pax_global_header00006660000000000000000000000064134067206720014521gustar00rootroot0000000000000052 comment=ed6b52c8144e4c6e1a5c8549e882f9057f6dc3ab asio-1.12.2/000077500000000000000000000000001340672067200125375ustar00rootroot00000000000000asio-1.12.2/COPYING000066400000000000000000000003401340672067200135670ustar00rootroot00000000000000Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) asio-1.12.2/INSTALL000066400000000000000000000002201340672067200135620ustar00rootroot00000000000000See doc/index.html for information on: - External dependencies - Using asio - Supported platforms - How to build the tests and examples asio-1.12.2/LICENSE_1_0.txt000066400000000000000000000024721340672067200150260ustar00rootroot00000000000000Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. asio-1.12.2/Makefile.am000066400000000000000000000005561340672067200146010ustar00rootroot00000000000000AUTOMAKE_OPTIONS = foreign dist-bzip2 dist-zip SUBDIRS = include src MAINTAINERCLEANFILES = \ $(srcdir)/aclocal.m4 \ $(srcdir)/configure \ $(srcdir)/config.guess \ $(srcdir)/config.sub \ $(srcdir)/depcomp \ $(srcdir)/install-sh \ $(srcdir)/missing \ $(srcdir)/mkinstalldirs \ $(srcdir)/Makefile.in \ asio-*.tar.gz EXTRA_DIST = \ LICENSE_1_0.txt \ doc asio-1.12.2/Makefile.in000066400000000000000000000601741340672067200146140ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in COPYING INSTALL README compile \ config.guess config.sub depcomp install-sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip GZIP_ENV = --best DIST_TARGETS = dist-bzip2 dist-gzip dist-zip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign dist-bzip2 dist-zip SUBDIRS = include src MAINTAINERCLEANFILES = \ $(srcdir)/aclocal.m4 \ $(srcdir)/configure \ $(srcdir)/config.guess \ $(srcdir)/config.sub \ $(srcdir)/depcomp \ $(srcdir)/install-sh \ $(srcdir)/missing \ $(srcdir)/mkinstalldirs \ $(srcdir)/Makefile.in \ asio-*.tar.gz EXTRA_DIST = \ LICENSE_1_0.txt \ doc all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/README000066400000000000000000000001611340672067200134150ustar00rootroot00000000000000asio version 1.12.2 Released Sunday, 09 December 2018. See doc/index.html for API documentation and a tutorial. asio-1.12.2/aclocal.m4000066400000000000000000001250311340672067200144010ustar00rootroot00000000000000# generated automatically by aclocal 1.16.1 -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.16.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR asio-1.12.2/compile000077500000000000000000000163271340672067200141260ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asio-1.12.2/config.guess000077500000000000000000001262061340672067200150660ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-03-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # Note: order is significant - the case branches are not exclusive. case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-unknown ;; *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` case "$UNAME_MACHINE" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "$sc_kernel_bits" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "$HP_ARCH" = "" ]; then eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ "$HP_ARCH" = hppa2.0w ] then eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: asio-1.12.2/config.sub000077500000000000000000001064551340672067200145350ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-03-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo "$1" | sed 's/-[^-]*$//'` if [ "$basic_machine" != "$1" ] then os=`echo "$1" | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-pc os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases that might get confused # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo "$os" | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4*) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"` ;; esac echo "$basic_machine$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: asio-1.12.2/configure000077500000000000000000005677471340672067200145000ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for asio 1.12.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='asio' PACKAGE_TARNAME='asio' PACKAGE_VERSION='1.12.2' PACKAGE_STRING='asio 1.12.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="include/asio.hpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS HAVE_CXX14_FALSE HAVE_CXX14_TRUE HAVE_CXX11_FALSE HAVE_CXX11_TRUE WINDOWS_TARGET_FALSE WINDOWS_TARGET_TRUE HAVE_BOOST_COROUTINE_FALSE HAVE_BOOST_COROUTINE_TRUE SEPARATE_COMPILATION_FALSE SEPARATE_COMPILATION_TRUE STANDALONE_FALSE STANDALONE_TRUE HAVE_OPENSSL_FALSE HAVE_OPENSSL_TRUE EGREP GREP CXXCPP RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_silent_rules enable_dependency_tracking with_boost enable_separate_compilation enable_boost_coroutine with_openssl ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures asio 1.12.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/asio] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of asio 1.12.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-separate-compilation separate compilation of asio source --enable-boost-coroutine use Boost.Coroutine to implement stackful coroutines Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-boost=DIR location of boost distribution --with-openssl=DIR location of openssl Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF asio configure 1.12.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by asio $as_me 1.12.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE am__api_version='1.16' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='asio' VERSION='1.12.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 $as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test $am_uid -le $am_max_uid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 $as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test $am_gid -le $am_max_gid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 $as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 $as_echo "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi $as_echo "#define _REENTRANT 1" >>confdefs.h # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; if test "${withval}" = no; then STANDALONE="yes" else CPPFLAGS="$CPPFLAGS -I${withval} -DBOOST_CHRONO_HEADER_ONLY -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING" LIBS="$LIBS -L${withval}/stage/lib" fi else BOOSTDIR=`ls -1d ../boost_*_*_*/ 2>/dev/null | sort -t "_" -k 2nr -k 3nr -k 4nr | head -n 1 | sed -e 's/\/$//'` if test "${BOOSTDIR}" != ""; then BOOSTDIR="`pwd`/${BOOSTDIR}" if test -d "${BOOSTDIR}"; then echo "using automatically detected boost from ${BOOSTDIR}" CPPFLAGS="$CPPFLAGS -I${BOOSTDIR} -DBOOST_CHRONO_HEADER_ONLY -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING" LIBS="$LIBS -L${BOOSTDIR}/stage/lib" fi fi fi # Check whether --enable-separate-compilation was given. if test "${enable_separate_compilation+set}" = set; then : enableval=$enable_separate_compilation; SEPARATE_COMPILATION=yes fi # Check whether --enable-boost-coroutine was given. if test "${enable_boost_coroutine+set}" = set; then : enableval=$enable_boost_coroutine; HAVE_BOOST_COROUTINE=yes fi if test "$STANDALONE" != yes; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_cxx_check_header_mongrel "$LINENO" "boost/noncopyable.hpp" "ac_cv_header_boost_noncopyable_hpp" "$ac_includes_default" if test "x$ac_cv_header_boost_noncopyable_hpp" = xyes; then : else echo "Can't find boost headers. Please check the location of the boost" echo "distribution and rerun configure using the --with-boost=DIR option." echo "Alternatively, run with --without-boost to enable standalone build." exit 1 fi fi # Check whether --with-openssl was given. if test "${with_openssl+set}" = set; then : withval=$with_openssl; CPPFLAGS="$CPPFLAGS -I${withval}/include" LIBS="$LIBS -L${withval}/lib" fi ac_fn_cxx_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : else OPENSSL_FOUND=no fi if test x$OPENSSL_FOUND != xno; then LIBS="$LIBS -lssl -lcrypto" fi if test x$OPENSSL_FOUND != xno; then HAVE_OPENSSL_TRUE= HAVE_OPENSSL_FALSE='#' else HAVE_OPENSSL_TRUE='#' HAVE_OPENSSL_FALSE= fi WINDOWS=no case $host in *-*-linux*) CXXFLAGS="$CXXFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" LIBS="$LIBS -lrt" ;; *-*-solaris*) if test "$GXX" = yes; then CXXFLAGS="$CXXFLAGS -D_PTHREADS" else # We'll assume Sun's CC. CXXFLAGS="$CXXFLAGS -mt" fi LIBS="$LIBS -lsocket -lnsl -lpthread" ;; *-*-mingw32*) CXXFLAGS="$CXXFLAGS -mthreads" LDFLAGS="$LDFLAGS -mthreads" LIBS="$LIBS -lws2_32 -lmswsock" WINDOWS=yes ;; *-*-mingw64*) CXXFLAGS="$CXXFLAGS -mthreads" LDFLAGS="$LDFLAGS -mthreads" LIBS="$LIBS -lws2_32 -lmswsock" WINDOWS=yes ;; *-pc-cygwin*) CXXFLAGS="$CXXFLAGS -D__USE_W32_SOCKETS -D_WIN32_WINNT=0x0501" LIBS="$LIBS -lws2_32 -lmswsock" WINDOWS=yes ;; *-apple-darwin*) CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" ;; *-*-freebsd*) CXXFLAGS="$CXXFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ;; *-*-netbsd*) CXXFLAGS="$CXXFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ;; esac if test "$GXX" = yes; then CXXFLAGS="$CXXFLAGS -ftemplate-depth-256" fi if test "$STANDALONE" = yes; then CPPFLAGS="$CPPFLAGS -DASIO_STANDALONE" fi if test "$SEPARATE_COMPILATION" = yes; then CPPFLAGS="$CPPFLAGS -DASIO_SEPARATE_COMPILATION" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++11 is enabled" >&5 $as_echo_n "checking whether C++11 is enabled... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if __cplusplus < 201103L #error C++11 not available #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_CXX11=yes; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_CXX11=no; fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++14 is enabled" >&5 $as_echo_n "checking whether C++14 is enabled... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if __cplusplus < 201402L #error C++14 not available #endif int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_CXX14=yes; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_CXX14=no; fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$GXX" = yes; then if test "$STANDALONE" = yes; then if test "$HAVE_CXX11" = no; then HAVE_CXX11=yes CPPFLAGS="-std=c++0x $CPPFLAGS" fi fi fi if test x$STANDALONE = xyes; then STANDALONE_TRUE= STANDALONE_FALSE='#' else STANDALONE_TRUE='#' STANDALONE_FALSE= fi if test x$SEPARATE_COMPILATION = xyes; then SEPARATE_COMPILATION_TRUE= SEPARATE_COMPILATION_FALSE='#' else SEPARATE_COMPILATION_TRUE='#' SEPARATE_COMPILATION_FALSE= fi if test x$HAVE_BOOST_COROUTINE = xyes; then HAVE_BOOST_COROUTINE_TRUE= HAVE_BOOST_COROUTINE_FALSE='#' else HAVE_BOOST_COROUTINE_TRUE='#' HAVE_BOOST_COROUTINE_FALSE= fi if test x$WINDOWS != xno; then WINDOWS_TARGET_TRUE= WINDOWS_TARGET_FALSE='#' else WINDOWS_TARGET_TRUE='#' WINDOWS_TARGET_FALSE= fi if test x$HAVE_CXX11 = xyes; then HAVE_CXX11_TRUE= HAVE_CXX11_FALSE='#' else HAVE_CXX11_TRUE='#' HAVE_CXX11_FALSE= fi if test x$HAVE_CXX14 = xyes; then HAVE_CXX14_TRUE= HAVE_CXX14_FALSE='#' else HAVE_CXX14_TRUE='#' HAVE_CXX14_FALSE= fi ac_config_files="$ac_config_files Makefile include/Makefile src/Makefile src/tests/Makefile src/examples/cpp03/Makefile src/examples/cpp11/Makefile src/examples/cpp14/Makefile src/examples/cpp17/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_OPENSSL_TRUE}" && test -z "${HAVE_OPENSSL_FALSE}"; then as_fn_error $? "conditional \"HAVE_OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${STANDALONE_TRUE}" && test -z "${STANDALONE_FALSE}"; then as_fn_error $? "conditional \"STANDALONE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SEPARATE_COMPILATION_TRUE}" && test -z "${SEPARATE_COMPILATION_FALSE}"; then as_fn_error $? "conditional \"SEPARATE_COMPILATION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_BOOST_COROUTINE_TRUE}" && test -z "${HAVE_BOOST_COROUTINE_FALSE}"; then as_fn_error $? "conditional \"HAVE_BOOST_COROUTINE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WINDOWS_TARGET_TRUE}" && test -z "${WINDOWS_TARGET_FALSE}"; then as_fn_error $? "conditional \"WINDOWS_TARGET\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CXX11_TRUE}" && test -z "${HAVE_CXX11_FALSE}"; then as_fn_error $? "conditional \"HAVE_CXX11\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CXX14_TRUE}" && test -z "${HAVE_CXX14_FALSE}"; then as_fn_error $? "conditional \"HAVE_CXX14\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by asio $as_me 1.12.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ asio config.status 1.12.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/tests/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/Makefile" ;; "src/examples/cpp03/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp03/Makefile" ;; "src/examples/cpp11/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp11/Makefile" ;; "src/examples/cpp14/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp14/Makefile" ;; "src/examples/cpp17/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp17/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. Try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi asio-1.12.2/configure.ac000066400000000000000000000106661340672067200150360ustar00rootroot00000000000000AC_INIT(asio, [1.12.2]) AC_CONFIG_SRCDIR(include/asio.hpp) AM_MAINTAINER_MODE AM_INIT_AUTOMAKE([tar-ustar]) AC_CANONICAL_HOST AM_PROG_CC_C_O AC_PROG_CXX AC_LANG(C++) AC_PROG_RANLIB AC_DEFINE(_REENTRANT, [1], [Define this]) AC_ARG_WITH(boost, AC_HELP_STRING([--with-boost=DIR],[location of boost distribution]), [ if test "${withval}" = no; then STANDALONE="yes" else CPPFLAGS="$CPPFLAGS -I${withval} -DBOOST_CHRONO_HEADER_ONLY -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING" LIBS="$LIBS -L${withval}/stage/lib" fi ], [ BOOSTDIR=`ls -1d ../boost_*_*_*/ 2>/dev/null | sort -t "_" -k 2nr -k 3nr -k 4nr | head -n 1 | sed -e 's/\/$//'` if test "${BOOSTDIR}" != ""; then BOOSTDIR="`pwd`/${BOOSTDIR}" if test -d "${BOOSTDIR}"; then echo "using automatically detected boost from ${BOOSTDIR}" CPPFLAGS="$CPPFLAGS -I${BOOSTDIR} -DBOOST_CHRONO_HEADER_ONLY -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING" LIBS="$LIBS -L${BOOSTDIR}/stage/lib" fi fi ]) AC_ARG_ENABLE(separate-compilation, [ --enable-separate-compilation separate compilation of asio source], [ SEPARATE_COMPILATION=yes ]) AC_ARG_ENABLE(boost-coroutine, [ --enable-boost-coroutine use Boost.Coroutine to implement stackful coroutines], [ HAVE_BOOST_COROUTINE=yes ]) if test "$STANDALONE" != yes; then AC_CHECK_HEADER([boost/noncopyable.hpp],, [ echo "Can't find boost headers. Please check the location of the boost" echo "distribution and rerun configure using the --with-boost=DIR option." echo "Alternatively, run with --without-boost to enable standalone build." exit 1 ],[]) fi AC_ARG_WITH(openssl, AC_HELP_STRING([--with-openssl=DIR],[location of openssl]), [ CPPFLAGS="$CPPFLAGS -I${withval}/include" LIBS="$LIBS -L${withval}/lib" ],[]) AC_CHECK_HEADER([openssl/ssl.h],, [ OPENSSL_FOUND=no ],[]) if test x$OPENSSL_FOUND != xno; then LIBS="$LIBS -lssl -lcrypto" fi AM_CONDITIONAL(HAVE_OPENSSL,test x$OPENSSL_FOUND != xno) WINDOWS=no case $host in *-*-linux*) CXXFLAGS="$CXXFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" LIBS="$LIBS -lrt" ;; *-*-solaris*) if test "$GXX" = yes; then CXXFLAGS="$CXXFLAGS -D_PTHREADS" else # We'll assume Sun's CC. CXXFLAGS="$CXXFLAGS -mt" fi LIBS="$LIBS -lsocket -lnsl -lpthread" ;; *-*-mingw32*) CXXFLAGS="$CXXFLAGS -mthreads" LDFLAGS="$LDFLAGS -mthreads" LIBS="$LIBS -lws2_32 -lmswsock" WINDOWS=yes ;; *-*-mingw64*) CXXFLAGS="$CXXFLAGS -mthreads" LDFLAGS="$LDFLAGS -mthreads" LIBS="$LIBS -lws2_32 -lmswsock" WINDOWS=yes ;; *-pc-cygwin*) CXXFLAGS="$CXXFLAGS -D__USE_W32_SOCKETS -D_WIN32_WINNT=0x0501" LIBS="$LIBS -lws2_32 -lmswsock" WINDOWS=yes ;; *-apple-darwin*) CXXFLAGS="$CXXFLAGS" LDFLAGS="$LDFLAGS" ;; *-*-freebsd*) CXXFLAGS="$CXXFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ;; *-*-netbsd*) CXXFLAGS="$CXXFLAGS -pthread" LDFLAGS="$LDFLAGS -pthread" ;; esac if test "$GXX" = yes; then CXXFLAGS="$CXXFLAGS -ftemplate-depth-256" fi if test "$STANDALONE" = yes; then CPPFLAGS="$CPPFLAGS -DASIO_STANDALONE" fi if test "$SEPARATE_COMPILATION" = yes; then CPPFLAGS="$CPPFLAGS -DASIO_SEPARATE_COMPILATION" fi AC_MSG_CHECKING([whether C++11 is enabled]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if __cplusplus < 201103L]] [[#error C++11 not available]] [[#endif]])], [AC_MSG_RESULT([yes]) HAVE_CXX11=yes;], [AC_MSG_RESULT([no]) HAVE_CXX11=no;]) AC_MSG_CHECKING([whether C++14 is enabled]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if __cplusplus < 201402L]] [[#error C++14 not available]] [[#endif]])], [AC_MSG_RESULT([yes]) HAVE_CXX14=yes;], [AC_MSG_RESULT([no]) HAVE_CXX14=no;]) if test "$GXX" = yes; then if test "$STANDALONE" = yes; then if test "$HAVE_CXX11" = no; then HAVE_CXX11=yes CPPFLAGS="-std=c++0x $CPPFLAGS" fi fi fi AM_CONDITIONAL(STANDALONE,test x$STANDALONE = xyes) AM_CONDITIONAL(SEPARATE_COMPILATION,test x$SEPARATE_COMPILATION = xyes) AM_CONDITIONAL(HAVE_BOOST_COROUTINE,test x$HAVE_BOOST_COROUTINE = xyes) AM_CONDITIONAL(WINDOWS_TARGET,test x$WINDOWS != xno) AM_CONDITIONAL(HAVE_CXX11,test x$HAVE_CXX11 = xyes) AM_CONDITIONAL(HAVE_CXX14,test x$HAVE_CXX14 = xyes) AC_OUTPUT([ Makefile include/Makefile src/Makefile src/tests/Makefile src/examples/cpp03/Makefile src/examples/cpp11/Makefile src/examples/cpp14/Makefile src/examples/cpp17/Makefile]) asio-1.12.2/depcomp000077500000000000000000000560201340672067200141170ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asio-1.12.2/doc/000077500000000000000000000000001340672067200133045ustar00rootroot00000000000000asio-1.12.2/doc/asio.png000066400000000000000000000061341340672067200147510ustar00rootroot00000000000000‰PNG  IHDRú<À?0à pHYs  šœ IDATxÚíLSWÇŸ¶Eë2$Ì©e­J…ÃÉ6¨²tH¦ŽšáŒL‡JÓ‘HX¶¸¹-Î:Œû¡Ù„™nÓˆŠ¿‚c(ÂV‹° t)ŽAéVJ¡áýã$÷í{oÜ–ºWåùüusιϽ÷ô{Ÿó<眛r&&&A¦\ìåŽ (wA¹#ÊAPî‚rG”;‚ ÜåŽ (wA¹#(wA¹#ÊAPî‚rGÿ'Ó„›èîînhh€U«Vùûûã¯âÙn´W~÷îÝ––HLLôòòB¹ÿKTTTlÞ¼š››/^üï\´««ëÒ¥Kµµµþù§Éd  }æ™g’““CCCÆßÒ^7Ú+?sæÌÞ½{@¯×?þøã(÷G­V›““STTtïÞ=ZÕ‰'x<ÞË/¿üé§Ÿ>ýôÓ8b Ü=¯¯opp0L›vß狀ºzݺu===är+W®ŒŒŒœ5kÖððp[[[UUUOOÏÅ‹/_¾<44äííýüÆÿf÷>èLL%ù|>yð-[¶hµZZ‹Årúôé… Àðð°ckJ¥r÷îÝû÷ïŸä]yÊÎÉ“'É£577³iÿÙgŸ‘öz½~Š` ÉÝb±…BòôÑGZšL¦ôôt§rÿꫯ`îܹ“¼1OÙA¹;Å…ÑíÖ­[¿üòKSS“^¯çp8ÁÁÁ±±±)))æRêêê~úé§ÖÖV£ÑèããOÜ'Eggg]]H$ÊûҢ풒’úúzƒÁÀçó…BáºuëÂÃÃ]ÇNžË¢>Ÿ¿iÓ&¤ªmmm …‚éJoß¾½`Áâ™ÆÆÆ¬3Bbüƒ>°iM­V³q?.\ åb±X§ÓQåýýý‰„T}ñÅlr¯¼òЧÁGÆ»@jjêÈÈUÕÞÞþÔSOÀôéÓïܹcó” 6 †É«Å©YƒÁ@Þ¥ôôtæåôz½dddÜ÷TµªªŠÜåµkר¢¢"j”œÌï´bÅ Òã†,@hh¨Åbqz‰~ø\bÏž=(wšÈBCC‡††hÖª««ImVVó”E‹™Íf¨…ÙŒŒ ðóóc¾`yyyT¢èô&»g&>>Þ××nܸA’· ÔjõdƒT*yÝ™9“@ رcY%Íc4ÉÁŒ30z¡‘‘‘áççG+\¹rett4œ={–yÊ®]»ÜX”°©6f333Àd2Q¯.-’‰ŠŠŠŠŠòä2“Ùl.//¯««ëìì4Ô’äøø8I2¨–qqq>>>f³ùÕW_ÍÊÊ’ÉdK—.eaÓ& ÈAbb¢Í‰‰‰Ÿ|ò é»çž{α5’Ý€ÅbqõG2›Íd™†Æèè(tttfmnnnnnîý°ãq^xá{ꬫ«ÓjµÝÝÝ!!!´—ÁSjacV,¯X±B¥R¼õÖ[TyeeåíÛ·`ûöíž\UU({÷îíííuê>`öìÙ‡ÎÊÊÝÞì890™LNš¤'ó».áååUPPÀ,¯¬¬,,, áq[-lÞÉ7Þx#//¯¸¸øÈ‘#3gÎüî»ïHH²868OUoÞ¼IF¥ÜÜ\æÝëtº¡¡!ÇwÿÞ{ïýüóÏMMMd|ÌÏÏ·'bæÛÔÔd³Uno,þŸ×zÚ´””2hœ:u ÓSkÈ®w{å\.wîܹ,MMR-ŽÙ¹s'‡Ã1™L§Nš˜˜ ‘Ltt´X,ö˜Üõz=9°sSSãlX¼xñ;ï¼C|@[[›ãÆ111䛃K—.Ùlpþüy–i5I-Ô9 ÷»ºº˜ÛƒUJKK™…ããã?þø#…BöÞ݃j±™­­Y³ *++[[[]rí¬äþØc‘ƒß~ûVõÏ?ÿ¹›S 6¡/§=Èçóׯ_W¯^¥ÕªÕj2'C™EbÊžžžµk×þý÷ßöZ–——ÇÄĸ=ì>t|ÿý÷LïSPPÐÙÙ ¯¿þ:{Sn¨Å%ÈŒdCCÃîÝ»‰Š^{í5OÊ}ùòåä>üðC²Oå| ÝÝÝÌô"///99ùܹsTºIP*•dAaÑ¢EÔ¼ŠöïßOòQ™Lfíã«««¥R©Åbár¹r¹œýÓ~ùå—dʲ¶¶V( Examples
asio C++ library

PrevUpHomeNext
  • C++03 Examples: Illustrates the use of Asio using only C++03 language and library features. Where necessary, the examples make use of selected Boost C++ libraries.
  • C++11 Examples: Contains a limited set of the C++03 Asio examples, updated to use only C++11 library and language facilities. These examples do not make direct use of Boost C++ libraries. To show the changes between C++03 and C++11, these examples include a diff between the C++03 and C++11 versions.
  • C++17 Examples: Selected examples illustrating C++17 usage in conjunction with Technical Specifications.

PrevUpHomeNext
asio-1.12.2/doc/asio/examples/000077500000000000000000000000001340672067200160555ustar00rootroot00000000000000asio-1.12.2/doc/asio/examples/cpp03_examples.html000066400000000000000000001062541340672067200215760ustar00rootroot00000000000000 C++03 Examples
asio C++ library

PrevUpHomeNext
Allocation

This example shows how to customise the allocation of memory associated with asynchronous operations.

Buffers

This example demonstrates how to create reference counted buffers that can be used with socket read and write operations.

Chat

This example implements a chat server and client. The programs use a custom protocol with a fixed length message header and variable length message body.

The following POSIX-specific chat client demonstrates how to use the posix::stream_descriptor class to perform console input and output.

Echo

A collection of simple clients and servers, showing the use of both synchronous and asynchronous operations.

Fork

These POSIX-specific examples show how to use Asio in conjunction with the fork() system call. The first example illustrates the steps required to start a daemon process:

The second example demonstrates how it is possible to fork a process from within a completion handler.

HTTP Client

Example programs implementing simple HTTP 1.0 clients. These examples show how to use the read_until and async_read_until functions.

HTTP Server

This example illustrates the use of asio in a simple single-threaded server implementation of HTTP 1.0. It demonstrates how to perform a clean shutdown by cancelling all outstanding asynchronous operations.

HTTP Server 2

An HTTP server using an io_context-per-CPU design.

HTTP Server 3

An HTTP server using a single io_context and a thread pool calling io_context::run().

HTTP Server 4

A single-threaded HTTP server implemented using stackless coroutines.

ICMP

This example shows how to use raw sockets with ICMP to ping a remote host.

Invocation

This example shows how to customise handler invocation. Completion handlers are added to a priority queue rather than executed immediately.

Iostreams

Two examples showing how to use ip::tcp::iostream.

Multicast

An example showing the use of multicast to transmit packets to a group of subscribers.

Serialization

This example shows how Boost.Serialization can be used with asio to encode and decode structures for transmission over a socket.

Services

This example demonstrates how to integrate custom functionality (in this case, for logging) into asio's io_context, and how to use a custom service with basic_stream_socket<>.

SOCKS 4

Example client program implementing the SOCKS 4 protocol for communication via a proxy.

SSL

Example client and server programs showing the use of the ssl::stream<> template with asynchronous operations.

Timeouts

A collection of examples showing how to cancel long running asynchronous operations after a period of time.

Timers

Example showing how to customise basic_waitable_timer using a different clock type.

Porthopper

Example illustrating mixed synchronous and asynchronous operations, and how to use Boost.Lambda with Asio.

Nonblocking

Example demonstrating reactor-style operations for integrating a third-party library that wants to perform the I/O operations itself.

Spawn

Example of using the asio::spawn() function, a wrapper around the Boost.Coroutine library, to implement a chain of asynchronous operations using stackful coroutines.

UNIX Domain Sockets

Examples showing how to use UNIX domain (local) sockets.

Windows

An example showing how to use the Windows-specific function TransmitFile with Asio.


PrevUpHomeNext
asio-1.12.2/doc/asio/examples/cpp11_examples.html000066400000000000000000000623251340672067200215750ustar00rootroot00000000000000 C++11 Examples
asio C++ library

PrevUpHomeNext
Allocation

This example shows how to customise the allocation of memory associated with asynchronous operations.

Buffers

This example demonstrates how to create reference counted buffers that can be used with socket read and write operations.

Chat

This example implements a chat server and client. The programs use a custom protocol with a fixed length message header and variable length message body.

Echo

A collection of simple clients and servers, showing the use of both synchronous and asynchronous operations.

Fork

These POSIX-specific examples show how to use Asio in conjunction with the fork() system call. The first example illustrates the steps required to start a daemon process:

The second example demonstrates how it is possible to fork a process from within a completion handler.

Futures

This example demonstrates how to use std::future in conjunction with Asio's asynchronous operations.

Handler Tracking

This example shows how to implement custom handler tracking.

HTTP Server

This example illustrates the use of asio in a simple single-threaded server implementation of HTTP 1.0. It demonstrates how to perform a clean shutdown by cancelling all outstanding asynchronous operations.

Multicast

An example showing the use of multicast to transmit packets to a group of subscribers.

Nonblocking

Example demonstrating reactor-style operations for integrating a third-party library that wants to perform the I/O operations itself.

Operations

Examples showing how to implement composed asynchronous operations as reusable library functions.

SOCKS 4

Example client program implementing the SOCKS 4 protocol for communication via a proxy.

Spawn

Example of using the asio::spawn() function, a wrapper around the Boost.Coroutine library, to implement a chain of asynchronous operations using stackful coroutines.

SSL

Example client and server programs showing the use of the ssl::stream<> template with asynchronous operations.

Timeouts

A collection of examples showing how to cancel long running asynchronous operations after a period of time.

Timers

Example showing how to customise basic_waitable_timer using a different clock type.

UNIX Domain Sockets

Examples showing how to use UNIX domain (local) sockets.


PrevUpHomeNext
asio-1.12.2/doc/asio/examples/cpp17_examples.html000066400000000000000000000071311340672067200215750ustar00rootroot00000000000000 C++17 Examples
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/history.html000066400000000000000000003172251340672067200166400ustar00rootroot00000000000000 Revision History
asio C++ library

PrevUpHomeNext

Asio 1.12.2

  • Fixed a problem with the detection of std::future availability with libstdc++.
  • Fixed compile error in regex overload of read_until.
  • Fixed a timer heap corruption issue that can occur when moving a cancelled timer.
  • Fixed detection of std::experimental::string_view and std::string_view with newer clang/libc++.
  • Fixed MSVC version detection for availability of std::invoke_result.
  • Fixed the buffer sequence traits to test the new requirements, if decltype is available.
  • Fixed an MSVC issue when building with exceptions disabled.
  • Added SSL context options for TLS v1.3.
  • Added a compile-time test for TLS v1 support.
  • Fixed the macro used to test for TLS v1.2 support.
  • Prevented global objects from being created once per thread on Windows.
  • Fixed a crash when using size(), max_size() or empty() on default-constructed resolver results.
  • Changed to move the return value in basic_resolver_results::begin() to avoid copying.
  • Enabled move support for the Intel Compiler.
  • Fixed std::string_view detection issue when using clang-cl.
  • Fixed the handler tracking operation name for io_context::executor_type::dispatch.
  • Fixed a buffer overflow that could occur when parsing an address string with a 64-bit scope id.
  • Added examples showing how to write composed operations.
  • Added C++11 versions of the Timeouts, Timers, SOCKS4 and SSL examples.
  • Fixed minor issues in documentation and examples.

Asio 1.12.1

  • Added missing const qualifier to basic_socket_acceptor::get_option.
  • Worked around a parsing error that occurs with some versions of gcc.
  • Fixed broken code samples in tutorial.
  • Added new experimental features. (Note that "experimental" features may be changed without notice in subsequent releases.)
    • Added experimental::detached completion token.
    • Added experimental::redirect_error completion token.
    • Added experimental::co_spawn facility for integration with the coroutines technical specification.
  • Updated timeout examples to use latest features.
    • Used asio::steady_timer rather than asio::deadline_timer.
    • Used asio::dynamic_buffer rather than asio::streambuf.
    • Used timed asio::io_context::run_for() function for blocking clients.
    • Added example showing a custom completion token for blocking with timeouts.
  • Fixed unit tests to compile when (BOOST_)ASIO_NO_DEPRECATED is defined.
  • Changed socket iostreams to use chrono by default, to fix compatibility with the Networking TS. Define (BOOST_)ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM to enable the old Boost.Date_Time interface in basic_socket_streambuf and basic_socket_iostream.
  • Updated examples to use chrono rather than Boost.Date_Time.
  • Fixed an incorrect member function detector in the is_dynamic_buffer trait.
  • Fixed an async_result incompatibility with deprecated handler_type.
  • Added a missing move optimisation in the SSL stream implementation.
  • Fixed incorrect basic_resolver_results::value_type typedef.
  • Fixed a compile error with some OpenSSL versions when SSL_OP_NO_COMPRESSION is defined.
  • Changed add_certificate_authority to process multiple certificates in a bundle.
  • Eliminated deprecation warning with MSVC by using std::invoke_result rather than std::result_of.
  • Changed to use std::string_view for C++17 or later, and std::experimental::string_view for C++14. Define the preprocessor macro (BOOST_)ASIO_DISABLE_STD_STRING_VIEW to force the use of std::experimental::string_view (assuming it is available) when compiling in C++17 mode.
  • Ensured DynamicBuffer template arguments are decayed before using in enable_if tests.
  • Changed documentation to distinguish legacy completion handlers (which are still required to be CopyConstructible) from new MoveConstructible handlers.
  • Suppressed a discarded return value warning in the buffer debugging support.
  • Fixed basic_yield_context to work with completion signatures containing reference parameters.
  • Ensured that stackful coroutines launched using spawn() correctly store decayed copies of their function and handler arguments.
  • Fixed some compatibility issues with Android.
  • Fixed some minor portability issues in examples.

Asio 1.12.0

  • Completed the interface changes to reflect the Networking TS (N4656).
    • See the list of new interfaces and, where applicable, the corresponding old interfaces that have been superseded.
    • The service template parameters, and the corresponding classes, are disabled by default. For example, instead of basic_socket<Protocol, SocketService> we now have simply basic_socket<Protocol>. The old interface can be enabled by defining the (BOOST_)ASIO_ENABLE_OLD_SERVICES macro.
  • Added support for customised handler tracking.
  • Added reactor-related (i.e. descriptor readiness) events to handler tracking.
  • Added special concurrency hint values that may be used to disable locking on a per io_context basis.
  • Enabled perfect forwarding for the first ssl::stream<> constructor argument.
  • Added ability to release ownership of the underlying native socket. (Requires Windows 8.1 or later when using the I/O completion port backend.)

Asio 1.11.0

  • Implemented changes to substantially reflect the Networking Library Proposal (N4370).
    • New Executor type requirements and classes to support an executor framework, including the execution_context base class, the executor_work class for tracking outstanding work, and the executor polymorphic wrapper. Free functions dispatch(), post() and defer() have been added and are used to submit function objects to executors.
    • Completion handlers now have an associated executor and associated allocator. The free function wrap() is used to associate an executor with a handler or other object. The handler hooks for allocation, invocation and continuation have been deprecated.
    • A system_executor class has been added as a default executor.
    • The io_service class is now derived from execution_context and implements the executor type requirements in its nested executor_type class. The member functions dispatch(), post(), defer() and wrap() have been deprecated. The io_service::work class has been deprecated.
    • The io_service member function reset() has been renamed to restart(). The old name is retained for backward compatibility but has been deprecated.
    • The make_service<>() function is now used to add a new service to an execution context such as an io_service. The add_service() function has been deprecated.
    • A new strand<> template has been added to allow strand functionality to be used with generic executor types.
    • I/O objects (such as sockets and timers) now provide access to their associated io_service via a context() member function. The get_io_service() member function is deprecated.
    • All asynchronous operations and executor operations now support move-only handlers. However, the deprecated io_service::post(), io_service::dispatch(), io_service::strand::post() and io_service::strand::dispatch() functions still require copyable handlers.
    • Waitable timer objects are now movable.
    • Waitable timers, socket iostreams and socket streambufs now provide an expiry() member function for obtaining the expiry time. The accessors expires_at() and expires_after() have been deprecated, though those names are retained for the mutating members.
    • The std::packaged_task class template is now supported as a completion handler. The initiating operation automatically returns the future associated with the task. The package() function has been added as a convenient factory for packaged tasks.
    • Sockets, socket acceptors and descriptors now provide wait() and async_wait() operations that may be used to wait for readiness. The null_buffers type has been deprecated.
    • The proposed error code enum classes are simulated using namespaces. Existing asio error codes now have a correspondence with the standard error conditions.
    • Conversion between IP address types, and conversion from string to address, is now supported via the address_cast<>(), make_address(), make_address_v4() and make_address_v6() free functions. The from_string(), to_v4(), to_v6() and v4_mapped() member functions have been deprecated.
    • A default-constructed ip::address now represents an invalid address value that is neither IPv4 nor IPv6.
    • New buffer() overloads that generate mutable buffers for non-const string objects.
    • Support for dynamic buffer sequences that automatically grow and shrink to accomodate data as it is read or written. This is a generic facility similar to the existing asio::streambuf class. This support includes:
      • New dynamic_string_buffer and dynamic_vector_buffer adapter classes that meet the DynamicBufferSequence type requirements.
      • New dynamic_buffer() factory functions for creating a dynamic buffer adapter for a vector or string.
      • New overloads for the read(), async_read(), write() and async_write(), read_until() and async_read_until() free functions that directly support dynamic buffer sequences.
    • Support for networks and address ranges. Thanks go to Oliver Kowalke for contributing to the design and providing the implementation on which this facility is based. The following new classes have been added:
      • address_iterator_v4 for iterating across IPv4 addresses
      • address_iterator_v6 for iterating across IPv6 addresses
      • address_range_v4 to represent a range of IPv4 addresses
      • address_range_v6 to represent a range of IPv6 addresses
      • network_v4 for manipulating IPv4 CIDR addresses, e.g. 1.2.3.0/24
      • network_v6 for manipulating IPv6 CIDR addresses, e.g. ffe0:/120
    • New convenience headers in <asio/ts/*.hpp> that correspond to the headers in the proposal.
  • Added a new, executor-aware thread_pool class.
  • Changed spawn() to be executor-aware.
  • Added a new spawn() overload that takes only a function object.
  • Changed spawn() and yield_context to permit nested calls to the completion handler.
  • Removed previously deprecated functions.
  • Added options for disabling TLS v1.1 and v1.2.
  • Changed the SSL wrapper to call the password callback when loading an in-memory key.
  • Changed the tutorial to use std::endl to ensure output is flushed.
  • Fixed false SSL error reports by ensuring that the SSL error queue is cleared prior to each operation.
  • Fixed an ssl::stream<> bug that may result in spurious 'short read' errors.
  • Enabled perfect forwarding for the first ssl::stream<> constructor argument.
  • Added standalone Asio support for Clang when used with libstdc++ and C++11.
  • Fixed an unsigned integer overflow reported by Clang's integer sanitizer.
  • Added support for move-only return types when using a yield_context object with asynchronous operations.
  • Ensured errors generated by Windows' ConnectEx function are mapped to their portable equivalents.
  • Changed multicast test to treat certain join_group failures as non-fatal.

Asio 1.10.5

  • Fixed the kqueue reactor so that it works on FreeBSD.
  • Fixed an issue in the kqueue reactor which resulted in spinning when using serial ports on Mac OS.
  • Fixed kqueue reactor support for read-only file descriptors.
  • Fixed a compile error when using the /dev/poll reactor.
  • Changed the Windows backend to use WSASocketW, as WSASocketA has been deprecated.
  • Fixed some warnings reported by Visual C++ 2013.
  • Fixed integer type used in the WinRT version of the byte-order conversion functions.
  • Changed documentation to indicate that use_future and spawn() are not made available when including the asio.hpp convenience header.
  • Explicitly marked asio::strand as deprecated. Use asio::io_service::strand instead.

Asio 1.10.4

  • Stopped using certain Winsock functions that are marked as deprecated in the latest Visual C++ and Windows SDK.
  • Fixed a shadow variable warning on Windows.
  • Fixed a regression in the kqueue backend that was introduced in Asio 1.10.2.
  • Added a workaround for building the unit tests with gcc on AIX.

Asio 1.10.3

  • Worked around a gcc problem to do with anonymous enums.
  • Reverted the Windows HANDLE backend change to ignore ERROR_MORE_DATA. Instead, the error will be propagated as with any other (i.e. in an error_code or thrown as a system_error), and the number of bytes transferred will be returned. For code that needs to handle partial messages, the error_code overload should be used.
  • Fixed an off-by-one error in the signal_set implementation's signal number check.
  • Changed the Windows IOCP backend to not assume that SO_UPDATE_CONNECT_CONTEXT is defined.
  • Fixed a Windows-specific issue, introduced in Asio 1.10.2, by using VerifyVersionInfo rather than GetVersionEx, as GetVersionEx has been deprecated.
  • Changed to use SSE2 intrinsics rather than inline assembly, to allow the Cray compiler to work.

Asio 1.10.2

  • Fixed asio::spawn() to work correctly with new Boost.Coroutine interface.
  • Ensured that incomplete asio::spawn() coroutines are correctly unwound when cleaned up by the io_service destructor.
  • Fixed delegation of continuation hook for handlers produced by io_service::wrap() and strand::wrap().
  • Changed the Windows I/O completion port backend to use ConnectEx, if available, for connection-oriented IP sockets.
  • Changed the io_service backend for non-Windows (and non-IOCP Windows) platforms to use a single condition variable per io_service instance. This addresses a potential race condition when run_one() is used from multiple threads.
  • Prevented integer overflow when computing timeouts based on some boost::chrono and std::chrono clocks.
  • Made further changes to EV_CLEAR handling in the kqueue backend, to address other cases where the close() system call may hang on Mac OS X.
  • Fixed infinite recursion in implementation of resolver_query_base::flags::operator~.
  • Made the select reactor more efficient on Windows for large numbers of sockets.
  • Fixed a Windows-specific type-aliasing issue reported by gcc.
  • Prevented execution of compile-time-only buffer test to avoid triggering an address sanitiser warning.
  • Disabled the GetQueuedCompletionStatus timeout workaround on recent versions of Windows.
  • Changed implementation for Windows Runtime to use FormatMessageW rather than FormatMessageA, as the Windows store does not permit the latter.
  • Added support for string-based scope IDs when using link-local multicast addresses.
  • Changed IPv6 multicast group join to use the address's scope ID as the interface, if an interface is not explicitly specified.
  • Fixed multicast test failure on Mac OS X and the BSDs by using a link-local multicast address.
  • Various minor documentation improvements.

Asio 1.10.1

  • Implemented a limited port to Windows Runtime. This support requires that the language extensions be enabled. Due to the restricted facilities exposed by the Windows Runtime API, the port also comes with the following caveats:
    • The core facilities such as the io_service, strand, buffers, composed operations, timers, etc., should all work as normal.
    • For sockets, only client-side TCP is supported.
    • Explicit binding of a client-side TCP socket is not supported.
    • The cancel() function is not supported for sockets. Asynchronous operations may only be cancelled by closing the socket.
    • Operations that use null_buffers are not supported.
    • Only tcp::no_delay and socket_base::keep_alive options are supported.
    • Resolvers do not support service names, only numbers. I.e. you must use "80" rather than "http".
    • Most resolver query flags have no effect.
  • Extended the ability to use Asio without Boost to include Microsoft Visual Studio 2012. When using a C++11 compiler, most of Asio may now be used without a dependency on Boost header files or libraries. To use Asio in this way, define ASIO_STANDALONE on your compiler command line or as part of the project options. This standalone configuration has been tested for the following platforms and compilers:
    • Microsoft Visual Studio 2012
    • Linux with g++ 4.7 or 4.8 (requires -std=c++11)
    • Mac OS X with clang++ / Xcode 4.6 (requires -std=c++11 -stdlib=libc++)
  • Fixed a regression (introduced in 1.10.0) where, on some platforms, errors from async_connect were not correctly propagated through to the completion handler.
  • Fixed a Windows-specific regression (introduced in 1.10.0) that occurs when multiple threads are running an io_service. When the bug occurs, the result of an asynchronous operation (error and bytes tranferred) is incorrectly discarded and zero values used instead. For TCP sockets this results in spurious end-of-file notifications.
  • Fixed a bug in handler tracking, where it was not correctly printing out some handler IDs.
  • Fixed the comparison used to test for successful synchronous accept operations so that it works correctly with unsigned socket descriptors.
  • Ensured the signal number is correctly passed to the completion handler when starting an async_wait on a signal that is already raised.
  • Suppressed a g++ 4.8+ warning about unused typedefs.
  • Enabled the move optimisation for handlers that use the default invocation hook.
  • Clarified that programs must not issue overlapping async_write_at operations.
  • Changed the Windows HANDLE backend to treat ERROR_MORE_DATA as a non-fatal error when returned by GetOverlappedResult for a synchronous read.
  • Visual C++ language extensions use generic as a keyword. Added a workaround that renames the namespace to cpp_generic when those language extensions are in effect.
  • Fixed some asynchronous operations that missed out on getting async_result support in 1.10.0. In particular, the buffered stream templates have been updated so that they adhere to current handler patterns.
  • Enabled move support for Microsoft Visual Studio 2012.
  • Added use_future support for Microsoft Visual Studio 2012.
  • Removed a use of std::min in the Windows IOCP backend to avoid a dependency on the <algorithm> header.
  • Eliminated some unnecessary handler copies.
  • Fixed support for older versions of OpenSSL that do not provide the SSL_CTX_clear_options function.
  • Fixed various minor and cosmetic issues in code and documentation.

Asio 1.10.0

  • Added new traits classes, handler_type and async_result, that allow the customisation of the return type of an initiating function.
  • Added the asio::spawn() function, a high-level wrapper for running stackful coroutines, based on the Boost.Coroutine library. The spawn() function enables programs to implement asynchronous logic in a synchronous manner. For example: size_t n = my_socket.async_read_some(my_buffer, yield);. For further information, see Stackful Coroutines.
  • Added the asio::use_future special value, which provides first-class support for returning a C++11 std::future from an asynchronous operation's initiating function. For example: future<size_t> = my_socket.async_read_some(my_buffer, asio::use_future);. For further information, see C++ 2011 Support - Futures.
  • Promoted the stackless coroutine class and macros to be part of Asio's documented interface, rather than part of the HTTP server 4 example. For further information, see Stackless Coroutines.
  • Added a new handler hook called asio_handler_is_continuation. Asynchronous operations may represent a continuation of the asynchronous control flow associated with the current executing handler. The asio_handler_is_continuation hook can be customised to return true if this is the case, and Asio's implementation can use this knowledge to optimise scheduling of the new handler. To cover common cases, Asio customises the hook for strands, spawn() and composed asynchronous operations.
  • Added four new generic protocol classes, generic::datagram_protocol, generic::raw_protocol, generic::seq_packet_protocol and generic::stream_protocol, which implement the Protocol type requirements, but allow the user to specify the address family (e.g. AF_INET) and protocol type (e.g. IPPROTO_TCP) at runtime. For further information, see Support for Other Protocols.
  • Added C++11 move constructors that allow the conversion of a socket (or acceptor) into a more generic type. For example, an ip::tcp::socket can be converted into a generic::stream_protocol::socket via move construction. For further information, see Support for Other Protocols.
  • Extended the basic_socket_acceptor<>'s accept() and async_accept() functions to allow a new connection to be accepted directly into a socket of a more generic type. For example, an ip::tcp::acceptor can be used to accept into a generic::stream_protocol::socket object. For further information, see Support for Other Protocols.
  • Moved existing examples into a C++03-specific directory, and added a new directory for C++11-specific examples. A limited subset of the C++03 examples have been converted to their C++11 equivalents.
  • Add the ability to use Asio without Boost, for a limited set of platforms. When using a C++11 compiler, most of Asio may now be used without a dependency on Boost header files or libraries. To use Asio in this way, define ASIO_STANDALONE on your compiler command line or as part of the project options. This standalone configuration has currently been tested for the following platforms and compilers:
    • Linux with g++ 4.7 (requires -std=c++11)
    • Mac OS X with clang++ / Xcode 4.6 (requires -std=c++11 -stdlib=libc++)
  • Various SSL enhancements. Thanks go to Nick Jones, on whose work these changes are based.
    • Added support for SSL handshakes with re-use of data already read from the wire. New overloads of the ssl::stream<> class's handshake() and async_handshake() functions have been added. These accept a ConstBufferSequence to be used as initial input to the ssl engine for the handshake procedure.
    • Added support for creation of TLSv1.1 and TLSv1.2 ssl::context objects.
    • Added a set_verify_depth() function to the ssl::context and ssl::stream<> classes.
    • Added the ability to load SSL certificate and key data from memory buffers. New functions, add_certificate_authority(), use_certificate(), use_certificate_chain(), use_private_key(), use_rsa_private_key() and use_tmp_dh(), have been added to the ssl::context class.
    • Changed ssl::context to automatically disable SSL compression by default. To enable, use the new ssl::context::clear_options() function, as in my_context.clear_options(ssl::context::no_compression).
  • Fixed a potential deadlock in signal_set implementation.
  • Fixed an error in acceptor example in documentation.
  • Fixed copy-paste errors in waitable timer documentation.
  • Added assertions to satisfy some code analysis tools.
  • Fixed a malformed #warning directive.
  • Fixed a potential data race in the Linux epoll implementation.
  • Fixed a Windows-specific bug, where certain operations might generate an error_code with an invalid (i.e. NULL) error_category.
  • Fixed basic_waitable_timer's underlying implementation so that it can handle any time_point value without overflowing the intermediate duration objects.
  • Fixed a problem with lost thread wakeups that can occur when making concurrent calls to run() and poll() on the same io_service object.
  • Fixed implementation of asynchronous connect operation so that it can cope with spurious readiness notifications from the reactor.
  • Fixed a memory leak in the ssl::rfc2818_verification class.
  • Added a mechanism for disabling automatic Winsock initialisation. See the header file asio/detail/winsock_init.hpp for details.

Asio 1.8.3

  • Fixed some 64-to-32-bit conversion warnings.
  • Fixed various small errors in documentation and comments.
  • Fixed an error in the example embedded in basic_socket::get_option's documentation.
  • Changed to use long rather than int for SSL_CTX options, to match OpenSSL.
  • Changed to use _snwprintf to address a compile error due to the changed swprintf signature in recent versions of MinGW.
  • Fixed a deadlock that can occur on Windows when shutting down a pool of io_service threads due to running out of work.
  • Changed UNIX domain socket example to treat errors from accept as non-fatal.
  • Added a small block recycling optimisation to improve default memory allocation behaviour.

Asio 1.8.2

  • Fixed an incompatibility between ip::tcp::iostream and C++11.
  • Decorated GCC attribute names with underscores to prevent interaction with user-defined macros.
  • Added missing #include <cctype>, needed for some versions of MinGW.
  • Changed to use gcc's atomic builtins on ARM CPUs, when available.
  • Changed strand destruction to be a no-op, to allow strand objects to be destroyed after their associated io_service has been destroyed.
  • Added support for some newer versions of glibc which provide the epoll_create1() function but always fail with ENOSYS.
  • Changed the SSL implementation to throw an exception if SSL engine initialisation fails.
  • Fixed another regression in buffered_write_stream.
  • Implemented various minor performance improvements, primarily targeted at Linux x86 and x86-64 platforms.

Asio 1.8.1

  • Changed the epoll_reactor backend to do lazy registration for EPOLLOUT events.
  • Fixed the epoll_reactor handling of out-of-band data, which was broken by an incomplete fix in the last release.
  • Changed Asio's SSL wrapper to respect OpenSSL's OPENSSL_NO_ENGINE feature test #define.
  • Fixed windows::object_handle so that it works with Windows compilers that support C++11 move semantics (such as g++).
  • Improved the performance of strand rescheduling.
  • Added support for g++ 4.7 when compiling in C++11 mode.
  • Fixed a problem where signal_set handlers were not being delivered when the io_service was constructed with a concurrency_hint of 1.

Asio 1.8.0

  • Added a new class template basic_waitable_timer based around the C++11 clock type requirements. It may be used with the clocks from the C++11 <chrono> library facility or, if those are not available, Boost.Chrono. The typedefs high_resolution_timer, steady_timer and system_timer may be used to create timer objects for the standard clock types.
  • Added a new windows::object_handle class for performing waits on Windows kernel objects. Thanks go to Boris Schaeling for contributing substantially to the development of this feature.
  • On Linux, connect() can return EAGAIN in certain circumstances. Remapped this to another error so that it doesn't look like a non-blocking operation.
  • Fixed a compile error on NetBSD.
  • Fixed deadlock on Mac OS X.
  • Fixed a regression in buffered_write_stream.
  • Fixed a non-paged pool "leak" on Windows when an io_service is repeatedly run without anything to do.
  • Reverted earlier change to allow some speculative operations to be performed without holding the lock, as it introduced a race condition in some multithreaded scenarios.
  • Fixed a bug where the second buffer in an array of two buffers may be ignored if the first buffer is empty.

Asio 1.6.1

  • Implemented various performance improvements, including:
    • Using thread-local operation queues in single-threaded use cases (i.e. when concurrency_hint is 1) to eliminate a lock/unlock pair.
    • Allowing some epoll_reactor speculative operations to be performed without holding the lock.
    • Improving locality of reference by performing an epoll_reactor's I/O operation immediately before the corresponding handler is called. This also improves scalability across CPUs when multiple threads are running the io_service.
    • Specialising asynchronous read and write operations for buffer sequences that are arrays (boost::array or std::array) of exactly two buffers.
  • Fixed a compile error in the regex overload of async_read_until.
  • Fixed a Windows-specific compile error by explicitly specifying the signal() function from the global namespace.
  • Changed the deadline_timer implementation so that it does not read the clock unless the timer heap is non-empty.
  • Changed the SSL stream's buffers' sizes so that they are large enough to hold a complete TLS record.
  • Fixed the behaviour of the synchronous null_buffers operations so that they obey the user's non-blocking setting.
  • Changed to set the size of the select fd_set at runtime when using Windows.
  • Disabled an MSVC warning due to const qualifier being applied to function type.
  • Fixed a crash that occurs when using the Intel C++ compiler.
  • Changed the initialisation of the OpenSSL library so that it supports all available algorithms.
  • Fixed the SSL error mapping used when the session is gracefully shut down.
  • Added some latency test programs.
  • Clarified that a read operation ends when the buffer is full.
  • Fixed an exception safety issue in epoll_reactor initialisation.
  • Made the number of strand implementations configurable by defining (BOOST_)ASIO_STRAND_IMPLEMENTATIONS to the desired number.
  • Added support for a new (BOOST_)ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION flag which switches the allocation of strand implementations to use a round-robin approach rather than hashing.
  • Fixed potential strand starvation issue that can occur when strand.post() is used.

Asio 1.6.0

  • Improved support for C++0x move construction to further reduce copying of handler objects. In certain designs it is possible to eliminate virtually all copies. Move support is now enabled when compiling in -std=c++0x mode on g++ 4.5 or higher.
  • Added build support for platforms that don't provide either of signal() or sigaction().
  • Changed to use C++0x variadic templates when they are available, rather than generating function overloads using the Boost.Preprocessor library.
  • Ensured the value of errno is preserved across the implementation's signal handler.
  • On Windows, ensured the count of outstanding work is decremented for abandoned operations (i.e. operations that are being cleaned up within the io_service destructor).
  • Fixed behaviour of zero-length reads and writes in the new SSL implementation.
  • Added support for building with OpenSSL 1.0 when OPENSSL_NO_SSL2 is defined.
  • Changed most examples to treat a failure by an accept operation as non-fatal.
  • Fixed an error in the tick_count_timer example by making the duration type signed. Previously, a wait on an already-passed deadline would not return for a very long time.

Asio 1.5.3

  • Added a new, completely rewritten SSL implementation. The new implementation compiles faster, shows substantially improved performance, and supports custom memory allocation and handler invocation. It includes new API features such as certificate verification callbacks and has improved error reporting. The new implementation is source-compatible with the old for most uses. However, if necessary, the old implementation may still be used by defining (BOOST_)ASIO_ENABLE_OLD_SSL.
  • Added new asio::buffer() overloads for std::array, when available. The support is automatically enabled when compiling in -std=c++0x mode on g++ 4.3 or higher, or when using MSVC 10. The support may be explicitly enabled by defining (BOOST_)ASIO_HAS_STD_ARRAY, or disabled by defining (BOOST_)ASIO_DISABLE_STD_ARRAY.
  • Changed to use the C++0x standard library templates array, shared_ptr, weak_ptr and atomic when they are available, rather than the Boost equivalents.
  • Support for std::error_code and std::system_error is no longer enabled by default for g++ 4.5, as that compiler's standard library does not implement std::system_error::what() correctly.

Asio 1.5.2

  • Added support for C++0x move construction and assignment to sockets, serial ports, POSIX descriptors and Windows handles.
  • Added support for the fork() system call. Programs that use fork() must call io_service.notify_fork() at the appropriate times. Two new examples have been added showing how to use this feature.
  • Cleaned up the handling of errors reported by the close() system call. In particular, assume that most operating systems won't have close() fail with EWOULDBLOCK, but if it does then set the blocking mode and restart the call. If any other error occurs, assume the descriptor is closed.
  • The kqueue flag EV_ONESHOT seems to cause problems on some versions of Mac OS X, with the io_service destructor getting stuck inside the close() system call. Changed the kqueue backend to use EV_CLEAR instead.
  • Changed exception reporting to include the function name in exception what() messages.
  • Fixed an insufficient initialisers warning with MinGW.
  • Changed the shutdown_service() member functions to be private.
  • Added archetypes for testing socket option functions.
  • Added a missing lock in signal_set_service::cancel().
  • Fixed a copy/paste error in SignalHandler example.
  • Added the inclusion of the signal header to signal_set_service.hpp so that constants like NSIG may be used.
  • Changed the signal_set_service implementation so that it doesn't assume that SIGRTMAX is a compile-time constant.
  • Changed the Boost.Asio examples so that they don't use Boost.Thread's convenience header. Use the header file that is specifically for the boost::thread class instead.

Asio 1.5.1

  • Added support for signal handling, using a new class called signal_set. Programs may add one or more signals to the set, and then perform an async_wait() operation. The specified handler will be called when one of the signals occurs. The same signal number may registered with multiple signal_set objects, however the signal number must be used only with Asio.
  • Added handler tracking, a new debugging aid. When enabled by defining (BOOST_)ASIO_ENABLE_HANDLER_TRACKING, Asio writes debugging output to the standard error stream. The output records asynchronous operations and the relationships between their handlers. It may be post-processed using the included handlerviz.pl tool to create a visual representation of the handlers (requires GraphViz).
  • Fixed a bug in asio::streambuf where the consume() function did not always update the internal buffer pointers correctly. The problem may occur when the asio::streambuf is filled with data using the standard C++ member functions such as sputn(). (Note: the problem does not manifest when the streambuf is populated by the Asio free functions read(), async_read(), read_until() or async_read_until().)
  • Fixed a bug on kqueue-based platforms, where reactor read operations that return false from their perform() function are not correctly re-registered with kqueue.
  • Support for std::error_code and std::system_error is no longer enabled by default for MSVC10, as that compiler's standard library does not implement std::system_error::what() correctly.
  • Modified the buffers_iterator<> and ip::basic_resolver_iterator classes so that the value_type typedefs are non-const byte types.

Asio 1.5.0

  • Added support for timeouts on socket iostreams, such as ip::tcp::iostream. A timeout is set by calling expires_at() or expires_from_now() to establish a deadline. Any socket operations which occur past the deadline will put the iostream into a bad state.
  • Added a new error() member function to socket iostreams, for retrieving the error code from the most recent system call.
  • Added a new basic_deadline_timer::cancel_one() function. This function lets you cancel a single waiting handler on a timer. Handlers are cancelled in FIFO order.
  • Added a new transfer_exactly() completion condition. This can be used to send or receive a specified number of bytes even if the total size of the buffer (or buffer sequence) is larger.
  • Added new free functions connect() and async_connect(). These operations try each endpoint in a list until the socket is successfully connected.
  • Extended the buffer_size() function so that it works for buffer sequences in addition to individual buffers.
  • Added a new buffer_copy() function that can be used to copy the raw bytes between individual buffers and buffer sequences.
  • Added new non-throwing overloads of read(), read_at(), write() and write_at() that do not require a completion condition.
  • Added friendlier compiler errors for when a completion handler does not meet the necessary type requirements. When C++0x is available (currently supported for g++ 4.5 or later, and MSVC 10), static_assert is also used to generate an informative error message. This checking may be disabled by defining (BOOST_)ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS.
  • Added support for using std::error_code and std::system_error, when available. The support is automatically enabled when compiling in -std=c++0x mode on g++ 4.5 or higher, or when using MSVC 10. The support may be explicitly enabled by defining ASIO_HAS_STD_SYSTEM_ERROR, or disabled by defining ASIO_DISABLE_STD_SYSTEM_ERROR. (Available in non-Boost version of Asio only.)
  • Made the is_loopback(), is_unspecified() and is_multicast() functions consistently available across the ip::address, ip::address_v4 and ip::address_v6 classes.
  • Added new non_blocking() functions for managing the non-blocking behaviour of a socket or descriptor. The io_control() commands named non_blocking_io are now deprecated in favour of these new functions.
  • Added new native_non_blocking() functions for managing the non-blocking mode of the underlying socket or descriptor. These functions are intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The functions have no effect on the behaviour of the synchronous operations of the socket or descriptor.
  • Added the io_control() member function for socket acceptors.
  • For consistency with the C++0x standard library, deprecated the native_type typedefs in favour of native_handle_type, and the native() member functions in favour of native_handle().
  • Added a release() member function to posix descriptors. This function releases ownership of the underlying native descriptor to the caller.
  • Added support for sequenced packet sockets (SOCK_SEQPACKET).
  • Added a new io_service::stopped() function that can be used to determine whether the io_service has stopped (i.e. a reset() call is needed prior to any further calls to run(), run_one(), poll() or poll_one()).
  • Reduced the copying of handler function objects.
  • Added support for C++0x move construction to further reduce copying of handler objects. Move support is enabled when compiling in -std=c++0x mode on g++ 4.5 or higher, or when using MSVC10.
  • Removed the dependency on OS-provided macros for the well-known IPv4 and IPv6 addresses. This should eliminate the annoying "missing braces around initializer" warnings.
  • Reduced the size of ip::basic_endpoint<> objects (such as ip::tcp::endpoint and ip::udp::endpoint).
  • Changed the reactor backends to assume that any descriptors or sockets added using assign() may have been dup()-ed, and so require explicit deregistration from the reactor.
  • Changed the SSL error category to return error strings from the OpenSSL library.
  • Changed the separate compilation support such that, to use Asio's SSL capabilities, you should also include 'asio/ssl/impl/src.hpp` in one source file in your program.
  • Removed the deprecated member functions named io_service(). The get_io_service() member functions should be used instead.
  • Removed the deprecated typedefs resolver_query and resolver_iterator from the ip::tcp, ip::udp and ip::icmp classes.
  • Fixed a compile error on some versions of g++ due to anonymous enums.
  • Added an explicit cast to the FIONBIO constant to int to suppress a compiler warning on some platforms.
  • Fixed warnings reported by g++'s -Wshadow compiler option.

Asio 1.4.8

  • Fixed an integer overflow problem that occurs when ip::address_v4::broadcast() is used on 64-bit platforms.
  • Fixed a problem on older Linux kernels (where epoll is used without timerfd support) that prevents timely delivery of deadline_timer handlers, after the program has been running for some time.

Asio 1.4.7

  • Fixed a problem on kqueue-based platforms where a deadline_timer may never fire if the io_service is running in a background thread.
  • Fixed a const-correctness issue that prevented valid uses of has_service<> from compiling.
  • Fixed MinGW cross-compilation.
  • Removed dependency on deprecated Boost.System functions (Boost.Asio only).
  • Ensured close()/closesocket() failures are correctly propagated.
  • Added a check for errors returned by InitializeCriticalSectionAndSpinCount.
  • Added support for hardware flow control on QNX.
  • Always use pselect() on HP-UX, if it is available.
  • Ensured handler arguments are passed as lvalues.
  • Fixed Windows build when thread support is disabled.
  • Fixed a Windows-specific problem where deadline_timer objects with expiry times set more than 5 minutes in the future may never expire.
  • Fixed the resolver backend on BSD platforms so that an empty service name resolves to port number 0, as per the documentation.
  • Fixed read operations so that they do not accept buffer sequences of type const_buffers_1.
  • Redefined Protocol and id to avoid clashing with Objective-C++ keywords.
  • Fixed a vector reallocation performance issue that can occur when there are many active deadline_timer objects.
  • Fixed the kqueue backend so that it compiles on NetBSD.
  • Fixed the socket io_control() implementation on 64-bit Mac OS X and BSD platforms.
  • Fixed a Windows-specific problem where failures from accept() are incorrectly treated as successes.
  • Deprecated the separate compilation header asio/impl/src.cpp in favour of asio/impl/src.hpp.

Asio 1.4.6

  • Reduced compile times. (Note that some programs may need to add additional #includes, e.g. if the program uses boost::array but does not explicitly include <boost/array.hpp>.)
  • Reduced the size of generated code.
  • Refactored deadline_timer implementation to improve performance.
  • Improved multiprocessor scalability on Windows by using a dedicated hidden thread to wait for timers.
  • Improved performance of asio::streambuf with async_read() and async_read_until(). These read operations now use the existing capacity of the streambuf when reading, rather than limiting the read to 512 bytes.
  • Added optional separate compilation. To enable, include asio/impl/src.cpp in one source file in a program, then build the program with (BOOST_)ASIO_SEPARATE_COMPILATION defined in the project/compiler settings. Alternatively, (BOOST_)ASIO_DYN_LINK may be defined to build a separately-compiled Asio as part of a shared library.
  • Added new macro (BOOST_)ASIO_DISABLE_FENCED_BLOCK to permit the disabling of memory fences around completion handlers, even if thread support is enabled.
  • Reworked timeout examples to better illustrate typical use cases.
  • Ensured that handler arguments are passed as const types.
  • Fixed incorrect parameter order in null_buffers variant of async_send_to.
  • Ensured unsigned char is used with isdigit in getaddrinfo emulation.
  • Fixed handling of very small but non-zero timeouts.
  • Fixed crash that occurred when an empty buffer sequence was passed to a composed read or write operation.
  • Added missing operator+ overload in buffers_iterator.
  • Implemented cancellation of null_buffers operations on Windows.

Asio 1.4.5

  • Improved performance.
  • Reduced compile times.
  • Reduced the size of generated code.
  • Extended the guarantee that background threads don't call user code to all asynchronous operations.
  • Changed to use edge-triggered epoll on Linux.
  • Changed to use timerfd for dispatching timers on Linux, when available.
  • Changed to use one-shot notifications with kqueue on Mac OS X and BSD platforms.
  • Added a bitmask type ip::resolver_query_base::flags as per the TR2 proposal. This type prevents implicit conversion from int to flags, allowing the compiler to catch cases where users incorrectly pass a numeric port number as the service name.
  • Added #define NOMINMAX for all Windows compilers. Users can define (BOOST_)ASIO_NO_NOMINMAX to suppress this definition.
  • Fixed a bug where 0-byte asynchronous reads were incorrectly passing an error::eof result to the completion handler.
  • Changed the io_control() member functions to always call ioctl on the underlying descriptor when modifying blocking mode.
  • Changed the resolver implementation so that it no longer requires the typedefs InternetProtocol::resolver_query and InternetProtocol::resolver_iterator, as neither typedef is part of the documented InternetProtocol requirements. The corresponding typedefs in the ip::tcp, ip::udp and ip::icmp classes have been deprecated.
  • Fixed out-of-band handling for reactors not based on select().
  • Added new (BOOST_)ASIO_DISABLE_THREADS macro that allows Asio's threading support to be independently disabled.
  • Minor documentation improvements.

Asio 1.4.4

  • Added a new HTTP Server 4 example illustrating the use of stackless coroutines with Asio.
  • Changed handler allocation and invocation to use boost::addressof to get the address of handler objects, rather than applying operator& directly.
  • Restricted MSVC buffer debugging workaround to 2008, as it causes a crash with 2010 beta 2.
  • Fixed a problem with the lifetime of handler memory, where Windows needs the OVERLAPPED structure to be valid until both the initiating function call has returned and the completion packet has been delivered.
  • Don't block signals while performing system calls, but instead restart the calls if they are interrupted.
  • Documented the guarantee made by strand objects with respect to order of handler invocation.
  • Changed strands to use a pool of implementations, to make copying of strands cheaper.
  • Ensured that kqueue support is enabled for BSD platforms.
  • Added a boost_ prefix to the extern "C" thread entry point function.
  • In getaddrinfo emulation, only check the socket type (SOCK_STREAM or SOCK_DGRAM) if a service name has been specified. This should allow the emulation to work with raw sockets.
  • Added a workaround for some broken Windows firewalls that make a socket appear bound to 0.0.0.0 when it is in fact bound to 127.0.0.1.
  • Applied a fix for reported excessive CPU usage under Solaris.
  • Added some support for platforms that use older compilers such as g++ 2.95.

Asio 1.4.3

  • Added a new ping example to illustrate the use of ICMP sockets.
  • Changed the buffered*_stream<> templates to treat 0-byte reads and writes as no-ops, to comply with the documented type requirements for SyncReadStream, AsyncReadStream, SyncWriteStream and AsyncWriteStream.
  • Changed some instances of the throw keyword to boost::throw_exception() to allow Asio to be used when exception support is disabled. Note that the SSL wrappers still require exception support.
  • Made Asio compatible with the OpenSSL 1.0 beta.
  • Eliminated a redundant system call in the Solaris /dev/poll backend.
  • Fixed a bug in resizing of the bucket array in the internal hash maps.
  • Ensured correct propagation of the error code when a synchronous accept fails.
  • Ensured correct propagation of the error code when a synchronous read or write on a Windows HANDLE fails.
  • Fixed failures reported when _GLIBCXX_DEBUG is defined.
  • Fixed custom memory allocation support for timers.
  • Tidied up various warnings reported by g++.
  • Various documentation improvements, including more obvious hyperlinks to function overloads, header file information, examples for the handler type requirements, and adding enum values to the index.

Asio 1.4.2

  • Implement automatic resizing of the bucket array in the internal hash maps. This is to improve performance for very large numbers of asynchronous operations and also to reduce memory usage for very small numbers. A new macro (BOOST_)ASIO_HASH_MAP_BUCKETS may be used to tweak the sizes used for the bucket arrays. (N.B. this feature introduced a bug which was fixed in Asio 1.4.3 / Boost 1.40.)
  • Add performance optimisation for the Windows IOCP backend for when no timers are used.
  • Prevent locale settings from affecting formatting of TCP and UDP endpoints.
  • Fix a memory leak that occurred when an asynchronous SSL operation's completion handler threw an exception.
  • Fix the implementation of io_control() so that it adheres to the documented type requirements for IoControlCommand.
  • Fix incompatibility between Asio and ncurses.h.
  • On Windows, specifically handle the case when an overlapped ReadFile call fails with ERROR_MORE_DATA. This enables a hack where a windows::stream_handle can be used with a message-oriented named pipe.
  • Fix system call wrappers to always clear the error on success, as POSIX allows successful system calls to modify errno.
  • Don't include termios.h if (BOOST_)ASIO_DISABLE_SERIAL_PORT is defined.
  • Cleaned up some more MSVC level 4 warnings.
  • Various documentation fixes.

Asio 1.4.1

  • Improved compatibility with some Windows firewall software.
  • Ensured arguments to windows::overlapped_ptr::complete() are correctly passed to the completion handler.
  • Fixed a link problem and multicast failure on QNX.
  • Fixed a compile error in SSL support on MinGW / g++ 3.4.5.
  • Drop back to using a pipe for notification if eventfd is not available at runtime on Linux.
  • Various minor bug and documentation fixes.

Asio 1.4.0

  • Enhanced CompletionCondition concept with the signature size_t CompletionCondition(error_code ec, size_t total), where the return value indicates the maximum number of bytes to be transferred on the next read or write operation. (The old CompletionCondition signature is still supported for backwards compatibility).
  • New windows::overlapped_ptr class to allow arbitrary overlapped I/O functions (such as TransmitFile) to be used with Asio.
  • On recent versions of Linux, an eventfd descriptor is now used (rather than a pipe) to interrupt a blocked select/epoll reactor.
  • Added const overloads of lowest_layer().
  • Synchronous read, write, accept and connect operations are now thread safe (meaning that it is now permitted to perform concurrent synchronous operations on an individual socket, if supported by the OS).
  • Reactor-based io_service implementations now use lazy initialisation to reduce the memory usage of an io_service object used only as a message queue.

Asio 1.2.0

  • Added support for serial ports.
  • Added support for UNIX domain sockets.
  • Added support for raw sockets and ICMP.
  • Added wrappers for POSIX stream-oriented file descriptors (excluding regular files).
  • Added wrappers for Windows stream-oriented HANDLEs such as named pipes (requires HANDLEs that work with I/O completion ports).
  • Added wrappers for Windows random-access HANDLEs such as files (requires HANDLEs that work with I/O completion ports).
  • Added support for reactor-style operations (i.e. they report readiness but perform no I/O) using a new null_buffers type.
  • Added an iterator type for bytewise traversal of buffer sequences.
  • Added new read_until() and async_read_until() overloads that take a user-defined function object for locating message boundaries.
  • Added an experimental two-lock queue (enabled by defining (BOOST_)ASIO_ENABLE_TWO_LOCK_QUEUE) that may provide better io_service scalability across many processors.
  • Various fixes, performance improvements, and more complete coverage of the custom memory allocation support.

Asio 1.0.0

First stable release of Asio.


PrevUpHomeNext
asio-1.12.2/doc/asio/index.html000066400000000000000000010433661340672067200162510ustar00rootroot00000000000000
asio C++ library

PrevUpHome

Index

Symbols

~awaitable
experimental::awaitable, experimental::awaitable::~awaitable
~bad_address_cast
ip::bad_address_cast, ip::bad_address_cast::~bad_address_cast
~basic_datagram_socket
basic_datagram_socket, basic_datagram_socket::~basic_datagram_socket
~basic_deadline_timer
basic_deadline_timer, basic_deadline_timer::~basic_deadline_timer
~basic_io_object
basic_io_object, basic_io_object::~basic_io_object
~basic_raw_socket
basic_raw_socket, basic_raw_socket::~basic_raw_socket
~basic_resolver
ip::basic_resolver, ip::basic_resolver::~basic_resolver
~basic_seq_packet_socket
basic_seq_packet_socket, basic_seq_packet_socket::~basic_seq_packet_socket
~basic_socket
basic_socket, basic_socket::~basic_socket
~basic_socket_acceptor
basic_socket_acceptor, basic_socket_acceptor::~basic_socket_acceptor
~basic_socket_streambuf
basic_socket_streambuf, basic_socket_streambuf::~basic_socket_streambuf
~basic_stream_socket
basic_stream_socket, basic_stream_socket::~basic_stream_socket
~basic_waitable_timer
basic_waitable_timer, basic_waitable_timer::~basic_waitable_timer
~context
ssl::context, ssl::context::~context
~context_base
ssl::context_base, ssl::context_base::~context_base
~descriptor
posix::descriptor, posix::descriptor::~descriptor
~descriptor_base
posix::descriptor_base, posix::descriptor_base::~descriptor_base
~error_category
error_category, error_category::~error_category
~execution_context
execution_context, execution_context::~execution_context
~executor
executor, executor::~executor
~executor_binder
executor_binder, executor_binder::~executor_binder
~executor_work_guard
executor_work_guard, executor_work_guard::~executor_work_guard
~io_context
io_context, io_context::~io_context
~overlapped_handle
windows::overlapped_handle, windows::overlapped_handle::~overlapped_handle
~overlapped_ptr
windows::overlapped_ptr, windows::overlapped_ptr::~overlapped_ptr
~resolver_base
ip::resolver_base, ip::resolver_base::~resolver_base
~resolver_query_base
ip::resolver_query_base, ip::resolver_query_base::~resolver_query_base
~serial_port
serial_port, serial_port::~serial_port
~serial_port_base
serial_port_base, serial_port_base::~serial_port_base
~service
execution_context::service, execution_context::service::~service
io_context::service, io_context::service::~service
~signal_set
signal_set, signal_set::~signal_set
~socket_base
socket_base, socket_base::~socket_base
~strand
io_context::strand, io_context::strand::~strand
strand, strand::~strand
~stream
ssl::stream, ssl::stream::~stream
~stream_base
ssl::stream_base, ssl::stream_base::~stream_base
~system_context
system_context, system_context::~system_context
~system_error
system_error, system_error::~system_error
~thread
thread, thread::~thread
~thread_pool
thread_pool, thread_pool::~thread_pool
~work
io_context::work, io_context::work::~work

A

accept
basic_socket_acceptor, basic_socket_acceptor::accept
acceptor
ip::tcp, ip::tcp::acceptor
local::stream_protocol, local::stream_protocol::acceptor
access_denied
error::basic_errors, error::basic_errors
add
signal_set, signal_set::add
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::add
address
ip::address, ip::address::address
ip::basic_endpoint, ip::basic_endpoint::address
ip::network_v4, ip::network_v4::address
ip::network_v6, ip::network_v6::address
address_configured
ip::basic_resolver, ip::basic_resolver::address_configured
ip::basic_resolver_query, ip::basic_resolver_query::address_configured
ip::resolver_base, ip::resolver_base::address_configured
ip::resolver_query_base, ip::resolver_query_base::address_configured
address_family_not_supported
error::basic_errors, error::basic_errors
address_in_use
error::basic_errors, error::basic_errors
address_v4
ip::address_v4, ip::address_v4::address_v4
address_v6
ip::address_v6, ip::address_v6::address_v6
add_certificate_authority
ssl::context, ssl::context::add_certificate_authority
add_service, add_service
execution_context, execution_context::add_service
io_context, io_context::add_service
system_context, system_context::add_service
thread_pool, thread_pool::add_service
add_verify_path
ssl::context, ssl::context::add_verify_path
allocator_type
use_future_t, use_future_t::allocator_type
all_matching
ip::basic_resolver, ip::basic_resolver::all_matching
ip::basic_resolver_query, ip::basic_resolver_query::all_matching
ip::resolver_base, ip::resolver_base::all_matching
ip::resolver_query_base, ip::resolver_query_base::all_matching
already_connected
error::basic_errors, error::basic_errors
already_open
error::misc_errors, error::misc_errors
already_started
error::basic_errors, error::basic_errors
any
ip::address_v4, ip::address_v4::any
ip::address_v6, ip::address_v6::any
argument_type
executor_binder, executor_binder::argument_type
asio_handler_allocate, asio_handler_allocate
asio_handler_deallocate, asio_handler_deallocate
asio_handler_invoke, asio_handler_invoke
asio_handler_is_continuation, asio_handler_is_continuation
asn1
ssl::context, ssl::context::file_format
ssl::context_base, ssl::context_base::file_format
assign
basic_datagram_socket, basic_datagram_socket::assign
basic_raw_socket, basic_raw_socket::assign
basic_seq_packet_socket, basic_seq_packet_socket::assign
basic_socket, basic_socket::assign
basic_socket_acceptor, basic_socket_acceptor::assign
basic_stream_socket, basic_stream_socket::assign
error_code, error_code::assign
posix::descriptor, posix::descriptor::assign
posix::stream_descriptor, posix::stream_descriptor::assign
serial_port, serial_port::assign
windows::object_handle, windows::object_handle::assign
windows::overlapped_handle, windows::overlapped_handle::assign
windows::random_access_handle, windows::random_access_handle::assign
windows::stream_handle, windows::stream_handle::assign
async_accept
basic_socket_acceptor, basic_socket_acceptor::async_accept
async_completion
async_completion, async_completion::async_completion
async_connect, async_connect
basic_datagram_socket, basic_datagram_socket::async_connect
basic_raw_socket, basic_raw_socket::async_connect
basic_seq_packet_socket, basic_seq_packet_socket::async_connect
basic_socket, basic_socket::async_connect
basic_stream_socket, basic_stream_socket::async_connect
async_fill
buffered_read_stream, buffered_read_stream::async_fill
buffered_stream, buffered_stream::async_fill
async_flush
buffered_stream, buffered_stream::async_flush
buffered_write_stream, buffered_write_stream::async_flush
async_handshake
ssl::stream, ssl::stream::async_handshake
async_read, async_read
async_read_at, async_read_at
async_read_some
basic_stream_socket, basic_stream_socket::async_read_some
buffered_read_stream, buffered_read_stream::async_read_some
buffered_stream, buffered_stream::async_read_some
buffered_write_stream, buffered_write_stream::async_read_some
posix::stream_descriptor, posix::stream_descriptor::async_read_some
serial_port, serial_port::async_read_some
ssl::stream, ssl::stream::async_read_some
windows::stream_handle, windows::stream_handle::async_read_some
async_read_some_at
windows::random_access_handle, windows::random_access_handle::async_read_some_at
async_read_until, async_read_until
async_receive
basic_datagram_socket, basic_datagram_socket::async_receive
basic_raw_socket, basic_raw_socket::async_receive
basic_seq_packet_socket, basic_seq_packet_socket::async_receive
basic_stream_socket, basic_stream_socket::async_receive
async_receive_from
basic_datagram_socket, basic_datagram_socket::async_receive_from
basic_raw_socket, basic_raw_socket::async_receive_from
async_resolve
ip::basic_resolver, ip::basic_resolver::async_resolve
async_result
async_result, async_result::async_result
async_result< Handler >, async_result< Handler >::async_result
async_result< std::packaged_task< Result(Args...)>, Signature >, async_result< std::packaged_task< Result(Args...)>, Signature >::async_result
async_send
basic_datagram_socket, basic_datagram_socket::async_send
basic_raw_socket, basic_raw_socket::async_send
basic_seq_packet_socket, basic_seq_packet_socket::async_send
basic_stream_socket, basic_stream_socket::async_send
async_send_to
basic_datagram_socket, basic_datagram_socket::async_send_to
basic_raw_socket, basic_raw_socket::async_send_to
async_shutdown
ssl::stream, ssl::stream::async_shutdown
async_wait
basic_datagram_socket, basic_datagram_socket::async_wait
basic_deadline_timer, basic_deadline_timer::async_wait
basic_raw_socket, basic_raw_socket::async_wait
basic_seq_packet_socket, basic_seq_packet_socket::async_wait
basic_socket, basic_socket::async_wait
basic_socket_acceptor, basic_socket_acceptor::async_wait
basic_stream_socket, basic_stream_socket::async_wait
basic_waitable_timer, basic_waitable_timer::async_wait
posix::descriptor, posix::descriptor::async_wait
posix::stream_descriptor, posix::stream_descriptor::async_wait
signal_set, signal_set::async_wait
windows::object_handle, windows::object_handle::async_wait
async_write, async_write
async_write_at, async_write_at
async_write_some
basic_stream_socket, basic_stream_socket::async_write_some
buffered_read_stream, buffered_read_stream::async_write_some
buffered_stream, buffered_stream::async_write_some
buffered_write_stream, buffered_write_stream::async_write_some
posix::stream_descriptor, posix::stream_descriptor::async_write_some
serial_port, serial_port::async_write_some
ssl::stream, ssl::stream::async_write_some
windows::stream_handle, windows::stream_handle::async_write_some
async_write_some_at
windows::random_access_handle, windows::random_access_handle::async_write_some_at
at_mark
basic_datagram_socket, basic_datagram_socket::at_mark
basic_raw_socket, basic_raw_socket::at_mark
basic_seq_packet_socket, basic_seq_packet_socket::at_mark
basic_socket, basic_socket::at_mark
basic_stream_socket, basic_stream_socket::at_mark
available
basic_datagram_socket, basic_datagram_socket::available
basic_raw_socket, basic_raw_socket::available
basic_seq_packet_socket, basic_seq_packet_socket::available
basic_socket, basic_socket::available
basic_stream_socket, basic_stream_socket::available
awaitable
experimental::awaitable, experimental::awaitable::awaitable
await_token
experimental::await_token, experimental::await_token::await_token

B

bad_address_cast
ip::bad_address_cast, ip::bad_address_cast::bad_address_cast
bad_descriptor
error::basic_errors, error::basic_errors
bad_executor
bad_executor, bad_executor::bad_executor
basic_address_iterator
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::basic_address_iterator
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::basic_address_iterator
basic_address_range
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::basic_address_range
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::basic_address_range
basic_datagram_socket
basic_datagram_socket, basic_datagram_socket::basic_datagram_socket
basic_deadline_timer
basic_deadline_timer, basic_deadline_timer::basic_deadline_timer
basic_endpoint
generic::basic_endpoint, generic::basic_endpoint::basic_endpoint
ip::basic_endpoint, ip::basic_endpoint::basic_endpoint
local::basic_endpoint, local::basic_endpoint::basic_endpoint
basic_io_object
basic_io_object, basic_io_object::basic_io_object
basic_raw_socket
basic_raw_socket, basic_raw_socket::basic_raw_socket
basic_resolver
ip::basic_resolver, ip::basic_resolver::basic_resolver
basic_resolver_entry
ip::basic_resolver_entry, ip::basic_resolver_entry::basic_resolver_entry
basic_resolver_iterator
ip::basic_resolver_iterator, ip::basic_resolver_iterator::basic_resolver_iterator
basic_resolver_query
ip::basic_resolver_query, ip::basic_resolver_query::basic_resolver_query
basic_resolver_results
ip::basic_resolver_results, ip::basic_resolver_results::basic_resolver_results
basic_seq_packet_socket
basic_seq_packet_socket, basic_seq_packet_socket::basic_seq_packet_socket
basic_socket
basic_socket, basic_socket::basic_socket
basic_socket_acceptor
basic_socket_acceptor, basic_socket_acceptor::basic_socket_acceptor
basic_socket_iostream
basic_socket_iostream, basic_socket_iostream::basic_socket_iostream
basic_socket_streambuf
basic_socket_streambuf, basic_socket_streambuf::basic_socket_streambuf
basic_streambuf
basic_streambuf, basic_streambuf::basic_streambuf
basic_streambuf_ref
basic_streambuf_ref, basic_streambuf_ref::basic_streambuf_ref
basic_stream_socket
basic_stream_socket, basic_stream_socket::basic_stream_socket
basic_waitable_timer
basic_waitable_timer, basic_waitable_timer::basic_waitable_timer
basic_yield_context
basic_yield_context, basic_yield_context::basic_yield_context
baud_rate
serial_port_base::baud_rate, serial_port_base::baud_rate::baud_rate
begin
buffers_iterator, buffers_iterator::begin
const_buffers_1, const_buffers_1::begin
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::begin
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::begin
ip::basic_resolver_results, ip::basic_resolver_results::begin
mutable_buffers_1, mutable_buffers_1::begin
null_buffers, null_buffers::begin
bind
basic_datagram_socket, basic_datagram_socket::bind
basic_raw_socket, basic_raw_socket::bind
basic_seq_packet_socket, basic_seq_packet_socket::bind
basic_socket, basic_socket::bind
basic_socket_acceptor, basic_socket_acceptor::bind
basic_stream_socket, basic_stream_socket::bind
bind_executor, bind_executor
broadcast
basic_datagram_socket, basic_datagram_socket::broadcast
basic_raw_socket, basic_raw_socket::broadcast
basic_seq_packet_socket, basic_seq_packet_socket::broadcast
basic_socket, basic_socket::broadcast
basic_socket_acceptor, basic_socket_acceptor::broadcast
basic_stream_socket, basic_stream_socket::broadcast
ip::address_v4, ip::address_v4::broadcast
ip::network_v4, ip::network_v4::broadcast
socket_base, socket_base::broadcast
broken_pipe
error::basic_errors, error::basic_errors
buffer, buffer
buffered_read_stream
buffered_read_stream, buffered_read_stream::buffered_read_stream
buffered_stream
buffered_stream, buffered_stream::buffered_stream
buffered_write_stream
buffered_write_stream, buffered_write_stream::buffered_write_stream
buffers_begin, buffers_begin
buffers_end, buffers_end
buffers_iterator
buffers_iterator, buffers_iterator::buffers_iterator
buffer_cast, buffer_cast
buffer_copy, buffer_copy
buffer_sequence_begin, buffer_sequence_begin
buffer_sequence_end, buffer_sequence_end
buffer_size, buffer_size
bytes_readable
basic_datagram_socket, basic_datagram_socket::bytes_readable
basic_raw_socket, basic_raw_socket::bytes_readable
basic_seq_packet_socket, basic_seq_packet_socket::bytes_readable
basic_socket, basic_socket::bytes_readable
basic_socket_acceptor, basic_socket_acceptor::bytes_readable
basic_stream_socket, basic_stream_socket::bytes_readable
posix::descriptor, posix::descriptor::bytes_readable
posix::descriptor_base, posix::descriptor_base::bytes_readable
posix::stream_descriptor, posix::stream_descriptor::bytes_readable
socket_base, socket_base::bytes_readable
bytes_type
ip::address_v4, ip::address_v4::bytes_type
ip::address_v6, ip::address_v6::bytes_type

C

callee_type
basic_yield_context, basic_yield_context::callee_type
caller_type
basic_yield_context, basic_yield_context::caller_type
cancel
basic_datagram_socket, basic_datagram_socket::cancel
basic_deadline_timer, basic_deadline_timer::cancel
basic_raw_socket, basic_raw_socket::cancel
basic_seq_packet_socket, basic_seq_packet_socket::cancel
basic_socket, basic_socket::cancel
basic_socket_acceptor, basic_socket_acceptor::cancel
basic_stream_socket, basic_stream_socket::cancel
basic_waitable_timer, basic_waitable_timer::cancel
ip::basic_resolver, ip::basic_resolver::cancel
posix::descriptor, posix::descriptor::cancel
posix::stream_descriptor, posix::stream_descriptor::cancel
serial_port, serial_port::cancel
signal_set, signal_set::cancel
windows::object_handle, windows::object_handle::cancel
windows::overlapped_handle, windows::overlapped_handle::cancel
windows::random_access_handle, windows::random_access_handle::cancel
windows::stream_handle, windows::stream_handle::cancel
cancel_one
basic_deadline_timer, basic_deadline_timer::cancel_one
basic_waitable_timer, basic_waitable_timer::cancel_one
canonical
ip::network_v4, ip::network_v4::canonical
ip::network_v6, ip::network_v6::canonical
canonical_name
ip::basic_resolver, ip::basic_resolver::canonical_name
ip::basic_resolver_query, ip::basic_resolver_query::canonical_name
ip::resolver_base, ip::resolver_base::canonical_name
ip::resolver_query_base, ip::resolver_query_base::canonical_name
capacity
basic_streambuf, basic_streambuf::capacity
basic_streambuf_ref, basic_streambuf_ref::capacity
dynamic_string_buffer, dynamic_string_buffer::capacity
dynamic_vector_buffer, dynamic_vector_buffer::capacity
generic::basic_endpoint, generic::basic_endpoint::capacity
ip::basic_endpoint, ip::basic_endpoint::capacity
local::basic_endpoint, local::basic_endpoint::capacity
category
error_code, error_code::category
cbegin
ip::basic_resolver_results, ip::basic_resolver_results::cbegin
cend
ip::basic_resolver_results, ip::basic_resolver_results::cend
character_size
serial_port_base::character_size, serial_port_base::character_size::character_size
clear
error_code, error_code::clear
signal_set, signal_set::clear
clear_options
ssl::context, ssl::context::clear_options
client
ssl::stream, ssl::stream::handshake_type
ssl::stream_base, ssl::stream_base::handshake_type
clock_type
basic_socket_iostream, basic_socket_iostream::clock_type
basic_socket_streambuf, basic_socket_streambuf::clock_type
basic_waitable_timer, basic_waitable_timer::clock_type
close
basic_datagram_socket, basic_datagram_socket::close
basic_raw_socket, basic_raw_socket::close
basic_seq_packet_socket, basic_seq_packet_socket::close
basic_socket, basic_socket::close
basic_socket_acceptor, basic_socket_acceptor::close
basic_socket_iostream, basic_socket_iostream::close
basic_socket_streambuf, basic_socket_streambuf::close
basic_stream_socket, basic_stream_socket::close
buffered_read_stream, buffered_read_stream::close
buffered_stream, buffered_stream::close
buffered_write_stream, buffered_write_stream::close
posix::descriptor, posix::descriptor::close
posix::stream_descriptor, posix::stream_descriptor::close
serial_port, serial_port::close
windows::object_handle, windows::object_handle::close
windows::overlapped_handle, windows::overlapped_handle::close
windows::random_access_handle, windows::random_access_handle::close
windows::stream_handle, windows::stream_handle::close
code
system_error, system_error::code
commit
basic_streambuf, basic_streambuf::commit
basic_streambuf_ref, basic_streambuf_ref::commit
dynamic_string_buffer, dynamic_string_buffer::commit
dynamic_vector_buffer, dynamic_vector_buffer::commit
complete
windows::overlapped_ptr, windows::overlapped_ptr::complete
completion_handler
async_completion, async_completion::completion_handler
completion_handler_type
async_completion, async_completion::completion_handler_type
async_result, async_result::completion_handler_type
async_result< std::packaged_task< Result(Args...)>, Signature >, async_result< std::packaged_task< Result(Args...)>, Signature >::completion_handler_type
connect, connect
basic_datagram_socket, basic_datagram_socket::connect
basic_raw_socket, basic_raw_socket::connect
basic_seq_packet_socket, basic_seq_packet_socket::connect
basic_socket, basic_socket::connect
basic_socket_iostream, basic_socket_iostream::connect
basic_socket_streambuf, basic_socket_streambuf::connect
basic_stream_socket, basic_stream_socket::connect
connection_aborted
error::basic_errors, error::basic_errors
connection_refused
error::basic_errors, error::basic_errors
connection_reset
error::basic_errors, error::basic_errors
const_buffer
const_buffer, const_buffer::const_buffer
const_buffers_1
const_buffers_1, const_buffers_1::const_buffers_1
const_buffers_type
basic_streambuf, basic_streambuf::const_buffers_type
basic_streambuf_ref, basic_streambuf_ref::const_buffers_type
dynamic_string_buffer, dynamic_string_buffer::const_buffers_type
dynamic_vector_buffer, dynamic_vector_buffer::const_buffers_type
const_iterator
const_buffers_1, const_buffers_1::const_iterator
ip::basic_resolver_results, ip::basic_resolver_results::const_iterator
mutable_buffers_1, mutable_buffers_1::const_iterator
null_buffers, null_buffers::const_iterator
const_reference
ip::basic_resolver_results, ip::basic_resolver_results::const_reference
consume
basic_streambuf, basic_streambuf::consume
basic_streambuf_ref, basic_streambuf_ref::consume
dynamic_string_buffer, dynamic_string_buffer::consume
dynamic_vector_buffer, dynamic_vector_buffer::consume
context
execution_context::service, execution_context::service::context
executor, executor::context
io_context::executor_type, io_context::executor_type::context
io_context::strand, io_context::strand::context
ssl::context, ssl::context::context
strand, strand::context
system_executor, system_executor::context
thread_pool::executor_type, thread_pool::executor_type::context
coroutine
coroutine, coroutine::coroutine
count_type
io_context, io_context::count_type

D

data
basic_streambuf, basic_streambuf::data
basic_streambuf_ref, basic_streambuf_ref::data
const_buffer, const_buffer::data
const_buffers_1, const_buffers_1::data
dynamic_string_buffer, dynamic_string_buffer::data
dynamic_vector_buffer, dynamic_vector_buffer::data
generic::basic_endpoint, generic::basic_endpoint::data
ip::basic_endpoint, ip::basic_endpoint::data
local::basic_endpoint, local::basic_endpoint::data
mutable_buffer, mutable_buffer::data
mutable_buffers_1, mutable_buffers_1::data
datagram_protocol
generic::datagram_protocol, generic::datagram_protocol::datagram_protocol
data_type
generic::basic_endpoint, generic::basic_endpoint::data_type
ip::basic_endpoint, ip::basic_endpoint::data_type
local::basic_endpoint, local::basic_endpoint::data_type
deadline_timer, deadline_timer
debug
basic_datagram_socket, basic_datagram_socket::debug
basic_raw_socket, basic_raw_socket::debug
basic_seq_packet_socket, basic_seq_packet_socket::debug
basic_socket, basic_socket::debug
basic_socket_acceptor, basic_socket_acceptor::debug
basic_stream_socket, basic_stream_socket::debug
socket_base, socket_base::debug
default_buffer_size
buffered_read_stream, buffered_read_stream::default_buffer_size
buffered_write_stream, buffered_write_stream::default_buffer_size
default_workarounds
ssl::context, ssl::context::default_workarounds
ssl::context_base, ssl::context_base::default_workarounds
defer, defer
executor, executor::defer
io_context::executor_type, io_context::executor_type::defer
io_context::strand, io_context::strand::defer
strand, strand::defer
system_executor, system_executor::defer
thread_pool::executor_type, thread_pool::executor_type::defer
dereference
ip::basic_resolver_iterator, ip::basic_resolver_iterator::dereference
ip::basic_resolver_results, ip::basic_resolver_results::dereference
descriptor
posix::descriptor, posix::descriptor::descriptor
destroy
execution_context, execution_context::destroy
io_context, io_context::destroy
system_context, system_context::destroy
thread_pool, thread_pool::destroy
detached_t
experimental::detached_t, experimental::detached_t::detached_t
difference_type
buffers_iterator, buffers_iterator::difference_type
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::difference_type
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::difference_type
ip::basic_resolver_iterator, ip::basic_resolver_iterator::difference_type
ip::basic_resolver_results, ip::basic_resolver_results::difference_type
dispatch, dispatch
executor, executor::dispatch
io_context, io_context::dispatch
io_context::executor_type, io_context::executor_type::dispatch
io_context::strand, io_context::strand::dispatch
strand, strand::dispatch
system_executor, system_executor::dispatch
thread_pool::executor_type, thread_pool::executor_type::dispatch
do_not_route
basic_datagram_socket, basic_datagram_socket::do_not_route
basic_raw_socket, basic_raw_socket::do_not_route
basic_seq_packet_socket, basic_seq_packet_socket::do_not_route
basic_socket, basic_socket::do_not_route
basic_socket_acceptor, basic_socket_acceptor::do_not_route
basic_stream_socket, basic_stream_socket::do_not_route
socket_base, socket_base::do_not_route
duration
basic_socket_iostream, basic_socket_iostream::duration
basic_socket_streambuf, basic_socket_streambuf::duration
basic_waitable_timer, basic_waitable_timer::duration
duration_type
basic_deadline_timer, basic_deadline_timer::duration_type
basic_socket_iostream, basic_socket_iostream::duration_type
basic_socket_streambuf, basic_socket_streambuf::duration_type
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::duration_type
dynamic_buffer, dynamic_buffer
dynamic_string_buffer
dynamic_string_buffer, dynamic_string_buffer::dynamic_string_buffer
dynamic_vector_buffer
dynamic_vector_buffer, dynamic_vector_buffer::dynamic_vector_buffer

E

ec_
experimental::redirect_error_t, experimental::redirect_error_t::ec_
empty
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::empty
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::empty
ip::basic_resolver_results, ip::basic_resolver_results::empty
enable_connection_aborted
basic_datagram_socket, basic_datagram_socket::enable_connection_aborted
basic_raw_socket, basic_raw_socket::enable_connection_aborted
basic_seq_packet_socket, basic_seq_packet_socket::enable_connection_aborted
basic_socket, basic_socket::enable_connection_aborted
basic_socket_acceptor, basic_socket_acceptor::enable_connection_aborted
basic_stream_socket, basic_stream_socket::enable_connection_aborted
socket_base, socket_base::enable_connection_aborted
end
buffers_iterator, buffers_iterator::end
const_buffers_1, const_buffers_1::end
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::end
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::end
ip::basic_resolver_results, ip::basic_resolver_results::end
mutable_buffers_1, mutable_buffers_1::end
null_buffers, null_buffers::end
endpoint
generic::datagram_protocol, generic::datagram_protocol::endpoint
generic::raw_protocol, generic::raw_protocol::endpoint
generic::seq_packet_protocol, generic::seq_packet_protocol::endpoint
generic::stream_protocol, generic::stream_protocol::endpoint
ip::basic_resolver_entry, ip::basic_resolver_entry::endpoint
ip::icmp, ip::icmp::endpoint
ip::tcp, ip::tcp::endpoint
ip::udp, ip::udp::endpoint
local::datagram_protocol, local::datagram_protocol::endpoint
local::stream_protocol, local::stream_protocol::endpoint
endpoint_type
basic_datagram_socket, basic_datagram_socket::endpoint_type
basic_raw_socket, basic_raw_socket::endpoint_type
basic_seq_packet_socket, basic_seq_packet_socket::endpoint_type
basic_socket, basic_socket::endpoint_type
basic_socket_acceptor, basic_socket_acceptor::endpoint_type
basic_socket_iostream, basic_socket_iostream::endpoint_type
basic_socket_streambuf, basic_socket_streambuf::endpoint_type
basic_stream_socket, basic_stream_socket::endpoint_type
ip::basic_resolver, ip::basic_resolver::endpoint_type
ip::basic_resolver_entry, ip::basic_resolver_entry::endpoint_type
ip::basic_resolver_results, ip::basic_resolver_results::endpoint_type
eof
error::misc_errors, error::misc_errors
equal
ip::basic_resolver_iterator, ip::basic_resolver_iterator::equal
ip::basic_resolver_results, ip::basic_resolver_results::equal
error
basic_socket_iostream, basic_socket_iostream::error
basic_socket_streambuf, basic_socket_streambuf::error
error::addrinfo_category, error::addrinfo_category
error::addrinfo_errors, error::addrinfo_errors
error::basic_errors, error::basic_errors
error::get_addrinfo_category, error::get_addrinfo_category
error::get_misc_category, error::get_misc_category
error::get_netdb_category, error::get_netdb_category
error::get_ssl_category, error::get_ssl_category
error::get_system_category, error::get_system_category
error::make_error_code, error::make_error_code
error::misc_category, error::misc_category
error::misc_errors, error::misc_errors
error::netdb_category, error::netdb_category
error::netdb_errors, error::netdb_errors
error::ssl_category, error::ssl_category
error::ssl_errors, error::ssl_errors
error::system_category, error::system_category
error_code
error_code, error_code::error_code
even
serial_port_base::parity, serial_port_base::parity::type
execution_context
execution_context, execution_context::execution_context
executor
executor, executor::executor
executor_arg, executor_arg
executor_arg_t
executor_arg_t, executor_arg_t::executor_arg_t
executor_binder
executor_binder, executor_binder::executor_binder
executor_type
basic_datagram_socket, basic_datagram_socket::executor_type
basic_deadline_timer, basic_deadline_timer::executor_type
basic_io_object, basic_io_object::executor_type
basic_raw_socket, basic_raw_socket::executor_type
basic_seq_packet_socket, basic_seq_packet_socket::executor_type
basic_socket, basic_socket::executor_type
basic_socket_acceptor, basic_socket_acceptor::executor_type
basic_stream_socket, basic_stream_socket::executor_type
basic_waitable_timer, basic_waitable_timer::executor_type
buffered_read_stream, buffered_read_stream::executor_type
buffered_stream, buffered_stream::executor_type
buffered_write_stream, buffered_write_stream::executor_type
executor_binder, executor_binder::executor_type
executor_work_guard, executor_work_guard::executor_type
experimental::awaitable, experimental::awaitable::executor_type
experimental::await_token, experimental::await_token::executor_type
ip::basic_resolver, ip::basic_resolver::executor_type
posix::descriptor, posix::descriptor::executor_type
posix::stream_descriptor, posix::stream_descriptor::executor_type
serial_port, serial_port::executor_type
signal_set, signal_set::executor_type
ssl::stream, ssl::stream::executor_type
system_context, system_context::executor_type
windows::object_handle, windows::object_handle::executor_type
windows::overlapped_handle, windows::overlapped_handle::executor_type
windows::random_access_handle, windows::random_access_handle::executor_type
windows::stream_handle, windows::stream_handle::executor_type
executor_work_guard
executor_work_guard, executor_work_guard::executor_work_guard
experimental::co_spawn, experimental::co_spawn
experimental::detached, experimental::detached
experimental::redirect_error, experimental::redirect_error
experimental::this_coro::executor, experimental::this_coro::executor
experimental::this_coro::token, experimental::this_coro::token
expires_after
basic_socket_iostream, basic_socket_iostream::expires_after
basic_socket_streambuf, basic_socket_streambuf::expires_after
basic_waitable_timer, basic_waitable_timer::expires_after
expires_at
basic_deadline_timer, basic_deadline_timer::expires_at
basic_socket_iostream, basic_socket_iostream::expires_at
basic_socket_streambuf, basic_socket_streambuf::expires_at
basic_waitable_timer, basic_waitable_timer::expires_at
expires_from_now
basic_deadline_timer, basic_deadline_timer::expires_from_now
basic_socket_iostream, basic_socket_iostream::expires_from_now
basic_socket_streambuf, basic_socket_streambuf::expires_from_now
basic_waitable_timer, basic_waitable_timer::expires_from_now
expiry
basic_socket_iostream, basic_socket_iostream::expiry
basic_socket_streambuf, basic_socket_streambuf::expiry
basic_waitable_timer, basic_waitable_timer::expiry

F

family
generic::datagram_protocol, generic::datagram_protocol::family
generic::raw_protocol, generic::raw_protocol::family
generic::seq_packet_protocol, generic::seq_packet_protocol::family
generic::stream_protocol, generic::stream_protocol::family
ip::icmp, ip::icmp::family
ip::tcp, ip::tcp::family
ip::udp, ip::udp::family
local::datagram_protocol, local::datagram_protocol::family
local::stream_protocol, local::stream_protocol::family
fault
error::basic_errors, error::basic_errors
fd_set_failure
error::misc_errors, error::misc_errors
file_format
ssl::context, ssl::context::file_format
ssl::context_base, ssl::context_base::file_format
fill
buffered_read_stream, buffered_read_stream::fill
buffered_stream, buffered_stream::fill
find
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::find
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::find
first_argument_type
executor_binder, executor_binder::first_argument_type
flags
ip::basic_resolver, ip::basic_resolver::flags
ip::basic_resolver_query, ip::basic_resolver_query::flags
ip::resolver_base, ip::resolver_base::flags
ip::resolver_query_base, ip::resolver_query_base::flags
flow_control
serial_port_base::flow_control, serial_port_base::flow_control::flow_control
flush
buffered_stream, buffered_stream::flush
buffered_write_stream, buffered_write_stream::flush
fork_child
execution_context, execution_context::fork_event
io_context, io_context::fork_event
system_context, system_context::fork_event
thread_pool, thread_pool::fork_event
fork_event
execution_context, execution_context::fork_event
io_context, io_context::fork_event
system_context, system_context::fork_event
thread_pool, thread_pool::fork_event
fork_parent
execution_context, execution_context::fork_event
io_context, io_context::fork_event
system_context, system_context::fork_event
thread_pool, thread_pool::fork_event
fork_prepare
execution_context, execution_context::fork_event
io_context, io_context::fork_event
system_context, system_context::fork_event
thread_pool, thread_pool::fork_event
for_reading
ssl::context, ssl::context::password_purpose
ssl::context_base, ssl::context_base::password_purpose
for_writing
ssl::context, ssl::context::password_purpose
ssl::context_base, ssl::context_base::password_purpose
from_string
ip::address, ip::address::from_string
ip::address_v4, ip::address_v4::from_string
ip::address_v6, ip::address_v6::from_string

G

get
associated_allocator, associated_allocator::get
associated_executor, associated_executor::get
async_result, async_result::get
async_result< Handler >, async_result< Handler >::get
async_result< std::packaged_task< Result(Args...)>, Signature >, async_result< std::packaged_task< Result(Args...)>, Signature >::get
executor_binder, executor_binder::get
windows::overlapped_ptr, windows::overlapped_ptr::get
get_allocator
use_future_t, use_future_t::get_allocator
get_associated_allocator, get_associated_allocator
get_associated_executor, get_associated_executor
get_executor
basic_datagram_socket, basic_datagram_socket::get_executor
basic_deadline_timer, basic_deadline_timer::get_executor
basic_io_object, basic_io_object::get_executor
basic_raw_socket, basic_raw_socket::get_executor
basic_seq_packet_socket, basic_seq_packet_socket::get_executor
basic_socket, basic_socket::get_executor
basic_socket_acceptor, basic_socket_acceptor::get_executor
basic_stream_socket, basic_stream_socket::get_executor
basic_waitable_timer, basic_waitable_timer::get_executor
buffered_read_stream, buffered_read_stream::get_executor
buffered_stream, buffered_stream::get_executor
buffered_write_stream, buffered_write_stream::get_executor
executor_binder, executor_binder::get_executor
executor_work_guard, executor_work_guard::get_executor
experimental::await_token, experimental::await_token::get_executor
io_context, io_context::get_executor
ip::basic_resolver, ip::basic_resolver::get_executor
posix::descriptor, posix::descriptor::get_executor
posix::stream_descriptor, posix::stream_descriptor::get_executor
serial_port, serial_port::get_executor
signal_set, signal_set::get_executor
ssl::stream, ssl::stream::get_executor
system_context, system_context::get_executor
thread_pool, thread_pool::get_executor
windows::object_handle, windows::object_handle::get_executor
windows::overlapped_handle, windows::overlapped_handle::get_executor
windows::random_access_handle, windows::random_access_handle::get_executor
windows::stream_handle, windows::stream_handle::get_executor
get_implementation
basic_io_object, basic_io_object::get_implementation
get_inner_executor
strand, strand::get_inner_executor
get_io_context
basic_datagram_socket, basic_datagram_socket::get_io_context
basic_deadline_timer, basic_deadline_timer::get_io_context
basic_io_object, basic_io_object::get_io_context
basic_raw_socket, basic_raw_socket::get_io_context
basic_seq_packet_socket, basic_seq_packet_socket::get_io_context
basic_socket, basic_socket::get_io_context
basic_socket_acceptor, basic_socket_acceptor::get_io_context
basic_stream_socket, basic_stream_socket::get_io_context
basic_waitable_timer, basic_waitable_timer::get_io_context
buffered_read_stream, buffered_read_stream::get_io_context
buffered_stream, buffered_stream::get_io_context
buffered_write_stream, buffered_write_stream::get_io_context
io_context::service, io_context::service::get_io_context
io_context::strand, io_context::strand::get_io_context
io_context::work, io_context::work::get_io_context
ip::basic_resolver, ip::basic_resolver::get_io_context
posix::descriptor, posix::descriptor::get_io_context
posix::stream_descriptor, posix::stream_descriptor::get_io_context
serial_port, serial_port::get_io_context
signal_set, signal_set::get_io_context
ssl::stream, ssl::stream::get_io_context
windows::object_handle, windows::object_handle::get_io_context
windows::overlapped_handle, windows::overlapped_handle::get_io_context
windows::random_access_handle, windows::random_access_handle::get_io_context
windows::stream_handle, windows::stream_handle::get_io_context
get_io_service
basic_datagram_socket, basic_datagram_socket::get_io_service
basic_deadline_timer, basic_deadline_timer::get_io_service
basic_io_object, basic_io_object::get_io_service
basic_raw_socket, basic_raw_socket::get_io_service
basic_seq_packet_socket, basic_seq_packet_socket::get_io_service
basic_socket, basic_socket::get_io_service
basic_socket_acceptor, basic_socket_acceptor::get_io_service
basic_stream_socket, basic_stream_socket::get_io_service
basic_waitable_timer, basic_waitable_timer::get_io_service
buffered_read_stream, buffered_read_stream::get_io_service
buffered_stream, buffered_stream::get_io_service
buffered_write_stream, buffered_write_stream::get_io_service
io_context::service, io_context::service::get_io_service
io_context::strand, io_context::strand::get_io_service
io_context::work, io_context::work::get_io_service
ip::basic_resolver, ip::basic_resolver::get_io_service
posix::descriptor, posix::descriptor::get_io_service
posix::stream_descriptor, posix::stream_descriptor::get_io_service
serial_port, serial_port::get_io_service
signal_set, signal_set::get_io_service
ssl::stream, ssl::stream::get_io_service
windows::object_handle, windows::object_handle::get_io_service
windows::overlapped_handle, windows::overlapped_handle::get_io_service
windows::random_access_handle, windows::random_access_handle::get_io_service
windows::stream_handle, windows::stream_handle::get_io_service
get_option
basic_datagram_socket, basic_datagram_socket::get_option
basic_raw_socket, basic_raw_socket::get_option
basic_seq_packet_socket, basic_seq_packet_socket::get_option
basic_socket, basic_socket::get_option
basic_socket_acceptor, basic_socket_acceptor::get_option
basic_stream_socket, basic_stream_socket::get_option
serial_port, serial_port::get_option
get_service
basic_io_object, basic_io_object::get_service

H

handshake
ssl::stream, ssl::stream::handshake
handshake_type
ssl::stream, ssl::stream::handshake_type
ssl::stream_base, ssl::stream_base::handshake_type
hardware
serial_port_base::flow_control, serial_port_base::flow_control::type
has_service, has_service
execution_context, execution_context::has_service
io_context, io_context::has_service
system_context, system_context::has_service
thread_pool, thread_pool::has_service
high_resolution_timer, high_resolution_timer
hints
ip::basic_resolver_query, ip::basic_resolver_query::hints
hosts
ip::network_v4, ip::network_v4::hosts
ip::network_v6, ip::network_v6::hosts
host_name
ip::basic_resolver_entry, ip::basic_resolver_entry::host_name
ip::basic_resolver_query, ip::basic_resolver_query::host_name
host_not_found
error::netdb_errors, error::netdb_errors
host_not_found_try_again
error::netdb_errors, error::netdb_errors
host_unreachable
error::basic_errors, error::basic_errors

I

id
execution_context::id, execution_context::id::id
implementation_type
basic_io_object, basic_io_object::implementation_type
increment
ip::basic_resolver_iterator, ip::basic_resolver_iterator::increment
ip::basic_resolver_results, ip::basic_resolver_results::increment
index_
ip::basic_resolver_iterator, ip::basic_resolver_iterator::index_
ip::basic_resolver_results, ip::basic_resolver_results::index_
inner_executor_type
strand, strand::inner_executor_type
interrupted
error::basic_errors, error::basic_errors
invalid_argument
error::basic_errors, error::basic_errors
invalid_service_owner
invalid_service_owner, invalid_service_owner::invalid_service_owner
in_avail
buffered_read_stream, buffered_read_stream::in_avail
buffered_stream, buffered_stream::in_avail
buffered_write_stream, buffered_write_stream::in_avail
in_progress
error::basic_errors, error::basic_errors
iostream
generic::stream_protocol, generic::stream_protocol::iostream
ip::tcp, ip::tcp::iostream
local::stream_protocol, local::stream_protocol::iostream
io_context
io_context, io_context::io_context
io_control
basic_datagram_socket, basic_datagram_socket::io_control
basic_raw_socket, basic_raw_socket::io_control
basic_seq_packet_socket, basic_seq_packet_socket::io_control
basic_socket, basic_socket::io_control
basic_socket_acceptor, basic_socket_acceptor::io_control
basic_stream_socket, basic_stream_socket::io_control
posix::descriptor, posix::descriptor::io_control
posix::stream_descriptor, posix::stream_descriptor::io_control
io_service, io_service
ip::address_v4_iterator, ip::address_v4_iterator
ip::address_v4_range, ip::address_v4_range
ip::address_v6_iterator, ip::address_v6_iterator
ip::address_v6_range, ip::address_v6_range
ip::host_name, ip::host_name
ip::multicast::enable_loopback, ip::multicast::enable_loopback
ip::multicast::hops, ip::multicast::hops
ip::multicast::join_group, ip::multicast::join_group
ip::multicast::leave_group, ip::multicast::leave_group
ip::multicast::outbound_interface, ip::multicast::outbound_interface
ip::unicast::hops, ip::unicast::hops
ip::v4_mapped_t, ip::v4_mapped_t
ip::v6_only, ip::v6_only
is_child
coroutine, coroutine::is_child
is_class_a
ip::address_v4, ip::address_v4::is_class_a
is_class_b
ip::address_v4, ip::address_v4::is_class_b
is_class_c
ip::address_v4, ip::address_v4::is_class_c
is_complete
coroutine, coroutine::is_complete
is_host
ip::network_v4, ip::network_v4::is_host
ip::network_v6, ip::network_v6::is_host
is_link_local
ip::address_v6, ip::address_v6::is_link_local
is_loopback
ip::address, ip::address::is_loopback
ip::address_v4, ip::address_v4::is_loopback
ip::address_v6, ip::address_v6::is_loopback
is_multicast
ip::address, ip::address::is_multicast
ip::address_v4, ip::address_v4::is_multicast
ip::address_v6, ip::address_v6::is_multicast
is_multicast_global
ip::address_v6, ip::address_v6::is_multicast_global
is_multicast_link_local
ip::address_v6, ip::address_v6::is_multicast_link_local
is_multicast_node_local
ip::address_v6, ip::address_v6::is_multicast_node_local
is_multicast_org_local
ip::address_v6, ip::address_v6::is_multicast_org_local
is_multicast_site_local
ip::address_v6, ip::address_v6::is_multicast_site_local
is_open
basic_datagram_socket, basic_datagram_socket::is_open
basic_raw_socket, basic_raw_socket::is_open
basic_seq_packet_socket, basic_seq_packet_socket::is_open
basic_socket, basic_socket::is_open
basic_socket_acceptor, basic_socket_acceptor::is_open
basic_stream_socket, basic_stream_socket::is_open
posix::descriptor, posix::descriptor::is_open
posix::stream_descriptor, posix::stream_descriptor::is_open
serial_port, serial_port::is_open
windows::object_handle, windows::object_handle::is_open
windows::overlapped_handle, windows::overlapped_handle::is_open
windows::random_access_handle, windows::random_access_handle::is_open
windows::stream_handle, windows::stream_handle::is_open
is_parent
coroutine, coroutine::is_parent
is_site_local
ip::address_v6, ip::address_v6::is_site_local
is_subnet_of
ip::network_v4, ip::network_v4::is_subnet_of
ip::network_v6, ip::network_v6::is_subnet_of
is_unspecified
ip::address, ip::address::is_unspecified
ip::address_v4, ip::address_v4::is_unspecified
ip::address_v6, ip::address_v6::is_unspecified
is_v4
ip::address, ip::address::is_v4
is_v4_compatible
ip::address_v6, ip::address_v6::is_v4_compatible
is_v4_mapped
ip::address_v6, ip::address_v6::is_v4_mapped
is_v6
ip::address, ip::address::is_v6
iterator
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::iterator
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::iterator
ip::basic_resolver, ip::basic_resolver::iterator
ip::basic_resolver_results, ip::basic_resolver_results::iterator
iterator_category
buffers_iterator, buffers_iterator::iterator_category
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::iterator_category
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::iterator_category
ip::basic_resolver_iterator, ip::basic_resolver_iterator::iterator_category
ip::basic_resolver_results, ip::basic_resolver_results::iterator_category

J

join
system_context, system_context::join
thread, thread::join
thread_pool, thread_pool::join

K

keep_alive
basic_datagram_socket, basic_datagram_socket::keep_alive
basic_raw_socket, basic_raw_socket::keep_alive
basic_seq_packet_socket, basic_seq_packet_socket::keep_alive
basic_socket, basic_socket::keep_alive
basic_socket_acceptor, basic_socket_acceptor::keep_alive
basic_stream_socket, basic_stream_socket::keep_alive
socket_base, socket_base::keep_alive

L

less_than
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::less_than
linger
basic_datagram_socket, basic_datagram_socket::linger
basic_raw_socket, basic_raw_socket::linger
basic_seq_packet_socket, basic_seq_packet_socket::linger
basic_socket, basic_socket::linger
basic_socket_acceptor, basic_socket_acceptor::linger
basic_stream_socket, basic_stream_socket::linger
socket_base, socket_base::linger
listen
basic_socket_acceptor, basic_socket_acceptor::listen
load
serial_port_base::baud_rate, serial_port_base::baud_rate::load
serial_port_base::character_size, serial_port_base::character_size::load
serial_port_base::flow_control, serial_port_base::flow_control::load
serial_port_base::parity, serial_port_base::parity::load
serial_port_base::stop_bits, serial_port_base::stop_bits::load
load_verify_file
ssl::context, ssl::context::load_verify_file
local::connect_pair, local::connect_pair
local_endpoint
basic_datagram_socket, basic_datagram_socket::local_endpoint
basic_raw_socket, basic_raw_socket::local_endpoint
basic_seq_packet_socket, basic_seq_packet_socket::local_endpoint
basic_socket, basic_socket::local_endpoint
basic_socket_acceptor, basic_socket_acceptor::local_endpoint
basic_stream_socket, basic_stream_socket::local_endpoint
loopback
ip::address_v4, ip::address_v4::loopback
ip::address_v6, ip::address_v6::loopback
lowest_layer
basic_datagram_socket, basic_datagram_socket::lowest_layer
basic_raw_socket, basic_raw_socket::lowest_layer
basic_seq_packet_socket, basic_seq_packet_socket::lowest_layer
basic_socket, basic_socket::lowest_layer
basic_stream_socket, basic_stream_socket::lowest_layer
buffered_read_stream, buffered_read_stream::lowest_layer
buffered_stream, buffered_stream::lowest_layer
buffered_write_stream, buffered_write_stream::lowest_layer
posix::descriptor, posix::descriptor::lowest_layer
posix::stream_descriptor, posix::stream_descriptor::lowest_layer
serial_port, serial_port::lowest_layer
ssl::stream, ssl::stream::lowest_layer
windows::object_handle, windows::object_handle::lowest_layer
windows::overlapped_handle, windows::overlapped_handle::lowest_layer
windows::random_access_handle, windows::random_access_handle::lowest_layer
windows::stream_handle, windows::stream_handle::lowest_layer
lowest_layer_type
basic_datagram_socket, basic_datagram_socket::lowest_layer_type
basic_raw_socket, basic_raw_socket::lowest_layer_type
basic_seq_packet_socket, basic_seq_packet_socket::lowest_layer_type
basic_socket, basic_socket::lowest_layer_type
basic_stream_socket, basic_stream_socket::lowest_layer_type
buffered_read_stream, buffered_read_stream::lowest_layer_type
buffered_stream, buffered_stream::lowest_layer_type
buffered_write_stream, buffered_write_stream::lowest_layer_type
posix::descriptor, posix::descriptor::lowest_layer_type
posix::stream_descriptor, posix::stream_descriptor::lowest_layer_type
serial_port, serial_port::lowest_layer_type
ssl::stream, ssl::stream::lowest_layer_type
windows::object_handle, windows::object_handle::lowest_layer_type
windows::overlapped_handle, windows::overlapped_handle::lowest_layer_type
windows::random_access_handle, windows::random_access_handle::lowest_layer_type
windows::stream_handle, windows::stream_handle::lowest_layer_type

M

make_address
ip::address, ip::address::make_address
make_address_v4
ip::address_v4, ip::address_v4::make_address_v4
make_address_v6
ip::address_v6, ip::address_v6::make_address_v6
make_network_v4
ip::address_v4, ip::address_v4::make_network_v4
ip::network_v4, ip::network_v4::make_network_v4
make_network_v6
ip::address_v6, ip::address_v6::make_network_v6
ip::network_v6, ip::network_v6::make_network_v6
make_service
execution_context, execution_context::make_service
io_context, io_context::make_service
system_context, system_context::make_service
thread_pool, thread_pool::make_service
make_work_guard, make_work_guard
max_connections
basic_datagram_socket, basic_datagram_socket::max_connections
basic_raw_socket, basic_raw_socket::max_connections
basic_seq_packet_socket, basic_seq_packet_socket::max_connections
basic_socket, basic_socket::max_connections
basic_socket_acceptor, basic_socket_acceptor::max_connections
basic_stream_socket, basic_stream_socket::max_connections
socket_base, socket_base::max_connections
max_listen_connections
basic_datagram_socket, basic_datagram_socket::max_listen_connections
basic_raw_socket, basic_raw_socket::max_listen_connections
basic_seq_packet_socket, basic_seq_packet_socket::max_listen_connections
basic_socket, basic_socket::max_listen_connections
basic_socket_acceptor, basic_socket_acceptor::max_listen_connections
basic_stream_socket, basic_stream_socket::max_listen_connections
socket_base, socket_base::max_listen_connections
max_size
basic_streambuf, basic_streambuf::max_size
basic_streambuf_ref, basic_streambuf_ref::max_size
dynamic_string_buffer, dynamic_string_buffer::max_size
dynamic_vector_buffer, dynamic_vector_buffer::max_size
ip::basic_resolver_results, ip::basic_resolver_results::max_size
message
error_category, error_category::message
error_code, error_code::message
message_do_not_route
basic_datagram_socket, basic_datagram_socket::message_do_not_route
basic_raw_socket, basic_raw_socket::message_do_not_route
basic_seq_packet_socket, basic_seq_packet_socket::message_do_not_route
basic_socket, basic_socket::message_do_not_route
basic_socket_acceptor, basic_socket_acceptor::message_do_not_route
basic_stream_socket, basic_stream_socket::message_do_not_route
socket_base, socket_base::message_do_not_route
message_end_of_record
basic_datagram_socket, basic_datagram_socket::message_end_of_record
basic_raw_socket, basic_raw_socket::message_end_of_record
basic_seq_packet_socket, basic_seq_packet_socket::message_end_of_record
basic_socket, basic_socket::message_end_of_record
basic_socket_acceptor, basic_socket_acceptor::message_end_of_record
basic_stream_socket, basic_stream_socket::message_end_of_record
socket_base, socket_base::message_end_of_record
message_flags
basic_datagram_socket, basic_datagram_socket::message_flags
basic_raw_socket, basic_raw_socket::message_flags
basic_seq_packet_socket, basic_seq_packet_socket::message_flags
basic_socket, basic_socket::message_flags
basic_socket_acceptor, basic_socket_acceptor::message_flags
basic_stream_socket, basic_stream_socket::message_flags
socket_base, socket_base::message_flags
message_out_of_band
basic_datagram_socket, basic_datagram_socket::message_out_of_band
basic_raw_socket, basic_raw_socket::message_out_of_band
basic_seq_packet_socket, basic_seq_packet_socket::message_out_of_band
basic_socket, basic_socket::message_out_of_band
basic_socket_acceptor, basic_socket_acceptor::message_out_of_band
basic_stream_socket, basic_stream_socket::message_out_of_band
socket_base, socket_base::message_out_of_band
message_peek
basic_datagram_socket, basic_datagram_socket::message_peek
basic_raw_socket, basic_raw_socket::message_peek
basic_seq_packet_socket, basic_seq_packet_socket::message_peek
basic_socket, basic_socket::message_peek
basic_socket_acceptor, basic_socket_acceptor::message_peek
basic_stream_socket, basic_stream_socket::message_peek
socket_base, socket_base::message_peek
message_size
error::basic_errors, error::basic_errors
method
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
mutable_buffer
mutable_buffer, mutable_buffer::mutable_buffer
mutable_buffers_1
mutable_buffers_1, mutable_buffers_1::mutable_buffers_1
mutable_buffers_type
basic_streambuf, basic_streambuf::mutable_buffers_type
basic_streambuf_ref, basic_streambuf_ref::mutable_buffers_type
dynamic_string_buffer, dynamic_string_buffer::mutable_buffers_type
dynamic_vector_buffer, dynamic_vector_buffer::mutable_buffers_type

N

name
error_category, error_category::name
name_too_long
error::basic_errors, error::basic_errors
native_handle
basic_datagram_socket, basic_datagram_socket::native_handle
basic_raw_socket, basic_raw_socket::native_handle
basic_seq_packet_socket, basic_seq_packet_socket::native_handle
basic_socket, basic_socket::native_handle
basic_socket_acceptor, basic_socket_acceptor::native_handle
basic_stream_socket, basic_stream_socket::native_handle
posix::descriptor, posix::descriptor::native_handle
posix::stream_descriptor, posix::stream_descriptor::native_handle
serial_port, serial_port::native_handle
ssl::context, ssl::context::native_handle
ssl::stream, ssl::stream::native_handle
ssl::verify_context, ssl::verify_context::native_handle
windows::object_handle, windows::object_handle::native_handle
windows::overlapped_handle, windows::overlapped_handle::native_handle
windows::random_access_handle, windows::random_access_handle::native_handle
windows::stream_handle, windows::stream_handle::native_handle
native_handle_type
basic_datagram_socket, basic_datagram_socket::native_handle_type
basic_raw_socket, basic_raw_socket::native_handle_type
basic_seq_packet_socket, basic_seq_packet_socket::native_handle_type
basic_socket, basic_socket::native_handle_type
basic_socket_acceptor, basic_socket_acceptor::native_handle_type
basic_stream_socket, basic_stream_socket::native_handle_type
posix::descriptor, posix::descriptor::native_handle_type
posix::stream_descriptor, posix::stream_descriptor::native_handle_type
serial_port, serial_port::native_handle_type
ssl::context, ssl::context::native_handle_type
ssl::stream, ssl::stream::native_handle_type
ssl::verify_context, ssl::verify_context::native_handle_type
windows::object_handle, windows::object_handle::native_handle_type
windows::overlapped_handle, windows::overlapped_handle::native_handle_type
windows::random_access_handle, windows::random_access_handle::native_handle_type
windows::stream_handle, windows::stream_handle::native_handle_type
native_non_blocking
basic_datagram_socket, basic_datagram_socket::native_non_blocking
basic_raw_socket, basic_raw_socket::native_non_blocking
basic_seq_packet_socket, basic_seq_packet_socket::native_non_blocking
basic_socket, basic_socket::native_non_blocking
basic_socket_acceptor, basic_socket_acceptor::native_non_blocking
basic_stream_socket, basic_stream_socket::native_non_blocking
posix::descriptor, posix::descriptor::native_non_blocking
posix::stream_descriptor, posix::stream_descriptor::native_non_blocking
netmask
ip::address_v4, ip::address_v4::netmask
ip::network_v4, ip::network_v4::netmask
network
ip::network_v4, ip::network_v4::network
ip::network_v6, ip::network_v6::network
network_down
error::basic_errors, error::basic_errors
network_reset
error::basic_errors, error::basic_errors
network_unreachable
error::basic_errors, error::basic_errors
network_v4
ip::network_v4, ip::network_v4::network_v4
network_v6
ip::network_v6, ip::network_v6::network_v6
next_layer
buffered_read_stream, buffered_read_stream::next_layer
buffered_stream, buffered_stream::next_layer
buffered_write_stream, buffered_write_stream::next_layer
ssl::stream, ssl::stream::next_layer
next_layer_type
buffered_read_stream, buffered_read_stream::next_layer_type
buffered_stream, buffered_stream::next_layer_type
buffered_write_stream, buffered_write_stream::next_layer_type
ssl::stream, ssl::stream::next_layer_type
none
serial_port_base::flow_control, serial_port_base::flow_control::type
serial_port_base::parity, serial_port_base::parity::type
non_blocking
basic_datagram_socket, basic_datagram_socket::non_blocking
basic_raw_socket, basic_raw_socket::non_blocking
basic_seq_packet_socket, basic_seq_packet_socket::non_blocking
basic_socket, basic_socket::non_blocking
basic_socket_acceptor, basic_socket_acceptor::non_blocking
basic_stream_socket, basic_stream_socket::non_blocking
posix::descriptor, posix::descriptor::non_blocking
posix::stream_descriptor, posix::stream_descriptor::non_blocking
notify_fork
execution_context, execution_context::notify_fork
execution_context::service, execution_context::service::notify_fork
io_context, io_context::notify_fork
system_context, system_context::notify_fork
thread_pool, thread_pool::notify_fork
not_connected
error::basic_errors, error::basic_errors
not_found
error::misc_errors, error::misc_errors
not_socket
error::basic_errors, error::basic_errors
now
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::now
no_buffer_space
error::basic_errors, error::basic_errors
no_compression
ssl::context, ssl::context::no_compression
ssl::context_base, ssl::context_base::no_compression
no_data
error::netdb_errors, error::netdb_errors
no_delay
ip::tcp, ip::tcp::no_delay
no_descriptors
error::basic_errors, error::basic_errors
no_memory
error::basic_errors, error::basic_errors
no_permission
error::basic_errors, error::basic_errors
no_protocol_option
error::basic_errors, error::basic_errors
no_recovery
error::netdb_errors, error::netdb_errors
no_sslv2
ssl::context, ssl::context::no_sslv2
ssl::context_base, ssl::context_base::no_sslv2
no_sslv3
ssl::context, ssl::context::no_sslv3
ssl::context_base, ssl::context_base::no_sslv3
no_such_device
error::basic_errors, error::basic_errors
no_tlsv1
ssl::context, ssl::context::no_tlsv1
ssl::context_base, ssl::context_base::no_tlsv1
no_tlsv1_1
ssl::context, ssl::context::no_tlsv1_1
ssl::context_base, ssl::context_base::no_tlsv1_1
no_tlsv1_2
ssl::context, ssl::context::no_tlsv1_2
ssl::context_base, ssl::context_base::no_tlsv1_2
no_tlsv1_3
ssl::context, ssl::context::no_tlsv1_3
ssl::context_base, ssl::context_base::no_tlsv1_3
numeric_host
ip::basic_resolver, ip::basic_resolver::numeric_host
ip::basic_resolver_query, ip::basic_resolver_query::numeric_host
ip::resolver_base, ip::resolver_base::numeric_host
ip::resolver_query_base, ip::resolver_query_base::numeric_host
numeric_service
ip::basic_resolver, ip::basic_resolver::numeric_service
ip::basic_resolver_query, ip::basic_resolver_query::numeric_service
ip::resolver_base, ip::resolver_base::numeric_service
ip::resolver_query_base, ip::resolver_query_base::numeric_service

O

object_handle
windows::object_handle, windows::object_handle::object_handle
odd
serial_port_base::parity, serial_port_base::parity::type
one
serial_port_base::stop_bits, serial_port_base::stop_bits::type
onepointfive
serial_port_base::stop_bits, serial_port_base::stop_bits::type
on_work_finished
executor, executor::on_work_finished
io_context::executor_type, io_context::executor_type::on_work_finished
io_context::strand, io_context::strand::on_work_finished
strand, strand::on_work_finished
system_executor, system_executor::on_work_finished
thread_pool::executor_type, thread_pool::executor_type::on_work_finished
on_work_started
executor, executor::on_work_started
io_context::executor_type, io_context::executor_type::on_work_started
io_context::strand, io_context::strand::on_work_started
strand, strand::on_work_started
system_executor, system_executor::on_work_started
thread_pool::executor_type, thread_pool::executor_type::on_work_started
open
basic_datagram_socket, basic_datagram_socket::open
basic_raw_socket, basic_raw_socket::open
basic_seq_packet_socket, basic_seq_packet_socket::open
basic_socket, basic_socket::open
basic_socket_acceptor, basic_socket_acceptor::open
basic_stream_socket, basic_stream_socket::open
serial_port, serial_port::open
operation_aborted
error::basic_errors, error::basic_errors
operation_not_supported
error::basic_errors, error::basic_errors
operator *
buffers_iterator, buffers_iterator::operator *
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator *
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator *
ip::basic_resolver_iterator, ip::basic_resolver_iterator::operator *
ip::basic_resolver_results, ip::basic_resolver_results::operator *
operator endpoint_type
ip::basic_resolver_entry, ip::basic_resolver_entry::operator endpoint_type
operator unspecified_bool_type
error_code, error_code::operator unspecified_bool_type
executor, executor::operator unspecified_bool_type
operator!
error_code, error_code::operator!
operator!=
buffers_iterator, buffers_iterator::operator!=
error_category, error_category::operator!=
error_code, error_code::operator!=
executor, executor::operator!=
generic::basic_endpoint, generic::basic_endpoint::operator!=
generic::datagram_protocol, generic::datagram_protocol::operator!=
generic::raw_protocol, generic::raw_protocol::operator!=
generic::seq_packet_protocol, generic::seq_packet_protocol::operator!=
generic::stream_protocol, generic::stream_protocol::operator!=
io_context::executor_type, io_context::executor_type::operator!=
io_context::strand, io_context::strand::operator!=
ip::address, ip::address::operator!=
ip::address_v4, ip::address_v4::operator!=
ip::address_v6, ip::address_v6::operator!=
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator!=
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator!=
ip::basic_endpoint, ip::basic_endpoint::operator!=
ip::basic_resolver_iterator, ip::basic_resolver_iterator::operator!=
ip::basic_resolver_results, ip::basic_resolver_results::operator!=
ip::icmp, ip::icmp::operator!=
ip::network_v4, ip::network_v4::operator!=
ip::network_v6, ip::network_v6::operator!=
ip::tcp, ip::tcp::operator!=
ip::udp, ip::udp::operator!=
local::basic_endpoint, local::basic_endpoint::operator!=
strand, strand::operator!=
system_executor, system_executor::operator!=
thread_pool::executor_type, thread_pool::executor_type::operator!=
operator()
executor_binder, executor_binder::operator()
ssl::rfc2818_verification, ssl::rfc2818_verification::operator()
use_future_t, use_future_t::operator()
operator+
buffers_iterator, buffers_iterator::operator+
const_buffer, const_buffer::operator+
const_buffers_1, const_buffers_1::operator+
mutable_buffer, mutable_buffer::operator+
mutable_buffers_1, mutable_buffers_1::operator+
operator++
buffers_iterator, buffers_iterator::operator++
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator++
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator++
ip::basic_resolver_iterator, ip::basic_resolver_iterator::operator++
ip::basic_resolver_results, ip::basic_resolver_results::operator++
operator+=
buffers_iterator, buffers_iterator::operator+=
const_buffer, const_buffer::operator+=
const_buffers_1, const_buffers_1::operator+=
mutable_buffer, mutable_buffer::operator+=
mutable_buffers_1, mutable_buffers_1::operator+=
operator-
buffers_iterator, buffers_iterator::operator-
operator--
buffers_iterator, buffers_iterator::operator--
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator--
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator--
operator-=
buffers_iterator, buffers_iterator::operator-=
operator->
buffers_iterator, buffers_iterator::operator->
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator->
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator->
ip::basic_resolver_iterator, ip::basic_resolver_iterator::operator->
ip::basic_resolver_results, ip::basic_resolver_results::operator->
operator<
buffers_iterator, buffers_iterator::operator<
generic::basic_endpoint, generic::basic_endpoint::operator<
ip::address, ip::address::operator<
ip::address_v4, ip::address_v4::operator<
ip::address_v6, ip::address_v6::operator<
ip::basic_endpoint, ip::basic_endpoint::operator<
local::basic_endpoint, local::basic_endpoint::operator<
operator<<, operator<<
ip::address, ip::address::operator<<
ip::address_v4, ip::address_v4::operator<<
ip::address_v6, ip::address_v6::operator<<
ip::basic_endpoint, ip::basic_endpoint::operator<<
local::basic_endpoint, local::basic_endpoint::operator<<
operator<=
buffers_iterator, buffers_iterator::operator<=
generic::basic_endpoint, generic::basic_endpoint::operator<=
ip::address, ip::address::operator<=
ip::address_v4, ip::address_v4::operator<=
ip::address_v6, ip::address_v6::operator<=
ip::basic_endpoint, ip::basic_endpoint::operator<=
local::basic_endpoint, local::basic_endpoint::operator<=
operator=
basic_datagram_socket, basic_datagram_socket::operator=
basic_deadline_timer, basic_deadline_timer::operator=
basic_io_object, basic_io_object::operator=
basic_raw_socket, basic_raw_socket::operator=
basic_seq_packet_socket, basic_seq_packet_socket::operator=
basic_socket, basic_socket::operator=
basic_socket_acceptor, basic_socket_acceptor::operator=
basic_socket_iostream, basic_socket_iostream::operator=
basic_socket_streambuf, basic_socket_streambuf::operator=
basic_stream_socket, basic_stream_socket::operator=
basic_waitable_timer, basic_waitable_timer::operator=
executor, executor::operator=
generic::basic_endpoint, generic::basic_endpoint::operator=
ip::address, ip::address::operator=
ip::address_v4, ip::address_v4::operator=
ip::address_v6, ip::address_v6::operator=
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator=
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator=
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::operator=
ip::basic_address_range< address_v6 >, ip::basic_address_range< address_v6 >::operator=
ip::basic_endpoint, ip::basic_endpoint::operator=
ip::basic_resolver, ip::basic_resolver::operator=
ip::basic_resolver_iterator, ip::basic_resolver_iterator::operator=
ip::basic_resolver_results, ip::basic_resolver_results::operator=
ip::network_v4, ip::network_v4::operator=
ip::network_v6, ip::network_v6::operator=
local::basic_endpoint, local::basic_endpoint::operator=
posix::descriptor, posix::descriptor::operator=
posix::stream_descriptor, posix::stream_descriptor::operator=
serial_port, serial_port::operator=
ssl::context, ssl::context::operator=
strand, strand::operator=
system_error, system_error::operator=
windows::object_handle, windows::object_handle::operator=
windows::overlapped_handle, windows::overlapped_handle::operator=
windows::random_access_handle, windows::random_access_handle::operator=
windows::stream_handle, windows::stream_handle::operator=
operator==
buffers_iterator, buffers_iterator::operator==
error_category, error_category::operator==
error_code, error_code::operator==
executor, executor::operator==
generic::basic_endpoint, generic::basic_endpoint::operator==
generic::datagram_protocol, generic::datagram_protocol::operator==
generic::raw_protocol, generic::raw_protocol::operator==
generic::seq_packet_protocol, generic::seq_packet_protocol::operator==
generic::stream_protocol, generic::stream_protocol::operator==
io_context::executor_type, io_context::executor_type::operator==
io_context::strand, io_context::strand::operator==
ip::address, ip::address::operator==
ip::address_v4, ip::address_v4::operator==
ip::address_v6, ip::address_v6::operator==
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::operator==
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::operator==
ip::basic_endpoint, ip::basic_endpoint::operator==
ip::basic_resolver_iterator, ip::basic_resolver_iterator::operator==
ip::basic_resolver_results, ip::basic_resolver_results::operator==
ip::icmp, ip::icmp::operator==
ip::network_v4, ip::network_v4::operator==
ip::network_v6, ip::network_v6::operator==
ip::tcp, ip::tcp::operator==
ip::udp, ip::udp::operator==
local::basic_endpoint, local::basic_endpoint::operator==
strand, strand::operator==
system_executor, system_executor::operator==
thread_pool::executor_type, thread_pool::executor_type::operator==
operator>
buffers_iterator, buffers_iterator::operator>
generic::basic_endpoint, generic::basic_endpoint::operator>
ip::address, ip::address::operator>
ip::address_v4, ip::address_v4::operator>
ip::address_v6, ip::address_v6::operator>
ip::basic_endpoint, ip::basic_endpoint::operator>
local::basic_endpoint, local::basic_endpoint::operator>
operator>=
buffers_iterator, buffers_iterator::operator>=
generic::basic_endpoint, generic::basic_endpoint::operator>=
ip::address, ip::address::operator>=
ip::address_v4, ip::address_v4::operator>=
ip::address_v6, ip::address_v6::operator>=
ip::basic_endpoint, ip::basic_endpoint::operator>=
local::basic_endpoint, local::basic_endpoint::operator>=
operator[]
basic_yield_context, basic_yield_context::operator[]
buffers_iterator, buffers_iterator::operator[]
use_future_t, use_future_t::operator[]
options
ssl::context, ssl::context::options
ssl::context_base, ssl::context_base::options
out_of_band_inline
basic_datagram_socket, basic_datagram_socket::out_of_band_inline
basic_raw_socket, basic_raw_socket::out_of_band_inline
basic_seq_packet_socket, basic_seq_packet_socket::out_of_band_inline
basic_socket, basic_socket::out_of_band_inline
basic_socket_acceptor, basic_socket_acceptor::out_of_band_inline
basic_stream_socket, basic_stream_socket::out_of_band_inline
socket_base, socket_base::out_of_band_inline
overflow
basic_socket_streambuf, basic_socket_streambuf::overflow
basic_streambuf, basic_streambuf::overflow
overlapped_handle
windows::overlapped_handle, windows::overlapped_handle::overlapped_handle
overlapped_ptr
windows::overlapped_ptr, windows::overlapped_ptr::overlapped_ptr
owns_work
executor_work_guard, executor_work_guard::owns_work

P

parity
serial_port_base::parity, serial_port_base::parity::parity
passive
ip::basic_resolver, ip::basic_resolver::passive
ip::basic_resolver_query, ip::basic_resolver_query::passive
ip::resolver_base, ip::resolver_base::passive
ip::resolver_query_base, ip::resolver_query_base::passive
password_purpose
ssl::context, ssl::context::password_purpose
ssl::context_base, ssl::context_base::password_purpose
path
local::basic_endpoint, local::basic_endpoint::path
peek
buffered_read_stream, buffered_read_stream::peek
buffered_stream, buffered_stream::peek
buffered_write_stream, buffered_write_stream::peek
pem
ssl::context, ssl::context::file_format
ssl::context_base, ssl::context_base::file_format
placeholders::bytes_transferred, placeholders::bytes_transferred
placeholders::endpoint, placeholders::endpoint
placeholders::error, placeholders::error
placeholders::iterator, placeholders::iterator
placeholders::results, placeholders::results
placeholders::signal_number, placeholders::signal_number
pointer
buffers_iterator, buffers_iterator::pointer
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::pointer
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::pointer
ip::basic_resolver_iterator, ip::basic_resolver_iterator::pointer
ip::basic_resolver_results, ip::basic_resolver_results::pointer
poll
io_context, io_context::poll
poll_one
io_context, io_context::poll_one
port
ip::basic_endpoint, ip::basic_endpoint::port
post, post
executor, executor::post
io_context, io_context::post
io_context::executor_type, io_context::executor_type::post
io_context::strand, io_context::strand::post
strand, strand::post
system_executor, system_executor::post
thread_pool::executor_type, thread_pool::executor_type::post
prefix_length
ip::network_v4, ip::network_v4::prefix_length
ip::network_v6, ip::network_v6::prefix_length
prepare
basic_streambuf, basic_streambuf::prepare
basic_streambuf_ref, basic_streambuf_ref::prepare
dynamic_string_buffer, dynamic_string_buffer::prepare
dynamic_vector_buffer, dynamic_vector_buffer::prepare
protocol
generic::basic_endpoint, generic::basic_endpoint::protocol
generic::datagram_protocol, generic::datagram_protocol::protocol
generic::raw_protocol, generic::raw_protocol::protocol
generic::seq_packet_protocol, generic::seq_packet_protocol::protocol
generic::stream_protocol, generic::stream_protocol::protocol
ip::basic_endpoint, ip::basic_endpoint::protocol
ip::icmp, ip::icmp::protocol
ip::tcp, ip::tcp::protocol
ip::udp, ip::udp::protocol
local::basic_endpoint, local::basic_endpoint::protocol
local::datagram_protocol, local::datagram_protocol::protocol
local::stream_protocol, local::stream_protocol::protocol
protocol_type
basic_datagram_socket, basic_datagram_socket::protocol_type
basic_raw_socket, basic_raw_socket::protocol_type
basic_seq_packet_socket, basic_seq_packet_socket::protocol_type
basic_socket, basic_socket::protocol_type
basic_socket_acceptor, basic_socket_acceptor::protocol_type
basic_socket_iostream, basic_socket_iostream::protocol_type
basic_socket_streambuf, basic_socket_streambuf::protocol_type
basic_stream_socket, basic_stream_socket::protocol_type
generic::basic_endpoint, generic::basic_endpoint::protocol_type
ip::basic_endpoint, ip::basic_endpoint::protocol_type
ip::basic_resolver, ip::basic_resolver::protocol_type
ip::basic_resolver_entry, ip::basic_resolver_entry::protocol_type
ip::basic_resolver_query, ip::basic_resolver_query::protocol_type
ip::basic_resolver_results, ip::basic_resolver_results::protocol_type
local::basic_endpoint, local::basic_endpoint::protocol_type
puberror
basic_socket_streambuf, basic_socket_streambuf::puberror

Q

query
ip::basic_resolver, ip::basic_resolver::query

R

random_access_handle
windows::random_access_handle, windows::random_access_handle::random_access_handle
raw_protocol
generic::raw_protocol, generic::raw_protocol::raw_protocol
rdbuf
basic_socket_iostream, basic_socket_iostream::rdbuf
read, read
read_at, read_at
read_some
basic_stream_socket, basic_stream_socket::read_some
buffered_read_stream, buffered_read_stream::read_some
buffered_stream, buffered_stream::read_some
buffered_write_stream, buffered_write_stream::read_some
posix::stream_descriptor, posix::stream_descriptor::read_some
serial_port, serial_port::read_some
ssl::stream, ssl::stream::read_some
windows::stream_handle, windows::stream_handle::read_some
read_some_at
windows::random_access_handle, windows::random_access_handle::read_some_at
read_until, read_until
rebind
use_future_t, use_future_t::rebind
receive
basic_datagram_socket, basic_datagram_socket::receive
basic_raw_socket, basic_raw_socket::receive
basic_seq_packet_socket, basic_seq_packet_socket::receive
basic_stream_socket, basic_stream_socket::receive
receive_buffer_size
basic_datagram_socket, basic_datagram_socket::receive_buffer_size
basic_raw_socket, basic_raw_socket::receive_buffer_size
basic_seq_packet_socket, basic_seq_packet_socket::receive_buffer_size
basic_socket, basic_socket::receive_buffer_size
basic_socket_acceptor, basic_socket_acceptor::receive_buffer_size
basic_stream_socket, basic_stream_socket::receive_buffer_size
socket_base, socket_base::receive_buffer_size
receive_from
basic_datagram_socket, basic_datagram_socket::receive_from
basic_raw_socket, basic_raw_socket::receive_from
receive_low_watermark
basic_datagram_socket, basic_datagram_socket::receive_low_watermark
basic_raw_socket, basic_raw_socket::receive_low_watermark
basic_seq_packet_socket, basic_seq_packet_socket::receive_low_watermark
basic_socket, basic_socket::receive_low_watermark
basic_socket_acceptor, basic_socket_acceptor::receive_low_watermark
basic_stream_socket, basic_stream_socket::receive_low_watermark
socket_base, socket_base::receive_low_watermark
redirect_error_t
experimental::redirect_error_t, experimental::redirect_error_t::redirect_error_t
reference
buffers_iterator, buffers_iterator::reference
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::reference
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::reference
ip::basic_resolver_iterator, ip::basic_resolver_iterator::reference
ip::basic_resolver_results, ip::basic_resolver_results::reference
release
basic_datagram_socket, basic_datagram_socket::release
basic_raw_socket, basic_raw_socket::release
basic_seq_packet_socket, basic_seq_packet_socket::release
basic_socket, basic_socket::release
basic_socket_acceptor, basic_socket_acceptor::release
basic_stream_socket, basic_stream_socket::release
posix::descriptor, posix::descriptor::release
posix::stream_descriptor, posix::stream_descriptor::release
windows::overlapped_ptr, windows::overlapped_ptr::release
remote_endpoint
basic_datagram_socket, basic_datagram_socket::remote_endpoint
basic_raw_socket, basic_raw_socket::remote_endpoint
basic_seq_packet_socket, basic_seq_packet_socket::remote_endpoint
basic_socket, basic_socket::remote_endpoint
basic_stream_socket, basic_stream_socket::remote_endpoint
remove
signal_set, signal_set::remove
reserve
basic_streambuf, basic_streambuf::reserve
reset
executor_work_guard, executor_work_guard::reset
io_context, io_context::reset
windows::overlapped_ptr, windows::overlapped_ptr::reset
resize
generic::basic_endpoint, generic::basic_endpoint::resize
ip::basic_endpoint, ip::basic_endpoint::resize
local::basic_endpoint, local::basic_endpoint::resize
resolve
ip::basic_resolver, ip::basic_resolver::resolve
resolver
ip::icmp, ip::icmp::resolver
ip::tcp, ip::tcp::resolver
ip::udp, ip::udp::resolver
resolver_errc::try_again, resolver_errc::try_again
restart
io_context, io_context::restart
result
async_completion, async_completion::result
results_type
ip::basic_resolver, ip::basic_resolver::results_type
result_type
executor_binder, executor_binder::result_type
ssl::rfc2818_verification, ssl::rfc2818_verification::result_type
return_type
async_result, async_result::return_type
async_result< std::packaged_task< Result(Args...)>, Signature >, async_result< std::packaged_task< Result(Args...)>, Signature >::return_type
reuse_address
basic_datagram_socket, basic_datagram_socket::reuse_address
basic_raw_socket, basic_raw_socket::reuse_address
basic_seq_packet_socket, basic_seq_packet_socket::reuse_address
basic_socket, basic_socket::reuse_address
basic_socket_acceptor, basic_socket_acceptor::reuse_address
basic_stream_socket, basic_stream_socket::reuse_address
socket_base, socket_base::reuse_address
rfc2818_verification
ssl::rfc2818_verification, ssl::rfc2818_verification::rfc2818_verification
run
io_context, io_context::run
running_in_this_thread
io_context::executor_type, io_context::executor_type::running_in_this_thread
io_context::strand, io_context::strand::running_in_this_thread
strand, strand::running_in_this_thread
thread_pool::executor_type, thread_pool::executor_type::running_in_this_thread
run_for
io_context, io_context::run_for
run_one
io_context, io_context::run_one
run_one_for
io_context, io_context::run_one_for
run_one_until
io_context, io_context::run_one_until
run_until
io_context, io_context::run_until

S

scope_id
ip::address_v6, ip::address_v6::scope_id
second_argument_type
executor_binder, executor_binder::second_argument_type
send
basic_datagram_socket, basic_datagram_socket::send
basic_raw_socket, basic_raw_socket::send
basic_seq_packet_socket, basic_seq_packet_socket::send
basic_stream_socket, basic_stream_socket::send
send_break
serial_port, serial_port::send_break
send_buffer_size
basic_datagram_socket, basic_datagram_socket::send_buffer_size
basic_raw_socket, basic_raw_socket::send_buffer_size
basic_seq_packet_socket, basic_seq_packet_socket::send_buffer_size
basic_socket, basic_socket::send_buffer_size
basic_socket_acceptor, basic_socket_acceptor::send_buffer_size
basic_stream_socket, basic_stream_socket::send_buffer_size
socket_base, socket_base::send_buffer_size
send_low_watermark
basic_datagram_socket, basic_datagram_socket::send_low_watermark
basic_raw_socket, basic_raw_socket::send_low_watermark
basic_seq_packet_socket, basic_seq_packet_socket::send_low_watermark
basic_socket, basic_socket::send_low_watermark
basic_socket_acceptor, basic_socket_acceptor::send_low_watermark
basic_stream_socket, basic_stream_socket::send_low_watermark
socket_base, socket_base::send_low_watermark
send_to
basic_datagram_socket, basic_datagram_socket::send_to
basic_raw_socket, basic_raw_socket::send_to
seq_packet_protocol
generic::seq_packet_protocol, generic::seq_packet_protocol::seq_packet_protocol
serial_port
serial_port, serial_port::serial_port
server
ssl::stream, ssl::stream::handshake_type
ssl::stream_base, ssl::stream_base::handshake_type
service
execution_context::service, execution_context::service::service
io_context::service, io_context::service::service
service_already_exists
service_already_exists, service_already_exists::service_already_exists
service_name
ip::basic_resolver_entry, ip::basic_resolver_entry::service_name
ip::basic_resolver_query, ip::basic_resolver_query::service_name
service_not_found
error::addrinfo_errors, error::addrinfo_errors
service_type
basic_io_object, basic_io_object::service_type
setbuf
basic_socket_streambuf, basic_socket_streambuf::setbuf
set_default_verify_paths
ssl::context, ssl::context::set_default_verify_paths
set_option
basic_datagram_socket, basic_datagram_socket::set_option
basic_raw_socket, basic_raw_socket::set_option
basic_seq_packet_socket, basic_seq_packet_socket::set_option
basic_socket, basic_socket::set_option
basic_socket_acceptor, basic_socket_acceptor::set_option
basic_stream_socket, basic_stream_socket::set_option
serial_port, serial_port::set_option
set_options
ssl::context, ssl::context::set_options
set_password_callback
ssl::context, ssl::context::set_password_callback
set_verify_callback
ssl::context, ssl::context::set_verify_callback
ssl::stream, ssl::stream::set_verify_callback
set_verify_depth
ssl::context, ssl::context::set_verify_depth
ssl::stream, ssl::stream::set_verify_depth
set_verify_mode
ssl::context, ssl::context::set_verify_mode
ssl::stream, ssl::stream::set_verify_mode
shutdown
basic_datagram_socket, basic_datagram_socket::shutdown
basic_raw_socket, basic_raw_socket::shutdown
basic_seq_packet_socket, basic_seq_packet_socket::shutdown
basic_socket, basic_socket::shutdown
basic_stream_socket, basic_stream_socket::shutdown
execution_context, execution_context::shutdown
execution_context::service, execution_context::service::shutdown
io_context, io_context::shutdown
ssl::stream, ssl::stream::shutdown
system_context, system_context::shutdown
thread_pool, thread_pool::shutdown
shutdown_both
basic_datagram_socket, basic_datagram_socket::shutdown_type
basic_raw_socket, basic_raw_socket::shutdown_type
basic_seq_packet_socket, basic_seq_packet_socket::shutdown_type
basic_socket, basic_socket::shutdown_type
basic_socket_acceptor, basic_socket_acceptor::shutdown_type
basic_stream_socket, basic_stream_socket::shutdown_type
socket_base, socket_base::shutdown_type
shutdown_receive
basic_datagram_socket, basic_datagram_socket::shutdown_type
basic_raw_socket, basic_raw_socket::shutdown_type
basic_seq_packet_socket, basic_seq_packet_socket::shutdown_type
basic_socket, basic_socket::shutdown_type
basic_socket_acceptor, basic_socket_acceptor::shutdown_type
basic_stream_socket, basic_stream_socket::shutdown_type
socket_base, socket_base::shutdown_type
shutdown_send
basic_datagram_socket, basic_datagram_socket::shutdown_type
basic_raw_socket, basic_raw_socket::shutdown_type
basic_seq_packet_socket, basic_seq_packet_socket::shutdown_type
basic_socket, basic_socket::shutdown_type
basic_socket_acceptor, basic_socket_acceptor::shutdown_type
basic_stream_socket, basic_stream_socket::shutdown_type
socket_base, socket_base::shutdown_type
shutdown_type
basic_datagram_socket, basic_datagram_socket::shutdown_type
basic_raw_socket, basic_raw_socket::shutdown_type
basic_seq_packet_socket, basic_seq_packet_socket::shutdown_type
basic_socket, basic_socket::shutdown_type
basic_socket_acceptor, basic_socket_acceptor::shutdown_type
basic_stream_socket, basic_stream_socket::shutdown_type
socket_base, socket_base::shutdown_type
shut_down
error::basic_errors, error::basic_errors
signal_set
signal_set, signal_set::signal_set
single_dh_use
ssl::context, ssl::context::single_dh_use
ssl::context_base, ssl::context_base::single_dh_use
size
basic_streambuf, basic_streambuf::size
basic_streambuf_ref, basic_streambuf_ref::size
const_buffer, const_buffer::size
const_buffers_1, const_buffers_1::size
dynamic_string_buffer, dynamic_string_buffer::size
dynamic_vector_buffer, dynamic_vector_buffer::size
generic::basic_endpoint, generic::basic_endpoint::size
ip::basic_address_range< address_v4 >, ip::basic_address_range< address_v4 >::size
ip::basic_endpoint, ip::basic_endpoint::size
ip::basic_resolver_results, ip::basic_resolver_results::size
local::basic_endpoint, local::basic_endpoint::size
mutable_buffer, mutable_buffer::size
mutable_buffers_1, mutable_buffers_1::size
size_type
ip::basic_resolver_results, ip::basic_resolver_results::size_type
socket
basic_socket_iostream, basic_socket_iostream::socket
basic_socket_streambuf, basic_socket_streambuf::socket
generic::datagram_protocol, generic::datagram_protocol::socket
generic::raw_protocol, generic::raw_protocol::socket
generic::seq_packet_protocol, generic::seq_packet_protocol::socket
generic::stream_protocol, generic::stream_protocol::socket
ip::icmp, ip::icmp::socket
ip::tcp, ip::tcp::socket
ip::udp, ip::udp::socket
local::datagram_protocol, local::datagram_protocol::socket
local::stream_protocol, local::stream_protocol::socket
socket_type_not_supported
error::addrinfo_errors, error::addrinfo_errors
software
serial_port_base::flow_control, serial_port_base::flow_control::type
spawn, spawn
ssl
ssl::stream::impl_struct, ssl::stream::impl_struct::ssl
ssl::error::get_stream_category, ssl::error::get_stream_category
ssl::error::make_error_code, ssl::error::make_error_code
ssl::error::stream_category, ssl::error::stream_category
ssl::error::stream_errors, ssl::error::stream_errors
ssl::verify_client_once, ssl::verify_client_once
ssl::verify_fail_if_no_peer_cert, ssl::verify_fail_if_no_peer_cert
ssl::verify_mode, ssl::verify_mode
ssl::verify_none, ssl::verify_none
ssl::verify_peer, ssl::verify_peer
sslv2
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv23
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv23_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv23_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv2_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv2_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv3
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv3_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
sslv3_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
steady_timer, steady_timer
stop
io_context, io_context::stop
system_context, system_context::stop
thread_pool, thread_pool::stop
stopped
io_context, io_context::stopped
system_context, system_context::stopped
stop_bits
serial_port_base::stop_bits, serial_port_base::stop_bits::stop_bits
store
serial_port_base::baud_rate, serial_port_base::baud_rate::store
serial_port_base::character_size, serial_port_base::character_size::store
serial_port_base::flow_control, serial_port_base::flow_control::store
serial_port_base::parity, serial_port_base::parity::store
serial_port_base::stop_bits, serial_port_base::stop_bits::store
strand
io_context::strand, io_context::strand::strand
strand, strand::strand
stream
ssl::stream, ssl::stream::stream
streambuf, streambuf
stream_descriptor
posix::stream_descriptor, posix::stream_descriptor::stream_descriptor
stream_handle
windows::stream_handle, windows::stream_handle::stream_handle
stream_protocol
generic::stream_protocol, generic::stream_protocol::stream_protocol
stream_truncated
ssl::error::stream_errors, ssl::error::stream_errors
subtract
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::subtract
swap
ip::basic_resolver_results, ip::basic_resolver_results::swap
sync
basic_socket_streambuf, basic_socket_streambuf::sync
system_category, system_category
system_error
system_error, system_error::system_error
system_timer, system_timer

T

target
executor, executor::target
target_type
executor, executor::target_type
executor_binder, executor_binder::target_type
thread
thread, thread::thread
thread_pool
thread_pool, thread_pool::thread_pool
timed_out
error::basic_errors, error::basic_errors
time_point
basic_socket_iostream, basic_socket_iostream::time_point
basic_socket_streambuf, basic_socket_streambuf::time_point
basic_waitable_timer, basic_waitable_timer::time_point
time_type
basic_deadline_timer, basic_deadline_timer::time_type
basic_socket_iostream, basic_socket_iostream::time_type
basic_socket_streambuf, basic_socket_streambuf::time_type
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::time_type
tls
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv1
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv11
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv11_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv11_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv12
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv12_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv12_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv13
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv13_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv13_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv1_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tlsv1_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tls_client
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
tls_server
ssl::context, ssl::context::method
ssl::context_base, ssl::context_base::method
token_
experimental::redirect_error_t, experimental::redirect_error_t::token_
to_bytes
ip::address_v4, ip::address_v4::to_bytes
ip::address_v6, ip::address_v6::to_bytes
to_posix_duration
time_traits< boost::posix_time::ptime >, time_traits< boost::posix_time::ptime >::to_posix_duration
to_string
ip::address, ip::address::to_string
ip::address_v4, ip::address_v4::to_string
ip::address_v6, ip::address_v6::to_string
ip::network_v4, ip::network_v4::to_string
ip::network_v6, ip::network_v6::to_string
to_uint
ip::address_v4, ip::address_v4::to_uint
to_ulong
ip::address_v4, ip::address_v4::to_ulong
to_v4
ip::address, ip::address::to_v4
ip::address_v6, ip::address_v6::to_v4
to_v6
ip::address, ip::address::to_v6
to_wait_duration
wait_traits, wait_traits::to_wait_duration
traits_type
basic_deadline_timer, basic_deadline_timer::traits_type
basic_waitable_timer, basic_waitable_timer::traits_type
transfer_all, transfer_all
transfer_at_least, transfer_at_least
transfer_exactly, transfer_exactly
try_again
error::basic_errors, error::basic_errors
two
serial_port_base::stop_bits, serial_port_base::stop_bits::type
type
associated_allocator, associated_allocator::type
associated_executor, associated_executor::type
async_result< Handler >, async_result< Handler >::type
generic::datagram_protocol, generic::datagram_protocol::type
generic::raw_protocol, generic::raw_protocol::type
generic::seq_packet_protocol, generic::seq_packet_protocol::type
generic::stream_protocol, generic::stream_protocol::type
handler_type, handler_type::type
ip::icmp, ip::icmp::type
ip::tcp, ip::tcp::type
ip::udp, ip::udp::type
local::datagram_protocol, local::datagram_protocol::type
local::stream_protocol, local::stream_protocol::type
serial_port_base::flow_control, serial_port_base::flow_control::type
serial_port_base::parity, serial_port_base::parity::type
serial_port_base::stop_bits, serial_port_base::stop_bits::type

U

uint_type
ip::address_v4, ip::address_v4::uint_type
underflow
basic_socket_streambuf, basic_socket_streambuf::underflow
basic_streambuf, basic_streambuf::underflow
unspecified_bool_true
error_code, error_code::unspecified_bool_true
executor, executor::unspecified_bool_true
unspecified_bool_type
error_code, error_code::unspecified_bool_type
executor, executor::unspecified_bool_type
use_certificate
ssl::context, ssl::context::use_certificate
use_certificate_chain
ssl::context, ssl::context::use_certificate_chain
use_certificate_chain_file
ssl::context, ssl::context::use_certificate_chain_file
use_certificate_file
ssl::context, ssl::context::use_certificate_file
use_future, use_future
use_future_t
use_future_t, use_future_t::use_future_t
use_private_key
ssl::context, ssl::context::use_private_key
use_private_key_file
ssl::context, ssl::context::use_private_key_file
use_rsa_private_key
ssl::context, ssl::context::use_rsa_private_key
use_rsa_private_key_file
ssl::context, ssl::context::use_rsa_private_key_file
use_service, use_service
execution_context, execution_context::use_service
io_context, io_context::use_service
system_context, system_context::use_service
thread_pool, thread_pool::use_service
use_tmp_dh
ssl::context, ssl::context::use_tmp_dh
use_tmp_dh_file
ssl::context, ssl::context::use_tmp_dh_file

V

v4
ip::icmp, ip::icmp::v4
ip::tcp, ip::tcp::v4
ip::udp, ip::udp::v4
v4_compatible
ip::address_v6, ip::address_v6::v4_compatible
v4_mapped
ip::address_v6, ip::address_v6::v4_mapped
ip::basic_resolver, ip::basic_resolver::v4_mapped
ip::basic_resolver_query, ip::basic_resolver_query::v4_mapped
ip::resolver_base, ip::resolver_base::v4_mapped
ip::resolver_query_base, ip::resolver_query_base::v4_mapped
ip::v4_mapped_t, ip::v4_mapped_t
v6
ip::icmp, ip::icmp::v6
ip::tcp, ip::tcp::v6
ip::udp, ip::udp::v6
value
error_code, error_code::value
is_endpoint_sequence, is_endpoint_sequence::value
is_match_condition, is_match_condition::value
is_read_buffered, is_read_buffered::value
is_write_buffered, is_write_buffered::value
serial_port_base::baud_rate, serial_port_base::baud_rate::value
serial_port_base::character_size, serial_port_base::character_size::value
serial_port_base::flow_control, serial_port_base::flow_control::value
serial_port_base::parity, serial_port_base::parity::value
serial_port_base::stop_bits, serial_port_base::stop_bits::value
values_
ip::basic_resolver_iterator, ip::basic_resolver_iterator::values_
ip::basic_resolver_results, ip::basic_resolver_results::values_
value_type
buffers_iterator, buffers_iterator::value_type
const_buffers_1, const_buffers_1::value_type
experimental::awaitable, experimental::awaitable::value_type
ip::basic_address_iterator< address_v4 >, ip::basic_address_iterator< address_v4 >::value_type
ip::basic_address_iterator< address_v6 >, ip::basic_address_iterator< address_v6 >::value_type
ip::basic_resolver_iterator, ip::basic_resolver_iterator::value_type
ip::basic_resolver_results, ip::basic_resolver_results::value_type
mutable_buffers_1, mutable_buffers_1::value_type
null_buffers, null_buffers::value_type
verify_context
ssl::verify_context, ssl::verify_context::verify_context

W

wait
basic_datagram_socket, basic_datagram_socket::wait
basic_deadline_timer, basic_deadline_timer::wait
basic_raw_socket, basic_raw_socket::wait
basic_seq_packet_socket, basic_seq_packet_socket::wait
basic_socket, basic_socket::wait
basic_socket_acceptor, basic_socket_acceptor::wait
basic_stream_socket, basic_stream_socket::wait
basic_waitable_timer, basic_waitable_timer::wait
posix::descriptor, posix::descriptor::wait
posix::stream_descriptor, posix::stream_descriptor::wait
windows::object_handle, windows::object_handle::wait
wait_error
basic_datagram_socket, basic_datagram_socket::wait_type
basic_raw_socket, basic_raw_socket::wait_type
basic_seq_packet_socket, basic_seq_packet_socket::wait_type
basic_socket, basic_socket::wait_type
basic_socket_acceptor, basic_socket_acceptor::wait_type
basic_stream_socket, basic_stream_socket::wait_type
posix::descriptor, posix::descriptor::wait_type
posix::descriptor_base, posix::descriptor_base::wait_type
posix::stream_descriptor, posix::stream_descriptor::wait_type
socket_base, socket_base::wait_type
wait_read
basic_datagram_socket, basic_datagram_socket::wait_type
basic_raw_socket, basic_raw_socket::wait_type
basic_seq_packet_socket, basic_seq_packet_socket::wait_type
basic_socket, basic_socket::wait_type
basic_socket_acceptor, basic_socket_acceptor::wait_type
basic_stream_socket, basic_stream_socket::wait_type
posix::descriptor, posix::descriptor::wait_type
posix::descriptor_base, posix::descriptor_base::wait_type
posix::stream_descriptor, posix::stream_descriptor::wait_type
socket_base, socket_base::wait_type
wait_type
basic_datagram_socket, basic_datagram_socket::wait_type
basic_raw_socket, basic_raw_socket::wait_type
basic_seq_packet_socket, basic_seq_packet_socket::wait_type
basic_socket, basic_socket::wait_type
basic_socket_acceptor, basic_socket_acceptor::wait_type
basic_stream_socket, basic_stream_socket::wait_type
posix::descriptor, posix::descriptor::wait_type
posix::descriptor_base, posix::descriptor_base::wait_type
posix::stream_descriptor, posix::stream_descriptor::wait_type
socket_base, socket_base::wait_type
wait_write
basic_datagram_socket, basic_datagram_socket::wait_type
basic_raw_socket, basic_raw_socket::wait_type
basic_seq_packet_socket, basic_seq_packet_socket::wait_type
basic_socket, basic_socket::wait_type
basic_socket_acceptor, basic_socket_acceptor::wait_type
basic_stream_socket, basic_stream_socket::wait_type
posix::descriptor, posix::descriptor::wait_type
posix::descriptor_base, posix::descriptor_base::wait_type
posix::stream_descriptor, posix::stream_descriptor::wait_type
socket_base, socket_base::wait_type
what
bad_executor, bad_executor::what
ip::bad_address_cast, ip::bad_address_cast::what
system_error, system_error::what
work
io_context::work, io_context::work::work
would_block
error::basic_errors, error::basic_errors
wrap
io_context, io_context::wrap
io_context::strand, io_context::strand::wrap
write, write
write_at, write_at
write_some
basic_stream_socket, basic_stream_socket::write_some
buffered_read_stream, buffered_read_stream::write_some
buffered_stream, buffered_stream::write_some
buffered_write_stream, buffered_write_stream::write_some
posix::stream_descriptor, posix::stream_descriptor::write_some
serial_port, serial_port::write_some
ssl::stream, ssl::stream::write_some
windows::stream_handle, windows::stream_handle::write_some
write_some_at
windows::random_access_handle, windows::random_access_handle::write_some_at

Y

yield_context, yield_context

PrevUpHome
asio-1.12.2/doc/asio/net_ts.html000066400000000000000000001461401340672067200164270ustar00rootroot00000000000000 Networking TS compatibility
asio C++ library

PrevUpHomeNext

Asio now provides the interfaces and functionality specified by the "C++ Extensions for Networking" Technical Specification. In addition to access via the usual Asio header files, this functionality may be accessed through special headers that correspond to the header files defined in the TS. These are listed in the table below:

Networking TS header

Asio header

#include <buffer>

#include <asio/ts/buffer.hpp>

#include <executor>

#include <asio/ts/executor.hpp>

#include <internet>

#include <asio/ts/internet.hpp>

#include <io_context>

#include <asio/ts/io_context.hpp>

#include <net>

#include <asio/ts/net.hpp>

#include <netfwd>

#include <asio/ts/netfwd.hpp>

#include <socket>

#include <asio/ts/socket.hpp>

#include <timer>

#include <asio/ts/timer.hpp>

In some cases the new Networking TS compatible interfaces supersede older Asio facilities. In these cases the older interfaces have been deprecated. The table below shows the new Networking TS interfaces and the facilities they replace:

New interface

Old interface

Notes

io_context

io_service

The name io_service is retained as a typedef.

dispatch

io_service::dispatch

The dispatch free function can be used to submit functions to any Executor or ExecutionContext.

post

io_service::post

The dispatch free function can be used to submit functions to any Executor or ExecutionContext.

defer

io_service::post when the asio_handler_is_continuation hook returns true

The defer free function can be used to submit functions to any Executor or ExecutionContext.

io_context::poll

io_service::poll overload that takes error_code&

The error_code overload is not required.

io_context::poll_one

io_service::poll_one overload that takes error_code&

The error_code overload is not required.

io_context::run

io_service::run overload that takes error_code&

The error_code overload is not required.

io_context::run_one

io_service::run_one overload that takes error_code&

The error_code overload is not required.

io_context::run_for, io_context::run_until, io_context::run_one_for, and io_context::run_one_until

These functions add the ability to run an io_context for a limited time.

io_context::restart

io_service::reset

io_context constructor concurrency_hint parameter is type int

io_context constructor concurrency_hint parameter is type std::size_t

The old constructor has not been retained as a deprecated overload.

execution_context, execution_context::service, and execution_context::id

io_service, io_service::service, and io_service::id

The service-related functionality has been moved to the execution_context base class. This may also be used as a base for creating custom execution contexts.

make_service

add_service

strand

io_service::strand

This template works with any valid executor, and is itself a valid executor.

executor_work_guard and make_work_guard

io_service::work

Work tracking is now covered by the Executor requirements. These templates work with any valid executor.

executor_binder and bind_executor

io_service::wrap and io_service::strand::wrap

These templates work with any valid executor.

async_result with CompletionToken and Signature template parameters

handler_type and single parameter async_result

The async_result trait is now the single point of customisation for asynchronous operation completion handlers and return type.

associated_executor and get_associated_executor

asio_handler_invoke

The handler invocation hook has been replaced by the new Executor requirements and the associated executor traits.

associated_allocator and get_associated_allocator

asio_handler_allocate and asio_handler_deallocate

The handler allocation hooks have been replaced by the standard Allocator requirements and the associated allocator traits.

const_buffer::data and mutable_buffer::data

buffer_cast

const_buffer::size and mutable_buffer::size

buffer_size for single buffers

buffer_size is not deprecated for single buffers as const_buffer and mutable_buffer now satisfy the buffer sequence requirements

const_buffer

const_buffers_1

The ConstBufferSequence requirements have been modified such that const_buffer now satisfies them.

mutable_buffer

mutable_buffers_1

The MutableBufferSequence requirements have been modified such that mutable_buffer now satisfies them.

basic_socket::get_executor (and corresponding member for I/O objects such as timers, serial ports, etc.)

basic_io_object::get_io_service

Use get_executor().context() to obtain the associated io_context.

socket_base::max_listen_connections

socket_base::max_connections

socket_base::wait_type, basic_socket::wait, basic_socket::async_wait, basic_socket_acceptor::wait, and basic_socket_acceptor::async_wait

null_buffers

Operations for reactive I/O.

basic_socket_acceptor::accept returns a socket

basic_socket_acceptor::accept takes a socket by reference

Uses move support so requires C++11 or later. To accept a connection into a socket object on a different io_context, pass the destination context to accept.

basic_socket_acceptor::async_accept passes socket to handler

basic_socket_acceptor::async_accept takes a socket by reference

Uses move support so requires C++11 or later. To accept a connection into a socket object on a different io_context, pass the destination context to async_accept.

connect overloads that take a range

connect overloads that take a single iterator

The ip::basic_resolver::resolve function now returns a range. When the resolve function's result is passed directly to connect, the range overload will be selected.

async_connect overloads that take a range

async_connect overloads that take a single iterator

The ip::basic_resolver::resolve function now returns a range. When the resolve function's result is passed directly to async_connect, the range overload will be selected.

basic_socket_streambuf::duration

basic_socket_streambuf::duration_type

basic_socket_streambuf::time_point

basic_socket_streambuf::time_type

basic_socket_streambuf::expiry

basic_socket_streambuf::expires_at and basic_socket_streambuf::expires_from_now getters

basic_socket_streambuf::expires_after

basic_socket_streambuf::expires_from_now setter

basic_socket_streambuf::error

basic_socket_streambuf::puberror

basic_socket_iostream::duration

basic_socket_iostream::duration_type

basic_socket_iostream::time_point

basic_socket_iostream::time_type

basic_socket_iostream::expiry

basic_socket_iostream::expires_at and basic_socket_iostream::expires_from_now getters

basic_socket_iostream::expires_after

basic_socket_iostream::expires_from_now setter

basic_waitable_timer::cancel

basic_waitable_timer::cancel overload that takes error_code&

The error_code overload is not required.

basic_waitable_timer::cancel_one

basic_waitable_timer::cancel_one overload that takes error_code&

The error_code overload is not required.

basic_waitable_timer::expires_at setter

basic_waitable_timer::expires_at setter that takes error_code&

The error_code overload is not required.

basic_waitable_timer::expiry

basic_waitable_timer::expires_at and basic_waitable_timer::expires_from_now getters

basic_waitable_timer::expires_after

basic_waitable_timer::expires_from_now setter

ip::make_address

ip::address::from_string

ip::make_address_v4

ip::address_v4::from_string and ip::address_v6::to_v4

ip::make_address_v6

ip::address_v6::from_string and ip::address_v6::v4_mapped

ip::address::to_string

ip::address::to_string that takes error_code&

The error_code overload is not required.

ip::address_v4::to_string

ip::address_v4::to_string that takes error_code&

The error_code overload is not required.

ip::address_v6::to_string

ip::address_v6::to_string that takes error_code&

The error_code overload is not required.

No replacement

ip::address_v6::is_v4_compatible and ip::address_v6::v4_compatible

ip::network_v4

ip::address_v4::broadcast, ip::address_v4::is_class_a, ip::address_v4::is_class_b, ip::address_v4::is_class_c, and ip::address_v4::netmask

The network_v4 class adds the ability to manipulate IPv4 network addresses using CIDR notation.

ip::network_v6

The network_v6 class adds the ability to manipulate IPv6 network addresses using CIDR notation.

ip::address_v4_iterator and ip::address_v4_range

The ip::address_v4_iterator and address_v4_range classes add the ability to iterate over all, or a subset of, IPv4 addresses.

ip::address_v6_iterator and ip::address_v6_range

The ip::address_v6_iterator and address_v6_range classes add the ability to iterate over all, or a subset of, IPv6 addresses.

ip::basic_resolver::results_type

ip::basic_resolver::iterator

Resolvers now produce ranges rather than single iterators.

ip::basic_resolver::resolve overloads taking hostname and service as arguments

ip::basic_resolver::resolve overloads taking a ip::basic_resolver::query

ip::basic_resolver::resolve returns a range

ip::basic_resolver::resolve returns a single iterator

ip::basic_resolver::async_resolve overloads taking hostname and service as arguments

ip::basic_resolver::async_resolve overloads taking a ip::basic_resolver::query

ip::basic_resolver::async_resolve calls the handler with a range

ip::basic_resolver::async_resolve calls the handler with a single iterator


PrevUpHomeNext
asio-1.12.2/doc/asio/overview.html000066400000000000000000000176611340672067200170060ustar00rootroot00000000000000 Overview
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/000077500000000000000000000000001340672067200161055ustar00rootroot00000000000000asio-1.12.2/doc/asio/overview/core.html000066400000000000000000000106761340672067200177350ustar00rootroot00000000000000 Core Concepts and Functionality
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/000077500000000000000000000000001340672067200170355ustar00rootroot00000000000000asio-1.12.2/doc/asio/overview/core/allocation.html000066400000000000000000000232711340672067200220550ustar00rootroot00000000000000 Custom Memory Allocation
asio C++ library

PrevUpHomeNext

Many asynchronous operations need to allocate an object to store state associated with the operation. For example, a Win32 implementation needs OVERLAPPED-derived objects to pass to Win32 API functions.

Furthermore, programs typically contain easily identifiable chains of asynchronous operations. A half duplex protocol implementation (e.g. an HTTP server) would have a single chain of operations per client (receives followed by sends). A full duplex protocol implementation would have two chains executing in parallel. Programs should be able to leverage this knowledge to reuse memory for all asynchronous operations in a chain.

Given a copy of a user-defined Handler object h, if the implementation needs to allocate memory associated with that handler it will obtain an allocator using the get_associated_allocator function. For example:

asio::associated_allocator_t<Handler> a = asio::get_associated_allocator(h);

The associated allocator must satisfy the standard Allocator requirements.

By default, handlers use the standard allocator (which is implemented in terms of ::operator new() and ::operator delete()). The allocator may be customised for a particular handler type by specifying a nested type allocator_type and member function get_allocator():

class my_handler
{
public:
  // Custom implementation of Allocator type requirements.
  typedef my_allocator allocator_type;

  // Return a custom allocator implementation.
  allocator_type get_allocator() const noexcept
  {
    return my_allocator();
  }

  void operator()() { ... }
};

In more complex cases, the associated_allocator template may be partially specialised directly:

namespace asio {

  template <typename Allocator>
  struct associated_allocator<my_handler, Allocator>
  {
    // Custom implementation of Allocator type requirements.
    typedef my_allocator type;

    // Return a custom allocator implementation.
    static type get(const my_handler&,
        const Allocator& a = Allocator()) noexcept
    {
      return my_allocator();
    }
  };

} // namespace asio

The implementation guarantees that the deallocation will occur before the associated handler is invoked, which means the memory is ready to be reused for any new asynchronous operations started by the handler.

The custom memory allocation functions may be called from any user-created thread that is calling a library function. The implementation guarantees that, for the asynchronous operations included the library, the implementation will not make concurrent calls to the memory allocation functions for that handler. The implementation will insert appropriate memory barriers to ensure correct memory visibility should allocation functions need to be called from different threads.

See Also

associated_allocator, get_associated_allocator, custom memory allocation example (C++03), custom memory allocation example (C++11).


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/async.html000066400000000000000000000364751340672067200210570ustar00rootroot00000000000000 The Proactor Design Pattern: Concurrency Without Threads
asio C++ library

PrevUpHomeNext

The Asio library offers side-by-side support for synchronous and asynchronous operations. The asynchronous support is based on the Proactor design pattern [POSA2]. The advantages and disadvantages of this approach, when compared to a synchronous-only or Reactor approach, are outlined below.

Proactor and Asio

Let us examine how the Proactor design pattern is implemented in Asio, without reference to platform-specific details.

proactor

Proactor design pattern (adapted from [POSA2])

— Asynchronous Operation

Defines an operation that is executed asynchronously, such as an asynchronous read or write on a socket.

— Asynchronous Operation Processor

Executes asynchronous operations and queues events on a completion event queue when operations complete. From a high-level point of view, internal services like reactive_socket_service are asynchronous operation processors.

— Completion Event Queue

Buffers completion events until they are dequeued by an asynchronous event demultiplexer.

— Completion Handler

Processes the result of an asynchronous operation. These are function objects, often created using boost::bind.

— Asynchronous Event Demultiplexer

Blocks waiting for events to occur on the completion event queue, and returns a completed event to its caller.

— Proactor

Calls the asynchronous event demultiplexer to dequeue events, and dispatches the completion handler (i.e. invokes the function object) associated with the event. This abstraction is represented by the io_context class.

— Initiator

Application-specific code that starts asynchronous operations. The initiator interacts with an asynchronous operation processor via a high-level interface such as basic_stream_socket, which in turn delegates to a service like reactive_socket_service.

Implementation Using Reactor

On many platforms, Asio implements the Proactor design pattern in terms of a Reactor, such as select, epoll or kqueue. This implementation approach corresponds to the Proactor design pattern as follows:

— Asynchronous Operation Processor

A reactor implemented using select, epoll or kqueue. When the reactor indicates that the resource is ready to perform the operation, the processor executes the asynchronous operation and enqueues the associated completion handler on the completion event queue.

— Completion Event Queue

A linked list of completion handlers (i.e. function objects).

— Asynchronous Event Demultiplexer

This is implemented by waiting on an event or condition variable until a completion handler is available in the completion event queue.

Implementation Using Windows Overlapped I/O

On Windows NT, 2000 and XP, Asio takes advantage of overlapped I/O to provide an efficient implementation of the Proactor design pattern. This implementation approach corresponds to the Proactor design pattern as follows:

— Asynchronous Operation Processor

This is implemented by the operating system. Operations are initiated by calling an overlapped function such as AcceptEx.

— Completion Event Queue

This is implemented by the operating system, and is associated with an I/O completion port. There is one I/O completion port for each io_context instance.

— Asynchronous Event Demultiplexer

Called by Asio to dequeue events and their associated completion handlers.

Advantages

— Portability.

Many operating systems offer a native asynchronous I/O API (such as overlapped I/O on Windows) as the preferred option for developing high performance network applications. The library may be implemented in terms of native asynchronous I/O. However, if native support is not available, the library may also be implemented using synchronous event demultiplexors that typify the Reactor pattern, such as POSIX select().

— Decoupling threading from concurrency.

Long-duration operations are performed asynchronously by the implementation on behalf of the application. Consequently applications do not need to spawn many threads in order to increase concurrency.

— Performance and scalability.

Implementation strategies such as thread-per-connection (which a synchronous-only approach would require) can degrade system performance, due to increased context switching, synchronisation and data movement among CPUs. With asynchronous operations it is possible to avoid the cost of context switching by minimising the number of operating system threads — typically a limited resource — and only activating the logical threads of control that have events to process.

— Simplified application synchronisation.

Asynchronous operation completion handlers can be written as though they exist in a single-threaded environment, and so application logic can be developed with little or no concern for synchronisation issues.

— Function composition.

Function composition refers to the implementation of functions to provide a higher-level operation, such as sending a message in a particular format. Each function is implemented in terms of multiple calls to lower-level read or write operations.

For example, consider a protocol where each message consists of a fixed-length header followed by a variable length body, where the length of the body is specified in the header. A hypothetical read_message operation could be implemented using two lower-level reads, the first to receive the header and, once the length is known, the second to receive the body.

To compose functions in an asynchronous model, asynchronous operations can be chained together. That is, a completion handler for one operation can initiate the next. Starting the first call in the chain can be encapsulated so that the caller need not be aware that the higher-level operation is implemented as a chain of asynchronous operations.

The ability to compose new operations in this way simplifies the development of higher levels of abstraction above a networking library, such as functions to support a specific protocol.

Disadvantages

— Program complexity.

It is more difficult to develop applications using asynchronous mechanisms due to the separation in time and space between operation initiation and completion. Applications may also be harder to debug due to the inverted flow of control.

— Memory usage.

Buffer space must be committed for the duration of a read or write operation, which may continue indefinitely, and a separate buffer is required for each concurrent operation. The Reactor pattern, on the other hand, does not require buffer space until a socket is ready for reading or writing.

References

[POSA2] D. Schmidt et al, Pattern Oriented Software Architecture, Volume 2. Wiley, 2000.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/basics.html000066400000000000000000000260371340672067200211770ustar00rootroot00000000000000 Basic Asio Anatomy
asio C++ library

PrevUpHomeNext

Asio may be used to perform both synchronous and asynchronous operations on I/O objects such as sockets. Before using Asio it may be useful to get a conceptual picture of the various parts of Asio, your program, and how they work together.

As an introductory example, let's consider what happens when you perform a connect operation on a socket. We shall start by examining synchronous operations.

sync_op

Your program will have at least one io_context object. The io_context represents your program's link to the operating system's I/O services.

asio::io_context io_context;

To perform I/O operations your program will need an I/O object such as a TCP socket:

asio::ip::tcp::socket socket(io_context);

When a synchronous connect operation is performed, the following sequence of events occurs:

1. Your program initiates the connect operation by calling the I/O object:

socket.connect(server_endpoint);

2. The I/O object forwards the request to the io_context.

3. The io_context calls on the operating system to perform the connect operation.

4. The operating system returns the result of the operation to the io_context.

5. The io_context translates any error resulting from the operation into an object of type asio::error_code. An error_code may be compared with specific values, or tested as a boolean (where a false result means that no error occurred). The result is then forwarded back up to the I/O object.

6. The I/O object throws an exception of type asio::system_error if the operation failed. If the code to initiate the operation had instead been written as:

asio::error_code ec;
socket.connect(server_endpoint, ec);

then the error_code variable ec would be set to the result of the operation, and no exception would be thrown.

When an asynchronous operation is used, a different sequence of events occurs.

async_op1

1. Your program initiates the connect operation by calling the I/O object:

socket.async_connect(server_endpoint, your_completion_handler);

where your_completion_handler is a function or function object with the signature:

void your_completion_handler(const asio::error_code& ec);

The exact signature required depends on the asynchronous operation being performed. The reference documentation indicates the appropriate form for each operation.

2. The I/O object forwards the request to the io_context.

3. The io_context signals to the operating system that it should start an asynchronous connect.

Time passes. (In the synchronous case this wait would have been contained entirely within the duration of the connect operation.)

async_op2

4. The operating system indicates that the connect operation has completed by placing the result on a queue, ready to be picked up by the io_context.

5. Your program must make a call to io_context::run() (or to one of the similar io_context member functions) in order for the result to be retrieved. A call to io_context::run() blocks while there are unfinished asynchronous operations, so you would typically call it as soon as you have started your first asynchronous operation.

6. While inside the call to io_context::run(), the io_context dequeues the result of the operation, translates it into an error_code, and then passes it to your completion handler.

This is a simplified picture of how Asio operates. You will want to delve further into the documentation if your needs are more advanced, such as extending Asio to perform other types of asynchronous operations.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/buffers.html000066400000000000000000000502101340672067200213550ustar00rootroot00000000000000 Buffers
asio C++ library

PrevUpHomeNext

Fundamentally, I/O involves the transfer of data to and from contiguous regions of memory, called buffers. These buffers can be simply expressed as a tuple consisting of a pointer and a size in bytes. However, to allow the development of efficient network applications, Asio includes support for scatter-gather operations. These operations involve one or more buffers:

  • A scatter-read receives data into multiple buffers.
  • A gather-write transmits multiple buffers.

Therefore we require an abstraction to represent a collection of buffers. The approach used in Asio is to define a type (actually two types) to represent a single buffer. These can be stored in a container, which may be passed to the scatter-gather operations.

In addition to specifying buffers as a pointer and size in bytes, Asio makes a distinction between modifiable memory (called mutable) and non-modifiable memory (where the latter is created from the storage for a const-qualified variable). These two types could therefore be defined as follows:

typedef std::pair<void*, std::size_t> mutable_buffer;
typedef std::pair<const void*, std::size_t> const_buffer;

Here, a mutable_buffer would be convertible to a const_buffer, but conversion in the opposite direction is not valid.

However, Asio does not use the above definitions as-is, but instead defines two classes: mutable_buffer and const_buffer. The goal of these is to provide an opaque representation of contiguous memory, where:

  • Types behave as std::pair would in conversions. That is, a mutable_buffer is convertible to a const_buffer, but the opposite conversion is disallowed.
  • There is protection against buffer overruns. Given a buffer instance, a user can only create another buffer representing the same range of memory or a sub-range of it. To provide further safety, the library also includes mechanisms for automatically determining the size of a buffer from an array, boost::array or std::vector of POD elements, or from a std::string.
  • The underlying memory is explicitly accessed using the data() member function. In general an application should never need to do this, but it is required by the library implementation to pass the raw memory to the underlying operating system functions.

Finally, multiple buffers can be passed to scatter-gather operations (such as read() or write()) by putting the buffer objects into a container. The MutableBufferSequence and ConstBufferSequence concepts have been defined so that containers such as std::vector, std::list, std::vector or boost::array can be used.

Streambuf for Integration with Iostreams

The class asio::basic_streambuf is derived from std::basic_streambuf to associate the input sequence and output sequence with one or more objects of some character array type, whose elements store arbitrary values. These character array objects are internal to the streambuf object, but direct access to the array elements is provided to permit them to be used with I/O operations, such as the send or receive operations of a socket:

  • The input sequence of the streambuf is accessible via the data() member function. The return type of this function meets the ConstBufferSequence requirements.
  • The output sequence of the streambuf is accessible via the prepare() member function. The return type of this function meets the MutableBufferSequence requirements.
  • Data is transferred from the front of the output sequence to the back of the input sequence by calling the commit() member function.
  • Data is removed from the front of the input sequence by calling the consume() member function.

The streambuf constructor accepts a size_t argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. Any operation that would, if successful, grow the internal data beyond this limit will throw a std::length_error exception.

Bytewise Traversal of Buffer Sequences

The buffers_iterator<> class template allows buffer sequences (i.e. types meeting MutableBufferSequence or ConstBufferSequence requirements) to be traversed as though they were a contiguous sequence of bytes. Helper functions called buffers_begin() and buffers_end() are also provided, where the buffers_iterator<> template parameter is automatically deduced.

As an example, to read a single line from a socket and into a std::string, you may write:

asio::streambuf sb;
...
std::size_t n = asio::read_until(sock, sb, '\n');
asio::streambuf::const_buffers_type bufs = sb.data();
std::string line(
    asio::buffers_begin(bufs),
    asio::buffers_begin(bufs) + n);
Buffer Debugging

Some standard library implementations, such as the one that ships with Microsoft Visual C++ 8.0 and later, provide a feature called iterator debugging. What this means is that the validity of iterators is checked at runtime. If a program tries to use an iterator that has been invalidated, an assertion will be triggered. For example:

std::vector<int> v(1)
std::vector<int>::iterator i = v.begin();
v.clear(); // invalidates iterators
*i = 0; // assertion!

Asio takes advantage of this feature to add buffer debugging. Consider the following code:

void dont_do_this()
{
 std::string msg = "Hello, world!";
 asio::async_write(sock, asio::buffer(msg), my_handler);
}

When you call an asynchronous read or write you need to ensure that the buffers for the operation are valid until the completion handler is called. In the above example, the buffer is the std::string variable msg. This variable is on the stack, and so it goes out of scope before the asynchronous operation completes. If you're lucky then the application will crash, but random failures are more likely.

When buffer debugging is enabled, Asio stores an iterator into the string until the asynchronous operation completes, and then dereferences it to check its validity. In the above example you would observe an assertion failure just before Asio tries to call the completion handler.

This feature is automatically made available for Microsoft Visual Studio 8.0 or later and for GCC when _GLIBCXX_DEBUG is defined. There is a performance cost to this checking, so buffer debugging is only enabled in debug builds. For other compilers it may be enabled by defining ASIO_ENABLE_BUFFER_DEBUGGING. It can also be explicitly disabled by defining ASIO_DISABLE_BUFFER_DEBUGGING.

See Also

buffer, buffers_begin, buffers_end, buffers_iterator, const_buffer, const_buffers_1, mutable_buffer, mutable_buffers_1, streambuf, ConstBufferSequence, MutableBufferSequence, buffers example (C++03), buffers example (c++11).


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/concurrency_hint.html000066400000000000000000000177251340672067200233130ustar00rootroot00000000000000 Concurrency Hints
asio C++ library

PrevUpHomeNext

The io_context constructor allows programs to specify a concurrency hint. This is a suggestion to the io_context implementation as to the number of active threads that should be used for running completion handlers.

When the Windows I/O completion port backend is in use, this value is passed to CreateIoCompletionPort.

When a reactor-based backend is used, the implementation recognises the following special concurrency hint values:

Value

Description

1

The implementation assumes that the io_context will be run from a single thread, and applies several optimisations based on this assumption.

For example, when a handler is posted from within another handler, the new handler is added to a fast thread-local queue (with the consequence that the new handler is held back until the currently executing handler finishes).

ASIO_CONCURRENCY_HINT_UNSAFE

This special concurrency hint disables locking in both the scheduler and reactor I/O. This hint has the following restrictions:

— Care must be taken to ensure that all operations on the io_context and any of its associated I/O objects (such as sockets and timers) occur in only one thread at a time.

— Asynchronous resolve operations fail with operation_not_supported.

— If a signal_set is used with the io_context, signal_set objects cannot be used with any other io_context in the program.

ASIO_CONCURRENCY_HINT_UNSAFE_IO

This special concurrency hint disables locking in the reactor I/O. This hint has the following restrictions:

— Care must be taken to ensure that run functions on the io_context, and all operations on the context's associated I/O objects (such as sockets and timers), occur in only one thread at a time.

ASIO_CONCURRENCY_HINT_SAFE

The default. The io_context provides full thread safety, and distinct I/O objects may be used from any thread.

The concurrency hint used by default-constructed io_context objects can be overridden at compile time by defining the ASIO_CONCURRENCY_HINT_DEFAULT macro. For example, specifying

-DASIO_CONCURRENCY_HINT_DEFAULT=1

on the compiler command line means that a concurrency hint of 1 is used for all default-constructed io_context objects in the program. Similarly, the concurrency hint used by io_context objects constructed with 1 can be overridden by defining ASIO_CONCURRENCY_HINT_1. For example, passing

-DASIO_CONCURRENCY_HINT_1=ASIO_CONCURRENCY_HINT_UNSAFE

to the compiler will disable thread safety for all of these objects.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/coroutine.html000066400000000000000000000106561340672067200217420ustar00rootroot00000000000000 Stackless Coroutines
asio C++ library

PrevUpHomeNext

The coroutine class provides support for stackless coroutines. Stackless coroutines enable programs to implement asynchronous logic in a synchronous manner, with minimal overhead, as shown in the following example:

struct session : asio::coroutine
{
  boost::shared_ptr<tcp::socket> socket_;
  boost::shared_ptr<std::vector<char> > buffer_;

  session(boost::shared_ptr<tcp::socket> socket)
    : socket_(socket),
      buffer_(new std::vector<char>(1024))
  {
  }

  void operator()(asio::error_code ec = asio::error_code(), std::size_t n = 0)
  {
    if (!ec) reenter (this)
    {
      for (;;)
      {
        yield socket_->async_read_some(asio::buffer(*buffer_), *this);
        yield asio::async_write(*socket_, asio::buffer(*buffer_, n), *this);
      }
    }
  }
};

The coroutine class is used in conjunction with the pseudo-keywords reenter, yield and fork. These are preprocessor macros, and are implemented in terms of a switch statement using a technique similar to Duff's Device. The coroutine class's documentation provides a complete description of these pseudo-keywords.

See Also

coroutine, HTTP Server 4 example, Stackful Coroutines.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/coroutines_ts.html000066400000000000000000000211601340672067200226230ustar00rootroot00000000000000 Coroutines TS Support (experimental)
asio C++ library

PrevUpHomeNext

(Note: "Experimental" means that this interface is provided to gather feedback and may change in subsequent Asio releases.)

Experimental support for the Coroutines TS is provided via the experimental::co_spawn() function. This co_spawn() function enables programs to implement asynchronous logic in a synchronous manner, in conjunction with the co_await keyword, as shown in the following example:

asio::experimental::co_spawn(executor,
    [socket = std::move(socket)]() mutable
    {
      return echo(std::move(socket));
    },
    asio::experimental::detached);

// ...

asio::experimental::awaitable<void> echo(tcp::socket socket)
{
  auto token = co_await asio::experimental::this_coro::token();

  try
  {
    char data[1024];
    for (;;)
    {
      std::size_t n = co_await socket.async_read_some(asio::buffer(data), token);
      co_await async_write(socket, asio::buffer(data, n), token);
    }
  }
  catch (std::exception& e)
  {
    std::printf("echo Exception: %s\n", e.what());
  }
}

The first argument to co_spawn() is an executor that determines the context in which the coroutine is permitted to execute. For example, a server's per-client object may consist of multiple coroutines; they should all run on the same strand so that no explicit synchronisation is required.

The second argument is a nullary function object that returns a asio::awaitable<R>, where R is the type of return value produced by the coroutine. In the above example, the coroutine returns void.

The third argument is a completion token, and this is used by co_spawn() to produce a completion handler with signature void(std::exception_ptr, R). This completion handler is invoked with the result of the coroutine once it has finished. In the above example we pass a completion token type, asio::experimental::detached, which is used to explicitly ignore the result of an asynchronous operation.

In this example the body of the coroutine is implemented in the echo function. This function first obtains a completion token that represents the current coroutine:

auto token = co_await asio::experimental::this_coro::token();

When this completion token is passed to an asynchronous operation, the operation's initiating function returns an awaitable that may be used with the co_await keyword:

std::size_t n = co_await socket.async_read_some(asio::buffer(data), token);

Where an asynchronous operation's handler signature has the form:

void handler(asio::error_code ec, result_type result);

the resulting type of the co_await expression is result_type. In the async_read_some example above, this is size_t. If the asynchronous operation fails, the error_code is converted into a system_error exception and thrown.

Where a handler signature has the form:

void handler(asio::error_code ec);

the co_await expression produces a void result. As above, an error is passed back to the coroutine as a system_error exception.

See Also

experimental::co_spawn, experimental::detached, experimental::redirect_error, experimental::awaitable, experimental::await_token, experimental::this_coro::executor, experimental::this_coro::token, Coroutines TS examples, Stackful Coroutines, Stackless Coroutines.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/handler_tracking.html000066400000000000000000000465601340672067200232350ustar00rootroot00000000000000 Handler Tracking
asio C++ library

PrevUpHomeNext

To aid in debugging asynchronous programs, Asio provides support for handler tracking. When enabled by defining ASIO_ENABLE_HANDLER_TRACKING, Asio writes debugging output to the standard error stream. The output records asynchronous operations and the relationships between their handlers.

This feature is useful when debugging and you need to know how your asynchronous operations are chained together, or what the pending asynchronous operations are. As an illustration, here is the output when you run the HTTP Server example, handle a single request, then shut down via Ctrl+C:

@asio|1512254357.979980|0*1|signal_set@0x7ffeaaaa20d8.async_wait
@asio|1512254357.980127|0*2|socket@0x7ffeaaaa20f8.async_accept
@asio|1512254357.980150|.2|non_blocking_accept,ec=asio.system:11
@asio|1512254357.980162|0|resolver@0x7ffeaaaa1fd8.cancel
@asio|1512254368.457147|.2|non_blocking_accept,ec=system:0
@asio|1512254368.457193|>2|ec=system:0
@asio|1512254368.457219|2*3|socket@0x55cf39f0a238.async_receive
@asio|1512254368.457244|.3|non_blocking_recv,ec=system:0,bytes_transferred=141
@asio|1512254368.457275|2*4|socket@0x7ffeaaaa20f8.async_accept
@asio|1512254368.457293|.4|non_blocking_accept,ec=asio.system:11
@asio|1512254368.457301|<2|
@asio|1512254368.457310|>3|ec=system:0,bytes_transferred=141
@asio|1512254368.457441|3*5|socket@0x55cf39f0a238.async_send
@asio|1512254368.457502|.5|non_blocking_send,ec=system:0,bytes_transferred=156
@asio|1512254368.457511|<3|
@asio|1512254368.457519|>5|ec=system:0,bytes_transferred=156
@asio|1512254368.457544|5|socket@0x55cf39f0a238.close
@asio|1512254368.457559|<5|
@asio|1512254371.385106|>1|ec=system:0,signal_number=2
@asio|1512254371.385130|1|socket@0x7ffeaaaa20f8.close
@asio|1512254371.385163|<1|
@asio|1512254371.385175|>4|ec=asio.system:125
@asio|1512254371.385182|<4|
@asio|1512254371.385202|0|signal_set@0x7ffeaaaa20d8.cancel

Each line is of the form:

<tag>|<timestamp>|<action>|<description>

The <tag> is always @asio, and is used to identify and extract the handler tracking messages from the program output.

The <timestamp> is seconds and microseconds from 1 Jan 1970 UTC.

The <action> takes one of the following forms:

>n

The program entered the handler number n. The <description> shows the arguments to the handler.

<n

The program left handler number n.

!n

The program left handler number n due to an exception.

~n

The handler number n was destroyed without having been invoked. This is usually the case for any unfinished asynchronous operations when the io_context is destroyed.

n*m

The handler number n created a new asynchronous operation with completion handler number m. The <description> shows what asynchronous operation was started.

n

The handler number n performed some other operation. The <description> shows what function was called. Currently only close() and cancel() operations are logged, as these may affect the state of pending asynchronous operations.

.n

The implementation performed a system call as part of the asynchronous operation for which handler number n is the completion handler. The <description> shows what function was called and its results. These tracking events are only emitted when using a reactor-based implementation.

Where the <description> shows a synchronous or asynchronous operation, the format is <object-type>@<pointer>.<operation>. For handler entry, it shows a comma-separated list of arguments and their values.

As shown above, Each handler is assigned a numeric identifier. Where the handler tracking output shows a handler number of 0, it means that the action was performed outside of any handler.

Visual Representations

The handler tracking output may be post-processed using the included handlerviz.pl tool to create a visual representation of the handlers (requires the GraphViz tool dot).

Custom Tracking

Handling tracking may be customised by defining the ASIO_CUSTOM_HANDLER_TRACKING macro to the name of a header file (enclosed in "" or <>). This header file must implement the following preprocessor macros:

Macro

Description

ASIO_INHERIT_TRACKED_HANDLER

Specifies a base class for classes that implement asynchronous operations. When used, the macro immediately follows the class name, so it must have the form : public my_class.

ASIO_ALSO_INHERIT_TRACKED_HANDLER

Specifies a base class for classes that implement asynchronous operations. When used, the macro follows other base classes, so it must have the form , public my_class.

ASIO_HANDLER_TRACKING_INIT(args)

An expression that is used to initialise the tracking mechanism.

ASIO_HANDLER_CREATION(args)

An expression that is called on creation of an asynchronous operation. args is a parenthesised function argument list containing the owning execution context, the tracked handler, the name of the object type, a pointer to the object, the object's native handle, and the operation name.

ASIO_HANDLER_COMPLETION(args)

An expression that is called on completion of an asynchronous operation. args is a parenthesised function argument list containing the tracked handler.

ASIO_HANDLER_INVOCATION_BEGIN(args)

An expression that is called immediately before a completion handler is invoked. args is a parenthesised function argument list containing the arguments to the completion handler.

ASIO_HANDLER_INVOCATION_END

An expression that is called immediately after a completion handler is invoked.

ASIO_HANDLER_OPERATION(args)

An expression that is called when some synchronous object operation is called (such as close() or cancel()). args is a parenthesised function argument list containing the owning execution context, the name of the object type, a pointer to the object, the object's native handle, and the operation name.

ASIO_HANDLER_REACTOR_REGISTRATION(args)

An expression that is called when an object is registered with the reactor. args is a parenthesised function argument list containing the owning execution context, the object's native handle, and a unique registration key.

ASIO_HANDLER_REACTOR_DEREGISTRATION(args)

An expression that is called when an object is deregistered from the reactor. args is a parenthesised function argument list containing the owning execution context, the object's native handle, and a unique registration key.

ASIO_HANDLER_REACTOR_READ_EVENT

A bitmask constant used to identify reactor read readiness events.

ASIO_HANDLER_REACTOR_WRITE_EVENT

A bitmask constant used to identify reactor write readiness events.

ASIO_HANDLER_REACTOR_ERROR_EVENT

A bitmask constant used to identify reactor error readiness events.

ASIO_HANDLER_REACTOR_EVENTS(args)

An expression that is called when an object registered with the reactor becomes ready. args is a parenthesised function argument list containing the owning execution context, the unique registration key, and a bitmask of the ready events.

ASIO_HANDLER_REACTOR_OPERATION(args)

An expression that is called when the implementation performs a system call as part of a reactor-based asynchronous operation. args is a parenthesised function argument list containing the tracked handler, the operation name, the error code produced by the operation, and (optionally) the number of bytes transferred.

See Also

Custom handler tracking example.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/line_based.html000066400000000000000000000422131340672067200220120ustar00rootroot00000000000000 Line-Based Operations
asio C++ library

PrevUpHomeNext

Many commonly-used internet protocols are line-based, which means that they have protocol elements that are delimited by the character sequence "\r\n". Examples include HTTP, SMTP and FTP. To more easily permit the implementation of line-based protocols, as well as other protocols that use delimiters, Asio includes the functions read_until() and async_read_until().

The following example illustrates the use of async_read_until() in an HTTP server, to receive the first line of an HTTP request from a client:

class http_connection
{
  ...

  void start()
  {
    asio::async_read_until(socket_, data_, "\r\n",
        boost::bind(&http_connection::handle_request_line, this, _1));
  }

  void handle_request_line(asio::error_code ec)
  {
    if (!ec)
    {
      std::string method, uri, version;
      char sp1, sp2, cr, lf;
      std::istream is(&data_);
      is.unsetf(std::ios_base::skipws);
      is >> method >> sp1 >> uri >> sp2 >> version >> cr >> lf;
      ...
    }
  }

  ...

  asio::ip::tcp::socket socket_;
  asio::streambuf data_;
};

The streambuf data member serves as a place to store the data that has been read from the socket before it is searched for the delimiter. It is important to remember that there may be additional data after the delimiter. This surplus data should be left in the streambuf so that it may be inspected by a subsequent call to read_until() or async_read_until().

The delimiters may be specified as a single char, a std::string or a boost::regex. The read_until() and async_read_until() functions also include overloads that accept a user-defined function object called a match condition. For example, to read data into a streambuf until whitespace is encountered:

typedef asio::buffers_iterator<
    asio::streambuf::const_buffers_type> iterator;

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
asio::streambuf b;
asio::read_until(s, b, match_whitespace);

To read data into a streambuf until a matching character is found:

class match_char
{
public:
  explicit match_char(char c) : c_(c) {}

  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }

private:
  char c_;
};

namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} // namespace asio
...
asio::streambuf b;
asio::read_until(s, b, match_char('a'));

The is_match_condition<> type trait automatically evaluates to true for functions, and for function objects with a nested result_type typedef. For other types the trait must be explicitly specialised, as shown above.

See Also

async_read_until(), is_match_condition, read_until(), streambuf, HTTP client example.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/reactor.html000066400000000000000000000141771340672067200213740ustar00rootroot00000000000000 Reactor-Style Operations
asio C++ library

PrevUpHomeNext

Sometimes a program must be integrated with a third-party library that wants to perform the I/O operations itself. To facilitate this, Asio includes synchronous and asynchronous operations that may be used to wait for a socket to become ready to read, ready to write, or to have a pending error condition.

As an example, to perform a non-blocking read something like the following may be used:

ip::tcp::socket socket(my_io_context);
...
socket.non_blocking(true);
...
socket.async_wait(ip::tcp::socket::wait_read, read_handler);
...
void read_handler(asio::error_code ec)
{
  if (!ec)
  {
    std::vector<char> buf(socket.available());
    socket.read_some(buffer(buf));
  }
}

These operations are supported for sockets on all platforms, and for the POSIX stream-oriented descriptor classes.

See Also

basic_socket::wait(), basic_socket::async_wait(), basic_socket::non_blocking(), basic_socket::native_non_blocking(), nonblocking example.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/spawn.html000066400000000000000000000163131340672067200210570ustar00rootroot00000000000000 Stackful Coroutines
asio C++ library

PrevUpHomeNext

The spawn() function is a high-level wrapper for running stackful coroutines. It is based on the Boost.Coroutine library. The spawn() function enables programs to implement asynchronous logic in a synchronous manner, as shown in the following example:

asio::spawn(my_strand, do_echo);

// ...

void do_echo(asio::yield_context yield)
{
  try
  {
    char data[128];
    for (;;)
    {
      std::size_t length =
        my_socket.async_read_some(
          asio::buffer(data), yield);

      asio::async_write(my_socket,
          asio::buffer(data, length), yield);
    }
  }
  catch (std::exception& e)
  {
    // ...
  }
}

The first argument to spawn() may be a strand, io_context, or completion handler. This argument determines the context in which the coroutine is permitted to execute. For example, a server's per-client object may consist of multiple coroutines; they should all run on the same strand so that no explicit synchronisation is required.

The second argument is a function object with signature:

void coroutine(asio::yield_context yield);

that specifies the code to be run as part of the coroutine. The parameter yield may be passed to an asynchronous operation in place of the completion handler, as in:

std::size_t length =
  my_socket.async_read_some(
    asio::buffer(data), yield);

This starts the asynchronous operation and suspends the coroutine. The coroutine will be resumed automatically when the asynchronous operation completes.

Where an asynchronous operation's handler signature has the form:

void handler(asio::error_code ec, result_type result);

the initiating function returns the result_type. In the async_read_some example above, this is size_t. If the asynchronous operation fails, the error_code is converted into a system_error exception and thrown.

Where a handler signature has the form:

void handler(asio::error_code ec);

the initiating function returns void. As above, an error is passed back to the coroutine as a system_error exception.

To collect the error_code from an operation, rather than have it throw an exception, associate the output variable with the yield_context as follows:

asio::error_code ec;
std::size_t length =
  my_socket.async_read_some(
    asio::buffer(data), yield[ec]);

Note: if spawn() is used with a custom completion handler of type Handler, the function object signature is actually:

void coroutine(asio::basic_yield_context<Handler> yield);
See Also

spawn, yield_context, basic_yield_context, Spawn example (C++03), Spawn example (C++11), Stackless Coroutines.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/strands.html000066400000000000000000000300071340672067200214010ustar00rootroot00000000000000 Strands: Use Threads Without Explicit Locking
asio C++ library

PrevUpHomeNext

A strand is defined as a strictly sequential invocation of event handlers (i.e. no concurrent invocation). Use of strands allows execution of code in a multithreaded program without the need for explicit locking (e.g. using mutexes).

Strands may be either implicit or explicit, as illustrated by the following alternative approaches:

  • Calling io_context::run() from only one thread means all event handlers execute in an implicit strand, due to the io_context's guarantee that handlers are only invoked from inside run().
  • Where there is a single chain of asynchronous operations associated with a connection (e.g. in a half duplex protocol implementation like HTTP) there is no possibility of concurrent execution of the handlers. This is an implicit strand.
  • An explicit strand is an instance of strand<> or io_context::strand. All event handler function objects need to be bound to the strand using asio::bind_executor() or otherwise posted/dispatched through the strand object.

In the case of composed asynchronous operations, such as async_read() or async_read_until(), if a completion handler goes through a strand, then all intermediate handlers should also go through the same strand. This is needed to ensure thread safe access for any objects that are shared between the caller and the composed operation (in the case of async_read() it's the socket, which the caller can close() to cancel the operation).

To achieve this, all asynchronous operations obtain the handler's associated executor by using the get_associated_executor function. For example:

asio::associated_executor_t<Handler> a = asio::get_associated_executor(h);

The associated executor must satisfy the Executor requirements. It will be used by the asynchronous operation to submit both intermediate and final handlers for execution.

The executor may be customised for a particular handler type by specifying a nested type executor_type and member function get_executor():

class my_handler
{
public:
  // Custom implementation of Executor type requirements.
  typedef my_executor executor_type;

  // Return a custom executor implementation.
  executor_type get_executor() const noexcept
  {
    return my_executor();
  }

  void operator()() { ... }
};

In more complex cases, the associated_executor template may be partially specialised directly:

struct my_handler
{
  void operator()() { ... }
};

namespace asio {

  template <class Executor>
  struct associated_executor<my_handler, Executor>
  {
    // Custom implementation of Executor type requirements.
    typedef my_executor type;

    // Return a custom executor implementation.
    static type get(const my_handler&,
        const Executor& = Executor()) noexcept
    {
      return my_executor();
    }
  };

} // namespace asio

The asio::bind_executor() function is a helper to bind a specific executor object, such as a strand, to a completion handler. This binding automatically associates an executor as shown above. For example, to bind a strand to a completion handler we would simply write:

my_socket.async_read_some(my_buffer,
    asio::bind_executor(my_strand,
      [](error_code ec, size_t length)
      {
        // ...
      }));
See Also

associated_executor, get_associated_executor, bind_executor, strand, io_context::strand, tutorial Timer.5, HTTP server 3 example.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/streams.html000066400000000000000000000201601340672067200214000ustar00rootroot00000000000000 Streams, Short Reads and Short Writes
asio C++ library

PrevUpHomeNext

Many I/O objects in Asio are stream-oriented. This means that:

  • There are no message boundaries. The data being transferred is a continuous sequence of bytes.
  • Read or write operations may transfer fewer bytes than requested. This is referred to as a short read or short write.

Objects that provide stream-oriented I/O model one or more of the following type requirements:

  • SyncReadStream, where synchronous read operations are performed using a member function called read_some().
  • AsyncReadStream, where asynchronous read operations are performed using a member function called async_read_some().
  • SyncWriteStream, where synchronous write operations are performed using a member function called write_some().
  • AsyncWriteStream, where asynchronous write operations are performed using a member function called async_write_some().

Examples of stream-oriented I/O objects include ip::tcp::socket, ssl::stream<>, posix::stream_descriptor, windows::stream_handle, etc.

Programs typically want to transfer an exact number of bytes. When a short read or short write occurs the program must restart the operation, and continue to do so until the required number of bytes has been transferred. Asio provides generic functions that do this automatically: read(), async_read(), write() and async_write().

Why EOF is an Error
  • The end of a stream can cause read, async_read, read_until or async_read_until functions to violate their contract. E.g. a read of N bytes may finish early due to EOF.
  • An EOF error may be used to distinguish the end of a stream from a successful read of size 0.
See Also

async_read(), async_write(), read(), write(), AsyncReadStream, AsyncWriteStream, SyncReadStream, SyncWriteStream.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/core/threads.html000066400000000000000000000161131340672067200213570ustar00rootroot00000000000000 Threads and Asio
asio C++ library

PrevUpHomeNext
Thread Safety

In general, it is safe to make concurrent use of distinct objects, but unsafe to make concurrent use of a single object. However, types such as io_context provide a stronger guarantee that it is safe to use a single object concurrently.

Thread Pools

Multiple threads may call io_context::run() to set up a pool of threads from which completion handlers may be invoked. This approach may also be used with post() as a means to perform arbitrary computational tasks across a thread pool.

Note that all threads that have joined an io_context's pool are considered equivalent, and the io_context may distribute work across them in an arbitrary fashion.

Internal Threads

The implementation of this library for a particular platform may make use of one or more internal threads to emulate asynchronicity. As far as possible, these threads must be invisible to the library user. In particular, the threads:

  • must not call the user's code directly; and
  • must block all signals.

This approach is complemented by the following guarantee:

  • Asynchronous completion handlers will only be called from threads that are currently calling io_context::run().

Consequently, it is the library user's responsibility to create and manage all threads to which the notifications will be delivered.

The reasons for this approach include:

  • By only calling io_context::run() from a single thread, the user's code can avoid the development complexity associated with synchronisation. For example, a library user can implement scalable servers that are single-threaded (from the user's point of view).
  • A library user may need to perform initialisation in a thread shortly after the thread starts and before any other application code is executed. For example, users of Microsoft's COM must call CoInitializeEx before any other COM operations can be called from that thread.
  • The library interface is decoupled from interfaces for thread creation and management, and permits implementations on platforms where threads are not available.
See Also

io_context, post.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011.html000066400000000000000000000062011340672067200200600ustar00rootroot00000000000000 C++ 2011 Support
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/000077500000000000000000000000001340672067200171735ustar00rootroot00000000000000asio-1.12.2/doc/asio/overview/cpp2011/array.html000066400000000000000000000073731340672067200212110ustar00rootroot00000000000000 Array Container
asio C++ library

PrevUpHomeNext

Where the standard library provides std::array<>, Asio:

Support for std::array<> is automatically enabled for g++ 4.3 and later, when the -std=c++0x or -std=gnu++0x compiler options are used, as well as for Microsoft Visual C++ 10. It may be disabled by defining ASIO_DISABLE_STD_ARRAY, or explicitly enabled for other compilers by defining ASIO_HAS_STD_ARRAY.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/atomic.html000066400000000000000000000055271340672067200213460ustar00rootroot00000000000000 Atomics
asio C++ library

PrevUpHomeNext

Asio's implementation can use std::atomic<> in preference to boost::detail::atomic_count.

Support for the standard atomic integer template is automatically enabled for g++ 4.5 and later, when the -std=c++0x or -std=gnu++0x compiler options are used. It may be disabled by defining ASIO_DISABLE_STD_ATOMIC, or explicitly enabled for other compilers by defining ASIO_HAS_STD_ATOMIC.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/chrono.html000066400000000000000000000100231340672067200213450ustar00rootroot00000000000000 Chrono
asio C++ library

PrevUpHomeNext

Asio provides timers based on the std::chrono facilities via the basic_waitable_timer class template. The typedefs system_timer, steady_timer and high_resolution_timer utilise the standard clocks system_clock, steady_clock and high_resolution_clock respectively.

Support for the std::chrono facilities is automatically enabled for g++ 4.6 and later, when the -std=c++0x or -std=gnu++0x compiler options are used. (Note that, for g++, the draft-standard monotonic_clock is used in place of steady_clock.) Support may be disabled by defining ASIO_DISABLE_STD_CHRONO, or explicitly enabled for other compilers by defining ASIO_HAS_STD_CHRONO.

When standard chrono is unavailable, Asio will otherwise use the Boost.Chrono library. The basic_waitable_timer class template may be used with either.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/futures.html000066400000000000000000000101661340672067200215620ustar00rootroot00000000000000 Futures
asio C++ library

PrevUpHomeNext

The asio::use_future special value provides first-class support for returning a C++11 std::future from an asynchronous operation's initiating function.

To use asio::use_future, pass it to an asynchronous operation instead of a normal completion handler. For example:

std::future<std::size_t> length =
  my_socket.async_read_some(my_buffer, asio::use_future);

Where a handler signature has the form:

void handler(asio::error_code ec, result_type result);

the initiating function returns a std::future templated on result_type. In the above example, this is std::size_t. If the asynchronous operation fails, the error_code is converted into a system_error exception and passed back to the caller through the future.

Where a handler signature has the form:

void handler(asio::error_code ec);

the initiating function returns std::future<void>. As above, an error is passed back in the future as a system_error exception.

use_future, use_future_t, Futures example (C++11).


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/move_handlers.html000066400000000000000000000104521340672067200227110ustar00rootroot00000000000000 Movable Handlers
asio C++ library

PrevUpHomeNext

As an optimisation, user-defined completion handlers may provide move constructors, and Asio's implementation will use a handler's move constructor in preference to its copy constructor. In certain circumstances, Asio may be able to eliminate all calls to a handler's copy constructor. However, handler types are still required to be copy constructible.

When move support is enabled, asynchronous that are documented as follows:

template <typename Handler>
void async_XYZ(..., Handler handler);

are actually declared as:

template <typename Handler>
void async_XYZ(..., Handler&& handler);

The handler argument is perfectly forwarded and the move construction occurs within the body of async_XYZ(). This ensures that all other function arguments are evaluated prior to the move. This is critical when the other arguments to async_XYZ() are members of the handler. For example:

struct my_operation
{
  shared_ptr<tcp::socket> socket;
  shared_ptr<vector<char>> buffer;
  ...
  void operator(error_code ec, size_t length)
  {
    ...
    socket->async_read_some(asio::buffer(*buffer), std::move(*this));
    ...
  }
};

Move support is automatically enabled for g++ 4.5 and later, when the -std=c++0x or -std=gnu++0x compiler options are used. It may be disabled by defining ASIO_DISABLE_MOVE, or explicitly enabled for other compilers by defining ASIO_HAS_MOVE. Note that these macros also affect the availability of movable I/O objects.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/move_objects.html000066400000000000000000000106071340672067200225440ustar00rootroot00000000000000 Movable I/O Objects
asio C++ library

PrevUpHomeNext

When move support is available (via rvalue references), Asio allows move construction and assignment of sockets, serial ports, POSIX descriptors and Windows handles.

Move support allows you to write code like:

tcp::socket make_socket(io_context& i)
{
  tcp::socket s(i);
  ...
  std::move(s);
}

or:

class connection : public enable_shared_from_this<connection>
{
private:
  tcp::socket socket_;
  ...
public:
  connection(tcp::socket&& s) : socket_(std::move(s)) {}
  ...
};

...

class server
{
private:
  tcp::acceptor acceptor_;
  ...
  void handle_accept(error_code ec, tcp::socket socket)
  {
    if (!ec)
      std::make_shared<connection>(std::move(socket))->go();
    acceptor_.async_accept(...);
  }
  ...
};

as well as:

std::vector<tcp::socket> sockets;
sockets.push_back(tcp::socket(...));

A word of warning: There is nothing stopping you from moving these objects while there are pending asynchronous operations, but it is unlikely to be a good idea to do so. In particular, composed operations like async_read() store a reference to the stream object. Moving during the composed operation means that the composed operation may attempt to access a moved-from object.

Move support is automatically enabled for g++ 4.5 and later, when the -std=c++0x or -std=gnu++0x compiler options are used. It may be disabled by defining ASIO_DISABLE_MOVE, or explicitly enabled for other compilers by defining ASIO_HAS_MOVE. Note that these macros also affect the availability of movable handlers.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/shared_ptr.html000066400000000000000000000056341340672067200222240ustar00rootroot00000000000000 Shared Pointers
asio C++ library

PrevUpHomeNext

Asio's implementation can use std::shared_ptr<> and std::weak_ptr<> in preference to the Boost equivalents.

Support for the standard smart pointers is automatically enabled for g++ 4.3 and later, when the -std=c++0x or -std=gnu++0x compiler options are used, as well as for Microsoft Visual C++ 10. It may be disabled by defining ASIO_DISABLE_STD_SHARED_PTR, or explicitly enabled for other compilers by defining ASIO_HAS_STD_SHARED_PTR.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/system_error.html000066400000000000000000000061731340672067200226250ustar00rootroot00000000000000 System Errors and Error Codes
asio C++ library

PrevUpHomeNext

When available, Asio can use the std::error_code and std::system_error classes for reporting errors. In this case, the names asio::error_code and asio::system_error will be typedefs for these standard classes.

System error support is automatically enabled for g++ 4.6 and later, when the -std=c++0x or -std=gnu++0x compiler options are used. It may be disabled by defining ASIO_DISABLE_STD_SYSTEM_ERROR, or explicitly enabled for other compilers by defining ASIO_HAS_STD_SYSTEM_ERROR.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/cpp2011/variadic.html000066400000000000000000000061631340672067200216510ustar00rootroot00000000000000 Variadic Templates
asio C++ library

PrevUpHomeNext

When supported by a compiler, Asio can use variadic templates to implement the basic_socket_streambuf::connect() and basic_socket_iostream::connect() functions.

Support for variadic templates is automatically enabled for g++ 4.3 and later, when the -std=c++0x or -std=gnu++0x compiler options are used. It may be disabled by defining ASIO_DISABLE_VARIADIC_TEMPLATES, or explicitly enabled for other compilers by defining ASIO_HAS_VARIADIC_TEMPLATES.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/implementation.html000066400000000000000000000621621340672067200220270ustar00rootroot00000000000000 Platform-Specific Implementation Notes
asio C++ library

PrevUpHomeNext

This section lists platform-specific implementation details, such as the default demultiplexing mechanism, the number of threads created internally, and when threads are created.

Linux Kernel 2.4

Demultiplexing mechanism:

  • Uses select for demultiplexing. This means that the number of file descriptors in the process cannot be permitted to exceed FD_SETSIZE.

Threads:

  • Demultiplexing using select is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
Linux Kernel 2.6

Demultiplexing mechanism:

  • Uses epoll for demultiplexing.

Threads:

  • Demultiplexing using epoll is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
Solaris

Demultiplexing mechanism:

  • Uses /dev/poll for demultiplexing.

Threads:

  • Demultiplexing using /dev/poll is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
QNX Neutrino

Demultiplexing mechanism:

  • Uses select for demultiplexing. This means that the number of file descriptors in the process cannot be permitted to exceed FD_SETSIZE.

Threads:

  • Demultiplexing using select is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
Mac OS X

Demultiplexing mechanism:

  • Uses kqueue for demultiplexing.

Threads:

  • Demultiplexing using kqueue is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
FreeBSD

Demultiplexing mechanism:

  • Uses kqueue for demultiplexing.

Threads:

  • Demultiplexing using kqueue is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
AIX

Demultiplexing mechanism:

  • Uses select for demultiplexing. This means that the number of file descriptors in the process cannot be permitted to exceed FD_SETSIZE.

Threads:

  • Demultiplexing using select is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
HP-UX

Demultiplexing mechanism:

  • Uses select for demultiplexing. This means that the number of file descriptors in the process cannot be permitted to exceed FD_SETSIZE.

Threads:

  • Demultiplexing using select is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
Tru64

Demultiplexing mechanism:

  • Uses select for demultiplexing. This means that the number of file descriptors in the process cannot be permitted to exceed FD_SETSIZE.

Threads:

  • Demultiplexing using select is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • At most min(64,IOV_MAX) buffers may be transferred in a single operation.
Windows 95, 98 and Me

Demultiplexing mechanism:

  • Uses select for demultiplexing.

Threads:

  • Demultiplexing using select is performed in one of the threads that calls io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • For sockets, at most 16 buffers may be transferred in a single operation.
Windows NT, 2000, XP, 2003, Vista, 7 and 8

Demultiplexing mechanism:

  • Uses overlapped I/O and I/O completion ports for all asynchronous socket operations except for asynchronous connect.
  • Uses select for emulating asynchronous connect.

Threads:

  • Demultiplexing using I/O completion ports is performed in all threads that call io_context::run(), io_context::run_one(), io_context::poll() or io_context::poll_one().
  • An additional thread per io_context is used to trigger timers. This thread is created on construction of the first basic_deadline_timer or basic_waitable_timer objects.
  • An additional thread per io_context is used for the select demultiplexing. This thread is created on the first call to async_connect().
  • An additional thread per io_context is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

Scatter-Gather:

  • For sockets, at most 64 buffers may be transferred in a single operation.
  • For stream-oriented handles, only one buffer may be transferred in a single operation.
Windows Runtime

Asio provides limited support for the Windows Runtime. It requires that the language extensions be enabled. Due to the restricted facilities exposed by the Windows Runtime API, the support comes with the following caveats:

  • The core facilities such as the io_context, strand, buffers, composed operations, timers, etc., should all work as normal.
  • For sockets, only client-side TCP is supported.
  • Explicit binding of a client-side TCP socket is not supported.
  • The cancel() function is not supported for sockets. Asynchronous operations may only be cancelled by closing the socket.
  • Operations that use null_buffers are not supported.
  • Only tcp::no_delay and socket_base::keep_alive options are supported.
  • Resolvers do not support service names, only numbers. I.e. you must use "80" rather than "http".
  • Most resolver query flags have no effect.

Demultiplexing mechanism:

  • Uses the Windows::Networking::Sockets::StreamSocket class to implement asynchronous TCP socket operations.

Threads:

  • Event completions are delivered to the Windows thread pool and posted to the io_context for the handler to be executed.
  • An additional thread per io_context is used to trigger timers. This thread is created on construction of the first timer objects.

Scatter-Gather:

  • For sockets, at most one buffer may be transferred in a single operation.

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/networking.html000066400000000000000000000056341340672067200211720ustar00rootroot00000000000000 Networking
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/networking/000077500000000000000000000000001340672067200202745ustar00rootroot00000000000000asio-1.12.2/doc/asio/overview/networking/bsd_sockets.html000066400000000000000000000703521340672067200234740ustar00rootroot00000000000000 The BSD Socket API and Asio
asio C++ library

PrevUpHomeNext

The Asio library includes a low-level socket interface based on the BSD socket API, which is widely implemented and supported by extensive literature. It is also used as the basis for networking APIs in other languages, like Java. This low-level interface is designed to support the development of efficient and scalable applications. For example, it permits programmers to exert finer control over the number of system calls, avoid redundant data copying, minimise the use of resources like threads, and so on.

Unsafe and error prone aspects of the BSD socket API not included. For example, the use of int to represent all sockets lacks type safety. The socket representation in Asio uses a distinct type for each protocol, e.g. for TCP one would use ip::tcp::socket, and for UDP one uses ip::udp::socket.

The following table shows the mapping between the BSD socket API and Asio:

BSD Socket API Elements

Equivalents in Asio

socket descriptor - int (POSIX) or SOCKET (Windows)

For TCP: ip::tcp::socket, ip::tcp::acceptor

For UDP: ip::udp::socket

basic_socket, basic_stream_socket, basic_datagram_socket, basic_raw_socket

in_addr, in6_addr

ip::address, ip::address_v4, ip::address_v6

sockaddr_in, sockaddr_in6

For TCP: ip::tcp::endpoint

For UDP: ip::udp::endpoint

ip::basic_endpoint

accept()

For TCP: ip::tcp::acceptor::accept()

basic_socket_acceptor::accept()

bind()

For TCP: ip::tcp::acceptor::bind(), ip::tcp::socket::bind()

For UDP: ip::udp::socket::bind()

basic_socket::bind()

close()

For TCP: ip::tcp::acceptor::close(), ip::tcp::socket::close()

For UDP: ip::udp::socket::close()

basic_socket::close()

connect()

For TCP: ip::tcp::socket::connect()

For UDP: ip::udp::socket::connect()

basic_socket::connect()

getaddrinfo(), gethostbyaddr(), gethostbyname(), getnameinfo(), getservbyname(), getservbyport()

For TCP: ip::tcp::resolver::resolve(), ip::tcp::resolver::async_resolve()

For UDP: ip::udp::resolver::resolve(), ip::udp::resolver::async_resolve()

ip::basic_resolver::resolve(), ip::basic_resolver::async_resolve()

gethostname()

ip::host_name()

getpeername()

For TCP: ip::tcp::socket::remote_endpoint()

For UDP: ip::udp::socket::remote_endpoint()

basic_socket::remote_endpoint()

getsockname()

For TCP: ip::tcp::acceptor::local_endpoint(), ip::tcp::socket::local_endpoint()

For UDP: ip::udp::socket::local_endpoint()

basic_socket::local_endpoint()

getsockopt()

For TCP: ip::tcp::acceptor::get_option(), ip::tcp::socket::get_option()

For UDP: ip::udp::socket::get_option()

basic_socket::get_option()

inet_addr(), inet_aton(), inet_pton()

ip::address::from_string(), ip::address_v4::from_string(), ip_address_v6::from_string()

inet_ntoa(), inet_ntop()

ip::address::to_string(), ip::address_v4::to_string(), ip_address_v6::to_string()

ioctl()

For TCP: ip::tcp::socket::io_control()

For UDP: ip::udp::socket::io_control()

basic_socket::io_control()

listen()

For TCP: ip::tcp::acceptor::listen()

basic_socket_acceptor::listen()

poll(), select(), pselect()

io_context::run(), io_context::run_one(), io_context::poll(), io_context::poll_one()

Note: in conjunction with asynchronous operations.

readv(), recv(), read()

For TCP: ip::tcp::socket::read_some(), ip::tcp::socket::async_read_some(), ip::tcp::socket::receive(), ip::tcp::socket::async_receive()

For UDP: ip::udp::socket::receive(), ip::udp::socket::async_receive()

basic_stream_socket::read_some(), basic_stream_socket::async_read_some(), basic_stream_socket::receive(), basic_stream_socket::async_receive(), basic_datagram_socket::receive(), basic_datagram_socket::async_receive()

recvfrom()

For UDP: ip::udp::socket::receive_from(), ip::udp::socket::async_receive_from()

basic_datagram_socket::receive_from(), basic_datagram_socket::async_receive_from()

send(), write(), writev()

For TCP: ip::tcp::socket::write_some(), ip::tcp::socket::async_write_some(), ip::tcp::socket::send(), ip::tcp::socket::async_send()

For UDP: ip::udp::socket::send(), ip::udp::socket::async_send()

basic_stream_socket::write_some(), basic_stream_socket::async_write_some(), basic_stream_socket::send(), basic_stream_socket::async_send(), basic_datagram_socket::send(), basic_datagram_socket::async_send()

sendto()

For UDP: ip::udp::socket::send_to(), ip::udp::socket::async_send_to()

basic_datagram_socket::send_to(), basic_datagram_socket::async_send_to()

setsockopt()

For TCP: ip::tcp::acceptor::set_option(), ip::tcp::socket::set_option()

For UDP: ip::udp::socket::set_option()

basic_socket::set_option()

shutdown()

For TCP: ip::tcp::socket::shutdown()

For UDP: ip::udp::socket::shutdown()

basic_socket::shutdown()

sockatmark()

For TCP: ip::tcp::socket::at_mark()

basic_socket::at_mark()

socket()

For TCP: ip::tcp::acceptor::open(), ip::tcp::socket::open()

For UDP: ip::udp::socket::open()

basic_socket::open()

socketpair()

local::connect_pair()

Note: POSIX operating systems only.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/networking/iostreams.html000066400000000000000000000123311340672067200231700ustar00rootroot00000000000000 Socket Iostreams
asio C++ library

PrevUpHomeNext

Asio includes classes that implement iostreams on top of sockets. These hide away the complexities associated with endpoint resolution, protocol independence, etc. To create a connection one might simply write:

ip::tcp::iostream stream("www.boost.org", "http");
if (!stream)
{
  // Can't connect.
}

The iostream class can also be used in conjunction with an acceptor to create simple servers. For example:

io_context ioc;

ip::tcp::endpoint endpoint(tcp::v4(), 80);
ip::tcp::acceptor acceptor(ios, endpoint);

for (;;)
{
  ip::tcp::iostream stream;
  acceptor.accept(stream.socket());
  ...
}

Timeouts may be set by calling expires_at() or expires_from_now() to establish a deadline. Any socket operations that occur past the deadline will put the iostream into a "bad" state.

For example, a simple client program like this:

ip::tcp::iostream stream;
stream.expires_from_now(boost::posix_time::seconds(60));
stream.connect("www.boost.org", "http");
stream << "GET /LICENSE_1_0.txt HTTP/1.0\r\n";
stream << "Host: www.boost.org\r\n";
stream << "Accept: */*\r\n";
stream << "Connection: close\r\n\r\n";
stream.flush();
std::cout << stream.rdbuf();

will fail if all the socket operations combined take longer than 60 seconds.

If an error does occur, the iostream's error() member function may be used to retrieve the error code from the most recent system call:

if (!stream)
{
  std::cout << "Error: " << stream.error().message() << "\n";
}
See Also

ip::tcp::iostream, basic_socket_iostream, iostreams examples.

Notes

These iostream templates only support char, not wchar_t, and do not perform any code conversion.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/networking/other_protocols.html000066400000000000000000000216331340672067200244140ustar00rootroot00000000000000 Support for Other Protocols
asio C++ library

PrevUpHomeNext

Support for other socket protocols (such as Bluetooth or IRCOMM sockets) can be added by implementing the protocol type requirements. However, in many cases these protocols may also be used with Asio's generic protocol support. For this, Asio provides the following four classes:

These classes implement the protocol type requirements, but allow the user to specify the address family (e.g. AF_INET) and protocol type (e.g. IPPROTO_TCP) at runtime. For example:

asio::generic::stream_protocol::socket my_socket(my_io_context);
my_socket.open(asio::generic::stream_protocol(AF_INET, IPPROTO_TCP));
...

An endpoint class template, asio::generic::basic_endpoint, is included to support these protocol classes. This endpoint can hold any other endpoint type, provided its native representation fits into a sockaddr_storage object. This class will also convert from other types that implement the endpoint type requirements:

asio::ip::tcp::endpoint my_endpoint1 = ...;
asio::generic::stream_protocol::endpoint my_endpoint2(my_endpoint1);

The conversion is implicit, so as to support the following use cases:

asio::generic::stream_protocol::socket my_socket(my_io_context);
asio::ip::tcp::endpoint my_endpoint = ...;
my_socket.connect(my_endpoint);
C++11 Move Construction

When using C++11, it is possible to perform move construction from a socket (or acceptor) object to convert to the more generic protocol's socket (or acceptor) type. If the protocol conversion is valid:

Protocol1 p1 = ...;
Protocol2 p2(p1);

then the corresponding socket conversion is allowed:

Protocol1::socket my_socket1(my_io_context);
...
Protocol2::socket my_socket2(std::move(my_socket1));

For example, one possible conversion is from a TCP socket to a generic stream-oriented socket:

asio::ip::tcp::socket my_socket1(my_io_context);
...
asio::generic::stream_protocol::socket my_socket2(std::move(my_socket1));

These conversions are also available for move-assignment.

These conversions are not limited to the above generic protocol classes. User-defined protocols may take advantage of this feature by similarly ensuring the conversion from Protocol1 to Protocol2 is valid, as above.

Accepting Generic Sockets

As a convenience, a socket acceptor's accept() and async_accept() functions can directly accept into a different protocol's socket type, provided the corresponding protocol conversion is valid. For example, the following is supported because the protocol asio::ip::tcp is convertible to asio::generic::stream_protocol:

asio::ip::tcp::acceptor my_acceptor(my_io_context);
...
asio::generic::stream_protocol::socket my_socket(my_io_context);
my_acceptor.accept(my_socket);
See Also

generic::datagram_protocol, generic::raw_protocol, generic::seq_packet_protocol, generic::stream_protocol, protocol type requirements.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/networking/protocols.html000066400000000000000000000262121340672067200232110ustar00rootroot00000000000000 TCP, UDP and ICMP
asio C++ library

PrevUpHomeNext

Asio provides off-the-shelf support for the internet protocols TCP, UDP and ICMP.

TCP Clients

Hostname resolution is performed using a resolver, where host and service names are looked up and converted into one or more endpoints:

ip::tcp::resolver resolver(my_io_context);
ip::tcp::resolver::query query("www.boost.org", "http");
ip::tcp::resolver::iterator iter = resolver.resolve(query);
ip::tcp::resolver::iterator end; // End marker.
while (iter != end)
{
  ip::tcp::endpoint endpoint = *iter++;
  std::cout << endpoint << std::endl;
}

The list of endpoints obtained above could contain both IPv4 and IPv6 endpoints, so a program should try each of them until it finds one that works. This keeps the client program independent of a specific IP version.

To simplify the development of protocol-independent programs, TCP clients may establish connections using the free functions connect() and async_connect(). These operations try each endpoint in a list until the socket is successfully connected. For example, a single call:

ip::tcp::socket socket(my_io_context);
asio::connect(socket, resolver.resolve(query));

will synchronously try all endpoints until one is successfully connected. Similarly, an asynchronous connect may be performed by writing:

asio::async_connect(socket_, iter,
    boost::bind(&client::handle_connect, this,
      asio::placeholders::error));

// ...

void handle_connect(const error_code& error)
{
  if (!error)
  {
    // Start read or write operations.
  }
  else
  {
    // Handle error.
  }
}

When a specific endpoint is available, a socket can be created and connected:

ip::tcp::socket socket(my_io_context);
socket.connect(endpoint);

Data may be read from or written to a connected TCP socket using the receive(), async_receive(), send() or async_send() member functions. However, as these could result in short writes or reads, an application will typically use the following operations instead: read(), async_read(), write() and async_write().

TCP Servers

A program uses an acceptor to accept incoming TCP connections:

ip::tcp::acceptor acceptor(my_io_context, my_endpoint);
...
ip::tcp::socket socket(my_io_context);
acceptor.accept(socket);

After a socket has been successfully accepted, it may be read from or written to as illustrated for TCP clients above.

UDP

UDP hostname resolution is also performed using a resolver:

ip::udp::resolver resolver(my_io_context);
ip::udp::resolver::query query("localhost", "daytime");
ip::udp::resolver::iterator iter = resolver.resolve(query);
...

A UDP socket is typically bound to a local endpoint. The following code will create an IP version 4 UDP socket and bind it to the "any" address on port 12345:

ip::udp::endpoint endpoint(ip::udp::v4(), 12345);
ip::udp::socket socket(my_io_context, endpoint);

Data may be read from or written to an unconnected UDP socket using the receive_from(), async_receive_from(), send_to() or async_send_to() member functions. For a connected UDP socket, use the receive(), async_receive(), send() or async_send() member functions.

ICMP

As with TCP and UDP, ICMP hostname resolution is performed using a resolver:

ip::icmp::resolver resolver(my_io_context);
ip::icmp::resolver::query query("localhost", "");
ip::icmp::resolver::iterator iter = resolver.resolve(query);
...

An ICMP socket may be bound to a local endpoint. The following code will create an IP version 6 ICMP socket and bind it to the "any" address:

ip::icmp::endpoint endpoint(ip::icmp::v6(), 0);
ip::icmp::socket socket(my_io_context, endpoint);

The port number is not used for ICMP.

Data may be read from or written to an unconnected ICMP socket using the receive_from(), async_receive_from(), send_to() or async_send_to() member functions.

See Also

ip::tcp, ip::udp, ip::icmp, daytime protocol tutorials, ICMP ping example.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/posix.html000066400000000000000000000050031340672067200201330ustar00rootroot00000000000000 POSIX-Specific Functionality
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/posix/000077500000000000000000000000001340672067200172475ustar00rootroot00000000000000asio-1.12.2/doc/asio/overview/posix/fork.html000066400000000000000000000103441340672067200211000ustar00rootroot00000000000000 Fork
asio C++ library

PrevUpHomeNext

Asio supports programs that utilise the fork() system call. Provided the program calls io_context.notify_fork() at the appropriate times, Asio will recreate any internal file descriptors (such as the "self-pipe trick" descriptor used for waking up a reactor). The notification is usually performed as follows:

io_context_.notify_fork(asio::io_context::fork_prepare);
if (fork() == 0)
{
  io_context_.notify_fork(asio::io_context::fork_child);
  ...
}
else
{
  io_context_.notify_fork(asio::io_context::fork_parent);
  ...
}

User-defined services can also be made fork-aware by overriding the io_context::service::notify_fork() virtual function.

Note that any file descriptors accessible via Asio's public API (e.g. the descriptors underlying basic_socket<>, posix::stream_descriptor, etc.) are not altered during a fork. It is the program's responsibility to manage these as required.

See Also

io_context::notify_fork(), io_context::fork_event, io_context::service::notify_fork(), Fork examples.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/posix/local.html000066400000000000000000000143431340672067200212340ustar00rootroot00000000000000 UNIX Domain Sockets
asio C++ library

PrevUpHomeNext

Asio provides basic support UNIX domain sockets (also known as local sockets). The simplest use involves creating a pair of connected sockets. The following code:

local::stream_protocol::socket socket1(my_io_context);
local::stream_protocol::socket socket2(my_io_context);
local::connect_pair(socket1, socket2);

will create a pair of stream-oriented sockets. To do the same for datagram-oriented sockets, use:

local::datagram_protocol::socket socket1(my_io_context);
local::datagram_protocol::socket socket2(my_io_context);
local::connect_pair(socket1, socket2);

A UNIX domain socket server may be created by binding an acceptor to an endpoint, in much the same way as one does for a TCP server:

::unlink("/tmp/foobar"); // Remove previous binding.
local::stream_protocol::endpoint ep("/tmp/foobar");
local::stream_protocol::acceptor acceptor(my_io_context, ep);
local::stream_protocol::socket socket(my_io_context);
acceptor.accept(socket);

A client that connects to this server might look like:

local::stream_protocol::endpoint ep("/tmp/foobar");
local::stream_protocol::socket socket(my_io_context);
socket.connect(ep);

Transmission of file descriptors or credentials across UNIX domain sockets is not directly supported within Asio, but may be achieved by accessing the socket's underlying descriptor using the native_handle() member function.

See Also

local::connect_pair, local::datagram_protocol, local::datagram_protocol::endpoint, local::datagram_protocol::socket, local::stream_protocol, local::stream_protocol::acceptor, local::stream_protocol::endpoint, local::stream_protocol::iostream, local::stream_protocol::socket, UNIX domain sockets examples.

Notes

UNIX domain sockets are only available at compile time if supported by the target operating system. A program may test for the macro ASIO_HAS_LOCAL_SOCKETS to determine whether they are supported.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/posix/stream_descriptor.html000066400000000000000000000126121340672067200236700ustar00rootroot00000000000000 Stream-Oriented File Descriptors
asio C++ library

PrevUpHomeNext

Asio includes classes added to permit synchronous and asynchronous read and write operations to be performed on POSIX file descriptors, such as pipes, standard input and output, and various devices.

These classes also provide limited support for regular files. This support assumes that the underlying read and write operations provided by the operating system never fail with EAGAIN or EWOULDBLOCK. (This assumption normally holds for buffered file I/O.) Synchronous and asynchronous read and write operations on file descriptors will succeed but the I/O will always be performed immediately. Wait operations, and operations involving asio::null_buffers, are not portably supported.

For example, to perform read and write operations on standard input and output, the following objects may be created:

posix::stream_descriptor in(my_io_context, ::dup(STDIN_FILENO));
posix::stream_descriptor out(my_io_context, ::dup(STDOUT_FILENO));

These are then used as synchronous or asynchronous read and write streams. This means the objects can be used with any of the read(), async_read(), write(), async_write(), read_until() or async_read_until() free functions.

See Also

posix::stream_descriptor, Chat example (C++03), Chat example (C++11).

Notes

POSIX stream descriptors are only available at compile time if supported by the target operating system. A program may test for the macro ASIO_HAS_POSIX_STREAM_DESCRIPTOR to determine whether they are supported.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/rationale.html000066400000000000000000000124521340672067200207550ustar00rootroot00000000000000 Rationale
asio C++ library

PrevUpHomeNext

Most programs interact with the outside world in some way, whether it be via a file, a network, a serial cable, or the console. Sometimes, as is the case with networking, individual I/O operations can take a long time to complete. This poses particular challenges to application development.

Asio provides the tools to manage these long running operations, without requiring programs to use concurrency models based on threads and explicit locking.

The Asio library is intended for programmers using C++ for systems programming, where access to operating system functionality such as networking is often required. In particular, Asio addresses the following goals:

  • Portability. The library should support a range of commonly used operating systems, and provide consistent behaviour across these operating systems.
  • Scalability. The library should facilitate the development of network applications that scale to thousands of concurrent connections. The library implementation for each operating system should use the mechanism that best enables this scalability.
  • Efficiency. The library should support techniques such as scatter-gather I/O, and allow programs to minimise data copying.
  • Model concepts from established APIs, such as BSD sockets. The BSD socket API is widely implemented and understood, and is covered in much literature. Other programming languages often use a similar interface for networking APIs. As far as is reasonable, Asio should leverage existing practice.
  • Ease of use. The library should provide a lower entry barrier for new users by taking a toolkit, rather than framework, approach. That is, it should try to minimise the up-front investment in time to just learning a few basic rules and guidelines. After that, a library user should only need to understand the specific functions that are being used.
  • Basis for further abstraction. The library should permit the development of other libraries that provide higher levels of abstraction. For example, implementations of commonly used protocols such as HTTP.

Although Asio started life focused primarily on networking, its concepts of asynchronous I/O have been extended to include other operating system resources such as serial ports, file descriptors, and so on.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/serial_ports.html000066400000000000000000000123201340672067200214770ustar00rootroot00000000000000 Serial Ports
asio C++ library

PrevUpHomeNext

Asio includes classes for creating and manipulating serial ports in a portable manner. For example, a serial port may be opened using:

serial_port port(my_io_context, name);

where name is something like "COM1" on Windows, and "/dev/ttyS0" on POSIX platforms.

Once opened, the serial port may be used as a stream. This means the objects can be used with any of the read(), async_read(), write(), async_write(), read_until() or async_read_until() free functions.

The serial port implementation also includes option classes for configuring the port's baud rate, flow control type, parity, stop bits and character size.

See Also

serial_port, serial_port_base, serial_port_base::baud_rate, serial_port_base::flow_control, serial_port_base::parity, serial_port_base::stop_bits, serial_port_base::character_size.

Notes

Serial ports are available on all POSIX platforms. For Windows, serial ports are only available at compile time when the I/O completion port backend is used (which is the default). A program may test for the macro ASIO_HAS_SERIAL_PORT to determine whether they are supported.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/signals.html000066400000000000000000000075111340672067200204370ustar00rootroot00000000000000 Signal Handling
asio C++ library

PrevUpHomeNext

Asio supports signal handling using a class called signal_set. Programs may add one or more signals to the set, and then perform an async_wait() operation. The specified handler will be called when one of the signals occurs. The same signal number may be registered with multiple signal_set objects, however the signal number must be used only with Asio.

void handler(
    const asio::error_code& error,
    int signal_number)
{
  if (!error)
  {
    // A signal occurred.
  }
}

...

// Construct a signal set registered for process termination.
asio::signal_set signals(io_context, SIGINT, SIGTERM);

// Start an asynchronous wait for one of the signals to occur.
signals.async_wait(handler);

Signal handling also works on Windows, as the Microsoft Visual C++ runtime library maps console events like Ctrl+C to the equivalent signal.

See Also

signal_set, HTTP server example (C++03), HTTP server example (C++11).


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/ssl.html000066400000000000000000000245261340672067200176050ustar00rootroot00000000000000 SSL
asio C++ library

PrevUpHomeNext

SSL

Asio contains classes and class templates for basic SSL support. These classes allow encrypted communication to be layered on top of an existing stream, such as a TCP socket.

Before creating an encrypted stream, an application must construct an SSL context object. This object is used to set SSL options such as verification mode, certificate files, and so on. As an illustration, client-side initialisation may look something like:

ssl::context ctx(ssl::context::sslv23);
ctx.set_verify_mode(ssl::verify_peer);
ctx.load_verify_file("ca.pem");

To use SSL with a TCP socket, one may write:

ssl::stream<ip::tcp::socket> ssl_sock(my_io_context, ctx);

To perform socket-specific operations, such as establishing an outbound connection or accepting an incoming one, the underlying socket must first be obtained using the ssl::stream template's lowest_layer() member function:

ip::tcp::socket::lowest_layer_type& sock = ssl_sock.lowest_layer();
sock.connect(my_endpoint);

In some use cases the underlying stream object will need to have a longer lifetime than the SSL stream, in which case the template parameter should be a reference to the stream type:

ip::tcp::socket sock(my_io_context);
ssl::stream<ip::tcp::socket&> ssl_sock(sock, ctx);

SSL handshaking must be performed prior to transmitting or receiving data over an encrypted connection. This is accomplished using the ssl::stream template's handshake() or async_handshake() member functions.

Once connected, SSL stream objects are used as synchronous or asynchronous read and write streams. This means the objects can be used with any of the read(), async_read(), write(), async_write(), read_until() or async_read_until() free functions.

Certificate Verification

Asio provides various methods for configuring the way SSL certificates are verified:

To simplify use cases where certificates are verified according to the rules in RFC 2818 (certificate verification for HTTPS), Asio provides a reusable verification callback as a function object:

The following example shows verification of a remote host's certificate according to the rules used by HTTPS:

using asio::ip::tcp;
namespace ssl = asio::ssl;
typedef ssl::stream<tcp::socket> ssl_socket;

// Create a context that uses the default paths for
// finding CA certificates.
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();

// Open a socket and connect it to the remote host.
asio::io_context io_context;
ssl_socket sock(io_context, ctx);
tcp::resolver resolver(io_context);
tcp::resolver::query query("host.name", "https");
asio::connect(sock.lowest_layer(), resolver.resolve(query));
sock.lowest_layer().set_option(tcp::no_delay(true));

// Perform SSL handshake and verify the remote host's
// certificate.
sock.set_verify_mode(ssl::verify_peer);
sock.set_verify_callback(ssl::rfc2818_verification("host.name"));
sock.handshake(ssl_socket::client);

// ... read and write as normal ...
SSL and Threads

SSL stream objects perform no locking of their own. Therefore, it is essential that all asynchronous SSL operations are performed in an implicit or explicit strand. Note that this means that no synchronisation is required (and so no locking overhead is incurred) in single threaded programs.

See Also

ssl::context, ssl::rfc2818_verification, ssl::stream, SSL example (C++03), SSL example (C++11).

Notes

OpenSSL is required to make use of Asio's SSL support. When an application needs to use OpenSSL functionality that is not wrapped by Asio, the underlying OpenSSL types may be obtained by calling ssl::context::native_handle() or ssl::stream::native_handle().


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/timers.html000066400000000000000000000076541340672067200203120ustar00rootroot00000000000000 Timers
asio C++ library

PrevUpHomeNext

Long running I/O operations will often have a deadline by which they must have completed. These deadlines may be expressed as absolute times, but are often calculated relative to the current time.

As a simple example, to perform a synchronous wait operation on a timer using a relative time one may write:

io_context i;
...
deadline_timer t(i);
t.expires_from_now(boost::posix_time::seconds(5));
t.wait();

More commonly, a program will perform an asynchronous wait operation on a timer:

void handler(asio::error_code ec) { ... }
...
io_context i;
...
deadline_timer t(i);
t.expires_from_now(boost::posix_time::milliseconds(400));
t.async_wait(handler);
...
i.run();

The deadline associated with a timer may also be obtained as a relative time:

boost::posix_time::time_duration time_until_expiry
  = t.expires_from_now();

or as an absolute time to allow composition of timers:

deadline_timer t2(i);
t2.expires_at(t.expires_at() + boost::posix_time::seconds(30));
See Also

basic_deadline_timer, deadline_timer, timer tutorials.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/windows.html000066400000000000000000000051151340672067200204670ustar00rootroot00000000000000 Windows-Specific Functionality
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/overview/windows/000077500000000000000000000000001340672067200175775ustar00rootroot00000000000000asio-1.12.2/doc/asio/overview/windows/object_handle.html000066400000000000000000000106301340672067200232460ustar00rootroot00000000000000 Object HANDLEs
asio C++ library

PrevUpHomeNext

Asio provides Windows-specific classes that permit asynchronous wait operations to be performed on HANDLEs to kernel objects of the following types:

  • Change notification
  • Console input
  • Event
  • Memory resource notification
  • Process
  • Semaphore
  • Thread
  • Waitable timer

For example, to perform asynchronous operations on an event, the following object may be created:

HANDLE handle = ::CreateEvent(...);
windows::object_handle file(my_io_context, handle);

The wait() and async_wait() member functions may then be used to wait until the kernel object is signalled.

See Also

windows::object_handle.

Notes

Windows object HANDLEs are only available at compile time when targeting Windows. Programs may test for the macro ASIO_HAS_WINDOWS_OBJECT_HANDLE to determine whether they are supported.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/windows/random_access_handle.html000066400000000000000000000117341340672067200246070ustar00rootroot00000000000000 Random-Access HANDLEs
asio C++ library

PrevUpHomeNext

Asio provides Windows-specific classes that permit asynchronous read and write operations to be performed on HANDLEs that refer to regular files.

For example, to perform asynchronous operations on a file the following object may be created:

HANDLE handle = ::CreateFile(...);
windows::random_access_handle file(my_io_context, handle);

Data may be read from or written to the handle using one of the read_some_at(), async_read_some_at(), write_some_at() or async_write_some_at() member functions. However, like the equivalent functions (read_some(), etc.) on streams, these functions are only required to transfer one or more bytes in a single operation. Therefore free functions called read_at(), async_read_at(), write_at() and async_write_at() have been created to repeatedly call the corresponding *_some_at() function until all data has been transferred.

See Also

windows::random_access_handle.

Notes

Windows random-access HANDLEs are only available at compile time when targeting Windows and only when the I/O completion port backend is used (which is the default). A program may test for the macro ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE to determine whether they are supported.


PrevUpHomeNext
asio-1.12.2/doc/asio/overview/windows/stream_handle.html000066400000000000000000000114001340672067200232670ustar00rootroot00000000000000 Stream-Oriented HANDLEs
asio C++ library

PrevUpHomeNext

Asio contains classes to allow asynchronous read and write operations to be performed on Windows HANDLEs, such as named pipes.

For example, to perform asynchronous operations on a named pipe, the following object may be created:

HANDLE handle = ::CreateFile(...);
windows::stream_handle pipe(my_io_context, handle);

These are then used as synchronous or asynchronous read and write streams. This means the objects can be used with any of the read(), async_read(), write(), async_write(), read_until() or async_read_until() free functions.

The kernel object referred to by the HANDLE must support use with I/O completion ports (which means that named pipes are supported, but anonymous pipes and console streams are not).

See Also

windows::stream_handle.

Notes

Windows stream HANDLEs are only available at compile time when targeting Windows and only when the I/O completion port backend is used (which is the default). A program may test for the macro ASIO_HAS_WINDOWS_STREAM_HANDLE to determine whether they are supported.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference.html000066400000000000000000001320331340672067200170650ustar00rootroot00000000000000 Reference
asio C++ library

PrevUpHomeNext

Core

Classes

coroutine
error_code
execution_context
execution_context::id
execution_context::service
executor
executor_arg_t
invalid_service_owner
io_context
io_context::executor_type
io_context::service
io_context::strand
io_context::work (deprecated)
service_already_exists
system_error
system_executor
thread
thread_pool
thread_pool::executor_type
yield_context

Free Functions

add_service
asio_handler_allocate
asio_handler_deallocate
asio_handler_invoke
asio_handler_is_continuation
bind_executor
dispatch
defer
get_associated_allocator
get_associated_executor
has_service
make_work_guard
post
spawn
use_service

Class Templates

async_completion
basic_io_object
basic_yield_context
executor_binder
executor_work_guard
strand
use_future_t

Special Values

executor_arg
use_future

Boost.Bind Placeholders

placeholders::bytes_transferred
placeholders::endpoint
placeholders::error
placeholders::iterator
placeholders::results
placeholders::signal_number

Error Codes

error::basic_errors
error::netdb_errors
error::addrinfo_errors
error::misc_errors

Type Traits

associated_allocator
associated_executor
async_result
handler_type (deprecated)
is_executor
uses_executor

Type Requirements

Asynchronous operations
CompletionHandler
ExecutionContext
Executor
Handler
Service

Buffers and Buffer-Oriented Operations

Classes

const_buffer
mutable_buffer
const_buffers_1 (deprecated)
mutable_buffers_1 (deprecated)
null_buffers (deprecated)
streambuf

Class Templates

basic_streambuf
buffered_read_stream
buffered_stream
buffered_write_stream
buffers_iterator
dynamic_string_buffer
dynamic_vector_buffer

Free Functions

async_read
async_read_at
async_read_until
async_write
async_write_at
buffer
buffer_cast (deprecated)
buffer_copy
buffer_size
buffers_begin
buffers_end
dynamic_buffer
read
read_at
read_until
transfer_all
transfer_at_least
transfer_exactly
write
write_at

Type Traits

is_const_buffer_sequence
is_match_condition
is_mutable_buffer_sequence
is_read_buffered
is_write_buffered

Type Requirements

Read and write operations
AsyncRandomAccessReadDevice
AsyncRandomAccessWriteDevice
AsyncReadStream
AsyncWriteStream
CompletionCondition
ConstBufferSequence
DynamicBuffer
MutableBufferSequence
ReadHandler
SyncRandomAccessReadDevice
SyncRandomAccessWriteDevice
SyncReadStream
SyncWriteStream
WriteHandler

Networking

Classes

generic::datagram_protocol
generic::datagram_protocol::endpoint
generic::datagram_protocol::socket
generic::raw_protocol
generic::raw_protocol::endpoint
generic::raw_protocol::socket
generic::seq_packet_protocol
generic::seq_packet_protocol::endpoint
generic::seq_packet_protocol::socket
generic::stream_protocol
generic::stream_protocol::endpoint
generic::stream_protocol::iostream
generic::stream_protocol::socket
ip::address
ip::address_v4
ip::address_v4_iterator
ip::address_v4_range
ip::address_v6
ip::address_v6_iterator
ip::address_v6_range
ip::icmp
ip::icmp::endpoint
ip::icmp::resolver
ip::icmp::socket
ip::network_v4
ip::network_v6
ip::resolver_query_base
ip::tcp
ip::tcp::acceptor
ip::tcp::endpoint
ip::tcp::iostream
ip::tcp::resolver
ip::tcp::socket
ip::udp
ip::udp::endpoint
ip::udp::resolver
ip::udp::socket
socket_base

Free Functions

async_connect
connect
ip::host_name
ip::make_address
ip::make_address_v4
ip::make_address_v6
ip::make_network_v4
ip::make_network_v6

Class Templates

basic_datagram_socket
basic_raw_socket
basic_seq_packet_socket
basic_socket
basic_socket_acceptor
basic_socket_iostream
basic_socket_streambuf
basic_stream_socket
generic::basic_endpoint
ip::basic_endpoint
ip::basic_resolver
ip::basic_resolver_entry
ip::basic_resolver_iterator
ip::basic_resolver_query

Socket Options

ip::multicast::enable_loopback
ip::multicast::hops
ip::multicast::join_group
ip::multicast::leave_group
ip::multicast::outbound_interface
ip::tcp::no_delay
ip::unicast::hops
ip::v6_only
socket_base::broadcast
socket_base::debug
socket_base::do_not_route
socket_base::enable_connection_aborted
socket_base::keep_alive
socket_base::linger
socket_base::receive_buffer_size
socket_base::receive_low_watermark
socket_base::reuse_address
socket_base::send_buffer_size
socket_base::send_low_watermark

I/O Control Commands

socket_base::bytes_readable

Type Requirements

Synchronous socket operations
Asynchronous socket operations
AcceptableProtocol
AcceptHandler
ConnectCondition
ConnectHandler
Endpoint
EndpointSequence
GettableSocketOption
InternetProtocol
IoControlCommand
IteratorConnectHandler
MoveAcceptHandler
Protocol
RangeConnectHandler
ResolveHandler
SettableSocketOption

Timers

SSL

Serial Ports

Signal Handling

Classes

deadline_timer
high_resolution_timer
steady_timer
system_timer

Class Templates

basic_deadline_timer
basic_waitable_timer
time_traits
wait_traits

Type Requirements

TimeTraits
WaitHandler
WaitTraits

Classes

ssl::context
ssl::context_base
ssl::rfc2818_verification
ssl::stream_base
ssl::verify_context

Class Templates

ssl::stream

Type Requirements

BufferedHandshakeHandler
HandshakeHandler
ShutdownHandler

Classes

serial_port
serial_port_base

Serial Port Options

serial_port_base::baud_rate
serial_port_base::flow_control
serial_port_base::parity
serial_port_base::stop_bits
serial_port_base::character_size

Type Requirements

GettableSerialPortOption
SettableSerialPortOption

Classes

signal_set

Type Requirements

SignalHandler

POSIX-specific

Windows-specific

Experimental

Classes

local::stream_protocol
local::stream_protocol::acceptor
local::stream_protocol::endpoint
local::stream_protocol::iostream
local::stream_protocol::socket
local::datagram_protocol
local::datagram_protocol::endpoint
local::datagram_protocol::socket
posix::descriptor
posix::descriptor_base
posix::stream_descriptor

Free Functions

local::connect_pair

Class Templates

local::basic_endpoint

Classes

windows::object_handle
windows::overlapped_handle
windows::overlapped_ptr
windows::random_access_handle
windows::stream_handle

Classes

experimental::detached_t
experimental::this_coro::executor_t
experimental::this_coro::token_t

Class Templates

experimental::awaitable
experimental::await_token
experimental::redirect_error_t

Free Functions

experimental::co_spawn
experimental::this_coro::executor
experimental::this_coro::token

Special Values

experimental::detached

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/000077500000000000000000000000001340672067200161755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/AcceptHandler.html000066400000000000000000000103461340672067200215640ustar00rootroot00000000000000 Accept handler requirements
asio C++ library

PrevUpHomeNext

An accept handler must meet the requirements for a handler. A value h of an accept handler class should work correctly in the expression h(ec), where ec is an lvalue of type const error_code.

Examples

A free function as an accept handler:

void accept_handler(
    const asio::error_code& ec)
{
  ...
}

An accept handler function object:

struct accept_handler
{
  ...
  void operator()(
      const asio::error_code& ec)
  {
    ...
  }
  ...
};

A lambda as an accept handler:

acceptor.async_accept(...,
    [](const asio::error_code& ec)
    {
      ...
    });

A non-static class member function adapted to an accept handler using std::bind():

void my_class::accept_handler(
    const asio::error_code& ec)
{
  ...
}
...
acceptor.async_accept(...,
    std::bind(&my_class::accept_handler,
      this, std::placeholders::_1));

A non-static class member function adapted to an accept handler using boost::bind():

void my_class::accept_handler(
    const asio::error_code& ec)
{
  ...
}
...
acceptor.async_accept(...,
    boost::bind(&my_class::accept_handler,
      this, asio::placeholders::error));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/AcceptableProtocol.html000066400000000000000000000077041340672067200226400ustar00rootroot00000000000000 Acceptable protocol requirements
asio C++ library

PrevUpHomeNext

A type X meets the AcceptableProtocol requirements if it satisfies the requirements of Protocol as well as the additional requirements listed below.

Table 1. AcceptableProtocol requirements

expression

return type

assertion/note
pre/post-conditions

X::socket

A type that satisfies the requirements of Destructible (C++Std [destructible]) and MoveConstructible (C++Std [moveconstructible]), and that is publicly and unambiguously derived from basic_socket<X>.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/AsyncRandomAccessReadDevice.html000066400000000000000000000150021340672067200243350ustar00rootroot00000000000000 Buffer-oriented asynchronous random-access read device requirements
asio C++ library

PrevUpHomeNext

In the table below, a denotes an asynchronous random access read device object, o denotes an offset of type boost::uint64_t, mb denotes an object satisfying mutable buffer sequence requirements, and h denotes an object satisfying read handler requirements.

Table 2. Buffer-oriented asynchronous random-access read device requirements

operation

type

semantics, pre/post-conditions

a.get_executor()

A type satisfying the Executor requirements.

Returns the associated I/O executor.

a.async_read_some_at(o, mb, h);

void

Initiates an asynchronous operation to read one or more bytes of data from the device a at the offset o. The operation is performed via the io_service object a.get_io_service() and behaves according to asynchronous operation requirements.

The mutable buffer sequence mb specifies memory where the data should be placed. The async_read_some_at operation shall always fill a buffer in the sequence completely before proceeding to the next.

The implementation shall maintain one or more copies of mb until such time as the read operation no longer requires access to the memory specified by the buffers in the sequence. The program must ensure the memory is valid until:

— the last copy of mb is destroyed, or

— the handler for the asynchronous read operation is invoked,

whichever comes first.

If the total size of all buffers in the sequence mb is 0, the asynchronous read operation shall complete immediately and pass 0 as the argument to the handler that specifies the number of bytes read.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/AsyncRandomAccessWriteDevice.html000066400000000000000000000150731340672067200245640ustar00rootroot00000000000000 Buffer-oriented asynchronous random-access write device requirements
asio C++ library

PrevUpHomeNext

In the table below, a denotes an asynchronous write stream object, o denotes an offset of type boost::uint64_t, cb denotes an object satisfying constant buffer sequence requirements, and h denotes an object satisfying write handler requirements.

Table 3. Buffer-oriented asynchronous random-access write device requirements

operation

type

semantics, pre/post-conditions

a.get_executor()

A type satisfying the Executor requirements.

Returns the associated I/O executor.

a.async_write_some_at(o, cb, h);

void

Initiates an asynchronous operation to write one or more bytes of data to the device a at offset o. The operation is performed via the io_service object a.get_io_service() and behaves according to asynchronous operation requirements.

The constant buffer sequence cb specifies memory where the data to be written is located. The async_write_some_at operation shall always write a buffer in the sequence completely before proceeding to the next.

The implementation shall maintain one or more copies of cb until such time as the write operation no longer requires access to the memory specified by the buffers in the sequence. The program must ensure the memory is valid until:

— the last copy of cb is destroyed, or

— the handler for the asynchronous write operation is invoked,

whichever comes first.

If the total size of all buffers in the sequence cb is 0, the asynchronous write operation shall complete immediately and pass 0 as the argument to the handler that specifies the number of bytes written.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/AsyncReadStream.html000066400000000000000000000151151340672067200221130ustar00rootroot00000000000000 Buffer-oriented asynchronous read stream requirements
asio C++ library

PrevUpHomeNext

A type X meets the AsyncReadStream requirements if it satisfies the requirements listed below.

In the table below, a denotes a value of type X, mb denotes a (possibly const) value satisfying the MutableBufferSequence requirements, and t is a completion token.

Table 4. AsyncReadStream requirements

operation

type

semantics, pre/post-conditions

a.get_executor()

A type satisfying the Executor requirements.

Returns the associated I/O executor.

a.async_read_some(mb,t)

The return type is determined according to the requirements for an asynchronous operation.

Meets the requirements for a read operation and an asynchronous operation with completion signature void(error_code ec, size_t n).

If buffer_size(mb) > 0, initiates an asynchronous operation to read one or more bytes of data from the stream a into the buffer sequence mb. If successful, ec is set such that !ec is true, and n is the number of bytes read. If an error occurred, ec is set such that !!ec is true, and n is 0. If all data has been read from the stream, and the stream performed an orderly shutdown, ec is stream_errc::eof and n is 0.

If buffer_size(mb) == 0, the operation completes immediately. ec is set such that !ec is true, and n is 0.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/AsyncWriteStream.html000066400000000000000000000144141340672067200223330ustar00rootroot00000000000000 Buffer-oriented asynchronous write stream requirements
asio C++ library

PrevUpHomeNext

A type X meets the AsyncWriteStream requirements if it satisfies the requirements listed below.

In the table below, a denotes a value of type X, cb denotes a (possibly const) value satisfying the ConstBufferSequence requirements, and t is a completion token.

Table 5. AsyncWriteStream requirements

operation

type

semantics, pre/post-conditions

a.get_executor()

A type satisfying the Executor requirements.

Returns the associated I/O executor.

a.async_write_some(cb,t)

The return type is determined according to the requirements for an asynchronous operation.

Meets the requirements for a write operation and an asynchronous operation with completion signature void(error_code ec, size_t n).

If buffer_size(cb) > 0, initiates an asynchronous operation to write one or more bytes of data to the stream a from the buffer sequence cb. If successful, ec is set such that !ec is true, and n is the number of bytes written. If an error occurred, ec is set such that !!ec is true, and n is 0.

If buffer_size(cb) == 0, the operation completes immediately. ec is set such that !ec is true, and n is 0.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/BufferedHandshakeHandler.html000066400000000000000000000101451340672067200237130ustar00rootroot00000000000000 Buffered handshake handler requirements
asio C++ library

PrevUpHomeNext

A buffered handshake handler must meet the requirements for a handler. A value h of a buffered handshake handler class should work correctly in the expression h(ec, s), where ec is an lvalue of type const error_code and s is an lvalue of type const size_t.

Examples

A free function as a buffered handshake handler:

void handshake_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}

A buffered handshake handler function object:

struct handshake_handler
{
  ...
  void operator()(
      const asio::error_code& ec,
      std::size_t bytes_transferred)
  {
    ...
  }
  ...
};

A non-static class member function adapted to a buffered handshake handler using boost::bind():

void my_class::handshake_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}
...
socket.async_handshake(...,
    boost::bind(&my_class::handshake_handler,
      this, asio::placeholders::error,
      asio::placeholders::bytes_transferred));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/CompletionCondition.html000066400000000000000000000126001340672067200230420ustar00rootroot00000000000000 Completion condition requirements
asio C++ library

PrevUpHomeNext

A completion condition is a function object that is used with the algorithms read, async_read, write, and async_write to determine when the algorithm has completed transferring data.

A type X meets the CompletionCondition requirements if it satisfies the requirements of Destructible (C++Std [destructible]) and CopyConstructible (C++Std [copyconstructible]), as well as the additional requirements listed below.

In the table below, x denotes a value of type X, ec denotes a (possibly const) value of type error_code, and n denotes a (possibly const) value of type size_t.

Table 6. CompletionCondition requirements

expression

return type

assertion/note
pre/post-condition

x(ec, n)

size_t

Let n be the total number of bytes transferred by the read or write algorithm so far.

Returns the maximum number of bytes to be transferred on the next read_some, async_read_some, write_some, or async_write_some operation performed by the algorithm. Returns 0 to indicate that the algorithm is complete.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/CompletionHandler.html000066400000000000000000000076001340672067200224750ustar00rootroot00000000000000 Completion handler requirements
asio C++ library

PrevUpHomeNext

A completion handler must meet the requirements for a handler. A value h of a completion handler class should work correctly in the expression h().

Examples

A free function as a completion handler:

void completion_handler()
{
  ...
}

A completion handler function object:

struct completion_handler
{
  ...
  void operator()()
  {
    ...
  }
  ...
};

A lambda as a completion handler:

my_io_service.post(
    []()
    {
      ...
    });

A non-static class member function adapted to a completion handler using std::bind():

void my_class::completion_handler()
{
  ...
}
...
my_io_service.post(std::bind(&my_class::completion_handler, this));

A non-static class member function adapted to a completion handler using boost::bind():

void my_class::completion_handler()
{
  ...
}
...
my_io_service.post(boost::bind(&my_class::completion_handler, this));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ConnectCondition.html000066400000000000000000000113371340672067200223300ustar00rootroot00000000000000 Connect condition requirements
asio C++ library

PrevUpHomeNext

A type X meets the ConnectCondition requirements if it satisfies the requirements of Destructible (C++Std [destructible]) and CopyConstructible (C++Std [copyconstructible]), as well as the additional requirements listed below.

In the table below, x denotes a value of type X, ec denotes a (possibly const) value of type error_code, and ep denotes a (possibly const) value of some type satisfying the endpoint requirements.

Table 7. ConnectCondition requirements

expression

return type

assertion/note
pre/post-condition

x(ec, ep)

bool

Returns true to indicate that the connect or async_connect algorithm should attempt a connection to the endpoint ep. Otherwise, returns false to indicate that the algorithm should not attempt connection to the endpoint ep, and should instead skip to the next endpoint in the sequence.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ConnectHandler.html000066400000000000000000000102641340672067200217550ustar00rootroot00000000000000 Connect handler requirements
asio C++ library

PrevUpHomeNext

A connect handler must meet the requirements for a handler. A value h of a connect handler class should work correctly in the expression h(ec), where ec is an lvalue of type const error_code.

Examples

A free function as a connect handler:

void connect_handler(
    const asio::error_code& ec)
{
  ...
}

A connect handler function object:

struct connect_handler
{
  ...
  void operator()(
      const asio::error_code& ec)
  {
    ...
  }
  ...
};

A lambda as a connect handler:

socket.async_connect(...,
    [](const asio::error_code& ec)
    {
      ...
    });

A non-static class member function adapted to a connect handler using std::bind():

void my_class::connect_handler(
    const asio::error_code& ec)
{
  ...
}
...
socket.async_connect(...,
    std::bind(&my_class::connect_handler,
      this, std::placeholders::_1));

A non-static class member function adapted to a connect handler using boost::bind():

void my_class::connect_handler(
    const asio::error_code& ec)
{
  ...
}
...
socket.async_connect(...,
    boost::bind(&my_class::connect_handler,
      this, asio::placeholders::error));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ConstBufferSequence.html000066400000000000000000000117211340672067200227760ustar00rootroot00000000000000 Constant buffer sequence requirements
asio C++ library

PrevUpHomeNext

A constant buffer sequence represents a set of memory regions that may be used as input to an operation, such as the send operation of a socket.

A type X meets the ConstBufferSequence requirements if it satisfies the requirements of Destructible (C++Std [destructible]) and CopyConstructible (C++Std [copyconstructible]), as well as the additional requirements listed below.

In the table below, x denotes a (possibly const) value of type X, and u denotes an identifier.

Table 8. ConstBufferSequence requirements

expression

return type

assertion/note
pre/post-condition

asio::buffer_sequence_begin(x)
asio::buffer_sequence_end(x)

An iterator type meeting the requirements for bidirectional iterators (C++Std [bidirectional.iterators]) whose value type is convertible to const_buffer.

X u(x);

post:

equal(
  asio::buffer_sequence_begin(x),
  asio::buffer_sequence_end(x),
  asio::buffer_sequence_begin(u),
  asio::buffer_sequence_end(u),
  [](const const_buffer& b1,
     const const_buffer& b2)
   {
     return b1.data() == b2.data()
         && b1.size() == b2.size();
   })



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/DynamicBuffer.html000066400000000000000000000237321340672067200216100ustar00rootroot00000000000000 Dynamic buffer requirements
asio C++ library

PrevUpHomeNext

A dynamic buffer encapsulates memory storage that may be automatically resized as required, where the memory is divided into an input sequence followed by an output sequence. These memory regions are internal to the dynamic buffer sequence, but direct access to the elements is provided to permit them to be efficiently used with I/O operations, such as the send or receive operations of a socket. Data written to the output sequence of a dynamic buffer sequence object is appended to the input sequence of the same object.

A dynamic buffer type X shall satisfy the requirements of MoveConstructible (C++ Std, [moveconstructible]) types in addition to those listed below.

In the table below, X denotes a dynamic buffer class, x denotes a value of type X&, x1 denotes values of type const X&, and n denotes a value of type size_t, and u denotes an identifier.

Table 9. DynamicBuffer requirements

expression

type

assertion/note
pre/post-conditions

X::const_buffers_type

type meeting ConstBufferSequence requirements.

This type represents the memory associated with the input sequence.

X::mutable_buffers_type

type meeting MutableBufferSequence requirements.

This type represents the memory associated with the output sequence.

x1.size()

size_t

Returns the size, in bytes, of the input sequence.

x1.max_size()

size_t

Returns the permitted maximum of the sum of the sizes of the input sequence and output sequence.

x1.capacity()

size_t

Returns the maximum sum of the sizes of the input sequence and output sequence that the dynamic buffer can hold without requiring reallocation.

x1.data()

X::const_buffers_type

Returns a constant buffer sequence u that represents the memory associated with the input sequence, and where buffer_size(u) == size().

x.prepare(n)

X::mutable_buffers_type

Requires: size() + n <= max_size().

Returns a mutable buffer sequence u representing the output sequence, and where buffer_size(u) == n. The dynamic buffer reallocates memory as required. All constant or mutable buffer sequences previously obtained using data() or prepare() are invalidated.

Throws: length_error if size() + n > max_size().

x.commit(n)

Appends n bytes from the start of the output sequence to the end of the input sequence. The remainder of the output sequence is discarded. If n is greater than the size of the output sequence, the entire output sequence is appended to the input sequence. All constant or mutable buffer sequences previously obtained using data() or prepare() are invalidated.

x.consume(n)

Removes n bytes from beginning of the input sequence. If n is greater than the size of the input sequence, the entire input sequence is removed. All constant or mutable buffer sequences previously obtained using data() or prepare() are invalidated.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/Endpoint.html000066400000000000000000000312721340672067200206500ustar00rootroot00000000000000 Endpoint requirements
asio C++ library

PrevUpHomeNext

A type X meets the Endpoint requirements if it satisfies the requirements of Destructible (C++Std [destructible]), DefaultConstructible (C++Std [defaultconstructible]), CopyConstructible (C++Std [copyconstructible]), and CopyAssignable (C++Std [copyassignable]), as well as the additional requirements listed below.

In the table below, a denotes a (possibly const) value of type X, and u denotes an identifier.

Table 10. Endpoint requirements

expression

type

assertion/note
pre/post-conditions

X::protocol_type

type meeting Protocol requirements

a.protocol()

protocol_type


In the table below, a denotes a (possibly const) value of type X, b denotes a value of type X, and s denotes a (possibly const) value of a type that is convertible to size_t and denotes a size in bytes.

Table 11. Endpoint requirements for extensible implementations

expression

type

assertion/note
pre/post-conditions

a.data()

const void*

Returns a pointer suitable for passing as the address argument to functions such as POSIX connect(), or as the dest_addr argument to functions such as POSIX sendto(). The implementation shall perform a static_cast on the pointer to convert it to const sockaddr*.

b.data()

void*

Returns a pointer suitable for passing as the address argument to functions such as POSIX accept(), getpeername(), getsockname() and recvfrom(). The implementation shall perform a static_cast on the pointer to convert it to sockaddr*.

a.size()

size_t

Returns a value suitable for passing as the address_len argument to functions such as POSIX connect(), or as the dest_len argument to functions such as POSIX sendto(), after appropriate integer conversion has been performed.

b.resize(s)

pre: s >= 0
post: a.size() == s
Passed the value contained in the address_len argument to functions such as POSIX accept(), getpeername(), getsockname() and recvfrom(), after successful completion of the function. Permitted to throw an exception if the protocol associated with the endpoint object a does not support the specified size.

a.capacity()

size_t

Returns a value suitable for passing as the address_len argument to functions such as POSIX accept(), getpeername(), getsockname() and recvfrom(), after appropriate integer conversion has been performed.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/EndpointSequence.html000066400000000000000000000103261340672067200223360ustar00rootroot00000000000000 Endpoint sequence requirements
asio C++ library

PrevUpHomeNext

A type X meets the EndpointSequence requirements if it satisfies the requirements of Destructible (C++Std [destructible]) and CopyConstructible (C++Std [copyconstructible]), as well as the additional requirements listed below.

In the table below, x denotes a (possibly const) value of type X.

Table 12. EndpointSequence requirements

expression

return type

assertion/note
pre/post-condition

x.begin()
x.end()

A type meeting the requirements for forward iterators (C++Std [forward.iterators]) whose value type is convertible to a type satisfying the Endpoint requirements.

[x.begin(),x.end()) is a valid range.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ExecutionContext.html000066400000000000000000000111261340672067200223740ustar00rootroot00000000000000 Execution context requirements
asio C++ library

PrevUpHomeNext

A type X meets the ExecutionContext requirements if it is publicly and unambiguously derived from execution_context, and satisfies the additional requirements listed below.

In the table below, x denotes a value of type X.

Table 13. ExecutionContext requirements

expression

return type

assertion/note
pre/post-condition

X::executor_type

type meeting Executor requirements

x.~X()

Destroys all unexecuted function objects that were submitted via an executor object that is associated with the execution context.

x.get_executor()

X::executor_type

Returns an executor object that is associated with the execution context.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/Executor1.html000066400000000000000000000344461340672067200207550ustar00rootroot00000000000000 Executor requirements
asio C++ library

PrevUpHomeNext

The library describes a standard set of requirements for executors. A type meeting the Executor requirements embodies a set of rules for determining how submitted function objects are to be executed.

A type X meets the Executor requirements if it satisfies the requirements of CopyConstructible (C++Std [copyconstructible]) and Destructible (C++Std [destructible]), as well as the additional requirements listed below.

No constructor, comparison operator, copy operation, move operation, swap operation, or member functions context, on_work_started, and on_work_finished on these types shall exit via an exception.

The executor copy constructor, comparison operators, and other member functions defined in these requirements shall not introduce data races as a result of concurrent calls to those functions from different threads.

Let ctx be the execution context returned by the executor's context() member function. An executor becomes invalid when the first call to ctx.shutdown() returns. The effect of calling on_work_started, on_work_finished, dispatch, post, or defer on an invalid executor is undefined. [Note: The copy constructor, comparison operators, and context() member function continue to remain valid until ctx is destroyed. —end note]

In the table below, x1 and x2 denote (possibly const) values of type X, mx1 denotes an xvalue of type X, f denotes a MoveConstructible (C++Std [moveconstructible]) function object callable with zero arguments, a denotes a (possibly const) value of type A meeting the Allocator requirements (C++Std [allocator.requirements]), and u denotes an identifier.

Table 14. Executor requirements

expression

type

assertion/note
pre/post-conditions

X u(x1);

Shall not exit via an exception.

post: u == x1 and std::addressof(u.context()) == std::addressof(x1.context()).

X u(mx1);

Shall not exit via an exception.

post: u equals the prior value of mx1 and std::addressof(u.context()) equals the prior value of std::addressof(mx1.context()).

x1 == x2

bool

Returns true only if x1 and x2 can be interchanged with identical effects in any of the expressions defined in these type requirements. [Note: Returning false does not necessarily imply that the effects are not identical. —end note]

operator== shall be reflexive, symmetric, and transitive, and shall not exit via an exception.

x1 != x2

bool

Same as !(x1 == x2).

x1.context()

execution_context&, or E& where E is a type that satifisfies the ExecutionContext requirements.

Shall not exit via an exception.

The comparison operators and member functions defined in these requirements shall not alter the reference returned by this function.

x1.on_work_started()

Shall not exit via an exception.

x1.on_work_finished()

Shall not exit via an exception.

Precondition: A preceding call x2.on_work_started() where x1 == x2.

x1.dispatch(std::move(f),a)

Effects: Creates an object f1 initialized with DECAY_COPY(forward<Func>(f)) (C++Std [thread.decaycopy]) in the current thread of execution . Calls f1() at most once. The executor may block forward progress of the caller until f1() finishes execution.

Executor implementations should use the supplied allocator to allocate any memory required to store the function object. Prior to invoking the function object, the executor shall deallocate any memory allocated. [Note: Executors defined in this Technical Specification always use the supplied allocator unless otherwise specified. —end note]

Synchronization: The invocation of dispatch synchronizes with (C++Std [intro.multithread]) the invocation of f1.

x1.post(std::move(f),a)
x1.defer(std::move(f),a)

Effects: Creates an object f1 initialized with DECAY_COPY(forward<Func>(f)) in the current thread of execution. Calls f1() at most once. The executor shall not block forward progress of the caller pending completion of f1().

Executor implementations should use the supplied allocator to allocate any memory required to store the function object. Prior to invoking the function object, the executor shall deallocate any memory allocated. [Note: Executors defined in this Technical Specification always use the supplied allocator unless otherwise specified. —end note]

Synchronization: The invocation of post or defer synchronizes with (C++Std [intro.multithread]) the invocation of f1.

[Note: Although the requirements placed on defer are identical to post, the use of post conveys a preference that the caller does not block the first step of f1's progress, whereas defer conveys a preference that the caller does block the first step of f1. One use of defer is to convey the intention of the caller that f1 is a continuation of the current call context. The executor may use this information to optimize or otherwise adjust the way in which f1 is invoked. —end note]



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/GettableSerialPortOption.html000066400000000000000000000113701340672067200240120ustar00rootroot00000000000000 Gettable serial port option requirements
asio C++ library

PrevUpHomeNext

In the table below, X denotes a serial port option class, a denotes a value of X, ec denotes a value of type error_code, and s denotes a value of implementation-defined type storage (where storage is the type DCB on Windows and termios on POSIX platforms), and u denotes an identifier.

Table 15. GettableSerialPortOption requirements

expression

type

assertion/note
pre/post-conditions

const storage& u = s;
a.load(u, ec);

error_code

Retrieves the value of the serial port option from the storage.

If successful, sets ec such that !ec is true. If an error occurred, sets ec such that !!ec is true. Returns ec.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/GettableSocketOption.html000066400000000000000000000175561340672067200231720ustar00rootroot00000000000000 Gettable socket option requirements
asio C++ library

PrevUpHomeNext

A type X meets the GettableSocketOption requirements if it satisfies the requirements listed below.

In the table below, a denotes a (possibly const) value of type X, b denotes a value of type X, p denotes a (possibly const) value that meets the Protocol requirements, and s denotes a (possibly const) value of a type that is convertible to size_t and denotes a size in bytes.

Table 16. GettableSocketOption requirements for extensible implementations

expression

type

assertion/note
pre/post-conditions

a.level(p)

int

Returns a value suitable for passing as the level argument to POSIX getsockopt() (or equivalent).

a.name(p)

int

Returns a value suitable for passing as the option_name argument to POSIX getsockopt() (or equivalent).

b.data(p)

void*

Returns a pointer suitable for passing as the option_value argument to POSIX getsockopt() (or equivalent).

a.size(p)

size_t

Returns a value suitable for passing as the option_len argument to POSIX getsockopt() (or equivalent), after appropriate integer conversion has been performed.

b.resize(p,s)

post: b.size(p) == s.
Passed the value contained in the option_len argument to POSIX getsockopt() (or equivalent) after successful completion of the function. Permitted to throw an exception if the socket option object b does not support the specified size.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/Handler.html000066400000000000000000000143141340672067200204430ustar00rootroot00000000000000 Handlers
asio C++ library

PrevUpHomeNext

A handler must meet the requirements of MoveConstructible types (C++Std [moveconstructible]).

In the table below, X denotes a handler class, h denotes a value of X, p denotes a pointer to a block of allocated memory of type void*, s denotes the size for a block of allocated memory, and f denotes a function object taking no arguments.

Table 17. Handler requirements

expression

return type

assertion/note
pre/post-conditions

using asio::asio_handler_allocate;
asio_handler_allocate(s, &h);

void*

Returns a pointer to a block of memory of size s. The pointer must satisfy the same alignment requirements as a pointer returned by ::operator new(). Throws bad_alloc on failure.

The asio_handler_allocate() function is located using argument-dependent lookup. The function asio::asio_handler_allocate() serves as a default if no user-supplied function is available.

using asio::asio_handler_deallocate;
asio_handler_deallocate(p, s, &h);

Frees a block of memory associated with a pointer p, of at least size s, that was previously allocated using asio_handler_allocate().

The asio_handler_deallocate() function is located using argument-dependent lookup. The function asio::asio_handler_deallocate() serves as a default if no user-supplied function is available.

using asio::asio_handler_invoke;
asio_handler_invoke(f, &h);

Causes the function object f to be executed as if by calling f().

The asio_handler_invoke() function is located using argument-dependent lookup. The function asio::asio_handler_invoke() serves as a default if no user-supplied function is available.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/HandshakeHandler.html000066400000000000000000000103231340672067200222460ustar00rootroot00000000000000 SSL handshake handler requirements
asio C++ library

PrevUpHomeNext

A handshake handler must meet the requirements for a handler. A value h of a handshake handler class should work correctly in the expression h(ec), where ec is an lvalue of type const error_code.

Examples

A free function as a handshake handler:

void handshake_handler(
    const asio::error_code& ec)
{
  ...
}

A handshake handler function object:

struct handshake_handler
{
  ...
  void operator()(
      const asio::error_code& ec)
  {
    ...
  }
  ...
};

A lambda as a handshake handler:

ssl_stream.async_handshake(...,
    [](const asio::error_code& ec)
    {
      ...
    });

A non-static class member function adapted to a handshake handler using std::bind():

void my_class::handshake_handler(
    const asio::error_code& ec)
{
  ...
}
...
ssl_stream.async_handshake(...,
    std::bind(&my_class::handshake_handler,
      this, std::placeholders::_1));

A non-static class member function adapted to a handshake handler using boost::bind():

void my_class::handshake_handler(
    const asio::error_code& ec)
{
  ...
}
...
ssl_stream.async_handshake(...,
    boost::bind(&my_class::handshake_handler,
      this, asio::placeholders::error));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/InternetProtocol.html000066400000000000000000000134541340672067200224040ustar00rootroot00000000000000 Internet protocol requirements
asio C++ library

PrevUpHomeNext

A type X meets the InternetProtocol requirements if it satisfies the requirements of AcceptableProtocol, as well as the additional requirements listed below.

In the table below, a denotes a (possibly const) value of type X, and b denotes a (possibly const) value of type X.

Table 18. InternetProtocol requirements

expression

return type

assertion/note
pre/post-conditions

X::resolver

ip::basic_resolver<X>

The type of a resolver for the protocol.

X::v4()

X

Returns an object representing the IP version 4 protocol.

X::v6()

X

Returns an object representing the IP version 6 protocol.

a == b

convertible to bool

Returns true if a and b represent the same IP protocol version, otherwise false.

a != b

convertible to bool

Returns !(a == b).



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/IoControlCommand.html000066400000000000000000000107241340672067200222760ustar00rootroot00000000000000 I/O control command requirements
asio C++ library

PrevUpHomeNext

A type X meets the IoControlCommand requirements if it satisfies the requirements listed below.

In the table below, a denotes a (possibly const) value of type X, and b denotes a value of type X.

Table 19. IoControlCommand requirements for extensible implementations

expression

type

assertion/note
pre/post-conditions

a.name()

int

Returns a value suitable for passing as the request argument to POSIX ioctl() (or equivalent).

b.data()

void*



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/IoObjectService.html000066400000000000000000000130311340672067200221000ustar00rootroot00000000000000 I/O object service requirements
asio C++ library

PrevUpHomeNext

An I/O object service must meet the requirements for a service, as well as the requirements listed below.

In the table below, X denotes an I/O object service class, a and ao denote values of type X, b and c denote values of type X::implementation_type, and u denotes an identifier.

Table 20. IoObjectService requirements

expression

return type

assertion/note
pre/post-condition

X::implementation_type

X::implementation_type u;

note: X::implementation_type has a public default constructor and destructor.

a.construct(b);

a.destroy(b);

note: destroy() will only be called on a value that has previously been initialised with construct() or move_construct().

a.move_construct(b, c);

note: only required for I/O objects that support movability.

a.move_assign(b, ao, c);

note: only required for I/O objects that support movability.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/IteratorConnectHandler.html000066400000000000000000000116141340672067200234670ustar00rootroot00000000000000 Iterator connect handler requirements
asio C++ library

PrevUpHomeNext

An iterator connect handler must meet the requirements for a handler. A value h of an iterator connect handler class should work correctly in the expression h(ec, i), where ec is an lvalue of type const error_code and i is an lvalue of the type Iterator used in the corresponding connect() or async_connect()` function.

Examples

A free function as an iterator connect handler:

void connect_handler(
    const asio::error_code& ec,
    asio::ip::tcp::resolver::iterator iterator)
{
  ...
}

An iterator connect handler function object:

struct connect_handler
{
  ...
  template <typename Iterator>
  void operator()(
      const asio::error_code& ec,
      Iterator iterator)
  {
    ...
  }
  ...
};

A lambda as an iterator connect handler:

asio::async_connect(...,
    [](const asio::error_code& ec,
      asio::ip::tcp::resolver::iterator iterator)
    {
      ...
    });

A non-static class member function adapted to an iterator connect handler using std::bind():

void my_class::connect_handler(
    const asio::error_code& ec,
    asio::ip::tcp::resolver::iterator iterator)
{
  ...
}
...
asio::async_connect(...,
    std::bind(&my_class::connect_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

A non-static class member function adapted to an iterator connect handler using boost::bind():

void my_class::connect_handler(
    const asio::error_code& ec,
    asio::ip::tcp::resolver::iterator iterator)
{
  ...
}
...
asio::async_connect(...,
    boost::bind(&my_class::connect_handler,
      this, asio::placeholders::error,
      asio::placeholders::iterator));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/LegacyCompletionHandler.html000066400000000000000000000101561340672067200236220ustar00rootroot00000000000000 Legacy completion handler requirements
asio C++ library

PrevUpHomeNext

A legacy completion handler must meet the requirements for a handler. A legacy completion handler must meet the requirements of CopyConstructible types (C++Std [copyconstructible]). A value h of a completion handler class should work correctly in the expression h().

Examples

A free function as a completion handler:

void completion_handler()
{
  ...
}

A completion handler function object:

struct completion_handler
{
  ...
  void operator()()
  {
    ...
  }
  ...
};

A lambda as a completion handler:

my_io_service.post(
    []()
    {
      ...
    });

A non-static class member function adapted to a completion handler using std::bind():

void my_class::completion_handler()
{
  ...
}
...
my_io_service.post(std::bind(&my_class::completion_handler, this));

A non-static class member function adapted to a completion handler using boost::bind():

void my_class::completion_handler()
{
  ...
}
...
my_io_service.post(boost::bind(&my_class::completion_handler, this));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/MoveAcceptHandler.html000066400000000000000000000104141340672067200224070ustar00rootroot00000000000000 Move accept handler requirements
asio C++ library

PrevUpHomeNext

A move accept handler must meet the requirements for a handler. A value h of a move accept handler class should work correctly in the expression h(ec, s), where ec is an lvalue of type const error_code and s is an lvalue of the nested type Protocol::socket for the type Protocol of the socket class template.

Examples

A free function as a move accept handler:

void accept_handler(
    const asio::error_code& ec, asio::ip::tcp::socket s)
{
  ...
}

A move accept handler function object:

struct accept_handler
{
  ...
  void operator()(
      const asio::error_code& ec, asio::ip::tcp::socket s)
  {
    ...
  }
  ...
};

A lambda as a move accept handler:

acceptor.async_accept(...,
    [](const asio::error_code& ec, asio::ip::tcp::socket s)
    {
      ...
    });

A non-static class member function adapted to a move accept handler using std::bind():

void my_class::accept_handler(
    const asio::error_code& ec, asio::ip::tcp::socket socket)
{
  ...
}
...
asio::async_accept(...,
    std::bind(&my_class::accept_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/MutableBufferSequence.html000066400000000000000000000120011340672067200232710ustar00rootroot00000000000000 Mutable buffer sequence requirements
asio C++ library

PrevUpHomeNext

A mutable buffer sequence represents a set of memory regions that may be used to receive the output of an operation, such as the receive operation of a socket.

A type X meets the MutableBufferSequence requirements if it satisfies the requirements of Destructible (C++Std [destructible]) and CopyConstructible (C++Std [copyconstructible]), as well as the additional requirements listed below.

In the table below, x denotes a (possibly const) value of type X, and u denotes an identifier.

Table 21. MutableBufferSequence requirements

expression

return type

assertion/note
pre/post-condition

asio::buffer_sequence_begin(x)
asio::buffer_sequence_end(x)

An iterator type meeting the requirements for bidirectional iterators (C++Std [bidirectional.iterators]) whose value type is convertible to mutable_buffer.

X u(x);

post:

equal(
  asio::buffer_sequence_begin(x),
  asio::buffer_sequence_end(x),
  asio::buffer_sequence_begin(u),
  asio::buffer_sequence_end(u),
  [](const mutable_buffer& b1,
     const mutable_buffer& b2)
   {
     return b1.data() == b2.data()
         && b1.size() == b2.size();
   })



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ProtoAllocator.html000066400000000000000000000062731340672067200220370ustar00rootroot00000000000000 Proto-allocator requirements
asio C++ library

PrevUpHomeNext

A type A meets the proto-allocator requirements if A is CopyConstructible (C++Std [copyconstructible]), Destructible (C++Std [destructible]), and allocator_traits<A>::rebind_alloc<U> meets the allocator requirements (C++Std [allocator.requirements]), where U is an object type. [Note: For example, std::allocator<void> meets the proto-allocator requirements but not the allocator requirements. —end note] No constructor, comparison operator, copy operation, move operation, or swap operation on these types shall exit via an exception.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/Protocol.html000066400000000000000000000154331340672067200206720ustar00rootroot00000000000000 Protocol requirements
asio C++ library

PrevUpHomeNext

A type X meets the Protocol requirements if it satisfies the requirements of Destructible (C++Std [destructible]), CopyConstructible (C++Std [copyconstructible]), and CopyAssignable (C++Std [copyassignable]), as well as the additional requirements listed below.

Table 22. Protocol requirements

expression

return type

assertion/note
pre/post-conditions

X::endpoint

type meeting endpoint requirements


In the table below, a denotes a (possibly const) value of type X.

Table 23. Protocol requirements for extensible implementations

expression

return type

assertion/note
pre/post-conditions

a.family()

int

Returns a value suitable for passing as the domain argument to POSIX socket() (or equivalent).

a.type()

int

Returns a value suitable for passing as the type argument to POSIX socket() (or equivalent).

a.protocol()

int

Returns a value suitable for passing as the protocol argument to POSIX socket() (or equivalent).



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/RangeConnectHandler.html000066400000000000000000000115411340672067200227310ustar00rootroot00000000000000 Range connect handler requirements
asio C++ library

PrevUpHomeNext

A range connect handler must meet the requirements for a handler. A value h of a range connect handler class should work correctly in the expression h(ec, ep), where ec is an lvalue of type const error_code and ep is an lvalue of the type Protocol::endpoint for the Protocol type in the corresponding connect() or async_connect()` function.

Examples

A free function as a range connect handler:

void connect_handler(
    const asio::error_code& ec,
    const asio::ip::tcp::endpoint& endpoint)
{
  ...
}

A range connect handler function object:

struct connect_handler
{
  ...
  template <typename Range>
  void operator()(
      const asio::error_code& ec,
      const asio::ip::tcp::endpoint& endpoint)
  {
    ...
  }
  ...
};

A lambda as a range connect handler:

asio::async_connect(...,
    [](const asio::error_code& ec,
      const asio::ip::tcp::endpoint& endpoint)
    {
      ...
    });

A non-static class member function adapted to a range connect handler using std::bind():

void my_class::connect_handler(
    const asio::error_code& ec,
    const asio::ip::tcp::endpoint& endpoint)
{
  ...
}
...
asio::async_connect(...,
    std::bind(&my_class::connect_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

A non-static class member function adapted to a range connect handler using boost::bind():

void my_class::connect_handler(
    const asio::error_code& ec,
    const asio::ip::tcp::endpoint& endpoint)
{
  ...
}
...
asio::async_connect(...,
    boost::bind(&my_class::connect_handler,
      this, asio::placeholders::error,
      asio::placeholders::endpoint));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ReadHandler.html000066400000000000000000000107251340672067200212410ustar00rootroot00000000000000 Read handler requirements
asio C++ library

PrevUpHomeNext

A read handler must meet the requirements for a handler. A value h of a read handler class should work correctly in the expression h(ec, s), where ec is an lvalue of type const error_code and s is an lvalue of type const size_t.

Examples

A free function as a read handler:

void read_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}

A read handler function object:

struct read_handler
{
  ...
  void operator()(
      const asio::error_code& ec,
      std::size_t bytes_transferred)
  {
    ...
  }
  ...
};

A lambda as a read handler:

socket.async_read(...
    [](const asio::error_code& ec,
      std::size_t bytes_transferred)
    {
      ...
    });

A non-static class member function adapted to a read handler using std::bind():

void my_class::read_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}
...
socket.async_read(...,
    std::bind(&my_class::read_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

A non-static class member function adapted to a read handler using boost::bind():

void my_class::read_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}
...
socket.async_read(...,
    boost::bind(&my_class::read_handler,
      this, asio::placeholders::error,
      asio::placeholders::bytes_transferred));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ResolveHandler.html000066400000000000000000000116041340672067200220020ustar00rootroot00000000000000 Resolve handler requirements
asio C++ library

PrevUpHomeNext

A resolve handler must meet the requirements for a handler. A value h of a resolve handler class should work correctly in the expression h(ec, r), where ec is an lvalue of type const error_code and r is an lvalue of type const ip::basic_resolver_results<InternetProtocol>. InternetProtocol is the template parameter of the ip::basic_resolver<> which is used to initiate the asynchronous operation.

Examples

A free function as a resolve handler:

void resolve_handler(
    const asio::error_code& ec,
    asio::ip::tcp::resolver::results_type results)
{
  ...
}

A resolve handler function object:

struct resolve_handler
{
  ...
  void operator()(
      const asio::error_code& ec,
      asio::ip::tcp::resolver::results_type results)
  {
    ...
  }
  ...
};

A lambda as a resolve handler:

resolver.async_resolve(...,
    [](const asio::error_code& ec,
      asio::ip::tcp::resolver::results_type results)
    {
      ...
    });

A non-static class member function adapted to a resolve handler using std::bind():

void my_class::resolve_handler(
    const asio::error_code& ec,
    asio::ip::tcp::resolver::results_type results)
{
  ...
}
...
resolver.async_resolve(...,
    std::bind(&my_class::resolve_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

A non-static class member function adapted to a resolve handler using boost::bind():

void my_class::resolve_handler(
    const asio::error_code& ec,
    asio::ip::tcp::resolver::results_type results)
{
  ...
}
...
resolver.async_resolve(...,
    boost::bind(&my_class::resolve_handler,
      this, asio::placeholders::error,
      asio::placeholders::results));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/Service.html000066400000000000000000000105771340672067200204750ustar00rootroot00000000000000 Service requirements
asio C++ library

PrevUpHomeNext

A class is a service if it is publicly and unambiguously derived from execution_context::service, or if it is publicly and unambiguously derived from another service. For a service S, S::key_type shall be valid and denote a type (C++Std [temp.deduct]), is_base_of_v<typename S::key_type, S> shall be true, and S shall satisfy the Destructible requirements (C++Std [destructible]).

The first parameter of all service constructors shall be an lvalue reference to execution_context. This parameter denotes the execution_context object that represents a set of services, of which the service object will be a member. [Note: These constructors may be called by the make_service function. —end note]

A service shall provide an explicit constructor with a single parameter of lvalue reference to execution_context. [Note: This constructor may be called by the use_service function. —end note]

class my_service : public execution_context::service
{
public:
  typedef my_service key_type;
  explicit my_service(execution_context& ctx);
  my_service(execution_context& ctx, int some_value);
private:
  virtual void shutdown() noexcept override;
  ...
};

A service's shutdown member function shall destroy all copies of user-defined function objects that are held by the service.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SettableSerialPortOption.html000066400000000000000000000111541340672067200240260ustar00rootroot00000000000000 Settable serial port option requirements
asio C++ library

PrevUpHomeNext

In the table below, X denotes a serial port option class, a denotes a value of X, ec denotes a value of type error_code, and s denotes a value of implementation-defined type storage (where storage is the type DCB on Windows and termios on POSIX platforms), and u denotes an identifier.

Table 24. SettableSerialPortOption requirements

expression

type

assertion/note
pre/post-conditions

const X& u = a;
u.store(s, ec);

error_code

Saves the value of the serial port option to the storage.

If successful, sets ec such that !ec is true. If an error occurred, sets ec such that !!ec is true. Returns ec.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SettableSocketOption.html000066400000000000000000000154141340672067200231750ustar00rootroot00000000000000 Settable socket option requirements
asio C++ library

PrevUpHomeNext

A type X meets the SettableSocketOption requirements if it satisfies the requirements listed below.

In the table below, a denotes a (possibly const) value of type X, p denotes a (possibly const) value that meets the Protocol requirements, and u denotes an identifier.

Table 25. SettableSocketOption requirements for extensible implementations

expression

type

assertion/note
pre/post-conditions

a.level(p)

int

Returns a value suitable for passing as the level argument to POSIX setsockopt() (or equivalent).

a.name(p)

int

Returns a value suitable for passing as the option_name argument to POSIX setsockopt() (or equivalent).

a.data(p)

const void*

Returns a pointer suitable for passing as the option_value argument to POSIX setsockopt() (or equivalent).

a.size(p)

size_t

Returns a value suitable for passing as the option_len argument to POSIX setsockopt() (or equivalent), after appropriate integer conversion has been performed.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ShutdownHandler.html000066400000000000000000000103301340672067200221710ustar00rootroot00000000000000 SSL shutdown handler requirements
asio C++ library

PrevUpHomeNext

A shutdown handler must meet the requirements for a handler. A value h of a shutdown handler class should work correctly in the expression h(ec), where ec is an lvalue of type const error_code.

Examples

A free function as a shutdown handler:

void shutdown_handler(
    const asio::error_code& ec)
{
  ...
}

A shutdown handler function object:

struct shutdown_handler
{
  ...
  void operator()(
      const asio::error_code& ec)
  {
    ...
  }
  ...
};

A lambda as a shutdown handler:

ssl_stream.async_shutdown(...,
    [](const asio::error_code& ec)
    {
      ...
    });

A non-static class member function adapted to a shutdown handler using std::bind():

void my_class::shutdown_handler(
    const asio::error_code& ec)
{
  ...
}
...
ssl_stream.async_shutdown(
    std::bind(&my_class::shutdown_handler,
      this, std::placeholders::_1));

A non-static class member function adapted to a shutdown handler using boost::bind():

void my_class::shutdown_handler(
    const asio::error_code& ec)
{
  ...
}
...
ssl_stream.async_shutdown(
    boost::bind(&my_class::shutdown_handler,
      this, asio::placeholders::error));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SignalHandler.html000066400000000000000000000110051340672067200215730ustar00rootroot00000000000000 Signal handler requirements
asio C++ library

PrevUpHomeNext

A signal handler must meet the requirements for a handler. A value h of a signal handler class should work correctly in the expression h(ec, n), where ec is an lvalue of type const error_code and n is an lvalue of type const int.

Examples

A free function as a signal handler:

void signal_handler(
    const asio::error_code& ec,
    int signal_number)
{
  ...
}

A signal handler function object:

struct signal_handler
{
  ...
  void operator()(
      const asio::error_code& ec,
      int signal_number)
  {
    ...
  }
  ...
};

A lambda as a signal handler:

my_signal_set.async_wait(
    [](const asio::error_code& ec,
      int signal_number)
    {
      ...
    });

A non-static class member function adapted to a signal handler using std::bind():

void my_class::signal_handler(
    const asio::error_code& ec,
    int signal_number)
{
  ...
}
...
my_signal_set.async_wait(
    std::bind(&my_class::signal_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

A non-static class member function adapted to a signal handler using boost::bind():

void my_class::signal_handler(
    const asio::error_code& ec,
    int signal_number)
{
  ...
}
...
my_signal_set.async_wait(
    boost::bind(&my_class::signal_handler,
      this, asio::placeholders::error,
      asio::placeholders::signal_number));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SyncRandomAccessReadDevice.html000066400000000000000000000133771340672067200242110ustar00rootroot00000000000000 Buffer-oriented synchronous random-access read device requirements
asio C++ library

PrevUpHomeNext

In the table below, a denotes a synchronous random-access read device object, o denotes an offset of type boost::uint64_t, mb denotes an object satisfying mutable buffer sequence requirements, and ec denotes an object of type error_code.

Table 26. Buffer-oriented synchronous random-access read device requirements

operation

type

semantics, pre/post-conditions

a.read_some_at(o, mb);

size_t

Equivalent to:

error_code ec;
size_t s = a.read_some_at(o, mb, ec);
if (ec) throw system_error(ec);
return s;

a.read_some_at(o, mb, ec);

size_t

Reads one or more bytes of data from the device a at offset o.

The mutable buffer sequence mb specifies memory where the data should be placed. The read_some_at operation shall always fill a buffer in the sequence completely before proceeding to the next.

If successful, returns the number of bytes read and sets ec such that !ec is true. If an error occurred, returns 0 and sets ec such that !!ec is true.

If the total size of all buffers in the sequence mb is 0, the function shall return 0 immediately.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SyncRandomAccessWriteDevice.html000066400000000000000000000134551340672067200244250ustar00rootroot00000000000000 Buffer-oriented synchronous random-access write device requirements
asio C++ library

PrevUpHomeNext

In the table below, a denotes a synchronous random-access write device object, o denotes an offset of type boost::uint64_t, cb denotes an object satisfying constant buffer sequence requirements, and ec denotes an object of type error_code.

Table 27. Buffer-oriented synchronous random-access write device requirements

operation

type

semantics, pre/post-conditions

a.write_some_at(o, cb);

size_t

Equivalent to:

error_code ec;
size_t s = a.write_some(o, cb, ec);
if (ec) throw system_error(ec);
return s;

a.write_some_at(o, cb, ec);

size_t

Writes one or more bytes of data to the device a at offset o.

The constant buffer sequence cb specifies memory where the data to be written is located. The write_some_at operation shall always write a buffer in the sequence completely before proceeding to the next.

If successful, returns the number of bytes written and sets ec such that !ec is true. If an error occurred, returns 0 and sets ec such that !!ec is true.

If the total size of all buffers in the sequence cb is 0, the function shall return 0 immediately.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SyncReadStream.html000066400000000000000000000130431340672067200217500ustar00rootroot00000000000000 Buffer-oriented synchronous read stream requirements
asio C++ library

PrevUpHomeNext

A type X meets the SyncReadStream requirements if it satisfies the requirements listed below.

In the table below, a denotes a value of type X, mb denotes a (possibly const) value satisfying the MutableBufferSequence requirements, and ec denotes an object of type error_code.

Table 28. SyncReadStream requirements

operation

type

semantics, pre/post-conditions

a.read_some(mb)
a.read_some(mb,ec)

size_t

Meets the requirements for a read operation.

If buffer_size(mb) > 0, reads one or more bytes of data from the stream a into the buffer sequence mb. If successful, sets ec such that !ec is true, and returns the number of bytes read. If an error occurred, sets ec such that !!ec is true, and returns 0. If all data has been read from the stream, and the stream performed an orderly shutdown, sets ec to stream_errc::eof and returns 0.

If buffer_size(mb) == 0, the operation shall not block. Sets ec such that !ec is true, and returns 0.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/SyncWriteStream.html000066400000000000000000000123341340672067200221710ustar00rootroot00000000000000 Buffer-oriented synchronous write stream requirements
asio C++ library

PrevUpHomeNext

A type X meets the SyncWriteStream requirements if it satisfies the requirements listed below.

In the table below, a denotes a value of type X, cb denotes a (possibly const) value satisfying the ConstBufferSequence requirements, and ec denotes an object of type error_code.

Table 29. SyncWriteStream requirements

operation

type

semantics, pre/post-conditions

a.write_some(cb)
a.write_some(cb,ec)

size_t

Meets the requirements for a write operation.

If buffer_size(cb) > 0, writes one or more bytes of data to the stream a from the buffer sequence cb. If successful, sets ec such that !ec is true, and returns the number of bytes written. If an error occurred, sets ec such that !!ec is true, and returns 0.

If buffer_size(cb) == 0, the operation shall not block. Sets ec such that !ec is true, and returns 0.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/TimeTraits.html000066400000000000000000000157211340672067200211560ustar00rootroot00000000000000 Time traits requirements
asio C++ library

PrevUpHomeNext

In the table below, X denotes a time traits class for time type Time, t, t1, and t2 denote values of type Time, and d denotes a value of type X::duration_type.

Table 30. TimeTraits requirements

expression

return type

assertion/note
pre/post-condition

X::time_type

Time

Represents an absolute time. Must support default construction, and meet the requirements for CopyConstructible and Assignable.

X::duration_type

Represents the difference between two absolute times. Must support default construction, and meet the requirements for CopyConstructible and Assignable. A duration can be positive, negative, or zero.

X::now();

time_type

Returns the current time.

X::add(t, d);

time_type

Returns a new absolute time resulting from adding the duration d to the absolute time t.

X::subtract(t1, t2);

duration_type

Returns the duration resulting from subtracting t2 from t1.

X::less_than(t1, t2);

bool

Returns whether t1 is to be treated as less than t2.

X::to_posix_duration(d);

date_time::time_duration_type

Returns the date_time::time_duration_type value that most closely represents the duration d.



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/WaitHandler.html000066400000000000000000000100511340672067200212620ustar00rootroot00000000000000 Wait handler requirements
asio C++ library

PrevUpHomeNext

A wait handler must meet the requirements for a handler. A value h of a wait handler class should work correctly in the expression h(ec), where ec is an lvalue of type const error_code.

Examples

A free function as a wait handler:

void wait_handler(
    const asio::error_code& ec)
{
  ...
}

A wait handler function object:

struct wait_handler
{
  ...
  void operator()(
      const asio::error_code& ec)
  {
    ...
  }
  ...
};

A lambda as a wait handler:

socket.async_wait(...,
    [](const asio::error_code& ec)
    {
      ...
    });

A non-static class member function adapted to a wait handler using std::bind():

void my_class::wait_handler(
    const asio::error_code& ec)
{
  ...
}
...
socket.async_wait(...,
    std::bind(&my_class::wait_handler,
      this, std::placeholders::_1));

A non-static class member function adapted to a wait handler using boost::bind():

void my_class::wait_handler(
    const asio::error_code& ec)
{
  ...
}
...
socket.async_wait(...,
    boost::bind(&my_class::wait_handler,
      this, asio::placeholders::error));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/WaitTraits.html000066400000000000000000000143721340672067200211650ustar00rootroot00000000000000 Wait traits requirements
asio C++ library

PrevUpHomeNext

The basic_waitable_timer template uses wait traits to allow programs to customize wait and async_wait behavior. [Note: Possible uses of wait traits include:
— To enable timers based on non-realtime clocks.
— Determining how quickly wallclock-based timers respond to system time changes.
— Correcting for errors or rounding timeouts to boundaries.
— Preventing duration overflow. That is, a program may set a timer's expiry e to be Clock::max() (meaning never reached) or Clock::min() (meaning always in the past). As a result, computing the duration until timer expiry as e - Clock::now() may cause overflow. —end note]

For a type Clock meeting the Clock requirements (C++Std [time.clock.req]), a type X meets the WaitTraits requirements if it satisfies the requirements listed below.

In the table below, t denotes a (possibly const) value of type Clock::time_point; and d denotes a (possibly const) value of type Clock::duration.

Table 31. WaitTraits requirements

expression

return type

assertion/note
pre/post-condition

X::to_wait_duration(d)

Clock::duration

Returns a Clock::duration value to be used in a wait or async_wait operation. [Note: The return value is typically representative of the duration d. —end note]

X::to_wait_duration(t)

Clock::duration

Returns a Clock::duration value to be used in a wait or async_wait operation. [Note: The return value is typically representative of the duration from Clock::now() until the time point t. —end note]



PrevUpHomeNext
asio-1.12.2/doc/asio/reference/WriteHandler.html000066400000000000000000000106571340672067200214640ustar00rootroot00000000000000 Write handler requirements
asio C++ library

PrevUpHomeNext

A write handler must meet the requirements for a handler. A value h of a write handler class should work correctly in the expression h(ec, s), where ec is an lvalue of type const error_code and s is an lvalue of type const size_t.

Examples

A free function as a write handler:

void write_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}

A write handler function object:

struct write_handler
{
  ...
  void operator()(
      const asio::error_code& ec,
      std::size_t bytes_transferred)
  {
    ...
  }
  ...
};

A lambda as a write handler:

socket.async_write(...
    [](const asio::error_code& ec,
      std::size_t bytes_transferred)
    {
      ...
    });

A non-static class member function adapted to a write handler using std::bind():

void my_class::write_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}
...
socket.async_write(...,
    std::bind(&my_class::write_handler,
      this, std::placeholders::_1,
      std::placeholders::_2));

A non-static class member function adapted to a write handler using boost::bind():

void my_class::write_handler(
    const asio::error_code& ec,
    std::size_t bytes_transferred)
{
  ...
}
...
socket.async_write(...,
    boost::bind(&my_class::write_handler,
      this, asio::placeholders::error,
      asio::placeholders::bytes_transferred));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/add_service.html000066400000000000000000000126431340672067200213410ustar00rootroot00000000000000 add_service
asio C++ library

PrevUpHomeNext

template<
    typename Service>
void add_service(
    execution_context & e,
    Service * svc);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

svc

The service object. On success, ownership of the service object is transferred to the execution_context. When the execution_context object is destroyed, it will destroy the service object by performing:

delete static_cast<execution_context::service*>(svc)

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

asio::invalid_service_owner

Thrown if the service's owning execution_context is not the execution_context object specified by the e parameter.

Requirements

Header: asio/impl/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asio_handler_allocate.html000066400000000000000000000111211340672067200233530ustar00rootroot00000000000000 asio_handler_allocate
asio C++ library

PrevUpHomeNext

Default allocation function for handlers.

void * asio_handler_allocate(
    std::size_t size,
    ... );

Asynchronous operations may need to allocate temporary objects. Since asynchronous operations have a handler function object, these temporary objects can be said to be associated with the handler.

Implement asio_handler_allocate and asio_handler_deallocate for your own handlers to provide custom allocation for these temporary objects.

The default implementation of these allocation hooks uses operator new and operator delete.

Remarks

All temporary objects associated with a handler will be deallocated before the upcall to the handler is performed. This allows the same memory to be reused for a subsequent asynchronous operation initiated by the handler.

Example
class my_handler;

void* asio_handler_allocate(std::size_t size, my_handler* context)
{
  return ::operator new(size);
}

void asio_handler_deallocate(void* pointer, std::size_t size,
    my_handler* context)
{
  ::operator delete(pointer);
}
Requirements

Header: asio/handler_alloc_hook.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asio_handler_deallocate.html000066400000000000000000000066171340672067200237020ustar00rootroot00000000000000 asio_handler_deallocate
asio C++ library

PrevUpHomeNext

Default deallocation function for handlers.

void asio_handler_deallocate(
    void * pointer,
    std::size_t size,
    ... );

Implement asio_handler_allocate and asio_handler_deallocate for your own handlers to provide custom allocation for the associated temporary objects.

The default implementation of these allocation hooks uses operator new and operator delete.

Requirements

Header: asio/handler_alloc_hook.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asio_handler_invoke.html000066400000000000000000000141411340672067200230670ustar00rootroot00000000000000 asio_handler_invoke
asio C++ library

PrevUpHomeNext

Default invoke function for handlers.

Default handler invocation hook used for non-const function objects.

template<
    typename Function>
void asio_handler_invoke(
    Function & function,
    ... );
  » more...

Default handler invocation hook used for const function objects.

template<
    typename Function>
void asio_handler_invoke(
    const Function & function,
    ... );
  » more...

Completion handlers for asynchronous operations are invoked by the io_context associated with the corresponding object (e.g. a socket or deadline_timer). Certain guarantees are made on when the handler may be invoked, in particular that a handler can only be invoked from a thread that is currently calling run() on the corresponding io_context object. Handlers may subsequently be invoked through other objects (such as io_context::strand objects) that provide additional guarantees.

When asynchronous operations are composed from other asynchronous operations, all intermediate handlers should be invoked using the same method as the final handler. This is required to ensure that user-defined objects are not accessed in a way that may violate the guarantees. This hooking function ensures that the invoked method used for the final handler is accessible at each intermediate step.

Implement asio_handler_invoke for your own handlers to specify a custom invocation strategy.

This default implementation invokes the function object like so:

function();

If necessary, the default implementation makes a copy of the function object so that the non-const operator() can be used.

Example
class my_handler;

template <typename Function>
void asio_handler_invoke(Function function, my_handler* context)
{
  context->strand_.dispatch(function);
}
Requirements

Header: asio/handler_invoke_hook.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asio_handler_invoke/000077500000000000000000000000001340672067200222005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/asio_handler_invoke/overload1.html000066400000000000000000000051331340672067200247640ustar00rootroot00000000000000 asio_handler_invoke (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Default handler invocation hook used for non-const function objects.

template<
    typename Function>
void asio_handler_invoke(
    Function & function,
    ... );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asio_handler_invoke/overload2.html000066400000000000000000000052011340672067200247610ustar00rootroot00000000000000 asio_handler_invoke (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Default handler invocation hook used for const function objects.

template<
    typename Function>
void asio_handler_invoke(
    const Function & function,
    ... );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asio_handler_is_continuation.html000066400000000000000000000077731340672067200250160ustar00rootroot00000000000000 asio_handler_is_continuation
asio C++ library

PrevUpHomeNext

Default continuation function for handlers.

bool asio_handler_is_continuation(
    ... );

Asynchronous operations may represent a continuation of the asynchronous control flow associated with the current handler. The implementation can use this knowledge to optimise scheduling of the handler.

Implement asio_handler_is_continuation for your own handlers to indicate when a handler represents a continuation.

The default implementation of the continuation hook returns false.

Example
class my_handler;

bool asio_handler_is_continuation(my_handler* context)
{
  return true;
}
Requirements

Header: asio/handler_continuation_hook.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/associated_allocator.html000066400000000000000000000146351340672067200232530ustar00rootroot00000000000000 associated_allocator
asio C++ library

PrevUpHomeNext

Traits type used to obtain the allocator associated with an object.

template<
    typename T,
    typename Allocator = std::allocator<void>>
struct associated_allocator
Types

Name

Description

type

If T has a nested type allocator_type, T::allocator_type. Otherwise Allocator.

Member Functions

Name

Description

get

If T has a nested type allocator_type, returns t.get_allocator(). Otherwise returns a.

A program may specialise this traits type if the T template parameter in the specialisation is a user-defined type. The template parameter Allocator shall be a type meeting the Allocator requirements.

Specialisations shall meet the following requirements, where t is a const reference to an object of type T, and a is an object of type Allocator.

  • Provide a nested typedef type that identifies a type meeting the Allocator requirements.
  • Provide a noexcept static member function named get, callable as get(t) and with return type type.
  • Provide a noexcept static member function named get, callable as get(t,a) and with return type type.
Requirements

Header: asio/associated_allocator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/associated_allocator/000077500000000000000000000000001340672067200223545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/associated_allocator/get.html000066400000000000000000000053671340672067200240340ustar00rootroot00000000000000 associated_allocator::get
asio C++ library

PrevUpHomeNext

If T has a nested type allocator_type, returns t.get_allocator(). Otherwise returns a.

static type get(
    const T & t,
    const Allocator & a = Allocator());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/associated_allocator/type.html000066400000000000000000000063051340672067200242270ustar00rootroot00000000000000 associated_allocator::type
asio C++ library

PrevUpHomeNext

If T has a nested type allocator_type, T::allocator_type. Otherwise Allocator.

typedef see_below type;
Requirements

Header: asio/associated_allocator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/associated_executor.html000066400000000000000000000146621340672067200231310ustar00rootroot00000000000000 associated_executor
asio C++ library

PrevUpHomeNext

Traits type used to obtain the executor associated with an object.

template<
    typename T,
    typename Executor = system_executor>
struct associated_executor
Types

Name

Description

type

If T has a nested type executor_type, T::executor_type. Otherwise Executor.

Member Functions

Name

Description

get

If T has a nested type executor_type, returns t.get_executor(). Otherwise returns ex.

A program may specialise this traits type if the T template parameter in the specialisation is a user-defined type. The template parameter Executor shall be a type meeting the Executor requirements.

Specialisations shall meet the following requirements, where t is a const reference to an object of type T, and e is an object of type Executor.

  • Provide a nested typedef type that identifies a type meeting the Executor requirements.
  • Provide a noexcept static member function named get, callable as get(t) and with return type type.
  • Provide a noexcept static member function named get, callable as get(t,e) and with return type type.
Requirements

Header: asio/associated_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/associated_executor/000077500000000000000000000000001340672067200222325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/associated_executor/get.html000066400000000000000000000053471340672067200237100ustar00rootroot00000000000000 associated_executor::get
asio C++ library

PrevUpHomeNext

If T has a nested type executor_type, returns t.get_executor(). Otherwise returns ex.

static type get(
    const T & t,
    const Executor & ex = Executor());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/associated_executor/type.html000066400000000000000000000062501340672067200241040ustar00rootroot00000000000000 associated_executor::type
asio C++ library

PrevUpHomeNext

If T has a nested type executor_type, T::executor_type. Otherwise Executor.

typedef see_below type;
Requirements

Header: asio/associated_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_completion.html000066400000000000000000000146661340672067200224460ustar00rootroot00000000000000 async_completion
asio C++ library

PrevUpHomeNext

Helper template to deduce the handler type from a CompletionToken, capture a local copy of the handler, and then create an async_result for the handler.

template<
    typename CompletionToken,
    typename Signature>
struct async_completion
Types

Name

Description

completion_handler_type

The real handler type to be used for the asynchronous operation.

Member Functions

Name

Description

async_completion

Constructor.

Data Members

Name

Description

completion_handler

A copy of, or reference to, a real handler object.

result

The result of the asynchronous operation's initiating function.

Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_completion/000077500000000000000000000000001340672067200215435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_completion/async_completion.html000066400000000000000000000053321340672067200260020ustar00rootroot00000000000000 async_completion::async_completion
asio C++ library

PrevUpHomeNext

Constructor.

async_completion(
    CompletionToken & token);

The constructor creates the concrete completion handler and makes the link between the handler and the asynchronous result.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_completion/completion_handler.html000066400000000000000000000054061340672067200263040ustar00rootroot00000000000000 async_completion::completion_handler
asio C++ library

PrevUpHomeNext

A copy of, or reference to, a real handler object.

conditional< is_same< CompletionToken, completion_handler_type >::value, completion_handler_type &, completion_handler_type >::type completion_handler;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_completion/completion_handler_type.html000066400000000000000000000162721340672067200273500ustar00rootroot00000000000000 async_completion::completion_handler_type
asio C++ library

PrevUpHomeNext

The real handler type to be used for the asynchronous operation.

typedef asio::async_result< typename decay< CompletionToken >::type, Signature >::completion_handler_type completion_handler_type;
Types

Name

Description

completion_handler_type

The concrete completion handler type for the specific signature.

return_type

The return type of the initiating function.

Member Functions

Name

Description

async_result

Construct an async result from a given handler.

get

Obtain the value to be returned from the initiating function.

The async_result traits class is used for determining:

  • the concrete completion handler type to be called at the end of the asynchronous operation;
  • the initiating function return type; and
  • how the return value of the initiating function is obtained.

The trait allows the handler and return types to be determined at the point where the specific completion handler signature is known.

This template may be specialised for user-defined completion token types. The primary template assumes that the CompletionToken is the completion handler.

Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_completion/result.html000066400000000000000000000051451340672067200237540ustar00rootroot00000000000000 async_completion::result
asio C++ library

PrevUpHomeNext

The result of the asynchronous operation's initiating function.

async_result< typename decay< CompletionToken >::type, Signature > result;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect.html000066400000000000000000000235051340672067200217160ustar00rootroot00000000000000 async_connect
asio C++ library

PrevUpHomeNext

The async_connect function is a composed asynchronous operation that establishes a socket connection by trying each endpoint in a sequence.

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence,
    typename RangeConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    RangeConnectHandler && handler,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  » more...

(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    IteratorConnectHandler && handler,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  » more...

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    IteratorConnectHandler && handler);
  » more...

template<
    typename Protocol,
    typename EndpointSequence,
    typename ConnectCondition,
    typename RangeConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    ConnectCondition connect_condition,
    RangeConnectHandler && handler,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  » more...

(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    ConnectCondition connect_condition,
    IteratorConnectHandler && handler,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  » more...

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    ConnectCondition connect_condition,
    IteratorConnectHandler && handler);
  » more...
Requirements

Header: asio/connect.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect/000077500000000000000000000000001340672067200210235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_connect/overload1.html000066400000000000000000000136501340672067200236120ustar00rootroot00000000000000 async_connect (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence,
    typename RangeConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    RangeConnectHandler && handler,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's async_connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

endpoints

A sequence of endpoints.

handler

The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation. if the sequence is empty, set to
  // asio::error::not_found. Otherwise, contains the
  // error from the last connection attempt.
  const asio::error_code& error,

  // On success, the successfully connected endpoint.
  // Otherwise, a default-constructed endpoint.
  const typename Protocol::endpoint& endpoint
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);

// ...

r.async_resolve(q, resolve_handler);

// ...

void resolve_handler(
    const asio::error_code& ec,
    tcp::resolver::results_type results)
{
  if (!ec)
  {
    asio::async_connect(s, results, connect_handler);
  }
}

// ...

void connect_handler(
    const asio::error_code& ec,
    const tcp::endpoint& endpoint)
{
  // ...
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect/overload2.html000066400000000000000000000132641340672067200236140ustar00rootroot00000000000000 async_connect (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    IteratorConnectHandler && handler,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's async_connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

handler

The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation. if the sequence is empty, set to
  // asio::error::not_found. Otherwise, contains the
  // error from the last connection attempt.
  const asio::error_code& error,

  // On success, an iterator denoting the successfully
  // connected endpoint. Otherwise, the end iterator.
  Iterator iterator
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as asio::ip::tcp::resolver::iterator.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect/overload3.html000066400000000000000000000133451340672067200236150ustar00rootroot00000000000000 async_connect (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    IteratorConnectHandler && handler);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's async_connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

end

An iterator pointing to the end of a sequence of endpoints.

handler

The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation. if the sequence is empty, set to
  // asio::error::not_found. Otherwise, contains the
  // error from the last connection attempt.
  const asio::error_code& error,

  // On success, an iterator denoting the successfully
  // connected endpoint. Otherwise, the end iterator.
  Iterator iterator
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
std::vector<tcp::endpoint> endpoints = ...;
tcp::socket s(io_context);
asio::async_connect(s,
    endpoints.begin(), endpoints.end(),
    connect_handler);

// ...

void connect_handler(
    const asio::error_code& ec,
    std::vector<tcp::endpoint>::iterator i)
{
  // ...
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect/overload4.html000066400000000000000000000173241340672067200236170ustar00rootroot00000000000000 async_connect (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence,
    typename ConnectCondition,
    typename RangeConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    ConnectCondition connect_condition,
    RangeConnectHandler && handler,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's async_connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

endpoints

A sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

handler

The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation. if the sequence is empty, set to
  // asio::error::not_found. Otherwise, contains the
  // error from the last connection attempt.
  const asio::error_code& error,

  // On success, an iterator denoting the successfully
  // connected endpoint. Otherwise, the end iterator.
  Iterator iterator
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

The following connect condition function object can be used to output information about the individual connection attempts:

struct my_connect_condition
{
  bool operator()(
      const asio::error_code& ec,
      const::tcp::endpoint& next)
  {
    if (ec) std::cout << "Error: " << ec.message() << std::endl;
    std::cout << "Trying: " << next << std::endl;
    return true;
  }
};

It would be used with the asio::connect function as follows:

tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);

// ...

r.async_resolve(q, resolve_handler);

// ...

void resolve_handler(
    const asio::error_code& ec,
    tcp::resolver::results_type results)
{
  if (!ec)
  {
    asio::async_connect(s, results,
        my_connect_condition(),
        connect_handler);
  }
}

// ...

void connect_handler(
    const asio::error_code& ec,
    const tcp::endpoint& endpoint)
{
  if (ec)
  {
    // An error occurred.
  }
  else
  {
    std::cout << "Connected to: " << endpoint << std::endl;
  }
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect/overload5.html000066400000000000000000000153411340672067200236150ustar00rootroot00000000000000 async_connect (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use range overload.) Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    ConnectCondition connect_condition,
    IteratorConnectHandler && handler,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's async_connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

handler

The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation. if the sequence is empty, set to
  // asio::error::not_found. Otherwise, contains the
  // error from the last connection attempt.
  const asio::error_code& error,

  // On success, an iterator denoting the successfully
  // connected endpoint. Otherwise, the end iterator.
  Iterator iterator
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as asio::ip::tcp::resolver::iterator.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_connect/overload6.html000066400000000000000000000173231340672067200236200ustar00rootroot00000000000000 async_connect (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition,
    typename IteratorConnectHandler>
DEDUCED async_connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    ConnectCondition connect_condition,
    IteratorConnectHandler && handler);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's async_connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

end

An iterator pointing to the end of a sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

handler

The handler to be called when the connect operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation. if the sequence is empty, set to
  // asio::error::not_found. Otherwise, contains the
  // error from the last connection attempt.
  const asio::error_code& error,

  // On success, an iterator denoting the successfully
  // connected endpoint. Otherwise, the end iterator.
  Iterator iterator
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

The following connect condition function object can be used to output information about the individual connection attempts:

struct my_connect_condition
{
  bool operator()(
      const asio::error_code& ec,
      const::tcp::endpoint& next)
  {
    if (ec) std::cout << "Error: " << ec.message() << std::endl;
    std::cout << "Trying: " << next << std::endl;
    return true;
  }
};

It would be used with the asio::connect function as follows:

tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);

// ...

r.async_resolve(q, resolve_handler);

// ...

void resolve_handler(
    const asio::error_code& ec,
    tcp::resolver::iterator i)
{
  if (!ec)
  {
    tcp::resolver::iterator end;
    asio::async_connect(s, i, end,
        my_connect_condition(),
        connect_handler);
  }
}

// ...

void connect_handler(
    const asio::error_code& ec,
    tcp::resolver::iterator i)
{
  if (ec)
  {
    // An error occurred.
  }
  else
  {
    std::cout << "Connected to: " << i->endpoint() << std::endl;
  }
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read.html000066400000000000000000000225431340672067200212010ustar00rootroot00000000000000 async_read
asio C++ library

PrevUpHomeNext

The async_read function is a composed asynchronous operation that reads a certain amount of data from a stream before completion.

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    const MutableBufferSequence & buffers,
    ReadHandler && handler,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename AsyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    ReadHandler && handler,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    ReadHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    ReadHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    basic_streambuf< Allocator > & b,
    ReadHandler && handler);
  » more...

template<
    typename AsyncReadStream,
    typename Allocator,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    ReadHandler && handler);
  » more...
Requirements

Header: asio/read.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read/000077500000000000000000000000001340672067200203055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_read/overload1.html000066400000000000000000000171261340672067200230760ustar00rootroot00000000000000 async_read (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    const MutableBufferSequence & buffers,
    ReadHandler && handler,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program must ensure that the stream performs no other read operations (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes copied into the
                                          // buffers. If an error occurred,
                                          // this will be the  number of
                                          // bytes successfully transferred
                                          // prior to the error.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To read into a single data buffer use the buffer function as follows:

asio::async_read(s, asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::async_read(
    s, buffers,
    asio::transfer_all(),
    handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read/overload2.html000066400000000000000000000173041340672067200230750ustar00rootroot00000000000000 async_read (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    ReadHandler && handler,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.
Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async_read_some function.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes copied into the
                                          // buffers. If an error occurred,
                                          // this will be the  number of
                                          // bytes successfully transferred
                                          // prior to the error.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To read into a single data buffer use the buffer function as follows:

asio::async_read(s,
    asio::buffer(data, size),
    asio::transfer_at_least(32),
    handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read/overload3.html000066400000000000000000000152101340672067200230700ustar00rootroot00000000000000 async_read (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    ReadHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The specified dynamic buffer sequence is full (that is, it has reached maximum size).
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program must ensure that the stream performs no other read operations (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes copied into the
                                          // buffers. If an error occurred,
                                          // this will be the  number of
                                          // bytes successfully transferred
                                          // prior to the error.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

This overload is equivalent to calling:

asio::async_read(
    s, buffers,
    asio::transfer_all(),
    handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read/overload4.html000066400000000000000000000162301340672067200230740ustar00rootroot00000000000000 async_read (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    ReadHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The specified dynamic buffer sequence is full (that is, it has reached maximum size).
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program must ensure that the stream performs no other read operations (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async_read_some function.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes copied into the
                                          // buffers. If an error occurred,
                                          // this will be the  number of
                                          // bytes successfully transferred
                                          // prior to the error.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read/overload5.html000066400000000000000000000146651340672067200231070ustar00rootroot00000000000000 async_read (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    basic_streambuf< Allocator > & b,
    ReadHandler && handler);

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program must ensure that the stream performs no other read operations (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

b

A basic_streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes copied into the
                                          // buffers. If an error occurred,
                                          // this will be the  number of
                                          // bytes successfully transferred
                                          // prior to the error.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

This overload is equivalent to calling:

asio::async_read(
    s, b,
    asio::transfer_all(),
    handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read/overload6.html000066400000000000000000000157201340672067200231010ustar00rootroot00000000000000 async_read (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data from a stream.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read(
    AsyncReadStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    ReadHandler && handler);

This function is used to asynchronously read a certain number of bytes of data from a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. The program must ensure that the stream performs no other read operations (such as async_read, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

b

A basic_streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's async_read_some function.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes copied into the
                                          // buffers. If an error occurred,
                                          // this will be the  number of
                                          // bytes successfully transferred
                                          // prior to the error.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_at.html000066400000000000000000000164611340672067200216670ustar00rootroot00000000000000 async_read_at
asio C++ library

PrevUpHomeNext

The async_read_at function is a composed asynchronous operation that reads a certain amount of data at the specified offset.

Start an asynchronous operation to read a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    ReadHandler && handler);
  » more...

template<
    typename AsyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    ReadHandler && handler);
  » more...

template<
    typename AsyncRandomAccessReadDevice,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    ReadHandler && handler);
  » more...

template<
    typename AsyncRandomAccessReadDevice,
    typename Allocator,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    ReadHandler && handler);
  » more...
Requirements

Header: asio/read_at.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_at/000077500000000000000000000000001340672067200207715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_read_at/overload1.html000066400000000000000000000165161340672067200235640ustar00rootroot00000000000000 async_read_at (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's async_read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes copied into the buffers. If an error
  // occurred, this will be the number of bytes successfully
  // transferred prior to the error.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To read into a single data buffer use the buffer function as follows:

asio::async_read_at(d, 42, asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::async_read_at(
    d, 42, buffers,
    asio::transfer_all(),
    handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_at/overload2.html000066400000000000000000000173541340672067200235660ustar00rootroot00000000000000 async_read_at (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    ReadHandler && handler);

This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.
Parameters

d

The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_read_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's async_read_some_at function.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes copied into the buffers. If an error
  // occurred, this will be the number of bytes successfully
  // transferred prior to the error.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To read into a single data buffer use the buffer function as follows:

asio::async_read_at(d, 42,
    asio::buffer(data, size),
    asio::transfer_at_least(32),
    handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_at/overload3.html000066400000000000000000000142071340672067200235610ustar00rootroot00000000000000 async_read_at (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessReadDevice,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    ReadHandler && handler);

This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's async_read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

b

A basic_streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes copied into the buffers. If an error
  // occurred, this will be the number of bytes successfully
  // transferred prior to the error.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

This overload is equivalent to calling:

asio::async_read_at(
    d, 42, b,
    asio::transfer_all(),
    handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_at/overload4.html000066400000000000000000000152411340672067200235610ustar00rootroot00000000000000 async_read_at (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessReadDevice,
    typename Allocator,
    typename CompletionCondition,
    typename ReadHandler>
DEDUCED async_read_at(
    AsyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    ReadHandler && handler);

This function is used to asynchronously read a certain number of bytes of data from a random access device at the specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's async_read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the AsyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

b

A basic_streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_read_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's async_read_some_at function.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes copied into the buffers. If an error
  // occurred, this will be the number of bytes successfully
  // transferred prior to the error.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until.html000066400000000000000000000274751340672067200224250ustar00rootroot00000000000000 async_read_until
asio C++ library

PrevUpHomeNext

The async_read_until function is a composed asynchronous operation that reads data into a dynamic buffer sequence, or into a streambuf, until it contains a delimiter, matches a regular expression, or a function object indicates a match.

Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    char delim,
    ReadHandler && handler);
  » more...

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    string_view delim,
    ReadHandler && handler);
  » more...

Start an asynchronous operation to read data into a dynamic buffer sequence until some part of its data matches a regular expression.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    const boost::regex & expr,
    ReadHandler && handler);
  » more...

Start an asynchronous operation to read data into a dynamic buffer sequence until a function object indicates a match.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename MatchCondition,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    MatchCondition match_condition,
    ReadHandler && handler,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  » more...

Start an asynchronous operation to read data into a streambuf until it contains a specified delimiter.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    char delim,
    ReadHandler && handler);
  » more...

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    string_view delim,
    ReadHandler && handler);
  » more...

Start an asynchronous operation to read data into a streambuf until some part of its data matches a regular expression.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr,
    ReadHandler && handler);
  » more...

Start an asynchronous operation to read data into a streambuf until a function object indicates a match.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename MatchCondition,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    ReadHandler && handler,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  » more...
Requirements

Header: asio/read_until.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/000077500000000000000000000000001340672067200215205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_read_until/overload1.html000066400000000000000000000211511340672067200243020ustar00rootroot00000000000000 async_read_until (1 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    char delim,
    ReadHandler && handler);

This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The get area of the dynamic buffer sequence contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the dynamic buffer sequence's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

delim

The delimiter character.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the dynamic buffer sequence's
  // get area up to and including the delimiter.
  // 0 if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent async_read_until operation to examine.

Example

To asynchronously read data into a std::string until a newline is encountered:

std::string data;
...
void handler(const asio::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::string line = data.substr(0, n);
    data.erase(0, n);
    ...
  }
}
...
asio::async_read_until(s, data, '\n', handler);

After the async_read_until operation completes successfully, the buffer data contains the delimiter:

{ 'a', 'b', ..., 'c', '\n', 'd', 'e', ... }

The call to substr then extracts the data up to and including the delimiter, so that the string line contains:

{ 'a', 'b', ..., 'c', '\n' }

After the call to erase, the remaining data is left in the buffer data as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent async_read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload2.html000066400000000000000000000211671340672067200243120ustar00rootroot00000000000000 async_read_until (2 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    string_view delim,
    ReadHandler && handler);

This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The get area of the dynamic buffer sequence contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the dynamic buffer sequence's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

delim

The delimiter string.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the dynamic buffer sequence's
  // get area up to and including the delimiter.
  // 0 if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent async_read_until operation to examine.

Example

To asynchronously read data into a std::string until a CR-LF sequence is encountered:

std::string data;
...
void handler(const asio::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::string line = data.substr(0, n);
    data.erase(0, n);
    ...
  }
}
...
asio::async_read_until(s, data, "\r\n", handler);

After the async_read_until operation completes successfully, the string data contains the delimiter:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to substr then extracts the data up to and including the delimiter, so that the string line contains:

{ 'a', 'b', ..., 'c', '\r', '\n' }

After the call to erase, the remaining data is left in the string data as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent async_read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload3.html000066400000000000000000000215231340672067200243070ustar00rootroot00000000000000 async_read_until (3 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a dynamic buffer sequence until some part of its data matches a regular expression.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    const boost::regex & expr,
    ReadHandler && handler);

This function is used to asynchronously read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • A substring of the dynamic buffer sequence's get area matches the regular expression.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the dynamic buffer sequence's get area already contains data that matches the regular expression, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

expr

The regular expression.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the dynamic buffer
  // sequence's get area up to and including the
  // substring that matches the regular expression.
  // 0 if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent async_read_until operation to examine.

Example

To asynchronously read data into a std::string until a CR-LF sequence is encountered:

std::string data;
...
void handler(const asio::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::string line = data.substr(0, n);
    data.erase(0, n);
    ...
  }
}
...
asio::async_read_until(s, data,
    boost::regex("\r\n"), handler);

After the async_read_until operation completes successfully, the string data contains the data which matched the regular expression:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to substr then extracts the data up to and including the match, so that the string line contains:

{ 'a', 'b', ..., 'c', '\r', '\n' }

After the call to erase, the remaining data is left in the string data as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent async_read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload4.html000066400000000000000000000247061340672067200243160ustar00rootroot00000000000000 async_read_until (4 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a dynamic buffer sequence until a function object indicates a match.

template<
    typename AsyncReadStream,
    typename DynamicBuffer,
    typename MatchCondition,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    DynamicBuffer && buffers,
    MatchCondition match_condition,
    ReadHandler && handler,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);

This function is used to asynchronously read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The match condition function object returns a std::pair where the second element evaluates to true.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the match condition function object already indicates a match, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

match_condition

The function object to be called to determine whether a match exists. The signature of the function object must be:

pair<iterator, bool> match_condition(iterator begin, iterator end);

where iterator represents the type:

buffers_iterator<typename DynamicBuffer::const_buffers_type>

The iterator parameters begin and end define the range of bytes to be scanned to determine whether there is a match. The first member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the begin parameter for any subsequent invocation of the match condition. The second member of the return value is true if a match has been found, false otherwise.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the dynamic buffer sequence's
  // get area that have been fully consumed by the match
  // function. O if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent async_read_until operation to examine.

The default implementation of the is_match_condition type trait evaluates to true for function pointers and function objects with a result_type typedef. It must be specialised for other user-defined function objects.

Examples

To asynchronously read data into a std::string until whitespace is encountered:

typedef asio::buffers_iterator<
    asio::const_buffers_1> iterator;

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
void handler(const asio::error_code& e, std::size_t size);
...
std::string data;
asio::async_read_until(s, data, match_whitespace, handler);

To asynchronously read data into a std::string until a matching character is found:

class match_char
{
public:
  explicit match_char(char c) : c_(c) {}

  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }

private:
  char c_;
};

namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} // namespace asio
...
void handler(const asio::error_code& e, std::size_t size);
...
std::string data;
asio::async_read_until(s, data, match_char('a'), handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload5.html000066400000000000000000000203231340672067200243060ustar00rootroot00000000000000 async_read_until (5 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a streambuf until it contains a specified delimiter.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    char delim,
    ReadHandler && handler);

This function is used to asynchronously read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The get area of the streambuf contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the streambuf's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

b

A streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

delim

The delimiter character.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the streambuf's get
  // area up to and including the delimiter.
  // 0 if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent async_read_until operation to examine.

Example

To asynchronously read data into a streambuf until a newline is encountered:

asio::streambuf b;
...
void handler(const asio::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::istream is(&b);
    std::string line;
    std::getline(is, line);
    ...
  }
}
...
asio::async_read_until(s, b, '\n', handler);

After the async_read_until operation completes successfully, the buffer b contains the delimiter:

{ 'a', 'b', ..., 'c', '\n', 'd', 'e', ... }

The call to std::getline then extracts the data up to and including the newline (which is discarded), so that the string line contains:

{ 'a', 'b', ..., 'c' }

The remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent async_read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload6.html000066400000000000000000000203451340672067200243130ustar00rootroot00000000000000 async_read_until (6 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a streambuf until it contains a specified delimiter.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    string_view delim,
    ReadHandler && handler);

This function is used to asynchronously read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The get area of the streambuf contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the streambuf's get area already contains the delimiter, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

b

A streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

delim

The delimiter string.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the streambuf's get
  // area up to and including the delimiter.
  // 0 if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent async_read_until operation to examine.

Example

To asynchronously read data into a streambuf until a newline is encountered:

asio::streambuf b;
...
void handler(const asio::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::istream is(&b);
    std::string line;
    std::getline(is, line);
    ...
  }
}
...
asio::async_read_until(s, b, "\r\n", handler);

After the async_read_until operation completes successfully, the buffer b contains the delimiter:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to std::getline then extracts the data up to and including the newline (which is discarded), so that the string line contains:

{ 'a', 'b', ..., 'c', '\r' }

The remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent async_read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload7.html000066400000000000000000000207111340672067200243110ustar00rootroot00000000000000 async_read_until (7 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a streambuf until some part of its data matches a regular expression.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr,
    ReadHandler && handler);

This function is used to asynchronously read data into the specified streambuf until the streambuf's get area contains some data that matches a regular expression. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • A substring of the streambuf's get area matches the regular expression.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the streambuf's get area already contains data that matches the regular expression, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

b

A streambuf object into which the data will be read. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

expr

The regular expression.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the streambuf's get
  // area up to and including the substring
  // that matches the regular. expression.
  // 0 if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the streambuf may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the streambuf for a subsequent async_read_until operation to examine.

Example

To asynchronously read data into a streambuf until a CR-LF sequence is encountered:

asio::streambuf b;
...
void handler(const asio::error_code& e, std::size_t size)
{
  if (!e)
  {
    std::istream is(&b);
    std::string line;
    std::getline(is, line);
    ...
  }
}
...
asio::async_read_until(s, b, boost::regex("\r\n"), handler);

After the async_read_until operation completes successfully, the buffer b contains the data which matched the regular expression:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to std::getline then extracts the data up to and including the newline (which is discarded), so that the string line contains:

{ 'a', 'b', ..., 'c', '\r' }

The remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent async_read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_read_until/overload8.html000066400000000000000000000237351340672067200243230ustar00rootroot00000000000000 async_read_until (8 of 8 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to read data into a streambuf until a function object indicates a match.

template<
    typename AsyncReadStream,
    typename Allocator,
    typename MatchCondition,
    typename ReadHandler>
DEDUCED async_read_until(
    AsyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    ReadHandler && handler,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);

This function is used to asynchronously read data into the specified streambuf until a user-defined match condition function object, when applied to the data contained in the streambuf, indicates a successful match. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • The match condition function object returns a std::pair where the second element evaluates to true.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_read_some function, and is known as a composed operation. If the match condition function object already indicates a match, this asynchronous operation completes immediately. The program must ensure that the stream performs no other read operations (such as async_read, async_read_until, the stream's async_read_some function, or any other composed operations that perform reads) until this operation completes.

Parameters

s

The stream from which the data is to be read. The type must support the AsyncReadStream concept.

b

A streambuf object into which the data will be read.

match_condition

The function object to be called to determine whether a match exists. The signature of the function object must be:

pair<iterator, bool> match_condition(iterator begin, iterator end);

where iterator represents the type:

buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>

The iterator parameters begin and end define the range of bytes to be scanned to determine whether there is a match. The first member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the begin parameter for any subsequent invocation of the match condition. The second member of the return value is true if a match has been found, false otherwise.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // The number of bytes in the streambuf's get
  // area that have been fully consumed by the
  // match function. O if an error occurred.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

After a successful async_read_until operation, the streambuf may contain additional data beyond that which matched the function object. An application will typically leave that data in the streambuf for a subsequent async_read_until operation to examine.

The default implementation of the is_match_condition type trait evaluates to true for function pointers and function objects with a result_type typedef. It must be specialised for other user-defined function objects.

Examples

To asynchronously read data into a streambuf until whitespace is encountered:

typedef asio::buffers_iterator<
    asio::streambuf::const_buffers_type> iterator;

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
void handler(const asio::error_code& e, std::size_t size);
...
asio::streambuf b;
asio::async_read_until(s, b, match_whitespace, handler);

To asynchronously read data into a streambuf until a matching character is found:

class match_char
{
public:
  explicit match_char(char c) : c_(c) {}

  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }

private:
  char c_;
};

namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} // namespace asio
...
void handler(const asio::error_code& e, std::size_t size);
...
asio::streambuf b;
asio::async_read_until(s, b, match_char('a'), handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result.html000066400000000000000000000147461340672067200216120ustar00rootroot00000000000000 async_result
asio C++ library

PrevUpHomeNext

An interface for customising the behaviour of an initiating function.

template<
    typename CompletionToken,
    typename Signature>
class async_result
Types

Name

Description

completion_handler_type

The concrete completion handler type for the specific signature.

return_type

The return type of the initiating function.

Member Functions

Name

Description

async_result

Construct an async result from a given handler.

get

Obtain the value to be returned from the initiating function.

The async_result traits class is used for determining:

  • the concrete completion handler type to be called at the end of the asynchronous operation;
  • the initiating function return type; and
  • how the return value of the initiating function is obtained.

The trait allows the handler and return types to be determined at the point where the specific completion handler signature is known.

This template may be specialised for user-defined completion token types. The primary template assumes that the CompletionToken is the completion handler.

Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result/000077500000000000000000000000001340672067200207105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_result/async_result.html000066400000000000000000000056131340672067200243160ustar00rootroot00000000000000 async_result::async_result
asio C++ library

PrevUpHomeNext

Construct an async result from a given handler.

async_result(
    completion_handler_type & h);

When using a specalised async_result, the constructor has an opportunity to initialise some state associated with the completion handler, which is then returned from the initiating function.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result/completion_handler_type.html000066400000000000000000000061551340672067200265140ustar00rootroot00000000000000 async_result::completion_handler_type
asio C++ library

PrevUpHomeNext

The concrete completion handler type for the specific signature.

typedef CompletionToken completion_handler_type;
Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result/get.html000066400000000000000000000047421340672067200223640ustar00rootroot00000000000000 async_result::get
asio C++ library

PrevUpHomeNext

Obtain the value to be returned from the initiating function.

return_type get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result/return_type.html000066400000000000000000000060101340672067200241530ustar00rootroot00000000000000 async_result::return_type
asio C++ library

PrevUpHomeNext

The return type of the initiating function.

typedef void return_type;
Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result_lt__Handler__gt_.html000066400000000000000000000135041340672067200250640ustar00rootroot00000000000000 async_result< Handler >
asio C++ library

PrevUpHomeNext

(Deprecated: Use two-parameter version of async_result.) An interface for customising the behaviour of an initiating function.

template<
    typename Handler>
class async_result< Handler >
Types

Name

Description

type

The return type of the initiating function.

Member Functions

Name

Description

async_result

Construct an async result from a given handler.

get

Obtain the value to be returned from the initiating function.

This template may be specialised for user-defined handler types.

Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result_lt__Handler__gt_/000077500000000000000000000000001340672067200241735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_result_lt__Handler__gt_/async_result.html000066400000000000000000000060011340672067200275710ustar00rootroot00000000000000 async_result< Handler >::async_result
asio C++ library

PrevUpHomeNext

Construct an async result from a given handler.

async_result(
    Handler & );

When using a specalised async_result, the constructor has an opportunity to initialise some state associated with the handler, which is then returned from the initiating function.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result_lt__Handler__gt_/get.html000066400000000000000000000051141340672067200256410ustar00rootroot00000000000000 async_result< Handler >::get
asio C++ library

PrevUpHomeNext

Obtain the value to be returned from the initiating function.

type get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_result_lt__Handler__gt_/type.html000066400000000000000000000066071340672067200260530ustar00rootroot00000000000000 async_result< Handler >::type
asio C++ library

PrevUpHomeNext

The return type of the initiating function.

typedef void type;
Requirements

Header: asio/async_result.hpp

Convenience header: asio.hpp


PrevUpHomeNext
async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.html000066400000000000000000000176451340672067200421670ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference async_result< std::packaged_task< Result(Args...)>, Signature >
asio C++ library

PrevUpHomeNext

Partial specialisation of async_result for std::packaged_task.

template<
    typename Result,
    typename... Args,
    typename Signature>
class async_result< std::packaged_task< Result(Args...)>, Signature >
Types

Name

Description

completion_handler_type

The packaged task is the concrete completion handler type.

return_type

The return type of the initiating function is the future obtained from the packaged task.

Member Functions

Name

Description

async_result

The constructor extracts the future from the packaged task.

get

Returns the packaged task's future.

Requirements

Header: asio/packaged_task.hpp

Convenience header: asio.hpp


PrevUpHomeNext
async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/000077500000000000000000000000001340672067200412645ustar00rootroot00000000000000asio-1.12.2/doc/asio/referenceasync_result.html000066400000000000000000000071101340672067200446640ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_ async_result< std::packaged_task< Result(Args...)>, Signature >::async_result
asio C++ library

PrevUpHomeNext

The constructor extracts the future from the packaged task.

async_result(
    completion_handler_type & h);

PrevUpHomeNext
completion_handler_type.html000066400000000000000000000102251340672067200470610ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_ async_result< std::packaged_task< Result(Args...)>, Signature >::completion_handler_type
asio C++ library

PrevUpHomeNext

The packaged task is the concrete completion handler type.

typedef std::packaged_task< Result(Args...)> completion_handler_type;
Requirements

Header: asio/packaged_task.hpp

Convenience header: asio.hpp


PrevUpHomeNext
get.html000066400000000000000000000063441340672067200427400ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_ async_result< std::packaged_task< Result(Args...)>, Signature >::get
asio C++ library

PrevUpHomeNext

Returns the packaged task's future.

return_type get();

PrevUpHomeNext
return_type.html000066400000000000000000000077311340672067200445420ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_ async_result< std::packaged_task< Result(Args...)>, Signature >::return_type
asio C++ library

PrevUpHomeNext

The return type of the initiating function is the future obtained from the packaged task.

typedef std::future< Result > return_type;
Requirements

Header: asio/packaged_task.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write.html000066400000000000000000000246061340672067200214220ustar00rootroot00000000000000 async_write
asio C++ library

PrevUpHomeNext

The async_write function is a composed asynchronous operation that writes a certain amount of data to a stream before completion.

Start an asynchronous operation to write all of the supplied data to a stream.

template<
    typename AsyncWriteStream,
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    const ConstBufferSequence & buffers,
    WriteHandler && handler,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  » more...

Start an asynchronous operation to write a certain amount of data to a stream.

template<
    typename AsyncWriteStream,
    typename ConstBufferSequence,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    WriteHandler && handler,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  » more...

Start an asynchronous operation to write all of the supplied data to a stream.

template<
    typename AsyncWriteStream,
    typename DynamicBuffer,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    DynamicBuffer && buffers,
    WriteHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

Start an asynchronous operation to write a certain amount of data to a stream.

template<
    typename AsyncWriteStream,
    typename DynamicBuffer,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    WriteHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

Start an asynchronous operation to write all of the supplied data to a stream.

template<
    typename AsyncWriteStream,
    typename Allocator,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    WriteHandler && handler);
  » more...

Start an asynchronous operation to write a certain amount of data to a stream.

template<
    typename AsyncWriteStream,
    typename Allocator,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    WriteHandler && handler);
  » more...
Requirements

Header: asio/write.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write/000077500000000000000000000000001340672067200205245ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_write/overload1.html000066400000000000000000000160311340672067200233070ustar00rootroot00000000000000 async_write (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write all of the supplied data to a stream.

template<
    typename AsyncWriteStream,
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    const ConstBufferSequence & buffers,
    WriteHandler && handler,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);

This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

Parameters

s

The stream to which the data is to be written. The type must support the AsyncWriteStream concept.

buffers

One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes written from the
                                          // buffers. If an error occurred,
                                          // this will be less than the sum
                                          // of the buffer sizes.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To write a single data buffer use the buffer function as follows:

asio::async_write(s, asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write/overload2.html000066400000000000000000000200051340672067200233040ustar00rootroot00000000000000 async_write (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write a certain amount of data to a stream.

template<
    typename AsyncWriteStream,
    typename ConstBufferSequence,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    WriteHandler && handler,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);

This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

Parameters

s

The stream to which the data is to be written. The type must support the AsyncWriteStream concept.

buffers

One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async_write_some function.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes written from the
                                          // buffers. If an error occurred,
                                          // this will be less than the sum
                                          // of the buffer sizes.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To write a single data buffer use the buffer function as follows:

asio::async_write(s,
    asio::buffer(data, size),
    asio::transfer_at_least(32),
    handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write/overload3.html000066400000000000000000000143601340672067200233140ustar00rootroot00000000000000 async_write (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write all of the supplied data to a stream.

template<
    typename AsyncWriteStream,
    typename DynamicBuffer,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    DynamicBuffer && buffers,
    WriteHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied dynamic buffer sequence has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

Parameters

s

The stream to which the data is to be written. The type must support the AsyncWriteStream concept.

buffers

The dynamic buffer sequence from which data will be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called. Successfully written data is automatically consumed from the buffers.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes written from the
                                          // buffers. If an error occurred,
                                          // this will be less than the sum
                                          // of the buffer sizes.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write/overload4.html000066400000000000000000000162571340672067200233240ustar00rootroot00000000000000 async_write (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write a certain amount of data to a stream.

template<
    typename AsyncWriteStream,
    typename DynamicBuffer,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    WriteHandler && handler,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied dynamic buffer sequence has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

Parameters

s

The stream to which the data is to be written. The type must support the AsyncWriteStream concept.

buffers

The dynamic buffer sequence from which data will be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called. Successfully written data is automatically consumed from the buffers.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async_write_some function.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes written from the
                                          // buffers. If an error occurred,
                                          // this will be less than the sum
                                          // of the buffer sizes.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write/overload5.html000066400000000000000000000141421340672067200233140ustar00rootroot00000000000000 async_write (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write all of the supplied data to a stream.

template<
    typename AsyncWriteStream,
    typename Allocator,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    WriteHandler && handler);

This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

Parameters

s

The stream to which the data is to be written. The type must support the AsyncWriteStream concept.

b

A basic_streambuf object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes written from the
                                          // buffers. If an error occurred,
                                          // this will be less than the sum
                                          // of the buffer sizes.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write/overload6.html000066400000000000000000000160511340672067200233160ustar00rootroot00000000000000 async_write (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write a certain amount of data to a stream.

template<
    typename AsyncWriteStream,
    typename Allocator,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write(
    AsyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    WriteHandler && handler);

This function is used to asynchronously write a certain number of bytes of data to a stream. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

Parameters

s

The stream to which the data is to be written. The type must support the AsyncWriteStream concept.

b

A basic_streambuf object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's async_write_some function.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.

  std::size_t bytes_transferred           // Number of bytes written from the
                                          // buffers. If an error occurred,
                                          // this will be less than the sum
                                          // of the buffer sizes.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write_at.html000066400000000000000000000175271340672067200221120ustar00rootroot00000000000000 async_write_at
asio C++ library

PrevUpHomeNext

The async_write_at function is a composed asynchronous operation that writes a certain amount of data at the specified offset before completion.

Start an asynchronous operation to write all of the supplied data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    WriteHandler && handler);
  » more...

Start an asynchronous operation to write a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    WriteHandler && handler);
  » more...

Start an asynchronous operation to write all of the supplied data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename Allocator,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    WriteHandler && handler);
  » more...

Start an asynchronous operation to write a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename Allocator,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    WriteHandler && handler);
  » more...
Requirements

Header: asio/write_at.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write_at/000077500000000000000000000000001340672067200212105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/async_write_at/overload1.html000066400000000000000000000164601340672067200240010ustar00rootroot00000000000000 async_write_at (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write all of the supplied data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's async_write_some_at function, and is known as a composed operation. The program must ensure that the device performs no overlapping write operations (such as async_write_at, the device's async_write_some_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.

Parameters

d

The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

buffers

One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes written from the buffers. If an error
  // occurred, this will be less than the sum of the buffer sizes.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To write a single data buffer use the buffer function as follows:

asio::async_write_at(d, 42, asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write_at/overload2.html000066400000000000000000000204311340672067200237730ustar00rootroot00000000000000 async_write_at (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    WriteHandler && handler);

This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's async_write_some_at function, and is known as a composed operation. The program must ensure that the device performs no overlapping write operations (such as async_write_at, the device's async_write_some_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.

Parameters

d

The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

buffers

One or more buffers containing the data to be written. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_write_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's async_write_some_at function.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes written from the buffers. If an error
  // occurred, this will be less than the sum of the buffer sizes.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To write a single data buffer use the buffer function as follows:

asio::async_write_at(d, 42,
    asio::buffer(data, size),
    asio::transfer_at_least(32),
    handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write_at/overload3.html000066400000000000000000000147131340672067200240020ustar00rootroot00000000000000 async_write_at (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write all of the supplied data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename Allocator,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    WriteHandler && handler);

This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's async_write_some_at function, and is known as a composed operation. The program must ensure that the device performs no overlapping write operations (such as async_write_at, the device's async_write_some_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.

Parameters

d

The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

b

A basic_streambuf object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes written from the buffers. If an error
  // occurred, this will be less than the sum of the buffer sizes.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/async_write_at/overload4.html000066400000000000000000000166151340672067200240060ustar00rootroot00000000000000 async_write_at (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to write a certain amount of data at the specified offset.

template<
    typename AsyncRandomAccessWriteDevice,
    typename Allocator,
    typename CompletionCondition,
    typename WriteHandler>
DEDUCED async_write_at(
    AsyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    WriteHandler && handler);

This function is used to asynchronously write a certain number of bytes of data to a random access device at a specified offset. The function call always returns immediately. The asynchronous operation will continue until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's async_write_some_at function, and is known as a composed operation. The program must ensure that the device performs no overlapping write operations (such as async_write_at, the device's async_write_some_at function, or any other composed operations that perform writes) until this operation completes. Operations are overlapping if the regions defined by their offsets, and the numbers of bytes to write, intersect.

Parameters

d

The device to which the data is to be written. The type must support the AsyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

b

A basic_streambuf object from which data will be written. Ownership of the streambuf is retained by the caller, which must guarantee that it remains valid until the handler is called.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest async_write_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's async_write_some_at function.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  // Result of operation.
  const asio::error_code& error,

  // Number of bytes written from the buffers. If an error
  // occurred, this will be less than the sum of the buffer sizes.
  std::size_t bytes_transferred
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asynchronous_operations.html000066400000000000000000000566171340672067200241000ustar00rootroot00000000000000 Requirements on asynchronous operations
asio C++ library

PrevUpHomeNext

This section uses the names Alloc1, Alloc2, alloc1, alloc2, Args, CompletionHandler, completion_handler, Executor1, Executor2, ex1, ex2, f, i, N, Signature, token, T[sub i], t[sub i], work1, and work2 as placeholders for specifying the requirements below.

General asynchronous operation concepts

An initiating function is a function which may be called to start an asynchronous operation. A completion handler is a function object that will be invoked, at most once, with the result of the asynchronous operation.

The lifecycle of an asynchronous operation is comprised of the following events and phases:

— Event 1: The asynchronous operation is started by a call to the initiating function.

— Phase 1: The asynchronous operation is now outstanding.

— Event 2: The externally observable side effects of the asynchronous operation, if any, are fully established. The completion handler is submitted to an executor.

— Phase 2: The asynchronous operation is now completed.

— Event 3: The completion handler is called with the result of the asynchronous operation.

In this library, all functions with the prefix async_ are initiating functions.

Completion tokens and handlers

Initiating functions:

— are function templates with template parameter CompletionToken;

— accept, as the final parameter, a completion token object token of type CompletionToken;

— specify a completion signature, which is a call signature (C++Std [func.def]) Signature that determines the arguments to the completion handler.

An initiating function determines the type CompletionHandler of its completion handler function object by performing typename async_result<decay_t<CompletionToken>, Signature>::completion_handler_type. The completion handler object completion_handler is initialized with forward<CompletionToken>(token). [Note: No other requirements are placed on the type CompletionToken. —end note]

The type CompletionHandler must satisfy the requirements of Destructible (C++Std [destructible]) and MoveConstructible (C++Std [moveconstructible]), and be callable with the specified call signature.

In this library, all initiating functions specify a Completion signature element that defines the call signature Signature. The Completion signature elements in this Technical Specification have named parameters, and the results of an asynchronous operation are specified in terms of these names.

Automatic deduction of initiating function return type

The return type of an initiating function is typename async_result<decay_t<CompletionToken>, Signature>::return_type.

For the sake of exposition, this library sometimes annotates functions with a return type DEDUCED. For every function declaration that returns DEDUCED, the meaning is equivalent to specifying the return type as typename async_result<decay_t<CompletionToken>, Signature>::return_type.

Production of initiating function return value

An initiating function produces its return type as follows:

— constructing an object result of type async_result<decay_t<CompletionToken>, Signature>, initialized as result(completion_handler); and

— using result.get() as the operand of the return statement.

[Example: Given an asynchronous operation with Completion signature void(R1 r1, R2 r2), an initiating function meeting these requirements may be implemented as follows:

template<class CompletionToken>
auto async_xyz(T1 t1, T2 t2, CompletionToken&& token)
{
  typename async_result<decay_t<CompletionToken>, void(R1, R2)>::completion_handler_type
    completion_handler(forward<CompletionToken>(token));

  async_result<decay_t<CompletionToken>, void(R1, R2)> result(completion_handler);

  // initiate the operation and cause completion_handler to be invoked with
  // the result

  return result.get();
}

For convenience, initiating functions may be implemented using the async_completion template:

template<class CompletionToken>
auto async_xyz(T1 t1, T2 t2, CompletionToken&& token)
{
  async_completion<CompletionToken, void(R1, R2)> init(token);

  // initiate the operation and cause init.completion_handler to be invoked
  // with the result

  return init.result.get();
}

end example]

Lifetime of initiating function arguments

Unless otherwise specified, the lifetime of arguments to initiating functions shall be treated as follows:

— If the parameter has a pointer type or has a type of lvalue reference to non-const, the implementation may assume the validity of the pointee or referent, respectively, until the completion handler is invoked. [Note: In other words, the program must guarantee the validity of the argument until the completion handler is invoked. —end note]

— Otherwise, the implementation must not assume the validity of the argument after the initiating function completes. [Note: In other words, the program is not required to guarantee the validity of the argument after the initiating function completes. —end note] The implementation may make copies of the argument, and all copies shall be destroyed no later than immediately after invocation of the completion handler.

Non-blocking requirements on initiating functions

An initiating function shall not block (C++Std [defns.block]) the calling thread pending completion of the outstanding operation.

[std_note Initiating functions may still block the calling thread for other reasons. For example, an initiating function may lock a mutex in order to synchronize access to shared data.]

Associated executor

Certain objects that participate in asynchronous operations have an associated executor. These are obtained as specified in the sections below.

Associated I/O executor

An asynchronous operation has an associated executor satisfying the Executor requirements. If not otherwise specified by the asynchronous operation, this associated executor is an object of type system_executor.

All asynchronous operations in this library have an associated executor object that is determined as follows:

— If the initiating function is a member function, the associated executor is that returned by the get_executor member function on the same object.

— If the initiating function is not a member function, the associated executor is that returned by the get_executor member function of the first argument to the initiating function.

Let Executor1 be the type of the associated executor. Let ex1 be a value of type Executor1, representing the associated executor object obtained as described above.

Associated completion handler executor

A completion handler object of type CompletionHandler has an associated executor of type Executor2 satisfying the Executor requirements. The type Executor2 is associated_executor_t<CompletionHandler, Executor1>. Let ex2 be a value of type Executor2 obtained by performing get_associated_executor(completion_handler, ex1).

Outstanding work

Until the asynchronous operation has completed, the asynchronous operation shall maintain:

— an object work1 of type executor_work_guard<Executor1>, initialized as work1(ex1), and where work1.owns_work() == true; and

— an object work2 of type executor_work_guard<Executor2>, initialized as work2(ex2), and where work2.owns_work() == true.

Allocation of intermediate storage

Asynchronous operations may allocate memory. [Note: Such as a data structure to store copies of the completion_handler object and the initiating function's arguments. —end note]

Let Alloc1 be a type, satisfying the ProtoAllocator requirements, that represents the asynchronous operation's default allocation strategy. [Note: Typically std::allocator<void>. —end note] Let alloc1 be a value of type Alloc1.

A completion handler object of type CompletionHandler has an associated allocator object alloc2 of type Alloc2 satisfying the ProtoAllocator requirements. The type Alloc2 is associated_allocator_t<CompletionHandler, Alloc1>. Let alloc2 be a value of type Alloc2 obtained by performing get_associated_allocator(completion_handler, alloc1).

The asynchronous operations defined in this library:

— If required, allocate memory using only the completion handler's associated allocator.

— Prior to completion handler execution, deallocate any memory allocated using the completion handler's associated allocator.

[std_note The implementation may perform operating system or underlying API calls that perform memory allocations not using the associated allocator. Invocations of the allocator functions may not introduce data races (See C++Std [res.on.data.races]).]

Execution of completion handler on completion of asynchronous operation

Let Args... be the argument types of the completion signature Signature and let N be sizeof...(Args). Let i be in the range [0,N). Let T[sub i] be the ith type in Args... and let t[sub i] be the ith completion handler argument associated with T[sub i].

Let f be a function object, callable as f(), that invokes completion_handler as if by completion_handler(forward<T[sub 0>(t[sub 0]), ..., forward<T[sub N-1]>(t[sub N-1]))].

If an asynchonous operation completes immediately (that is, within the thread of execution calling the initiating function, and before the initiating function returns), the completion handler shall be submitted for execution as if by performing ex2.post(std::move(f), alloc2). Otherwise, the completion handler shall be submitted for execution as if by performing ex2.dispatch(std::move(f), alloc2).

Completion handlers and exceptions

Completion handlers are permitted to throw exceptions. The effect of any exception propagated from the execution of a completion handler is determined by the executor which is executing the completion handler.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/asynchronous_socket_operations.html000066400000000000000000000114151340672067200254330ustar00rootroot00000000000000 Requirements on asynchronous socket operations
asio C++ library

PrevUpHomeNext

In this library, asynchronous socket operations are those member functions having prefix async_.

For an object s, a program may initiate asynchronous socket operations such that there are multiple simultaneously outstanding asynchronous operations.

When there are multiple outstanding asynchronous read operations on s:

— having no argument flags of type socket_base::message_flags, or

— having an argument flags of type socket_base::message_flags but where (flags & socket_base::message_out_of_band) == 0

then the buffers are filled in the order in which these operations were issued. The order of invocation of the completion handlers for these operations is unspecified.

When there are multiple outstanding asynchronous read operations on s having an argument flags of type socket_base::message_flags where (flags & socket_base::message_out_of_band) != 0 then the buffers are filled in the order in which these operations were issued.

When there are multiple outstanding asynchronous write operations on s, the buffers are transmitted in the order in which these operations were issued. The order of invocation of the completion handlers for these operations is unspecified.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/bad_executor.html000066400000000000000000000101641340672067200215310ustar00rootroot00000000000000 bad_executor
asio C++ library

PrevUpHomeNext

Exception thrown when trying to access an empty polymorphic executor.

class bad_executor :
  public std::exception
Member Functions

Name

Description

bad_executor

Constructor.

what

Obtain message associated with exception.

Requirements

Header: asio/executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/bad_executor/000077500000000000000000000000001340672067200206415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/bad_executor/bad_executor.html000066400000000000000000000046151340672067200242010ustar00rootroot00000000000000 bad_executor::bad_executor
asio C++ library

PrevUpHomeNext

Constructor.

bad_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/bad_executor/what.html000066400000000000000000000047331340672067200225010ustar00rootroot00000000000000 bad_executor::what
asio C++ library

PrevUpHomeNext

Obtain message associated with exception.

virtual const char * what() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket.html000066400000000000000000000773371340672067200233750ustar00rootroot00000000000000 basic_datagram_socket
asio C++ library

PrevUpHomeNext

Provides datagram-oriented socket functionality.

template<
    typename Protocol>
class basic_datagram_socket :
  public basic_socket< Protocol >
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_datagram_socket

Construct a basic_datagram_socket without opening it.

Construct and open a basic_datagram_socket.

Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.

Construct a basic_datagram_socket on an existing native socket.

Move-construct a basic_datagram_socket from another.

Move-construct a basic_datagram_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_datagram_socket from another.

Move-assign a basic_datagram_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive a datagram with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send a datagram to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_datagram_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_datagram_socket class template provides asynchronous and blocking datagram-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/000077500000000000000000000000001340672067200224665ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/_basic_datagram_socket.html000066400000000000000000000055061340672067200300120ustar00rootroot00000000000000 basic_datagram_socket::~basic_datagram_socket
asio C++ library

PrevUpHomeNext

Destroys the socket.

~basic_datagram_socket();

This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/assign.html000066400000000000000000000065051340672067200246460ustar00rootroot00000000000000 basic_datagram_socket::assign
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/assign/000077500000000000000000000000001340672067200237525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/assign/overload1.html000066400000000000000000000053141340672067200265370ustar00rootroot00000000000000 basic_datagram_socket::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/assign/overload2.html000066400000000000000000000054071340672067200265430ustar00rootroot00000000000000 basic_datagram_socket::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_connect.html000066400000000000000000000126311340672067200262050ustar00rootroot00000000000000 basic_datagram_socket::async_connect
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Start an asynchronous connect.

template<
    typename ConnectHandler>
DEDUCED async_connect(
    const endpoint_type & peer_endpoint,
    ConnectHandler && handler);

This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.

handler

The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void connect_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Connect succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_connect(endpoint, connect_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive.html000066400000000000000000000105151340672067200261750ustar00rootroot00000000000000 basic_datagram_socket::async_receive
asio C++ library

PrevUpHomeNext

Start an asynchronous receive on a connected socket.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);
  » more...

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    ReadHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive/000077500000000000000000000000001340672067200253055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive/overload1.html000066400000000000000000000145611340672067200300760ustar00rootroot00000000000000 basic_datagram_socket::async_receive (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive on a connected socket.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously receive data from the datagram socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_receive operation can only be used with a connected socket. Use the async_receive_from function to receive data on an unconnected datagram socket.

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive(asio::buffer(data, size), handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive/overload2.html000066400000000000000000000132301340672067200300670ustar00rootroot00000000000000 basic_datagram_socket::async_receive (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive on a connected socket.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    ReadHandler && handler);

This function is used to asynchronously receive data from the datagram socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the receive call is to be made.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_receive operation can only be used with a connected socket. Use the async_receive_from function to receive data on an unconnected datagram socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive_from.html000066400000000000000000000110361340672067200272170ustar00rootroot00000000000000 basic_datagram_socket::async_receive_from
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    ReadHandler && handler);
  » more...

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    ReadHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive_from/000077500000000000000000000000001340672067200263305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive_from/overload1.html000066400000000000000000000145141340672067200311170ustar00rootroot00000000000000 basic_datagram_socket::async_receive_from (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    ReadHandler && handler);

This function is used to asynchronously receive a datagram. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the datagram. Ownership of the sender_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive_from(
    asio::buffer(data, size), sender_endpoint, handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_receive_from/overload2.html000066400000000000000000000130251340672067200311140ustar00rootroot00000000000000 basic_datagram_socket::async_receive_from (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    ReadHandler && handler);

This function is used to asynchronously receive a datagram. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the datagram. Ownership of the sender_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

flags

Flags specifying how the receive call is to be made.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send.html000066400000000000000000000105211340672067200255010ustar00rootroot00000000000000 basic_datagram_socket::async_send
asio C++ library

PrevUpHomeNext

Start an asynchronous send on a connected socket.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);
  » more...

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send/000077500000000000000000000000001340672067200246145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send/overload1.html000066400000000000000000000143541340672067200274050ustar00rootroot00000000000000 basic_datagram_socket::async_send (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send on a connected socket.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously send data on the datagram socket. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_send operation can only be used with a connected socket. Use the async_send_to function to send data on an unconnected datagram socket.

Example

To send a single data buffer use the buffer function as follows:

socket.async_send(asio::buffer(data, size), handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send/overload2.html000066400000000000000000000130431340672067200274000ustar00rootroot00000000000000 basic_datagram_socket::async_send (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send on a connected socket.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);

This function is used to asynchronously send data on the datagram socket. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the send call is to be made.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_send operation can only be used with a connected socket. Use the async_send_to function to send data on an unconnected datagram socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send_to.html000066400000000000000000000106551340672067200262130ustar00rootroot00000000000000 basic_datagram_socket::async_send_to
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    WriteHandler && handler);
  » more...

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    WriteHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send_to/000077500000000000000000000000001340672067200253165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send_to/overload1.html000066400000000000000000000142461340672067200301070ustar00rootroot00000000000000 basic_datagram_socket::async_send_to (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    WriteHandler && handler);

This function is used to asynchronously send a datagram to the specified remote endpoint. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

destination

The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To send a single data buffer use the buffer function as follows:

asio::ip::udp::endpoint destination(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_send_to(
    asio::buffer(data, size), destination, handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_send_to/overload2.html000066400000000000000000000125131340672067200301030ustar00rootroot00000000000000 basic_datagram_socket::async_send_to (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    WriteHandler && handler);

This function is used to asynchronously send a datagram to the specified remote endpoint. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the send call is to be made.

destination

The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/async_wait.html000066400000000000000000000120021340672067200255100ustar00rootroot00000000000000 basic_datagram_socket::async_wait
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
...
socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/at_mark.html000066400000000000000000000062421340672067200247760ustar00rootroot00000000000000 basic_datagram_socket::at_mark
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;
  » more...

bool at_mark(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/at_mark/000077500000000000000000000000001340672067200241045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/at_mark/overload1.html000066400000000000000000000073501340672067200266730ustar00rootroot00000000000000 basic_datagram_socket::at_mark (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/at_mark/overload2.html000066400000000000000000000074301340672067200266730ustar00rootroot00000000000000 basic_datagram_socket::at_mark (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark(
    asio::error_code & ec) const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/available.html000066400000000000000000000063641340672067200253050ustar00rootroot00000000000000 basic_datagram_socket::available
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available() const;
  » more...

std::size_t available(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/available/000077500000000000000000000000001340672067200244065ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/available/overload1.html000066400000000000000000000074201340672067200271730ustar00rootroot00000000000000 basic_datagram_socket::available (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available() const;

This function is used to determine the number of bytes that may be read without blocking.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/available/overload2.html000066400000000000000000000075501340672067200272000ustar00rootroot00000000000000 basic_datagram_socket::available (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available(
    asio::error_code & ec) const;

This function is used to determine the number of bytes that may be read without blocking.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket.html000066400000000000000000000155111340672067200276500ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket
asio C++ library

PrevUpHomeNext

Construct a basic_datagram_socket without opening it.

explicit basic_datagram_socket(
    asio::io_context & io_context);
  » more...

Construct and open a basic_datagram_socket.

basic_datagram_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);
  » more...

Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.

basic_datagram_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);
  » more...

Construct a basic_datagram_socket on an existing native socket.

basic_datagram_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

Move-construct a basic_datagram_socket from another.

basic_datagram_socket(
    basic_datagram_socket && other);
  » more...

Move-construct a basic_datagram_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_datagram_socket(
    basic_datagram_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/000077500000000000000000000000001340672067200267575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/overload1.html000066400000000000000000000076351340672067200315540ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_datagram_socket without opening it.

basic_datagram_socket(
    asio::io_context & io_context);

This constructor creates a datagram socket without opening it. The open() function must be called before data can be sent or received on the socket.

Parameters

io_context

The io_context object that the datagram socket will use to dispatch handlers for any asynchronous operations performed on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/overload2.html000066400000000000000000000107121340672067200315430ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a basic_datagram_socket.

basic_datagram_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);

This constructor creates and opens a datagram socket.

Parameters

io_context

The io_context object that the datagram socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/overload3.html000066400000000000000000000113221340672067200315420ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.

basic_datagram_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);

This constructor creates a datagram socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.

Parameters

io_context

The io_context object that the datagram socket will use to dispatch handlers for any asynchronous operations performed on the socket.

endpoint

An endpoint on the local machine to which the datagram socket will be bound.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/overload4.html000066400000000000000000000113261340672067200315470ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_datagram_socket on an existing native socket.

basic_datagram_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);

This constructor creates a datagram socket object to hold an existing native socket.

Parameters

io_context

The io_context object that the datagram socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

native_socket

The new underlying socket implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/overload5.html000066400000000000000000000104041340672067200315440ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_datagram_socket from another.

basic_datagram_socket(
    basic_datagram_socket && other);

This constructor moves a datagram socket from one object to another.

Parameters

other

The other basic_datagram_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_datagram_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/basic_datagram_socket/overload6.html000066400000000000000000000107351340672067200315540ustar00rootroot00000000000000 basic_datagram_socket::basic_datagram_socket (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_datagram_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_datagram_socket(
    basic_datagram_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);

This constructor moves a datagram socket from one object to another.

Parameters

other

The other basic_datagram_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_datagram_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/bind.html000066400000000000000000000063651340672067200243020ustar00rootroot00000000000000 basic_datagram_socket::bind
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);
  » more...

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/bind/000077500000000000000000000000001340672067200234025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/bind/overload1.html000066400000000000000000000103701340672067200261650ustar00rootroot00000000000000 basic_datagram_socket::bind (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/bind/overload2.html000066400000000000000000000077631340672067200262020ustar00rootroot00000000000000 basic_datagram_socket::bind (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
asio::error_code ec;
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/broadcast.html000066400000000000000000000100211340672067200253100ustar00rootroot00000000000000 basic_datagram_socket::broadcast
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/bytes_readable.html000066400000000000000000000075031340672067200263260ustar00rootroot00000000000000 basic_datagram_socket::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/cancel.html000066400000000000000000000062231340672067200246040ustar00rootroot00000000000000 basic_datagram_socket::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/cancel/000077500000000000000000000000001340672067200237135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/cancel/overload1.html000066400000000000000000000126621340672067200265040ustar00rootroot00000000000000 basic_datagram_socket::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/cancel/overload2.html000066400000000000000000000127261340672067200265060ustar00rootroot00000000000000 basic_datagram_socket::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/close.html000066400000000000000000000061431340672067200244650ustar00rootroot00000000000000 basic_datagram_socket::close
asio C++ library

PrevUpHomeNext

Close the socket.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/close/000077500000000000000000000000001340672067200235735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/close/overload1.html000066400000000000000000000077041340672067200263650ustar00rootroot00000000000000 basic_datagram_socket::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close();

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.

Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/close/overload2.html000066400000000000000000000106771340672067200263710ustar00rootroot00000000000000 basic_datagram_socket::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close(
    asio::error_code & ec);

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.close(ec);
if (ec)
{
  // An error occurred.
}
Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/connect.html000066400000000000000000000063741340672067200250170ustar00rootroot00000000000000 basic_datagram_socket::connect
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);
  » more...

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/connect/000077500000000000000000000000001340672067200241175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/connect/overload1.html000066400000000000000000000112171340672067200267030ustar00rootroot00000000000000 basic_datagram_socket::connect (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.connect(endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/connect/overload2.html000066400000000000000000000105451340672067200267070ustar00rootroot00000000000000 basic_datagram_socket::connect (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
asio::error_code ec;
socket.connect(endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/debug.html000066400000000000000000000077061340672067200244540ustar00rootroot00000000000000 basic_datagram_socket::debug
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/do_not_route.html000066400000000000000000000101111340672067200260460ustar00rootroot00000000000000 basic_datagram_socket::do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/enable_connection_aborted.html000066400000000000000000000107121340672067200305220ustar00rootroot00000000000000 basic_datagram_socket::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/endpoint_type.html000066400000000000000000000062671340672067200262500ustar00rootroot00000000000000 basic_datagram_socket::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/executor_type.html000066400000000000000000000204411340672067200262540ustar00rootroot00000000000000 basic_datagram_socket::executor_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_executor.html000066400000000000000000000052701340672067200260550ustar00rootroot00000000000000 basic_datagram_socket::get_executor
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_io_context.html000066400000000000000000000073571340672067200264020ustar00rootroot00000000000000 basic_datagram_socket::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_io_service.html000066400000000000000000000073471340672067200263550ustar00rootroot00000000000000 basic_datagram_socket::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_option.html000066400000000000000000000071121340672067200255240ustar00rootroot00000000000000 basic_datagram_socket::get_option
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;
  » more...

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_option/000077500000000000000000000000001340672067200246355ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_option/overload1.html000066400000000000000000000111021340672067200274120ustar00rootroot00000000000000 basic_datagram_socket::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
socket.get_option(option);
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/get_option/overload2.html000066400000000000000000000104271340672067200274240ustar00rootroot00000000000000 basic_datagram_socket::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
asio::error_code ec;
socket.get_option(option, ec);
if (ec)
{
  // An error occurred.
}
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/io_control.html000066400000000000000000000071211340672067200255240ustar00rootroot00000000000000 basic_datagram_socket::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/io_control/000077500000000000000000000000001340672067200246355ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/io_control/overload1.html000066400000000000000000000111031340672067200274130ustar00rootroot00000000000000 basic_datagram_socket::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
socket.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/io_control/overload2.html000066400000000000000000000104141340672067200274200ustar00rootroot00000000000000 basic_datagram_socket::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
asio::error_code ec;
socket.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/is_open.html000066400000000000000000000052401340672067200250110ustar00rootroot00000000000000 basic_datagram_socket::is_open
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/keep_alive.html000066400000000000000000000077111340672067200254660ustar00rootroot00000000000000 basic_datagram_socket::keep_alive
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/linger.html000066400000000000000000000100361340672067200246340ustar00rootroot00000000000000 basic_datagram_socket::linger
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/local_endpoint.html000066400000000000000000000064301340672067200263510ustar00rootroot00000000000000 basic_datagram_socket::local_endpoint
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;
  » more...

endpoint_type local_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/local_endpoint/000077500000000000000000000000001340672067200254605ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/local_endpoint/overload1.html000066400000000000000000000104021340672067200302370ustar00rootroot00000000000000 basic_datagram_socket::local_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;

This function is used to obtain the locally bound endpoint of the socket.

Return Value

An object that represents the local endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.local_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/local_endpoint/overload2.html000066400000000000000000000106551340672067200302520ustar00rootroot00000000000000 basic_datagram_socket::local_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the locally bound endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/lowest_layer.html000066400000000000000000000066361340672067200261000ustar00rootroot00000000000000 basic_datagram_socket::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/lowest_layer/000077500000000000000000000000001340672067200251775ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/lowest_layer/overload1.html000066400000000000000000000070151340672067200277640ustar00rootroot00000000000000 basic_datagram_socket::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/lowest_layer/overload2.html000066400000000000000000000070771340672067200277750ustar00rootroot00000000000000 basic_datagram_socket::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/lowest_layer_type.html000066400000000000000000000742311340672067200271350ustar00rootroot00000000000000 basic_datagram_socket::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

A basic_socket is always the lowest layer.

typedef basic_socket< Protocol > lowest_layer_type;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_socket

Construct a basic_socket without opening it.

Construct and open a basic_socket.

Construct a basic_socket, opening it and binding it to the given local endpoint.

Construct a basic_socket on an existing native socket.

Move-construct a basic_socket from another.

Move-construct a basic_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_socket from another.

Move-assign a basic_socket from a socket of another protocol type.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~basic_socket

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/max_connections.html000066400000000000000000000055361340672067200265540ustar00rootroot00000000000000 basic_datagram_socket::max_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/max_listen_connections.html000066400000000000000000000055131340672067200301250ustar00rootroot00000000000000 basic_datagram_socket::max_listen_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/message_do_not_route.html000066400000000000000000000055241340672067200275660ustar00rootroot00000000000000 basic_datagram_socket::message_do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/message_end_of_record.html000066400000000000000000000054561340672067200276620ustar00rootroot00000000000000 basic_datagram_socket::message_end_of_record
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/message_flags.html000066400000000000000000000065051340672067200261620ustar00rootroot00000000000000 basic_datagram_socket::message_flags
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/message_out_of_band.html000066400000000000000000000053471340672067200273500ustar00rootroot00000000000000 basic_datagram_socket::message_out_of_band
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/message_peek.html000066400000000000000000000053701340672067200260110ustar00rootroot00000000000000 basic_datagram_socket::message_peek
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_handle.html000066400000000000000000000056511340672067200261640ustar00rootroot00000000000000 basic_datagram_socket::native_handle
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the native socket representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_handle_type.html000066400000000000000000000063561340672067200272300ustar00rootroot00000000000000 basic_datagram_socket::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a socket.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_non_blocking.html000066400000000000000000000076451340672067200274000ustar00rootroot00000000000000 basic_datagram_socket::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_non_blocking/000077500000000000000000000000001340672067200264765ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_non_blocking/overload1.html000066400000000000000000000154301340672067200312630ustar00rootroot00000000000000 basic_datagram_socket::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.

Return Value

true if the underlying socket is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_non_blocking/overload2.html000066400000000000000000000164071340672067200312710ustar00rootroot00000000000000 basic_datagram_socket::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/native_non_blocking/overload3.html000066400000000000000000000155741340672067200312760ustar00rootroot00000000000000 basic_datagram_socket::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/non_blocking.html000066400000000000000000000073771340672067200260340ustar00rootroot00000000000000 basic_datagram_socket::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the socket.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/non_blocking/000077500000000000000000000000001340672067200251305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/non_blocking/overload1.html000066400000000000000000000077351340672067200277260ustar00rootroot00000000000000 basic_datagram_socket::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the socket.

bool non_blocking() const;
Return Value

true if the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/non_blocking/overload2.html000066400000000000000000000112021340672067200277070ustar00rootroot00000000000000 basic_datagram_socket::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/non_blocking/overload3.html000066400000000000000000000103631340672067200277170ustar00rootroot00000000000000 basic_datagram_socket::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/open.html000066400000000000000000000063441340672067200243240ustar00rootroot00000000000000 basic_datagram_socket::open
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());
  » more...

void open(
    const protocol_type & protocol,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/open/000077500000000000000000000000001340672067200234275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/open/overload1.html000066400000000000000000000102431340672067200262110ustar00rootroot00000000000000 basic_datagram_socket::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/open/overload2.html000066400000000000000000000076231340672067200262220ustar00rootroot00000000000000 basic_datagram_socket::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol,
    asio::error_code & ec);

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::error_code ec;
socket.open(asio::ip::tcp::v4(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/operator_eq_.html000066400000000000000000000076641340672067200260500ustar00rootroot00000000000000 basic_datagram_socket::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_datagram_socket from another.

basic_datagram_socket & operator=(
    basic_datagram_socket && other);
  » more...

Move-assign a basic_datagram_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_datagram_socket >::type & operator=(
    basic_datagram_socket< Protocol1 > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/operator_eq_/000077500000000000000000000000001340672067200251455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/operator_eq_/overload1.html000066400000000000000000000101661340672067200277330ustar00rootroot00000000000000 basic_datagram_socket::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_datagram_socket from another.

basic_datagram_socket & operator=(
    basic_datagram_socket && other);

This assignment operator moves a datagram socket from one object to another.

Parameters

other

The other basic_datagram_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_datagram_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/operator_eq_/overload2.html000066400000000000000000000106001340672067200277250ustar00rootroot00000000000000 basic_datagram_socket::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_datagram_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_datagram_socket >::type & operator=(
    basic_datagram_socket< Protocol1 > && other);

This assignment operator moves a datagram socket from one object to another.

Parameters

other

The other basic_datagram_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_datagram_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/out_of_band_inline.html000066400000000000000000000103071340672067200271720ustar00rootroot00000000000000 basic_datagram_socket::out_of_band_inline
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/protocol_type.html000066400000000000000000000061711340672067200262630ustar00rootroot00000000000000 basic_datagram_socket::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive.html000066400000000000000000000101501340672067200247730ustar00rootroot00000000000000 basic_datagram_socket::receive
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive/000077500000000000000000000000001340672067200241105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive/overload1.html000066400000000000000000000133411340672067200266740ustar00rootroot00000000000000 basic_datagram_socket::receive (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers);

This function is used to receive data on the datagram socket. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The receive operation can only be used with a connected socket. Use the receive_from function to receive data on an unconnected datagram socket.

Example

To receive into a single data buffer use the buffer function as follows:

socket.receive(asio::buffer(data, size));

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive/overload2.html000066400000000000000000000120451340672067200266750ustar00rootroot00000000000000 basic_datagram_socket::receive (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to receive data on the datagram socket. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

flags

Flags specifying how the receive call is to be made.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The receive operation can only be used with a connected socket. Use the receive_from function to receive data on an unconnected datagram socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive/overload3.html000066400000000000000000000113461340672067200267010ustar00rootroot00000000000000 basic_datagram_socket::receive (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to receive data on the datagram socket. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

flags

Flags specifying how the receive call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes received.

Remarks

The receive operation can only be used with a connected socket. Use the receive_from function to receive data on an unconnected datagram socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_buffer_size.html000066400000000000000000000102711340672067200273620ustar00rootroot00000000000000 basic_datagram_socket::receive_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_from.html000066400000000000000000000106031340672067200260210ustar00rootroot00000000000000 basic_datagram_socket::receive_from
asio C++ library

PrevUpHomeNext

Receive a datagram with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_from/000077500000000000000000000000001340672067200251335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_from/overload1.html000066400000000000000000000132321340672067200277160ustar00rootroot00000000000000 basic_datagram_socket::receive_from (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive a datagram with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint);

This function is used to receive a datagram. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the datagram.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.

Example

To receive into a single data buffer use the buffer function as follows:

asio::ip::udp::endpoint sender_endpoint;
socket.receive_from(
    asio::buffer(data, size), sender_endpoint);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_from/overload2.html000066400000000000000000000115741340672067200277260ustar00rootroot00000000000000 basic_datagram_socket::receive_from (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive a datagram with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags);

This function is used to receive a datagram. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the datagram.

flags

Flags specifying how the receive call is to be made.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_from/overload3.html000066400000000000000000000110611340672067200277160ustar00rootroot00000000000000 basic_datagram_socket::receive_from (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive a datagram with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to receive a datagram. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the datagram.

flags

Flags specifying how the receive call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes received.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/receive_low_watermark.html000066400000000000000000000103231340672067200277330ustar00rootroot00000000000000 basic_datagram_socket::receive_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/release.html000066400000000000000000000063231340672067200250000ustar00rootroot00000000000000 basic_datagram_socket::release
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release();
  » more...

native_handle_type release(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/release/000077500000000000000000000000001340672067200241065ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/release/overload1.html000066400000000000000000000100641340672067200266710ustar00rootroot00000000000000 basic_datagram_socket::release (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/release/overload2.html000066400000000000000000000101741340672067200266740ustar00rootroot00000000000000 basic_datagram_socket::release (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/remote_endpoint.html000066400000000000000000000065421340672067200265560ustar00rootroot00000000000000 basic_datagram_socket::remote_endpoint
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;
  » more...

endpoint_type remote_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/remote_endpoint/000077500000000000000000000000001340672067200256615ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/remote_endpoint/overload1.html000066400000000000000000000104251340672067200304450ustar00rootroot00000000000000 basic_datagram_socket::remote_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;

This function is used to obtain the remote endpoint of the socket.

Return Value

An object that represents the remote endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/remote_endpoint/overload2.html000066400000000000000000000107001340672067200304420ustar00rootroot00000000000000 basic_datagram_socket::remote_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the remote endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/reuse_address.html000066400000000000000000000102141340672067200262020ustar00rootroot00000000000000 basic_datagram_socket::reuse_address
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send.html000066400000000000000000000100131340672067200243000ustar00rootroot00000000000000 basic_datagram_socket::send
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send/000077500000000000000000000000001340672067200234175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/send/overload1.html000066400000000000000000000131301340672067200261770ustar00rootroot00000000000000 basic_datagram_socket::send (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers);

This function is used to send data on the datagram socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One ore more data buffers to be sent on the socket.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The send operation can only be used with a connected socket. Use the send_to function to send data on an unconnected datagram socket.

Example

To send a single data buffer use the buffer function as follows:

socket.send(asio::buffer(data, size));

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send/overload2.html000066400000000000000000000116751340672067200262140ustar00rootroot00000000000000 basic_datagram_socket::send (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to send data on the datagram socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One ore more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The send operation can only be used with a connected socket. Use the send_to function to send data on an unconnected datagram socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send/overload3.html000066400000000000000000000111751340672067200262100ustar00rootroot00000000000000 basic_datagram_socket::send (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to send data on the datagram socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes sent.

Remarks

The send operation can only be used with a connected socket. Use the send_to function to send data on an unconnected datagram socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_buffer_size.html000066400000000000000000000102171340672067200266710ustar00rootroot00000000000000 basic_datagram_socket::send_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_low_watermark.html000066400000000000000000000101741340672067200272460ustar00rootroot00000000000000 basic_datagram_socket::send_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_datagram_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_to.html000066400000000000000000000103601340672067200250070ustar00rootroot00000000000000 basic_datagram_socket::send_to
asio C++ library

PrevUpHomeNext

Send a datagram to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_to/000077500000000000000000000000001340672067200241215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_to/overload1.html000066400000000000000000000130241340672067200267030ustar00rootroot00000000000000 basic_datagram_socket::send_to (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send a datagram to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination);

This function is used to send a datagram to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint.

destination

The remote endpoint to which the data will be sent.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Example

To send a single data buffer use the buffer function as follows:

asio::ip::udp::endpoint destination(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.send_to(asio::buffer(data, size), destination);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_to/overload2.html000066400000000000000000000113731340672067200267110ustar00rootroot00000000000000 basic_datagram_socket::send_to (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send a datagram to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags);

This function is used to send a datagram to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint.

destination

The remote endpoint to which the data will be sent.

flags

Flags specifying how the send call is to be made.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/send_to/overload3.html000066400000000000000000000106301340672067200267050ustar00rootroot00000000000000 basic_datagram_socket::send_to (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send a datagram to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to send a datagram to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint.

destination

The remote endpoint to which the data will be sent.

flags

Flags specifying how the send call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes sent.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/set_option.html000066400000000000000000000071351340672067200255450ustar00rootroot00000000000000 basic_datagram_socket::set_option
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);
  » more...

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/set_option/000077500000000000000000000000001340672067200246515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/set_option/overload1.html000066400000000000000000000107711340672067200274410ustar00rootroot00000000000000 basic_datagram_socket::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
socket.set_option(option);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/set_option/overload2.html000066400000000000000000000103061340672067200274340ustar00rootroot00000000000000 basic_datagram_socket::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

ec

Set to indicate what error occurred, if any.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
asio::error_code ec;
socket.set_option(option, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/shutdown.html000066400000000000000000000063651340672067200252410ustar00rootroot00000000000000 basic_datagram_socket::shutdown
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);
  » more...

void shutdown(
    shutdown_type what,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/shutdown/000077500000000000000000000000001340672067200243415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/shutdown/overload1.html000066400000000000000000000105201340672067200271210ustar00rootroot00000000000000 basic_datagram_socket::shutdown (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

Exceptions

asio::system_error

Thrown on failure.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
socket.shutdown(asio::ip::tcp::socket::shutdown_send);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/shutdown/overload2.html000066400000000000000000000100771340672067200271310ustar00rootroot00000000000000 basic_datagram_socket::shutdown (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what,
    asio::error_code & ec);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

ec

Set to indicate what error occurred, if any.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/shutdown_type.html000066400000000000000000000073741340672067200263030ustar00rootroot00000000000000 basic_datagram_socket::shutdown_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/wait.html000066400000000000000000000062651340672067200243310ustar00rootroot00000000000000 basic_datagram_socket::wait
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/wait/000077500000000000000000000000001340672067200234325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_datagram_socket/wait/overload1.html000066400000000000000000000074701340672067200262240ustar00rootroot00000000000000 basic_datagram_socket::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
socket.wait(asio::ip::tcp::socket::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/wait/overload2.html000066400000000000000000000100131340672067200262100ustar00rootroot00000000000000 basic_datagram_socket::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.wait(asio::ip::tcp::socket::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_datagram_socket/wait_type.html000066400000000000000000000075701340672067200253720ustar00rootroot00000000000000 basic_datagram_socket::wait_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer.html000066400000000000000000000362511340672067200232000ustar00rootroot00000000000000 basic_deadline_timer
asio C++ library

PrevUpHomeNext

Provides waitable timer functionality.

template<
    typename Time,
    typename TimeTraits = asio::time_traits<Time>>
class basic_deadline_timer
Types

Name

Description

duration_type

The duration type.

executor_type

The type of the executor associated with the object.

time_type

The time type.

traits_type

The time traits type.

Member Functions

Name

Description

async_wait

Start an asynchronous wait on the timer.

basic_deadline_timer

Constructor.

Constructor to set a particular expiry time as an absolute time.

Constructor to set a particular expiry time relative to now.

Move-construct a basic_deadline_timer from another.

cancel

Cancel any asynchronous operations that are waiting on the timer.

cancel_one

Cancels one asynchronous operation that is waiting on the timer.

expires_at

Get the timer's expiry time as an absolute time.

Set the timer's expiry time as an absolute time.

expires_from_now

Get the timer's expiry time relative to now.

Set the timer's expiry time relative to now.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_deadline_timer from another.

wait

Perform a blocking wait on the timer.

~basic_deadline_timer

Destroys the timer.

The basic_deadline_timer class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A deadline timer is always in one of two states: "expired" or "not expired". If the wait() or async_wait() function is called on an expired timer, the wait operation will complete immediately.

Most applications will use the deadline_timer typedef.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Examples

Performing a blocking wait:

// Construct a timer without setting an expiry time.
asio::deadline_timer timer(io_context);

// Set an expiry time relative to now.
timer.expires_from_now(boost::posix_time::seconds(5));

// Wait for the timer to expire.
timer.wait();

Performing an asynchronous wait:

void handler(const asio::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
asio::deadline_timer timer(io_context,
    boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));

// Start an asynchronous wait.
timer.async_wait(handler);
Changing an active deadline_timer's expiry time

Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:

void on_some_event()
{
  if (my_timer.expires_from_now(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const asio::error_code& e)
{
  if (e != asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}
  • The asio::basic_deadline_timer::expires_from_now() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.
  • If a wait handler is cancelled, the error_code passed to it contains the value asio::error::operation_aborted.
Requirements

Header: asio/basic_deadline_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/000077500000000000000000000000001340672067200223035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/_basic_deadline_timer.html000066400000000000000000000055001340672067200274360ustar00rootroot00000000000000 basic_deadline_timer::~basic_deadline_timer
asio C++ library

PrevUpHomeNext

Destroys the timer.

~basic_deadline_timer();

This function destroys the timer, cancelling any outstanding asynchronous wait operations associated with the timer as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/async_wait.html000066400000000000000000000112741340672067200253370ustar00rootroot00000000000000 basic_deadline_timer::async_wait
asio C++ library

PrevUpHomeNext

Start an asynchronous wait on the timer.

template<
    typename WaitHandler>
DEDUCED async_wait(
    WaitHandler && handler);

This function may be used to initiate an asynchronous wait against the timer. It always returns immediately.

For each call to async_wait(), the supplied handler will be called exactly once. The handler will be called when:

  • The timer has expired.
  • The timer was cancelled, in which case the handler is passed the error code asio::error::operation_aborted.
Parameters

handler

The handler to be called when the timer expires. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/basic_deadline_timer.html000066400000000000000000000113011340672067200272730ustar00rootroot00000000000000 basic_deadline_timer::basic_deadline_timer
asio C++ library

PrevUpHomeNext

Constructor.

explicit basic_deadline_timer(
    asio::io_context & io_context);
  » more...

Constructor to set a particular expiry time as an absolute time.

basic_deadline_timer(
    asio::io_context & io_context,
    const time_type & expiry_time);
  » more...

Constructor to set a particular expiry time relative to now.

basic_deadline_timer(
    asio::io_context & io_context,
    const duration_type & expiry_time);
  » more...

Move-construct a basic_deadline_timer from another.

basic_deadline_timer(
    basic_deadline_timer && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/basic_deadline_timer/000077500000000000000000000000001340672067200264115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/basic_deadline_timer/overload1.html000066400000000000000000000074311340672067200312000ustar00rootroot00000000000000 basic_deadline_timer::basic_deadline_timer (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Constructor.

basic_deadline_timer(
    asio::io_context & io_context);

This constructor creates a timer without setting an expiry time. The expires_at() or expires_from_now() functions must be called to set an expiry time before the timer can be waited on.

Parameters

io_context

The io_context object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/basic_deadline_timer/overload2.html000066400000000000000000000074741340672067200312100ustar00rootroot00000000000000 basic_deadline_timer::basic_deadline_timer (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Constructor to set a particular expiry time as an absolute time.

basic_deadline_timer(
    asio::io_context & io_context,
    const time_type & expiry_time);

This constructor creates a timer and sets the expiry time.

Parameters

io_context

The io_context object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer.

expiry_time

The expiry time to be used for the timer, expressed as an absolute time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/basic_deadline_timer/overload3.html000066400000000000000000000074341340672067200312050ustar00rootroot00000000000000 basic_deadline_timer::basic_deadline_timer (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Constructor to set a particular expiry time relative to now.

basic_deadline_timer(
    asio::io_context & io_context,
    const duration_type & expiry_time);

This constructor creates a timer and sets the expiry time.

Parameters

io_context

The io_context object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer.

expiry_time

The expiry time to be used for the timer, relative to now.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/basic_deadline_timer/overload4.html000066400000000000000000000102631340672067200312000ustar00rootroot00000000000000 basic_deadline_timer::basic_deadline_timer (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_deadline_timer from another.

basic_deadline_timer(
    basic_deadline_timer && other);

This constructor moves a timer from one object to another.

Parameters

other

The other basic_deadline_timer object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_deadline_timer(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel.html000066400000000000000000000063361340672067200244260ustar00rootroot00000000000000 basic_deadline_timer::cancel
asio C++ library

PrevUpHomeNext

Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel();
  » more...

std::size_t cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel/000077500000000000000000000000001340672067200235305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel/overload1.html000066400000000000000000000114211340672067200263110ustar00rootroot00000000000000 basic_deadline_timer::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel();

This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when cancel() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel/overload2.html000066400000000000000000000115111340672067200263120ustar00rootroot00000000000000 basic_deadline_timer::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel(
    asio::error_code & ec);

This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled.

Remarks

If the timer has already expired when cancel() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel_one.html000066400000000000000000000063651340672067200252710ustar00rootroot00000000000000 basic_deadline_timer::cancel_one
asio C++ library

PrevUpHomeNext

Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one();
  » more...

std::size_t cancel_one(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel_one/000077500000000000000000000000001340672067200243715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel_one/overload1.html000066400000000000000000000116701340672067200271600ustar00rootroot00000000000000 basic_deadline_timer::cancel_one (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one();

This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Return Value

The number of asynchronous operations that were cancelled. That is, either 0 or 1.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when cancel_one() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/cancel_one/overload2.html000066400000000000000000000117541340672067200271640ustar00rootroot00000000000000 basic_deadline_timer::cancel_one (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one(
    asio::error_code & ec);

This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled. That is, either 0 or 1.

Remarks

If the timer has already expired when cancel_one() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/duration_type.html000066400000000000000000000062451340672067200260660ustar00rootroot00000000000000 basic_deadline_timer::duration_type
asio C++ library

PrevUpHomeNext

The duration type.

typedef traits_type::duration_type duration_type;
Requirements

Header: asio/basic_deadline_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/executor_type.html000066400000000000000000000202451340672067200260730ustar00rootroot00000000000000 basic_deadline_timer::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_deadline_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_at.html000066400000000000000000000073041340672067200253400ustar00rootroot00000000000000 basic_deadline_timer::expires_at
asio C++ library

PrevUpHomeNext

Get the timer's expiry time as an absolute time.

time_type expires_at() const;
  » more...

Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_type & expiry_time);
  » more...

std::size_t expires_at(
    const time_type & expiry_time,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_at/000077500000000000000000000000001340672067200244465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_at/overload1.html000066400000000000000000000053761340672067200272430ustar00rootroot00000000000000 basic_deadline_timer::expires_at (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Get the timer's expiry time as an absolute time.

time_type expires_at() const;

This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_at/overload2.html000066400000000000000000000125041340672067200272330ustar00rootroot00000000000000 basic_deadline_timer::expires_at (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_type & expiry_time);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when expires_at() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_at/overload3.html000066400000000000000000000117601340672067200272370ustar00rootroot00000000000000 basic_deadline_timer::expires_at (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_type & expiry_time,
    asio::error_code & ec);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled.

Remarks

If the timer has already expired when expires_at() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_from_now.html000066400000000000000000000076031340672067200265640ustar00rootroot00000000000000 basic_deadline_timer::expires_from_now
asio C++ library

PrevUpHomeNext

Get the timer's expiry time relative to now.

duration_type expires_from_now() const;
  » more...

Set the timer's expiry time relative to now.

std::size_t expires_from_now(
    const duration_type & expiry_time);
  » more...

std::size_t expires_from_now(
    const duration_type & expiry_time,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_from_now/000077500000000000000000000000001340672067200256705ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_from_now/overload1.html000066400000000000000000000055221340672067200304560ustar00rootroot00000000000000 basic_deadline_timer::expires_from_now (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Get the timer's expiry time relative to now.

duration_type expires_from_now() const;

This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_from_now/overload2.html000066400000000000000000000127241340672067200304610ustar00rootroot00000000000000 basic_deadline_timer::expires_from_now (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the timer's expiry time relative to now.

std::size_t expires_from_now(
    const duration_type & expiry_time);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when expires_from_now() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/expires_from_now/overload3.html000066400000000000000000000121301340672067200304510ustar00rootroot00000000000000 basic_deadline_timer::expires_from_now (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the timer's expiry time relative to now.

std::size_t expires_from_now(
    const duration_type & expiry_time,
    asio::error_code & ec);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled.

Remarks

If the timer has already expired when expires_from_now() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/get_executor.html000066400000000000000000000052131340672067200256670ustar00rootroot00000000000000 basic_deadline_timer::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/get_io_context.html000066400000000000000000000072021340672067200262040ustar00rootroot00000000000000 basic_deadline_timer::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/get_io_service.html000066400000000000000000000071771340672067200261730ustar00rootroot00000000000000 basic_deadline_timer::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/operator_eq_.html000066400000000000000000000101011340672067200256410ustar00rootroot00000000000000 basic_deadline_timer::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_deadline_timer from another.

basic_deadline_timer & operator=(
    basic_deadline_timer && other);

This assignment operator moves a timer from one object to another. Cancels any outstanding asynchronous operations associated with the target object.

Parameters

other

The other basic_deadline_timer object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_deadline_timer(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/time_type.html000066400000000000000000000060751340672067200252000ustar00rootroot00000000000000 basic_deadline_timer::time_type
asio C++ library

PrevUpHomeNext

The time type.

typedef traits_type::time_type time_type;
Requirements

Header: asio/basic_deadline_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/traits_type.html000066400000000000000000000060511340672067200255420ustar00rootroot00000000000000 basic_deadline_timer::traits_type
asio C++ library

PrevUpHomeNext

The time traits type.

typedef TimeTraits traits_type;
Requirements

Header: asio/basic_deadline_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/wait.html000066400000000000000000000060671340672067200241460ustar00rootroot00000000000000 basic_deadline_timer::wait
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the timer.

void wait();
  » more...

void wait(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/wait/000077500000000000000000000000001340672067200232475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_deadline_timer/wait/overload1.html000066400000000000000000000062041340672067200260330ustar00rootroot00000000000000 basic_deadline_timer::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the timer.

void wait();

This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_deadline_timer/wait/overload2.html000066400000000000000000000063601340672067200260370ustar00rootroot00000000000000 basic_deadline_timer::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the timer.

void wait(
    asio::error_code & ec);

This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object.html000066400000000000000000000232451340672067200221670ustar00rootroot00000000000000 basic_io_object
asio C++ library

PrevUpHomeNext

Base class for all I/O objects.

template<
    typename IoObjectService>
class basic_io_object
Types

Name

Description

executor_type

The type of the executor associated with the object.

implementation_type

The underlying implementation type of I/O object.

service_type

The type of the service that will be used to provide I/O operations.

Member Functions

Name

Description

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

Protected Member Functions

Name

Description

basic_io_object

Construct a basic_io_object.

Move-construct a basic_io_object.

Perform a converting move-construction of a basic_io_object.

get_implementation

Get the underlying implementation of the I/O object.

get_service

Get the service associated with the I/O object.

operator=

Move-assign a basic_io_object.

~basic_io_object

Protected destructor to prevent deletion through this type.

Remarks

All I/O objects are non-copyable. However, when using C++0x, certain I/O objects do support move construction and move assignment.

Requirements

Header: asio/basic_io_object.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/000077500000000000000000000000001340672067200212735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_io_object/_basic_io_object.html000066400000000000000000000052451340672067200254240ustar00rootroot00000000000000 basic_io_object::~basic_io_object
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~basic_io_object();

Performs:

get_service().destroy(get_implementation());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/basic_io_object.html000066400000000000000000000105231340672067200252600ustar00rootroot00000000000000 basic_io_object::basic_io_object
asio C++ library

PrevUpHomeNext

Construct a basic_io_object.

explicit basic_io_object(
    asio::io_context & io_context);
  » more...

Move-construct a basic_io_object.

basic_io_object(
    basic_io_object && other);
  » more...

Perform a converting move-construction of a basic_io_object.

template<
    typename IoObjectService1>
basic_io_object(
    IoObjectService1 & other_service,
    typename IoObjectService1::implementation_type & other_implementation);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/basic_io_object/000077500000000000000000000000001340672067200243715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_io_object/basic_io_object/overload1.html000066400000000000000000000055371340672067200271650ustar00rootroot00000000000000 basic_io_object::basic_io_object (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_io_object.

basic_io_object(
    asio::io_context & io_context);

Performs:

get_service().construct(get_implementation());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/basic_io_object/overload2.html000066400000000000000000000064201340672067200271560ustar00rootroot00000000000000 basic_io_object::basic_io_object (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_io_object.

basic_io_object(
    basic_io_object && other);

Performs:

get_service().move_construct(
    get_implementation(), other.get_implementation());
Remarks

Available only for services that support movability,


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/basic_io_object/overload3.html000066400000000000000000000057331340672067200271650ustar00rootroot00000000000000 basic_io_object::basic_io_object (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Perform a converting move-construction of a basic_io_object.

template<
    typename IoObjectService1>
basic_io_object(
    IoObjectService1 & other_service,
    typename IoObjectService1::implementation_type & other_implementation);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/executor_type.html000066400000000000000000000202031340672067200250550ustar00rootroot00000000000000 basic_io_object::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef asio::io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_io_object.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_executor.html000066400000000000000000000050471340672067200246640ustar00rootroot00000000000000 basic_io_object::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_implementation.html000066400000000000000000000064571340672067200260610ustar00rootroot00000000000000 basic_io_object::get_implementation
asio C++ library

PrevUpHomeNext

Get the underlying implementation of the I/O object.

implementation_type & get_implementation();
  » more...

const implementation_type & get_implementation() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_implementation/000077500000000000000000000000001340672067200251575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_io_object/get_implementation/overload1.html000066400000000000000000000052501340672067200277430ustar00rootroot00000000000000 basic_io_object::get_implementation (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying implementation of the I/O object.

implementation_type & get_implementation();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_implementation/overload2.html000066400000000000000000000052441340672067200277470ustar00rootroot00000000000000 basic_io_object::get_implementation (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying implementation of the I/O object.

const implementation_type & get_implementation() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_io_context.html000066400000000000000000000072051340672067200251770ustar00rootroot00000000000000 basic_io_object::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_io_service.html000066400000000000000000000070701340672067200251530ustar00rootroot00000000000000 basic_io_object::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_service.html000066400000000000000000000062301340672067200244610ustar00rootroot00000000000000 basic_io_object::get_service
asio C++ library

PrevUpHomeNext

Get the service associated with the I/O object.

service_type & get_service();
  » more...

const service_type & get_service() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_service/000077500000000000000000000000001340672067200235725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_io_object/get_service/overload1.html000066400000000000000000000050721340672067200263600ustar00rootroot00000000000000 basic_io_object::get_service (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the service associated with the I/O object.

service_type & get_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/get_service/overload2.html000066400000000000000000000051461340672067200263630ustar00rootroot00000000000000 basic_io_object::get_service (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the service associated with the I/O object.

const service_type & get_service() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/implementation_type.html000066400000000000000000000062771340672067200262630ustar00rootroot00000000000000 basic_io_object::implementation_type
asio C++ library

PrevUpHomeNext

The underlying implementation type of I/O object.

typedef service_type::implementation_type implementation_type;
Requirements

Header: asio/basic_io_object.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/operator_eq_.html000066400000000000000000000062721340672067200246470ustar00rootroot00000000000000 basic_io_object::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_io_object.

basic_io_object & operator=(
    basic_io_object && other);

Performs:

get_service().move_assign(get_implementation(),
    other.get_service(), other.get_implementation());
Remarks

Available only for services that support movability,


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_io_object/service_type.html000066400000000000000000000061261340672067200246670ustar00rootroot00000000000000 basic_io_object::service_type
asio C++ library

PrevUpHomeNext

The type of the service that will be used to provide I/O operations.

typedef IoObjectService service_type;
Requirements

Header: asio/basic_io_object.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket.html000066400000000000000000000756131340672067200224010ustar00rootroot00000000000000 basic_raw_socket
asio C++ library

PrevUpHomeNext

Provides raw-oriented socket functionality.

template<
    typename Protocol>
class basic_raw_socket :
  public basic_socket< Protocol >
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_raw_socket

Construct a basic_raw_socket without opening it.

Construct and open a basic_raw_socket.

Construct a basic_raw_socket, opening it and binding it to the given local endpoint.

Construct a basic_raw_socket on an existing native socket.

Move-construct a basic_raw_socket from another.

Move-construct a basic_raw_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_raw_socket from another.

Move-assign a basic_raw_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive raw data with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send raw data to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_raw_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_raw_socket class template provides asynchronous and blocking raw-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/000077500000000000000000000000001340672067200214775ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/_basic_raw_socket.html000066400000000000000000000053751340672067200260400ustar00rootroot00000000000000 basic_raw_socket::~basic_raw_socket
asio C++ library

PrevUpHomeNext

Destroys the socket.

~basic_raw_socket();

This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/assign.html000066400000000000000000000063531340672067200236600ustar00rootroot00000000000000 basic_raw_socket::assign
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/assign/000077500000000000000000000000001340672067200227635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/assign/overload1.html000066400000000000000000000052511340672067200255500ustar00rootroot00000000000000 basic_raw_socket::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/assign/overload2.html000066400000000000000000000053441340672067200255540ustar00rootroot00000000000000 basic_raw_socket::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_connect.html000066400000000000000000000125041340672067200252150ustar00rootroot00000000000000 basic_raw_socket::async_connect
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Start an asynchronous connect.

template<
    typename ConnectHandler>
DEDUCED async_connect(
    const endpoint_type & peer_endpoint,
    ConnectHandler && handler);

This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.

handler

The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void connect_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Connect succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_connect(endpoint, connect_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive.html000066400000000000000000000104021340672067200252010ustar00rootroot00000000000000 basic_raw_socket::async_receive
asio C++ library

PrevUpHomeNext

Start an asynchronous receive on a connected socket.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);
  » more...

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    ReadHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive/000077500000000000000000000000001340672067200243165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive/overload1.html000066400000000000000000000144271340672067200271100ustar00rootroot00000000000000 basic_raw_socket::async_receive (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive on a connected socket.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously receive data from the raw socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_receive operation can only be used with a connected socket. Use the async_receive_from function to receive data on an unconnected raw socket.

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive(asio::buffer(data, size), handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive/overload2.html000066400000000000000000000131151340672067200271020ustar00rootroot00000000000000 basic_raw_socket::async_receive (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive on a connected socket.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    ReadHandler && handler);

This function is used to asynchronously receive data from the raw socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the receive call is to be made.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_receive operation can only be used with a connected socket. Use the async_receive_from function to receive data on an unconnected raw socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive_from.html000066400000000000000000000107231340672067200262320ustar00rootroot00000000000000 basic_raw_socket::async_receive_from
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    ReadHandler && handler);
  » more...

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    ReadHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive_from/000077500000000000000000000000001340672067200253415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive_from/overload1.html000066400000000000000000000144101340672067200301230ustar00rootroot00000000000000 basic_raw_socket::async_receive_from (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    ReadHandler && handler);

This function is used to asynchronously receive raw data. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the data. Ownership of the sender_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive_from(
    asio::buffer(data, size), 0, sender_endpoint, handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_receive_from/overload2.html000066400000000000000000000127351340672067200301340ustar00rootroot00000000000000 basic_raw_socket::async_receive_from (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    ReadHandler && handler);

This function is used to asynchronously receive raw data. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the data. Ownership of the sender_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

flags

Flags specifying how the receive call is to be made.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send.html000066400000000000000000000104061340672067200245140ustar00rootroot00000000000000 basic_raw_socket::async_send
asio C++ library

PrevUpHomeNext

Start an asynchronous send on a connected socket.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);
  » more...

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send/000077500000000000000000000000001340672067200236255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send/overload1.html000066400000000000000000000142601340672067200264120ustar00rootroot00000000000000 basic_raw_socket::async_send (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send on a connected socket.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_send operation can only be used with a connected socket. Use the async_send_to function to send data on an unconnected raw socket.

Example

To send a single data buffer use the buffer function as follows:

socket.async_send(asio::buffer(data, size), handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send/overload2.html000066400000000000000000000127661340672067200264240ustar00rootroot00000000000000 basic_raw_socket::async_send (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send on a connected socket.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);

This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the send call is to be made.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The async_send operation can only be used with a connected socket. Use the async_send_to function to send data on an unconnected raw socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send_to.html000066400000000000000000000105421340672067200252170ustar00rootroot00000000000000 basic_raw_socket::async_send_to
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    WriteHandler && handler);
  » more...

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    WriteHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send_to/000077500000000000000000000000001340672067200243275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send_to/overload1.html000066400000000000000000000141431340672067200271140ustar00rootroot00000000000000 basic_raw_socket::async_send_to (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    WriteHandler && handler);

This function is used to asynchronously send raw data to the specified remote endpoint. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

destination

The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To send a single data buffer use the buffer function as follows:

asio::ip::udp::endpoint destination(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_send_to(
    asio::buffer(data, size), destination, handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_send_to/overload2.html000066400000000000000000000124271340672067200271200ustar00rootroot00000000000000 basic_raw_socket::async_send_to (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    WriteHandler && handler);

This function is used to asynchronously send raw data to the specified remote endpoint. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the send call is to be made.

destination

The remote endpoint to which the data will be sent. Copies will be made of the endpoint as required.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/async_wait.html000066400000000000000000000116551340672067200245360ustar00rootroot00000000000000 basic_raw_socket::async_wait
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
...
socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/at_mark.html000066400000000000000000000061271340672067200240110ustar00rootroot00000000000000 basic_raw_socket::at_mark
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;
  » more...

bool at_mark(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/at_mark/000077500000000000000000000000001340672067200231155ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/at_mark/overload1.html000066400000000000000000000072471340672067200257110ustar00rootroot00000000000000 basic_raw_socket::at_mark (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/at_mark/overload2.html000066400000000000000000000073271340672067200257110ustar00rootroot00000000000000 basic_raw_socket::at_mark (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark(
    asio::error_code & ec) const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/available.html000066400000000000000000000062511340672067200243110ustar00rootroot00000000000000 basic_raw_socket::available
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available() const;
  » more...

std::size_t available(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/available/000077500000000000000000000000001340672067200234175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/available/overload1.html000066400000000000000000000073171340672067200262110ustar00rootroot00000000000000 basic_raw_socket::available (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available() const;

This function is used to determine the number of bytes that may be read without blocking.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/available/overload2.html000066400000000000000000000074231340672067200262100ustar00rootroot00000000000000 basic_raw_socket::available (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available(
    asio::error_code & ec) const;

This function is used to determine the number of bytes that may be read without blocking.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket.html000066400000000000000000000146521340672067200256770ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket
asio C++ library

PrevUpHomeNext

Construct a basic_raw_socket without opening it.

explicit basic_raw_socket(
    asio::io_context & io_context);
  » more...

Construct and open a basic_raw_socket.

basic_raw_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);
  » more...

Construct a basic_raw_socket, opening it and binding it to the given local endpoint.

basic_raw_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);
  » more...

Construct a basic_raw_socket on an existing native socket.

basic_raw_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

Move-construct a basic_raw_socket from another.

basic_raw_socket(
    basic_raw_socket && other);
  » more...

Move-construct a basic_raw_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_raw_socket(
    basic_raw_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/000077500000000000000000000000001340672067200250015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/overload1.html000066400000000000000000000073751340672067200275770ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_raw_socket without opening it.

basic_raw_socket(
    asio::io_context & io_context);

This constructor creates a raw socket without opening it. The open() function must be called before data can be sent or received on the socket.

Parameters

io_context

The io_context object that the raw socket will use to dispatch handlers for any asynchronous operations performed on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/overload2.html000066400000000000000000000104331340672067200275650ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a basic_raw_socket.

basic_raw_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);

This constructor creates and opens a raw socket.

Parameters

io_context

The io_context object that the raw socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/overload3.html000066400000000000000000000110361340672067200275660ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_raw_socket, opening it and binding it to the given local endpoint.

basic_raw_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);

This constructor creates a raw socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.

Parameters

io_context

The io_context object that the raw socket will use to dispatch handlers for any asynchronous operations performed on the socket.

endpoint

An endpoint on the local machine to which the raw socket will be bound.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/overload4.html000066400000000000000000000110471340672067200275710ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_raw_socket on an existing native socket.

basic_raw_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);

This constructor creates a raw socket object to hold an existing native socket.

Parameters

io_context

The io_context object that the raw socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

native_socket

The new underlying socket implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/overload5.html000066400000000000000000000101011340672067200275600ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_raw_socket from another.

basic_raw_socket(
    basic_raw_socket && other);

This constructor moves a raw socket from one object to another.

Parameters

other

The other basic_raw_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_raw_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/basic_raw_socket/overload6.html000066400000000000000000000104371340672067200275750ustar00rootroot00000000000000 basic_raw_socket::basic_raw_socket (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_raw_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_raw_socket(
    basic_raw_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);

This constructor moves a raw socket from one object to another.

Parameters

other

The other basic_raw_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_raw_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/bind.html000066400000000000000000000062261340672067200233070ustar00rootroot00000000000000 basic_raw_socket::bind
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);
  » more...

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/bind/000077500000000000000000000000001340672067200224135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/bind/overload1.html000066400000000000000000000102501340672067200251730ustar00rootroot00000000000000 basic_raw_socket::bind (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/bind/overload2.html000066400000000000000000000076621340672067200252110ustar00rootroot00000000000000 basic_raw_socket::bind (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
asio::error_code ec;
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/broadcast.html000066400000000000000000000076671340672067200243470ustar00rootroot00000000000000 basic_raw_socket::broadcast
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/bytes_readable.html000066400000000000000000000073511340672067200253400ustar00rootroot00000000000000 basic_raw_socket::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/cancel.html000066400000000000000000000061101340672067200236100ustar00rootroot00000000000000 basic_raw_socket::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/cancel/000077500000000000000000000000001340672067200227245ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/cancel/overload1.html000066400000000000000000000125611340672067200255130ustar00rootroot00000000000000 basic_raw_socket::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/cancel/overload2.html000066400000000000000000000126251340672067200255150ustar00rootroot00000000000000 basic_raw_socket::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/close.html000066400000000000000000000060161340672067200234750ustar00rootroot00000000000000 basic_raw_socket::close
asio C++ library

PrevUpHomeNext

Close the socket.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/close/000077500000000000000000000000001340672067200226045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/close/overload1.html000066400000000000000000000076031340672067200253740ustar00rootroot00000000000000 basic_raw_socket::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close();

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.

Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/close/overload2.html000066400000000000000000000105571340672067200253770ustar00rootroot00000000000000 basic_raw_socket::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close(
    asio::error_code & ec);

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.close(ec);
if (ec)
{
  // An error occurred.
}
Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/connect.html000066400000000000000000000062611340672067200240230ustar00rootroot00000000000000 basic_raw_socket::connect
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);
  » more...

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/connect/000077500000000000000000000000001340672067200231305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/connect/overload1.html000066400000000000000000000110771340672067200257200ustar00rootroot00000000000000 basic_raw_socket::connect (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.connect(endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/connect/overload2.html000066400000000000000000000104441340672067200257160ustar00rootroot00000000000000 basic_raw_socket::connect (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
asio::error_code ec;
socket.connect(endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/debug.html000066400000000000000000000075541340672067200234660ustar00rootroot00000000000000 basic_raw_socket::debug
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/do_not_route.html000066400000000000000000000077571340672067200251050ustar00rootroot00000000000000 basic_raw_socket::do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/enable_connection_aborted.html000066400000000000000000000105601340672067200275340ustar00rootroot00000000000000 basic_raw_socket::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/endpoint_type.html000066400000000000000000000061541340672067200252540ustar00rootroot00000000000000 basic_raw_socket::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/executor_type.html000066400000000000000000000202701340672067200252650ustar00rootroot00000000000000 basic_raw_socket::executor_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/get_executor.html000066400000000000000000000052011340672067200250600ustar00rootroot00000000000000 basic_raw_socket::get_executor
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/get_io_context.html000066400000000000000000000072511340672067200254040ustar00rootroot00000000000000 basic_raw_socket::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/get_io_service.html000066400000000000000000000072411340672067200253570ustar00rootroot00000000000000 basic_raw_socket::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/get_option.html000066400000000000000000000067771340672067200245550ustar00rootroot00000000000000 basic_raw_socket::get_option
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;
  » more...

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/get_option/000077500000000000000000000000001340672067200236465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/get_option/overload1.html000066400000000000000000000107621340672067200264360ustar00rootroot00000000000000 basic_raw_socket::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
socket.get_option(option);
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/get_option/overload2.html000066400000000000000000000103261340672067200264330ustar00rootroot00000000000000 basic_raw_socket::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
asio::error_code ec;
socket.get_option(option, ec);
if (ec)
{
  // An error occurred.
}
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/io_control.html000066400000000000000000000070061340672067200245370ustar00rootroot00000000000000 basic_raw_socket::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/io_control/000077500000000000000000000000001340672067200236465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/io_control/overload1.html000066400000000000000000000107631340672067200264370ustar00rootroot00000000000000 basic_raw_socket::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
socket.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/io_control/overload2.html000066400000000000000000000103131340672067200264270ustar00rootroot00000000000000 basic_raw_socket::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
asio::error_code ec;
socket.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/is_open.html000066400000000000000000000051511340672067200240230ustar00rootroot00000000000000 basic_raw_socket::is_open
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/keep_alive.html000066400000000000000000000075571340672067200245070ustar00rootroot00000000000000 basic_raw_socket::keep_alive
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/linger.html000066400000000000000000000076721340672067200236610ustar00rootroot00000000000000 basic_raw_socket::linger
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/local_endpoint.html000066400000000000000000000063151340672067200253640ustar00rootroot00000000000000 basic_raw_socket::local_endpoint
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;
  » more...

endpoint_type local_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/local_endpoint/000077500000000000000000000000001340672067200244715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/local_endpoint/overload1.html000066400000000000000000000102621340672067200272540ustar00rootroot00000000000000 basic_raw_socket::local_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;

This function is used to obtain the locally bound endpoint of the socket.

Return Value

An object that represents the local endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.local_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/local_endpoint/overload2.html000066400000000000000000000105351340672067200272600ustar00rootroot00000000000000 basic_raw_socket::local_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the locally bound endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/lowest_layer.html000066400000000000000000000065231340672067200251040ustar00rootroot00000000000000 basic_raw_socket::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/lowest_layer/000077500000000000000000000000001340672067200242105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/lowest_layer/overload1.html000066400000000000000000000067331340672067200270030ustar00rootroot00000000000000 basic_raw_socket::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/lowest_layer/overload2.html000066400000000000000000000070151340672067200267760ustar00rootroot00000000000000 basic_raw_socket::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/lowest_layer_type.html000066400000000000000000000740031340672067200261430ustar00rootroot00000000000000 basic_raw_socket::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

A basic_socket is always the lowest layer.

typedef basic_socket< Protocol > lowest_layer_type;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_socket

Construct a basic_socket without opening it.

Construct and open a basic_socket.

Construct a basic_socket, opening it and binding it to the given local endpoint.

Construct a basic_socket on an existing native socket.

Move-construct a basic_socket from another.

Move-construct a basic_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_socket from another.

Move-assign a basic_socket from a socket of another protocol type.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~basic_socket

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/max_connections.html000066400000000000000000000054471340672067200255660ustar00rootroot00000000000000 basic_raw_socket::max_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/max_listen_connections.html000066400000000000000000000054241340672067200271370ustar00rootroot00000000000000 basic_raw_socket::max_listen_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/message_do_not_route.html000066400000000000000000000054351340672067200266000ustar00rootroot00000000000000 basic_raw_socket::message_do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/message_end_of_record.html000066400000000000000000000053671340672067200266740ustar00rootroot00000000000000 basic_raw_socket::message_end_of_record
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/message_flags.html000066400000000000000000000063721340672067200251750ustar00rootroot00000000000000 basic_raw_socket::message_flags
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/message_out_of_band.html000066400000000000000000000052601340672067200263530ustar00rootroot00000000000000 basic_raw_socket::message_out_of_band
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/message_peek.html000066400000000000000000000053011340672067200250140ustar00rootroot00000000000000 basic_raw_socket::message_peek
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/native_handle.html000066400000000000000000000055621340672067200251760ustar00rootroot00000000000000 basic_raw_socket::native_handle
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the native socket representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/native_handle_type.html000066400000000000000000000062431340672067200262340ustar00rootroot00000000000000 basic_raw_socket::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a socket.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/native_non_blocking.html000066400000000000000000000075201340672067200264010ustar00rootroot00000000000000 basic_raw_socket::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/native_non_blocking/000077500000000000000000000000001340672067200255075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/native_non_blocking/overload1.html000066400000000000000000000153101340672067200302710ustar00rootroot00000000000000 basic_raw_socket::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.

Return Value

true if the underlying socket is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/native_non_blocking/overload2.html000066400000000000000000000162671340672067200303060ustar00rootroot00000000000000 basic_raw_socket::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/native_non_blocking/overload3.html000066400000000000000000000154731340672067200303050ustar00rootroot00000000000000 basic_raw_socket::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/non_blocking.html000066400000000000000000000072521340672067200250350ustar00rootroot00000000000000 basic_raw_socket::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the socket.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/non_blocking/000077500000000000000000000000001340672067200241415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/non_blocking/overload1.html000066400000000000000000000076341340672067200267350ustar00rootroot00000000000000 basic_raw_socket::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the socket.

bool non_blocking() const;
Return Value

true if the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/non_blocking/overload2.html000066400000000000000000000110621340672067200267240ustar00rootroot00000000000000 basic_raw_socket::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/non_blocking/overload3.html000066400000000000000000000102621340672067200267260ustar00rootroot00000000000000 basic_raw_socket::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/open.html000066400000000000000000000062311340672067200233300ustar00rootroot00000000000000 basic_raw_socket::open
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());
  » more...

void open(
    const protocol_type & protocol,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/open/000077500000000000000000000000001340672067200224405ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/open/overload1.html000066400000000000000000000101231340672067200252170ustar00rootroot00000000000000 basic_raw_socket::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/open/overload2.html000066400000000000000000000075221340672067200252310ustar00rootroot00000000000000 basic_raw_socket::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol,
    asio::error_code & ec);

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::error_code ec;
socket.open(asio::ip::tcp::v4(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/operator_eq_.html000066400000000000000000000074671340672067200250620ustar00rootroot00000000000000 basic_raw_socket::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_raw_socket from another.

basic_raw_socket & operator=(
    basic_raw_socket && other);
  » more...

Move-assign a basic_raw_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_raw_socket >::type & operator=(
    basic_raw_socket< Protocol1 > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/operator_eq_/000077500000000000000000000000001340672067200241565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/operator_eq_/overload1.html000066400000000000000000000100031340672067200267320ustar00rootroot00000000000000 basic_raw_socket::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_raw_socket from another.

basic_raw_socket & operator=(
    basic_raw_socket && other);

This assignment operator moves a raw socket from one object to another.

Parameters

other

The other basic_raw_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_raw_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/operator_eq_/overload2.html000066400000000000000000000104151340672067200267420ustar00rootroot00000000000000 basic_raw_socket::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_raw_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_raw_socket >::type & operator=(
    basic_raw_socket< Protocol1 > && other);

This assignment operator moves a raw socket from one object to another.

Parameters

other

The other basic_raw_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_raw_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/out_of_band_inline.html000066400000000000000000000101551340672067200262040ustar00rootroot00000000000000 basic_raw_socket::out_of_band_inline
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/protocol_type.html000066400000000000000000000060561340672067200252760ustar00rootroot00000000000000 basic_raw_socket::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive.html000066400000000000000000000100231340672067200240030ustar00rootroot00000000000000 basic_raw_socket::receive
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive/000077500000000000000000000000001340672067200231215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/receive/overload1.html000066400000000000000000000131511340672067200257040ustar00rootroot00000000000000 basic_raw_socket::receive (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers);

This function is used to receive data on the raw socket. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The receive operation can only be used with a connected socket. Use the receive_from function to receive data on an unconnected raw socket.

Example

To receive into a single data buffer use the buffer function as follows:

socket.receive(asio::buffer(data, size));

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive/overload2.html000066400000000000000000000116741340672067200257150ustar00rootroot00000000000000 basic_raw_socket::receive (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to receive data on the raw socket. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

flags

Flags specifying how the receive call is to be made.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The receive operation can only be used with a connected socket. Use the receive_from function to receive data on an unconnected raw socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive/overload3.html000066400000000000000000000112141340672067200257040ustar00rootroot00000000000000 basic_raw_socket::receive (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to receive data on the raw socket. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

flags

Flags specifying how the receive call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes received.

Remarks

The receive operation can only be used with a connected socket. Use the receive_from function to receive data on an unconnected raw socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_buffer_size.html000066400000000000000000000101371340672067200263740ustar00rootroot00000000000000 basic_raw_socket::receive_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_from.html000066400000000000000000000104541340672067200250360ustar00rootroot00000000000000 basic_raw_socket::receive_from
asio C++ library

PrevUpHomeNext

Receive raw data with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_from/000077500000000000000000000000001340672067200241445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_from/overload1.html000066400000000000000000000130631340672067200267310ustar00rootroot00000000000000 basic_raw_socket::receive_from (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive raw data with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint);

This function is used to receive raw data. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the data.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.

Example

To receive into a single data buffer use the buffer function as follows:

asio::ip::udp::endpoint sender_endpoint;
socket.receive_from(
    asio::buffer(data, size), sender_endpoint);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_from/overload2.html000066400000000000000000000114441340672067200267330ustar00rootroot00000000000000 basic_raw_socket::receive_from (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive raw data with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags);

This function is used to receive raw data. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the data.

flags

Flags specifying how the receive call is to be made.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_from/overload3.html000066400000000000000000000107501340672067200267330ustar00rootroot00000000000000 basic_raw_socket::receive_from (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive raw data with the endpoint of the sender.

template<
    typename MutableBufferSequence>
std::size_t receive_from(
    const MutableBufferSequence & buffers,
    endpoint_type & sender_endpoint,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to receive raw data. The function call will block until data has been received successfully or an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

sender_endpoint

An endpoint object that receives the endpoint of the remote sender of the data.

flags

Flags specifying how the receive call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes received.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/receive_low_watermark.html000066400000000000000000000101711340672067200267450ustar00rootroot00000000000000 basic_raw_socket::receive_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/release.html000066400000000000000000000062101340672067200240040ustar00rootroot00000000000000 basic_raw_socket::release
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release();
  » more...

native_handle_type release(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/release/000077500000000000000000000000001340672067200231175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/release/overload1.html000066400000000000000000000077631340672067200257160ustar00rootroot00000000000000 basic_raw_socket::release (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/release/overload2.html000066400000000000000000000100731340672067200257030ustar00rootroot00000000000000 basic_raw_socket::release (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/remote_endpoint.html000066400000000000000000000064271340672067200255710ustar00rootroot00000000000000 basic_raw_socket::remote_endpoint
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;
  » more...

endpoint_type remote_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/remote_endpoint/000077500000000000000000000000001340672067200246725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/remote_endpoint/overload1.html000066400000000000000000000103051340672067200274530ustar00rootroot00000000000000 basic_raw_socket::remote_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;

This function is used to obtain the remote endpoint of the socket.

Return Value

An object that represents the remote endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/remote_endpoint/overload2.html000066400000000000000000000105601340672067200274570ustar00rootroot00000000000000 basic_raw_socket::remote_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the remote endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/reuse_address.html000066400000000000000000000100621340672067200252140ustar00rootroot00000000000000 basic_raw_socket::reuse_address
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send.html000066400000000000000000000076661340672067200233350ustar00rootroot00000000000000 basic_raw_socket::send
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send/000077500000000000000000000000001340672067200224305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/send/overload1.html000066400000000000000000000127241340672067200252200ustar00rootroot00000000000000 basic_raw_socket::send (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers);

This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One ore more data buffers to be sent on the socket.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The send operation can only be used with a connected socket. Use the send_to function to send data on an unconnected raw socket.

Example

To send a single data buffer use the buffer function as follows:

socket.send(asio::buffer(data, size));

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send/overload2.html000066400000000000000000000115101340672067200252110ustar00rootroot00000000000000 basic_raw_socket::send (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One ore more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The send operation can only be used with a connected socket. Use the send_to function to send data on an unconnected raw socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send/overload3.html000066400000000000000000000110271340672067200252150ustar00rootroot00000000000000 basic_raw_socket::send (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on a connected socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to send data on the raw socket. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes sent.

Remarks

The send operation can only be used with a connected socket. Use the send_to function to send data on an unconnected raw socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send_buffer_size.html000066400000000000000000000100651340672067200257030ustar00rootroot00000000000000 basic_raw_socket::send_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send_low_watermark.html000066400000000000000000000100421340672067200262510ustar00rootroot00000000000000 basic_raw_socket::send_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_raw_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send_to.html000066400000000000000000000102311340672067200240150ustar00rootroot00000000000000 basic_raw_socket::send_to
asio C++ library

PrevUpHomeNext

Send raw data to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send_to/000077500000000000000000000000001340672067200231325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/send_to/overload1.html000066400000000000000000000126611340672067200257220ustar00rootroot00000000000000 basic_raw_socket::send_to (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send raw data to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination);

This function is used to send raw data to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint.

destination

The remote endpoint to which the data will be sent.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Example

To send a single data buffer use the buffer function as follows:

asio::ip::udp::endpoint destination(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.send_to(asio::buffer(data, size), destination);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send_to/overload2.html000066400000000000000000000112471340672067200257220ustar00rootroot00000000000000 basic_raw_socket::send_to (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send raw data to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags);

This function is used to send raw data to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint.

destination

The remote endpoint to which the data will be sent.

flags

Flags specifying how the send call is to be made.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/send_to/overload3.html000066400000000000000000000105231340672067200257170ustar00rootroot00000000000000 basic_raw_socket::send_to (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send raw data to the specified endpoint.

template<
    typename ConstBufferSequence>
std::size_t send_to(
    const ConstBufferSequence & buffers,
    const endpoint_type & destination,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to send raw data to the specified remote endpoint. The function call will block until the data has been sent successfully or an error occurs.

Parameters

buffers

One or more data buffers to be sent to the remote endpoint.

destination

The remote endpoint to which the data will be sent.

flags

Flags specifying how the send call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes sent.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/set_option.html000066400000000000000000000070221340672067200245510ustar00rootroot00000000000000 basic_raw_socket::set_option
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);
  » more...

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/set_option/000077500000000000000000000000001340672067200236625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/set_option/overload1.html000066400000000000000000000106511340672067200264470ustar00rootroot00000000000000 basic_raw_socket::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
socket.set_option(option);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/set_option/overload2.html000066400000000000000000000102051340672067200264430ustar00rootroot00000000000000 basic_raw_socket::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

ec

Set to indicate what error occurred, if any.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
asio::error_code ec;
socket.set_option(option, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/shutdown.html000066400000000000000000000062521340672067200242450ustar00rootroot00000000000000 basic_raw_socket::shutdown
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);
  » more...

void shutdown(
    shutdown_type what,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/shutdown/000077500000000000000000000000001340672067200233525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/shutdown/overload1.html000066400000000000000000000104001340672067200261270ustar00rootroot00000000000000 basic_raw_socket::shutdown (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

Exceptions

asio::system_error

Thrown on failure.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
socket.shutdown(asio::ip::tcp::socket::shutdown_send);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/shutdown/overload2.html000066400000000000000000000077761340672067200261560ustar00rootroot00000000000000 basic_raw_socket::shutdown (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what,
    asio::error_code & ec);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

ec

Set to indicate what error occurred, if any.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/shutdown_type.html000066400000000000000000000072471340672067200253130ustar00rootroot00000000000000 basic_raw_socket::shutdown_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/wait.html000066400000000000000000000061401340672067200233320ustar00rootroot00000000000000 basic_raw_socket::wait
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/wait/000077500000000000000000000000001340672067200224435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_raw_socket/wait/overload1.html000066400000000000000000000073671340672067200252420ustar00rootroot00000000000000 basic_raw_socket::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
socket.wait(asio::ip::tcp::socket::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/wait/overload2.html000066400000000000000000000077121340672067200252350ustar00rootroot00000000000000 basic_raw_socket::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.wait(asio::ip::tcp::socket::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_raw_socket/wait_type.html000066400000000000000000000074171340672067200244030ustar00rootroot00000000000000 basic_raw_socket::wait_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket.html000066400000000000000000000752261340672067200237270ustar00rootroot00000000000000 basic_seq_packet_socket
asio C++ library

PrevUpHomeNext

Provides sequenced packet socket functionality.

template<
    typename Protocol>
class basic_seq_packet_socket :
  public basic_socket< Protocol >
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive.

async_send

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_seq_packet_socket

Construct a basic_seq_packet_socket without opening it.

Construct and open a basic_seq_packet_socket.

Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint.

Construct a basic_seq_packet_socket on an existing native socket.

Move-construct a basic_seq_packet_socket from another.

Move-construct a basic_seq_packet_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_seq_packet_socket from another.

Move-assign a basic_seq_packet_socket from a socket of another protocol type.

receive

Receive some data on the socket.

Receive some data on a connected socket.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_seq_packet_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_seq_packet_socket class template provides asynchronous and blocking sequenced packet socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/000077500000000000000000000000001340672067200230255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/_basic_seq_packet_socket.html000066400000000000000000000055101340672067200307030ustar00rootroot00000000000000 basic_seq_packet_socket::~basic_seq_packet_socket
asio C++ library

PrevUpHomeNext

Destroys the socket.

~basic_seq_packet_socket();

This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/assign.html000066400000000000000000000065511340672067200252060ustar00rootroot00000000000000 basic_seq_packet_socket::assign
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/assign/000077500000000000000000000000001340672067200243115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/assign/overload1.html000066400000000000000000000053321340672067200270760ustar00rootroot00000000000000 basic_seq_packet_socket::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/assign/overload2.html000066400000000000000000000054251340672067200271020ustar00rootroot00000000000000 basic_seq_packet_socket::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_connect.html000066400000000000000000000126731340672067200265520ustar00rootroot00000000000000 basic_seq_packet_socket::async_connect
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Start an asynchronous connect.

template<
    typename ConnectHandler>
DEDUCED async_connect(
    const endpoint_type & peer_endpoint,
    ConnectHandler && handler);

This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.

handler

The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void connect_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Connect succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_connect(endpoint, connect_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_receive.html000066400000000000000000000106701340672067200265360ustar00rootroot00000000000000 basic_seq_packet_socket::async_receive
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags & out_flags,
    ReadHandler && handler);
  » more...

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags in_flags,
    socket_base::message_flags & out_flags,
    ReadHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_receive/000077500000000000000000000000001340672067200256445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_receive/overload1.html000066400000000000000000000146351340672067200304370ustar00rootroot00000000000000 basic_seq_packet_socket::async_receive (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags & out_flags,
    ReadHandler && handler);

This function is used to asynchronously receive data from the sequenced packet socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

out_flags

Once the asynchronous operation completes, contains flags associated with the received data. For example, if the socket_base::message_end_of_record bit is set then the received data marks the end of a record. The caller must guarantee that the referenced variable remains valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive(asio::buffer(data, size), out_flags, handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_receive/overload2.html000066400000000000000000000151311340672067200304300ustar00rootroot00000000000000 basic_seq_packet_socket::async_receive (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags in_flags,
    socket_base::message_flags & out_flags,
    ReadHandler && handler);

This function is used to asynchronously receive data from the sequenced data socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

in_flags

Flags specifying how the receive call is to be made.

out_flags

Once the asynchronous operation completes, contains flags associated with the received data. For example, if the socket_base::message_end_of_record bit is set then the received data marks the end of a record. The caller must guarantee that the referenced variable remains valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive(
    asio::buffer(data, size),
    0, out_flags, handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_send.html000066400000000000000000000135301340672067200260430ustar00rootroot00000000000000 basic_seq_packet_socket::async_send
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);

This function is used to asynchronously send data on the sequenced packet socket. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the send call is to be made.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example

To send a single data buffer use the buffer function as follows:

socket.async_send(asio::buffer(data, size), 0, handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/async_wait.html000066400000000000000000000117471340672067200260660ustar00rootroot00000000000000 basic_seq_packet_socket::async_wait
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
...
socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/at_mark.html000066400000000000000000000063001340672067200253300ustar00rootroot00000000000000 basic_seq_packet_socket::at_mark
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;
  » more...

bool at_mark(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/at_mark/000077500000000000000000000000001340672067200244435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/at_mark/overload1.html000066400000000000000000000074021340672067200272300ustar00rootroot00000000000000 basic_seq_packet_socket::at_mark (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/at_mark/overload2.html000066400000000000000000000074621340672067200272370ustar00rootroot00000000000000 basic_seq_packet_socket::at_mark (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark(
    asio::error_code & ec) const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/available.html000066400000000000000000000064221340672067200256370ustar00rootroot00000000000000 basic_seq_packet_socket::available
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available() const;
  » more...

std::size_t available(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/available/000077500000000000000000000000001340672067200247455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/available/overload1.html000066400000000000000000000074521340672067200275370ustar00rootroot00000000000000 basic_seq_packet_socket::available (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available() const;

This function is used to determine the number of bytes that may be read without blocking.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/available/overload2.html000066400000000000000000000076121340672067200275360ustar00rootroot00000000000000 basic_seq_packet_socket::available (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available(
    asio::error_code & ec) const;

This function is used to determine the number of bytes that may be read without blocking.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket.html000066400000000000000000000157571340672067200305620ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket
asio C++ library

PrevUpHomeNext

Construct a basic_seq_packet_socket without opening it.

explicit basic_seq_packet_socket(
    asio::io_context & io_context);
  » more...

Construct and open a basic_seq_packet_socket.

basic_seq_packet_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);
  » more...

Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint.

basic_seq_packet_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);
  » more...

Construct a basic_seq_packet_socket on an existing native socket.

basic_seq_packet_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

Move-construct a basic_seq_packet_socket from another.

basic_seq_packet_socket(
    basic_seq_packet_socket && other);
  » more...

Move-construct a basic_seq_packet_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_seq_packet_socket(
    basic_seq_packet_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/000077500000000000000000000000001340672067200276555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload1.html000066400000000000000000000077431340672067200324520ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_seq_packet_socket without opening it.

basic_seq_packet_socket(
    asio::io_context & io_context);

This constructor creates a sequenced packet socket without opening it. The socket needs to be opened and then connected or accepted before data can be sent or received on it.

Parameters

io_context

The io_context object that the sequenced packet socket will use to dispatch handlers for any asynchronous operations performed on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload2.html000066400000000000000000000112141340672067200324370ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a basic_seq_packet_socket.

basic_seq_packet_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);

This constructor creates and opens a sequenced_packet socket. The socket needs to be connected or accepted before data can be sent or received on it.

Parameters

io_context

The io_context object that the sequenced packet socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload3.html000066400000000000000000000114541340672067200324460ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint.

basic_seq_packet_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);

This constructor creates a sequenced packet socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.

Parameters

io_context

The io_context object that the sequenced packet socket will use to dispatch handlers for any asynchronous operations performed on the socket.

endpoint

An endpoint on the local machine to which the sequenced packet socket will be bound.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload4.html000066400000000000000000000114501340672067200324430ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_seq_packet_socket on an existing native socket.

basic_seq_packet_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);

This constructor creates a sequenced packet socket object to hold an existing native socket.

Parameters

io_context

The io_context object that the sequenced packet socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

native_socket

The new underlying socket implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload5.html000066400000000000000000000105441340672067200324470ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_seq_packet_socket from another.

basic_seq_packet_socket(
    basic_seq_packet_socket && other);

This constructor moves a sequenced packet socket from one object to another.

Parameters

other

The other basic_seq_packet_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_seq_packet_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload6.html000066400000000000000000000110731340672067200324460ustar00rootroot00000000000000 basic_seq_packet_socket::basic_seq_packet_socket (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_seq_packet_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_seq_packet_socket(
    basic_seq_packet_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);

This constructor moves a sequenced packet socket from one object to another.

Parameters

other

The other basic_seq_packet_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_seq_packet_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/bind.html000066400000000000000000000064331340672067200246350ustar00rootroot00000000000000 basic_seq_packet_socket::bind
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);
  » more...

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/bind/000077500000000000000000000000001340672067200237415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/bind/overload1.html000066400000000000000000000104301340672067200265210ustar00rootroot00000000000000 basic_seq_packet_socket::bind (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/bind/overload2.html000066400000000000000000000100151340672067200265210ustar00rootroot00000000000000 basic_seq_packet_socket::bind (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
asio::error_code ec;
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/broadcast.html000066400000000000000000000100651340672067200256570ustar00rootroot00000000000000 basic_seq_packet_socket::broadcast
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/bytes_readable.html000066400000000000000000000075471340672067200266750ustar00rootroot00000000000000 basic_seq_packet_socket::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/cancel.html000066400000000000000000000062611340672067200251450ustar00rootroot00000000000000 basic_seq_packet_socket::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/cancel/000077500000000000000000000000001340672067200242525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/cancel/overload1.html000066400000000000000000000127141340672067200270410ustar00rootroot00000000000000 basic_seq_packet_socket::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/cancel/overload2.html000066400000000000000000000127601340672067200270430ustar00rootroot00000000000000 basic_seq_packet_socket::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/close.html000066400000000000000000000062011340672067200250170ustar00rootroot00000000000000 basic_seq_packet_socket::close
asio C++ library

PrevUpHomeNext

Close the socket.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/close/000077500000000000000000000000001340672067200241325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/close/overload1.html000066400000000000000000000077361340672067200267310ustar00rootroot00000000000000 basic_seq_packet_socket::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close();

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.

Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/close/overload2.html000066400000000000000000000107371340672067200267250ustar00rootroot00000000000000 basic_seq_packet_socket::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close(
    asio::error_code & ec);

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.close(ec);
if (ec)
{
  // An error occurred.
}
Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/connect.html000066400000000000000000000064321340672067200253510ustar00rootroot00000000000000 basic_seq_packet_socket::connect
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);
  » more...

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/connect/000077500000000000000000000000001340672067200244565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/connect/overload1.html000066400000000000000000000112571340672067200272460ustar00rootroot00000000000000 basic_seq_packet_socket::connect (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.connect(endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/connect/overload2.html000066400000000000000000000105771340672067200272530ustar00rootroot00000000000000 basic_seq_packet_socket::connect (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
asio::error_code ec;
socket.connect(endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/debug.html000066400000000000000000000077521340672067200250140ustar00rootroot00000000000000 basic_seq_packet_socket::debug
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/do_not_route.html000066400000000000000000000101551340672067200264150ustar00rootroot00000000000000 basic_seq_packet_socket::do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/enable_connection_aborted.html000066400000000000000000000107561340672067200310710ustar00rootroot00000000000000 basic_seq_packet_socket::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/endpoint_type.html000066400000000000000000000063251340672067200266020ustar00rootroot00000000000000 basic_seq_packet_socket::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/executor_type.html000066400000000000000000000205131340672067200266130ustar00rootroot00000000000000 basic_seq_packet_socket::executor_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_executor.html000066400000000000000000000053161340672067200264150ustar00rootroot00000000000000 basic_seq_packet_socket::get_executor
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_io_context.html000066400000000000000000000074131340672067200267320ustar00rootroot00000000000000 basic_seq_packet_socket::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_io_service.html000066400000000000000000000074031340672067200267050ustar00rootroot00000000000000 basic_seq_packet_socket::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_option.html000066400000000000000000000071501340672067200260650ustar00rootroot00000000000000 basic_seq_packet_socket::get_option
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;
  » more...

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_option/000077500000000000000000000000001340672067200251745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_option/overload1.html000066400000000000000000000111421340672067200277550ustar00rootroot00000000000000 basic_seq_packet_socket::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
socket.get_option(option);
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/get_option/overload2.html000066400000000000000000000104611340672067200277610ustar00rootroot00000000000000 basic_seq_packet_socket::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
asio::error_code ec;
socket.get_option(option, ec);
if (ec)
{
  // An error occurred.
}
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/io_control.html000066400000000000000000000071571340672067200260740ustar00rootroot00000000000000 basic_seq_packet_socket::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/io_control/000077500000000000000000000000001340672067200251745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/io_control/overload1.html000066400000000000000000000111431340672067200277560ustar00rootroot00000000000000 basic_seq_packet_socket::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
socket.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/io_control/overload2.html000066400000000000000000000104461340672067200277640ustar00rootroot00000000000000 basic_seq_packet_socket::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
asio::error_code ec;
socket.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/is_open.html000066400000000000000000000052661340672067200253600ustar00rootroot00000000000000 basic_seq_packet_socket::is_open
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/keep_alive.html000066400000000000000000000077551340672067200260350ustar00rootroot00000000000000 basic_seq_packet_socket::keep_alive
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/linger.html000066400000000000000000000101021340672067200251650ustar00rootroot00000000000000 basic_seq_packet_socket::linger
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/local_endpoint.html000066400000000000000000000064661340672067200267210ustar00rootroot00000000000000 basic_seq_packet_socket::local_endpoint
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;
  » more...

endpoint_type local_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/local_endpoint/000077500000000000000000000000001340672067200260175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/local_endpoint/overload1.html000066400000000000000000000104421340672067200306020ustar00rootroot00000000000000 basic_seq_packet_socket::local_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;

This function is used to obtain the locally bound endpoint of the socket.

Return Value

An object that represents the local endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.local_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/local_endpoint/overload2.html000066400000000000000000000107151340672067200306060ustar00rootroot00000000000000 basic_seq_packet_socket::local_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the locally bound endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/lowest_layer.html000066400000000000000000000066741340672067200264410ustar00rootroot00000000000000 basic_seq_packet_socket::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/lowest_layer/000077500000000000000000000000001340672067200255365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/lowest_layer/overload1.html000066400000000000000000000070411340672067200303220ustar00rootroot00000000000000 basic_seq_packet_socket::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/lowest_layer/overload2.html000066400000000000000000000071231340672067200303240ustar00rootroot00000000000000 basic_seq_packet_socket::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/lowest_layer_type.html000066400000000000000000000743251340672067200275000ustar00rootroot00000000000000 basic_seq_packet_socket::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

A basic_socket is always the lowest layer.

typedef basic_socket< Protocol > lowest_layer_type;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_socket

Construct a basic_socket without opening it.

Construct and open a basic_socket.

Construct a basic_socket, opening it and binding it to the given local endpoint.

Construct a basic_socket on an existing native socket.

Move-construct a basic_socket from another.

Move-construct a basic_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_socket from another.

Move-assign a basic_socket from a socket of another protocol type.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~basic_socket

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/max_connections.html000066400000000000000000000055641340672067200271140ustar00rootroot00000000000000 basic_seq_packet_socket::max_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/max_listen_connections.html000066400000000000000000000055411340672067200304650ustar00rootroot00000000000000 basic_seq_packet_socket::max_listen_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/message_do_not_route.html000066400000000000000000000055521340672067200301260ustar00rootroot00000000000000 basic_seq_packet_socket::message_do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/message_end_of_record.html000066400000000000000000000055041340672067200302130ustar00rootroot00000000000000 basic_seq_packet_socket::message_end_of_record
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/message_flags.html000066400000000000000000000065431340672067200265230ustar00rootroot00000000000000 basic_seq_packet_socket::message_flags
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/message_out_of_band.html000066400000000000000000000053751340672067200277100ustar00rootroot00000000000000 basic_seq_packet_socket::message_out_of_band
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/message_peek.html000066400000000000000000000054161340672067200263510ustar00rootroot00000000000000 basic_seq_packet_socket::message_peek
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_handle.html000066400000000000000000000056771340672067200265330ustar00rootroot00000000000000 basic_seq_packet_socket::native_handle
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the native socket representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_handle_type.html000066400000000000000000000064141340672067200275620ustar00rootroot00000000000000 basic_seq_packet_socket::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a socket.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_non_blocking.html000066400000000000000000000077071340672067200277360ustar00rootroot00000000000000 basic_seq_packet_socket::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_non_blocking/000077500000000000000000000000001340672067200270355ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_non_blocking/overload1.html000066400000000000000000000154701340672067200316260ustar00rootroot00000000000000 basic_seq_packet_socket::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.

Return Value

true if the underlying socket is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_non_blocking/overload2.html000066400000000000000000000164471340672067200316340ustar00rootroot00000000000000 basic_seq_packet_socket::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/native_non_blocking/overload3.html000066400000000000000000000156261340672067200316330ustar00rootroot00000000000000 basic_seq_packet_socket::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/non_blocking.html000066400000000000000000000074411340672067200263630ustar00rootroot00000000000000 basic_seq_packet_socket::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the socket.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/non_blocking/000077500000000000000000000000001340672067200254675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/non_blocking/overload1.html000066400000000000000000000077671340672067200302720ustar00rootroot00000000000000 basic_seq_packet_socket::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the socket.

bool non_blocking() const;
Return Value

true if the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/non_blocking/overload2.html000066400000000000000000000112421340672067200302520ustar00rootroot00000000000000 basic_seq_packet_socket::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/non_blocking/overload3.html000066400000000000000000000104151340672067200302540ustar00rootroot00000000000000 basic_seq_packet_socket::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/open.html000066400000000000000000000064021340672067200246560ustar00rootroot00000000000000 basic_seq_packet_socket::open
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());
  » more...

void open(
    const protocol_type & protocol,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/open/000077500000000000000000000000001340672067200237665ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/open/overload1.html000066400000000000000000000103031340672067200265450ustar00rootroot00000000000000 basic_seq_packet_socket::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/open/overload2.html000066400000000000000000000076551340672067200265660ustar00rootroot00000000000000 basic_seq_packet_socket::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol,
    asio::error_code & ec);

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::error_code ec;
socket.open(asio::ip::tcp::v4(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/operator_eq_.html000066400000000000000000000077461340672067200264100ustar00rootroot00000000000000 basic_seq_packet_socket::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_seq_packet_socket from another.

basic_seq_packet_socket & operator=(
    basic_seq_packet_socket && other);
  » more...

Move-assign a basic_seq_packet_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_seq_packet_socket >::type & operator=(
    basic_seq_packet_socket< Protocol1 > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/operator_eq_/000077500000000000000000000000001340672067200255045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/operator_eq_/overload1.html000066400000000000000000000103021340672067200302620ustar00rootroot00000000000000 basic_seq_packet_socket::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_seq_packet_socket from another.

basic_seq_packet_socket & operator=(
    basic_seq_packet_socket && other);

This assignment operator moves a sequenced packet socket from one object to another.

Parameters

other

The other basic_seq_packet_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_seq_packet_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/operator_eq_/overload2.html000066400000000000000000000107141340672067200302720ustar00rootroot00000000000000 basic_seq_packet_socket::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_seq_packet_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_seq_packet_socket >::type & operator=(
    basic_seq_packet_socket< Protocol1 > && other);

This assignment operator moves a sequenced packet socket from one object to another.

Parameters

other

The other basic_seq_packet_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_seq_packet_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/out_of_band_inline.html000066400000000000000000000103531340672067200275320ustar00rootroot00000000000000 basic_seq_packet_socket::out_of_band_inline
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/protocol_type.html000066400000000000000000000062271340672067200266240ustar00rootroot00000000000000 basic_seq_packet_socket::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive.html000066400000000000000000000105761340672067200253460ustar00rootroot00000000000000 basic_seq_packet_socket::receive
asio C++ library

PrevUpHomeNext

Receive some data on the socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags & out_flags);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags in_flags,
    socket_base::message_flags & out_flags);
  » more...

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags in_flags,
    socket_base::message_flags & out_flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive/000077500000000000000000000000001340672067200244475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive/overload1.html000066400000000000000000000135271340672067200272410ustar00rootroot00000000000000 basic_seq_packet_socket::receive (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on the socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags & out_flags);

This function is used to receive data on the sequenced packet socket. The function call will block until data has been received successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

out_flags

After the receive call completes, contains flags associated with the received data. For example, if the socket_base::message_end_of_record bit is set then the received data marks the end of a record.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Example

To receive into a single data buffer use the buffer function as follows:

socket.receive(asio::buffer(data, size), out_flags);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive/overload2.html000066400000000000000000000153301340672067200272340ustar00rootroot00000000000000 basic_seq_packet_socket::receive (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on the socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags in_flags,
    socket_base::message_flags & out_flags);

This function is used to receive data on the sequenced packet socket. The function call will block until data has been received successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

in_flags

Flags specifying how the receive call is to be made.

out_flags

After the receive call completes, contains flags associated with the received data. For example, if the socket_base::message_end_of_record bit is set then the received data marks the end of a record.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To receive into a single data buffer use the buffer function as follows:

socket.receive(asio::buffer(data, size), 0, out_flags);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive/overload3.html000066400000000000000000000126251340672067200272410ustar00rootroot00000000000000 basic_seq_packet_socket::receive (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags in_flags,
    socket_base::message_flags & out_flags,
    asio::error_code & ec);

This function is used to receive data on the sequenced packet socket. The function call will block until data has been received successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

in_flags

Flags specifying how the receive call is to be made.

out_flags

After the receive call completes, contains flags associated with the received data. For example, if the socket_base::message_end_of_record bit is set then the received data marks the end of a record.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes received. Returns 0 if an error occurred.

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive_buffer_size.html000066400000000000000000000104011340672067200277140ustar00rootroot00000000000000 basic_seq_packet_socket::receive_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/receive_low_watermark.html000066400000000000000000000103421340672067200302730ustar00rootroot00000000000000 basic_seq_packet_socket::receive_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/release.html000066400000000000000000000063611340672067200253410ustar00rootroot00000000000000 basic_seq_packet_socket::release
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release();
  » more...

native_handle_type release(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/release/000077500000000000000000000000001340672067200244455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/release/overload1.html000066400000000000000000000101161340672067200272260ustar00rootroot00000000000000 basic_seq_packet_socket::release (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/release/overload2.html000066400000000000000000000102261340672067200272310ustar00rootroot00000000000000 basic_seq_packet_socket::release (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/remote_endpoint.html000066400000000000000000000066001340672067200271100ustar00rootroot00000000000000 basic_seq_packet_socket::remote_endpoint
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;
  » more...

endpoint_type remote_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/remote_endpoint/000077500000000000000000000000001340672067200262205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/remote_endpoint/overload1.html000066400000000000000000000104651340672067200310100ustar00rootroot00000000000000 basic_seq_packet_socket::remote_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;

This function is used to obtain the remote endpoint of the socket.

Return Value

An object that represents the remote endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/remote_endpoint/overload2.html000066400000000000000000000107401340672067200310050ustar00rootroot00000000000000 basic_seq_packet_socket::remote_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the remote endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/reuse_address.html000066400000000000000000000102601340672067200265420ustar00rootroot00000000000000 basic_seq_packet_socket::reuse_address
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/send.html000066400000000000000000000071051340672067200246470ustar00rootroot00000000000000 basic_seq_packet_socket::send
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/send/000077500000000000000000000000001340672067200237565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/send/overload1.html000066400000000000000000000125371340672067200265500ustar00rootroot00000000000000 basic_seq_packet_socket::send (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to send data on the sequenced packet socket. The function call will block until the data has been sent successfully, or an until error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Example

To send a single data buffer use the buffer function as follows:

socket.send(asio::buffer(data, size), 0);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/send/overload2.html000066400000000000000000000115511340672067200265440ustar00rootroot00000000000000 basic_seq_packet_socket::send (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to send data on the sequenced packet socket. The function call will block the data has been sent successfully, or an until error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes sent. Returns 0 if an error occurred.

Remarks

The send operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/send_buffer_size.html000066400000000000000000000102631340672067200272310ustar00rootroot00000000000000 basic_seq_packet_socket::send_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/send_low_watermark.html000066400000000000000000000102541340672067200276040ustar00rootroot00000000000000 basic_seq_packet_socket::send_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_seq_packet_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/set_option.html000066400000000000000000000071661340672067200261100ustar00rootroot00000000000000 basic_seq_packet_socket::set_option
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);
  » more...

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/set_option/000077500000000000000000000000001340672067200252105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/set_option/overload1.html000066400000000000000000000110311340672067200277660ustar00rootroot00000000000000 basic_seq_packet_socket::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
socket.set_option(option);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/set_option/overload2.html000066400000000000000000000103401340672067200277710ustar00rootroot00000000000000 basic_seq_packet_socket::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

ec

Set to indicate what error occurred, if any.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
asio::error_code ec;
socket.set_option(option, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/shutdown.html000066400000000000000000000064231340672067200255730ustar00rootroot00000000000000 basic_seq_packet_socket::shutdown
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);
  » more...

void shutdown(
    shutdown_type what,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/shutdown/000077500000000000000000000000001340672067200247005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/shutdown/overload1.html000066400000000000000000000105601340672067200274640ustar00rootroot00000000000000 basic_seq_packet_socket::shutdown (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

Exceptions

asio::system_error

Thrown on failure.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
socket.shutdown(asio::ip::tcp::socket::shutdown_send);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/shutdown/overload2.html000066400000000000000000000101311340672067200274570ustar00rootroot00000000000000 basic_seq_packet_socket::shutdown (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what,
    asio::error_code & ec);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

ec

Set to indicate what error occurred, if any.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/shutdown_type.html000066400000000000000000000074361340672067200266410ustar00rootroot00000000000000 basic_seq_packet_socket::shutdown_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/wait.html000066400000000000000000000063231340672067200246630ustar00rootroot00000000000000 basic_seq_packet_socket::wait
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/wait/000077500000000000000000000000001340672067200237715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/wait/overload1.html000066400000000000000000000075221340672067200265610ustar00rootroot00000000000000 basic_seq_packet_socket::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
socket.wait(asio::ip::tcp::socket::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/wait/overload2.html000066400000000000000000000100451340672067200265540ustar00rootroot00000000000000 basic_seq_packet_socket::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.wait(asio::ip::tcp::socket::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_seq_packet_socket/wait_type.html000066400000000000000000000076421340672067200257310ustar00rootroot00000000000000 basic_seq_packet_socket::wait_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket.html000066400000000000000000000700571340672067200215250ustar00rootroot00000000000000 basic_socket
asio C++ library

PrevUpHomeNext

Provides socket functionality.

template<
    typename Protocol>
class basic_socket :
  public socket_base
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_socket

Construct a basic_socket without opening it.

Construct and open a basic_socket.

Construct a basic_socket, opening it and binding it to the given local endpoint.

Construct a basic_socket on an existing native socket.

Move-construct a basic_socket from another.

Move-construct a basic_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_socket from another.

Move-assign a basic_socket from a socket of another protocol type.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~basic_socket

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/000077500000000000000000000000001340672067200206265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/_basic_socket.html000066400000000000000000000053301340672067200243050ustar00rootroot00000000000000 basic_socket::~basic_socket
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~basic_socket();

This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/assign.html000066400000000000000000000062431340672067200230050ustar00rootroot00000000000000 basic_socket::assign
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/assign/000077500000000000000000000000001340672067200221125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/assign/overload1.html000066400000000000000000000050521340672067200246760ustar00rootroot00000000000000 basic_socket::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/assign/overload2.html000066400000000000000000000051451340672067200247020ustar00rootroot00000000000000 basic_socket::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/async_connect.html000066400000000000000000000122251340672067200243440ustar00rootroot00000000000000 basic_socket::async_connect
asio C++ library

PrevUpHomeNext

Start an asynchronous connect.

template<
    typename ConnectHandler>
DEDUCED async_connect(
    const endpoint_type & peer_endpoint,
    ConnectHandler && handler);

This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.

handler

The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void connect_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Connect succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_connect(endpoint, connect_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/async_wait.html000066400000000000000000000113311340672067200236540ustar00rootroot00000000000000 basic_socket::async_wait
asio C++ library

PrevUpHomeNext

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
...
socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/at_mark.html000066400000000000000000000060331340672067200231340ustar00rootroot00000000000000 basic_socket::at_mark
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;
  » more...

bool at_mark(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/at_mark/000077500000000000000000000000001340672067200222445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/at_mark/overload1.html000066400000000000000000000070201340672067200250250ustar00rootroot00000000000000 basic_socket::at_mark (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/at_mark/overload2.html000066400000000000000000000071001340672067200250250ustar00rootroot00000000000000 basic_socket::at_mark (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark(
    asio::error_code & ec) const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/available.html000066400000000000000000000061551340672067200234430ustar00rootroot00000000000000 basic_socket::available
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available() const;
  » more...

std::size_t available(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/available/000077500000000000000000000000001340672067200225465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/available/overload1.html000066400000000000000000000070701340672067200253340ustar00rootroot00000000000000 basic_socket::available (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available() const;

This function is used to determine the number of bytes that may be read without blocking.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/available/overload2.html000066400000000000000000000071541340672067200253400ustar00rootroot00000000000000 basic_socket::available (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available(
    asio::error_code & ec) const;

This function is used to determine the number of bytes that may be read without blocking.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket.html000066400000000000000000000141361340672067200241520ustar00rootroot00000000000000 basic_socket::basic_socket
asio C++ library

PrevUpHomeNext

Construct a basic_socket without opening it.

explicit basic_socket(
    asio::io_context & io_context);
  » more...

Construct and open a basic_socket.

basic_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);
  » more...

Construct a basic_socket, opening it and binding it to the given local endpoint.

basic_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);
  » more...

Construct a basic_socket on an existing native socket.

basic_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

Move-construct a basic_socket from another.

basic_socket(
    basic_socket && other);
  » more...

Move-construct a basic_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_socket(
    basic_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/000077500000000000000000000000001340672067200232575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/overload1.html000066400000000000000000000067671340672067200260610ustar00rootroot00000000000000 basic_socket::basic_socket (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket without opening it.

basic_socket(
    asio::io_context & io_context);

This constructor creates a socket without opening it.

Parameters

io_context

The io_context object that the socket will use to dispatch handlers for any asynchronous operations performed on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/overload2.html000066400000000000000000000102171340672067200260430ustar00rootroot00000000000000 basic_socket::basic_socket (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a basic_socket.

basic_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);

This constructor creates and opens a socket.

Parameters

io_context

The io_context object that the socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/overload3.html000066400000000000000000000105741340672067200260520ustar00rootroot00000000000000 basic_socket::basic_socket (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket, opening it and binding it to the given local endpoint.

basic_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);

This constructor creates a socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.

Parameters

io_context

The io_context object that the socket will use to dispatch handlers for any asynchronous operations performed on the socket.

endpoint

An endpoint on the local machine to which the socket will be bound.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/overload4.html000066400000000000000000000105661340672067200260540ustar00rootroot00000000000000 basic_socket::basic_socket (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket on an existing native socket.

basic_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);

This constructor creates a socket object to hold an existing native socket.

Parameters

io_context

The io_context object that the socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

native_socket

A native socket.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/overload5.html000066400000000000000000000076451340672067200260610ustar00rootroot00000000000000 basic_socket::basic_socket (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_socket from another.

basic_socket(
    basic_socket && other);

This constructor moves a socket from one object to another.

Parameters

other

The other basic_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/basic_socket/overload6.html000066400000000000000000000102071340672067200260460ustar00rootroot00000000000000 basic_socket::basic_socket (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_socket(
    basic_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);

This constructor moves a socket from one object to another.

Parameters

other

The other basic_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/bind.html000066400000000000000000000061121340672067200224300ustar00rootroot00000000000000 basic_socket::bind
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);
  » more...

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/bind/000077500000000000000000000000001340672067200215425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/bind/overload1.html000066400000000000000000000100051340672067200243200ustar00rootroot00000000000000 basic_socket::bind (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/bind/overload2.html000066400000000000000000000074331340672067200243340ustar00rootroot00000000000000 basic_socket::bind (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
asio::error_code ec;
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/broadcast.html000066400000000000000000000075571340672067200234740ustar00rootroot00000000000000 basic_socket::broadcast
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/bytes_readable.html000066400000000000000000000072411340672067200244650ustar00rootroot00000000000000 basic_socket::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/cancel.html000066400000000000000000000060141340672067200227420ustar00rootroot00000000000000 basic_socket::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/cancel/000077500000000000000000000000001340672067200220535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/cancel/overload1.html000066400000000000000000000123321340672067200246360ustar00rootroot00000000000000 basic_socket::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/cancel/overload2.html000066400000000000000000000123761340672067200246470ustar00rootroot00000000000000 basic_socket::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/close.html000066400000000000000000000057221340672067200226270ustar00rootroot00000000000000 basic_socket::close
asio C++ library

PrevUpHomeNext

Close the socket.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/close/000077500000000000000000000000001340672067200217335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/close/overload1.html000066400000000000000000000073541340672067200245260ustar00rootroot00000000000000 basic_socket::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the socket.

void close();

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.

Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/close/overload2.html000066400000000000000000000103141340672067200245150ustar00rootroot00000000000000 basic_socket::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the socket.

void close(
    asio::error_code & ec);

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.close(ec);
if (ec)
{
  // An error occurred.
}
Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/connect.html000066400000000000000000000061651340672067200231550ustar00rootroot00000000000000 basic_socket::connect
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);
  » more...

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/connect/000077500000000000000000000000001340672067200222575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/connect/overload1.html000066400000000000000000000106341340672067200250450ustar00rootroot00000000000000 basic_socket::connect (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.connect(endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/connect/overload2.html000066400000000000000000000102151340672067200250410ustar00rootroot00000000000000 basic_socket::connect (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
asio::error_code ec;
socket.connect(endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/debug.html000066400000000000000000000074441340672067200226130ustar00rootroot00000000000000 basic_socket::debug
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/do_not_route.html000066400000000000000000000076471340672067200242320ustar00rootroot00000000000000 basic_socket::do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/enable_connection_aborted.html000066400000000000000000000104501340672067200266610ustar00rootroot00000000000000 basic_socket::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/endpoint_type.html000066400000000000000000000060601340672067200243770ustar00rootroot00000000000000 basic_socket::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/executor_type.html000066400000000000000000000200051340672067200244100ustar00rootroot00000000000000 basic_socket::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/get_executor.html000066400000000000000000000047661340672067200242260ustar00rootroot00000000000000 basic_socket::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/get_io_context.html000066400000000000000000000070221340672067200245270ustar00rootroot00000000000000 basic_socket::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/get_io_service.html000066400000000000000000000070121340672067200245020ustar00rootroot00000000000000 basic_socket::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/get_option.html000066400000000000000000000067031340672067200236710ustar00rootroot00000000000000 basic_socket::get_option
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;
  » more...

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/get_option/000077500000000000000000000000001340672067200227755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/get_option/overload1.html000066400000000000000000000105171340672067200255630ustar00rootroot00000000000000 basic_socket::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
socket.get_option(option);
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/get_option/overload2.html000066400000000000000000000100771340672067200255650ustar00rootroot00000000000000 basic_socket::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
asio::error_code ec;
socket.get_option(option, ec);
if (ec)
{
  // An error occurred.
}
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/io_control.html000066400000000000000000000067121340672067200236710ustar00rootroot00000000000000 basic_socket::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/io_control/000077500000000000000000000000001340672067200227755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/io_control/overload1.html000066400000000000000000000105201340672067200255550ustar00rootroot00000000000000 basic_socket::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
socket.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/io_control/overload2.html000066400000000000000000000100641340672067200255610ustar00rootroot00000000000000 basic_socket::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
asio::error_code ec;
socket.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/is_open.html000066400000000000000000000047361340672067200231620ustar00rootroot00000000000000 basic_socket::is_open
asio C++ library

PrevUpHomeNext

Determine whether the socket is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/keep_alive.html000066400000000000000000000074471340672067200236340ustar00rootroot00000000000000 basic_socket::keep_alive
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/linger.html000066400000000000000000000075621340672067200230060ustar00rootroot00000000000000 basic_socket::linger
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/local_endpoint.html000066400000000000000000000062211340672067200245070ustar00rootroot00000000000000 basic_socket::local_endpoint
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;
  » more...

endpoint_type local_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/local_endpoint/000077500000000000000000000000001340672067200236205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/local_endpoint/overload1.html000066400000000000000000000100171340672067200264010ustar00rootroot00000000000000 basic_socket::local_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;

This function is used to obtain the locally bound endpoint of the socket.

Return Value

An object that represents the local endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.local_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/local_endpoint/overload2.html000066400000000000000000000102721340672067200264050ustar00rootroot00000000000000 basic_socket::local_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the locally bound endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/lowest_layer.html000066400000000000000000000064271340672067200242360ustar00rootroot00000000000000 basic_socket::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/lowest_layer/000077500000000000000000000000001340672067200233375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/lowest_layer/overload1.html000066400000000000000000000065201340672067200261240ustar00rootroot00000000000000 basic_socket::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/lowest_layer/overload2.html000066400000000000000000000066021340672067200261260ustar00rootroot00000000000000 basic_socket::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/lowest_layer_type.html000066400000000000000000000716541340672067200253030ustar00rootroot00000000000000 basic_socket::lowest_layer_type
asio C++ library

PrevUpHomeNext

A basic_socket is always the lowest layer.

typedef basic_socket< Protocol > lowest_layer_type;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_socket

Construct a basic_socket without opening it.

Construct and open a basic_socket.

Construct a basic_socket, opening it and binding it to the given local endpoint.

Construct a basic_socket on an existing native socket.

Move-construct a basic_socket from another.

Move-construct a basic_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_socket from another.

Move-assign a basic_socket from a socket of another protocol type.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~basic_socket

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/max_connections.html000066400000000000000000000053731340672067200247130ustar00rootroot00000000000000 basic_socket::max_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/max_listen_connections.html000066400000000000000000000053501340672067200262640ustar00rootroot00000000000000 basic_socket::max_listen_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/message_do_not_route.html000066400000000000000000000053611340672067200257250ustar00rootroot00000000000000 basic_socket::message_do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/message_end_of_record.html000066400000000000000000000053131340672067200260120ustar00rootroot00000000000000 basic_socket::message_end_of_record
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/message_flags.html000066400000000000000000000062761340672067200243270ustar00rootroot00000000000000 basic_socket::message_flags
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/message_out_of_band.html000066400000000000000000000052041340672067200255000ustar00rootroot00000000000000 basic_socket::message_out_of_band
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/message_peek.html000066400000000000000000000052251340672067200241500ustar00rootroot00000000000000 basic_socket::message_peek
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/native_handle.html000066400000000000000000000053471340672067200243260ustar00rootroot00000000000000 basic_socket::native_handle
asio C++ library

PrevUpHomeNext

Get the native socket representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/native_handle_type.html000066400000000000000000000061471340672067200253660ustar00rootroot00000000000000 basic_socket::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a socket.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/native_non_blocking.html000066400000000000000000000074141340672067200255320ustar00rootroot00000000000000 basic_socket::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/native_non_blocking/000077500000000000000000000000001340672067200246365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/native_non_blocking/overload1.html000066400000000000000000000150451340672067200274250ustar00rootroot00000000000000 basic_socket::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.

Return Value

true if the underlying socket is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/native_non_blocking/overload2.html000066400000000000000000000160241340672067200274240ustar00rootroot00000000000000 basic_socket::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/native_non_blocking/overload3.html000066400000000000000000000152441340672067200274300ustar00rootroot00000000000000 basic_socket::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/non_blocking.html000066400000000000000000000071461340672067200241660ustar00rootroot00000000000000 basic_socket::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the socket.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/non_blocking/000077500000000000000000000000001340672067200232705ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/non_blocking/overload1.html000066400000000000000000000074051340672067200260600ustar00rootroot00000000000000 basic_socket::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the socket.

bool non_blocking() const;
Return Value

true if the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/non_blocking/overload2.html000066400000000000000000000106171340672067200260600ustar00rootroot00000000000000 basic_socket::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/non_blocking/overload3.html000066400000000000000000000100331340672067200260510ustar00rootroot00000000000000 basic_socket::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/open.html000066400000000000000000000061351340672067200224620ustar00rootroot00000000000000 basic_socket::open
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());
  » more...

void open(
    const protocol_type & protocol,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/open/000077500000000000000000000000001340672067200215675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/open/overload1.html000066400000000000000000000076601340672067200243620ustar00rootroot00000000000000 basic_socket::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/open/overload2.html000066400000000000000000000072731340672067200243630ustar00rootroot00000000000000 basic_socket::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol,
    asio::error_code & ec);

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::error_code ec;
socket.open(asio::ip::tcp::v4(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/operator_eq_.html000066400000000000000000000073231340672067200242000ustar00rootroot00000000000000 basic_socket::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket from another.

basic_socket & operator=(
    basic_socket && other);
  » more...

Move-assign a basic_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket >::type & operator=(
    basic_socket< Protocol1 > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/operator_eq_/000077500000000000000000000000001340672067200233055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/operator_eq_/overload1.html000066400000000000000000000076471340672067200261050ustar00rootroot00000000000000 basic_socket::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket from another.

basic_socket & operator=(
    basic_socket && other);

This assignment operator moves a socket from one object to another.

Parameters

other

The other basic_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/operator_eq_/overload2.html000066400000000000000000000102611340672067200260700ustar00rootroot00000000000000 basic_socket::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket >::type & operator=(
    basic_socket< Protocol1 > && other);

This assignment operator moves a socket from one object to another.

Parameters

other

The other basic_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/out_of_band_inline.html000066400000000000000000000100451340672067200253310ustar00rootroot00000000000000 basic_socket::out_of_band_inline
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/protocol_type.html000066400000000000000000000060421340672067200244200ustar00rootroot00000000000000 basic_socket::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/receive_buffer_size.html000066400000000000000000000100421340672067200255160ustar00rootroot00000000000000 basic_socket::receive_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/receive_low_watermark.html000066400000000000000000000100341340672067200260720ustar00rootroot00000000000000 basic_socket::receive_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/release.html000066400000000000000000000061141340672067200231360ustar00rootroot00000000000000 basic_socket::release
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release();
  » more...

native_handle_type release(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/release/000077500000000000000000000000001340672067200222465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/release/overload1.html000066400000000000000000000075341340672067200250410ustar00rootroot00000000000000 basic_socket::release (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/release/overload2.html000066400000000000000000000076441340672067200250440ustar00rootroot00000000000000 basic_socket::release (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/remote_endpoint.html000066400000000000000000000063331340672067200247140ustar00rootroot00000000000000 basic_socket::remote_endpoint
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;
  » more...

endpoint_type remote_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/remote_endpoint/000077500000000000000000000000001340672067200240215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/remote_endpoint/overload1.html000066400000000000000000000100421340672067200266000ustar00rootroot00000000000000 basic_socket::remote_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;

This function is used to obtain the remote endpoint of the socket.

Return Value

An object that represents the remote endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/remote_endpoint/overload2.html000066400000000000000000000103151340672067200266040ustar00rootroot00000000000000 basic_socket::remote_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the remote endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/reuse_address.html000066400000000000000000000100321340672067200243400ustar00rootroot00000000000000 basic_socket::reuse_address
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/send_buffer_size.html000066400000000000000000000077401340672067200250400ustar00rootroot00000000000000 basic_socket::send_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/send_low_watermark.html000066400000000000000000000077461340672067200254210ustar00rootroot00000000000000 basic_socket::send_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/set_option.html000066400000000000000000000067211340672067200237050ustar00rootroot00000000000000 basic_socket::set_option
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);
  » more...

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/set_option/000077500000000000000000000000001340672067200230115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/set_option/overload1.html000066400000000000000000000104061340672067200255740ustar00rootroot00000000000000 basic_socket::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
socket.set_option(option);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/set_option/overload2.html000066400000000000000000000077561340672067200256130ustar00rootroot00000000000000 basic_socket::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

ec

Set to indicate what error occurred, if any.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
asio::error_code ec;
socket.set_option(option, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/shutdown.html000066400000000000000000000061561340672067200233770ustar00rootroot00000000000000 basic_socket::shutdown
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);
  » more...

void shutdown(
    shutdown_type what,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/shutdown/000077500000000000000000000000001340672067200225015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/shutdown/overload1.html000066400000000000000000000101351340672067200252630ustar00rootroot00000000000000 basic_socket::shutdown (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

Exceptions

asio::system_error

Thrown on failure.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
socket.shutdown(asio::ip::tcp::socket::shutdown_send);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/shutdown/overload2.html000066400000000000000000000075471340672067200253010ustar00rootroot00000000000000 basic_socket::shutdown (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what,
    asio::error_code & ec);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

ec

Set to indicate what error occurred, if any.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/shutdown_type.html000066400000000000000000000071431340672067200244350ustar00rootroot00000000000000 basic_socket::shutdown_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/wait.html000066400000000000000000000060441340672067200224640ustar00rootroot00000000000000 basic_socket::wait
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/wait/000077500000000000000000000000001340672067200215725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket/wait/overload1.html000066400000000000000000000071401340672067200243560ustar00rootroot00000000000000 basic_socket::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
socket.wait(asio::ip::tcp::socket::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/wait/overload2.html000066400000000000000000000074631340672067200243670ustar00rootroot00000000000000 basic_socket::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.wait(asio::ip::tcp::socket::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket/wait_type.html000066400000000000000000000072611340672067200235270ustar00rootroot00000000000000 basic_socket::wait_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor.html000066400000000000000000000666641340672067200234160ustar00rootroot00000000000000 basic_socket_acceptor
asio C++ library

PrevUpHomeNext

Provides the ability to accept new connections.

template<
    typename Protocol>
class basic_socket_acceptor :
  public socket_base
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of an acceptor.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

accept

Accept a new connection.

Accept a new connection and obtain the endpoint of the peer.

assign

Assigns an existing native acceptor to the acceptor.

async_accept

Start an asynchronous accept.

async_wait

Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

basic_socket_acceptor

Construct an acceptor without opening it.

Construct an open acceptor.

Construct an acceptor opened on the given endpoint.

Construct a basic_socket_acceptor on an existing native acceptor.

Move-construct a basic_socket_acceptor from another.

Move-construct a basic_socket_acceptor from an acceptor of another protocol type.

bind

Bind the acceptor to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the acceptor.

close

Close the acceptor.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the acceptor.

io_control

Perform an IO control command on the acceptor.

is_open

Determine whether the acceptor is open.

listen

Place the acceptor into the state where it will listen for new connections.

local_endpoint

Get the local endpoint of the acceptor.

native_handle

Get the native acceptor representation.

native_non_blocking

Gets the non-blocking mode of the native acceptor implementation.

Sets the non-blocking mode of the native acceptor implementation.

non_blocking

Gets the non-blocking mode of the acceptor.

Sets the non-blocking mode of the acceptor.

open

Open the acceptor using the specified protocol.

operator=

Move-assign a basic_socket_acceptor from another.

Move-assign a basic_socket_acceptor from an acceptor of another protocol type.

release

Release ownership of the underlying native acceptor.

set_option

Set an option on the acceptor.

wait

Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

~basic_socket_acceptor

Destroys the acceptor.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket_acceptor class template is used for accepting new socket connections.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Example

Opening a socket acceptor with the SO_REUSEADDR option enabled:

asio::ip::tcp::acceptor acceptor(io_context);
asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
acceptor.open(endpoint.protocol());
acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/000077500000000000000000000000001340672067200225065ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/_basic_socket_acceptor.html000066400000000000000000000055201340672067200300460ustar00rootroot00000000000000 basic_socket_acceptor::~basic_socket_acceptor
asio C++ library

PrevUpHomeNext

Destroys the acceptor.

~basic_socket_acceptor();

This function destroys the acceptor, cancelling any outstanding asynchronous operations associated with the acceptor as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept.html000066400000000000000000000164271340672067200246450ustar00rootroot00000000000000 basic_socket_acceptor::accept
asio C++ library

PrevUpHomeNext

Accept a new connection.

template<
    typename Protocol1>
void accept(
    basic_socket< Protocol1 > & peer,
    typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
  » more...

template<
    typename Protocol1>
void accept(
    basic_socket< Protocol1 > & peer,
    asio::error_code & ec,
    typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
  » more...

Accept a new connection and obtain the endpoint of the peer.

void accept(
    basic_socket< protocol_type > & peer,
    endpoint_type & peer_endpoint);
  » more...

void accept(
    basic_socket< protocol_type > & peer,
    endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

Protocol::socket accept();
  » more...

Protocol::socket accept(
    asio::error_code & ec);
  » more...

Protocol::socket accept(
    asio::io_context & io_context);
  » more...

Protocol::socket accept(
    asio::io_context & io_context,
    asio::error_code & ec);
  » more...

Protocol::socket accept(
    endpoint_type & peer_endpoint);
  » more...

Protocol::socket accept(
    endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

Protocol::socket accept(
    asio::io_context & io_context,
    endpoint_type & peer_endpoint);
  » more...

Protocol::socket accept(
    asio::io_context & io_context,
    endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/000077500000000000000000000000001340672067200237455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload1.html000066400000000000000000000107341340672067200265340ustar00rootroot00000000000000 basic_socket_acceptor::accept (1 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

template<
    typename Protocol1>
void accept(
    basic_socket< Protocol1 > & peer,
    typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);

This function is used to accept a new connection from a peer into the given socket. The function call will block until a new connection has been accepted successfully or an error occurs.

Parameters

peer

The socket into which the new connection will be accepted.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(io_context);
acceptor.accept(socket);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload10.html000066400000000000000000000113401340672067200266060ustar00rootroot00000000000000 basic_socket_acceptor::accept (10 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written.

ec

Set to indicate what error occurred, if any.

Return Value

On success, a socket object representing the newly accepted connection. On error, a socket object where is_open() is false.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint;
asio::ip::tcp::socket socket(acceptor.accept(endpoint, ec));
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload11.html000066400000000000000000000124011340672067200266060ustar00rootroot00000000000000 basic_socket_acceptor::accept (11 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    asio::io_context & io_context,
    endpoint_type & peer_endpoint);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

io_context

The io_context object to be used for the newly accepted socket.

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written.

Return Value

A socket object representing the newly accepted connection.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint;
asio::ip::tcp::socket socket(
    acceptor.accept(io_context2, endpoint));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload12.html000066400000000000000000000120411340672067200266070ustar00rootroot00000000000000 basic_socket_acceptor::accept (12 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    asio::io_context & io_context,
    endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

io_context

The io_context object to be used for the newly accepted socket.

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written.

ec

Set to indicate what error occurred, if any.

Return Value

On success, a socket object representing the newly accepted connection. On error, a socket object where is_open() is false.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint;
asio::ip::tcp::socket socket(
    acceptor.accept(io_context2, endpoint, ec));
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload2.html000066400000000000000000000103211340672067200265250ustar00rootroot00000000000000 basic_socket_acceptor::accept (2 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

template<
    typename Protocol1>
void accept(
    basic_socket< Protocol1 > & peer,
    asio::error_code & ec,
    typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);

This function is used to accept a new connection from a peer into the given socket. The function call will block until a new connection has been accepted successfully or an error occurs.

Parameters

peer

The socket into which the new connection will be accepted.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(io_context);
asio::error_code ec;
acceptor.accept(socket, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload3.html000066400000000000000000000112311340672067200265270ustar00rootroot00000000000000 basic_socket_acceptor::accept (3 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection and obtain the endpoint of the peer.

void accept(
    basic_socket< protocol_type > & peer,
    endpoint_type & peer_endpoint);

This function is used to accept a new connection from a peer into the given socket, and additionally provide the endpoint of the remote peer. The function call will block until a new connection has been accepted successfully or an error occurs.

Parameters

peer

The socket into which the new connection will be accepted.

peer_endpoint

An endpoint object which will receive the endpoint of the remote peer.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint;
acceptor.accept(socket, endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload4.html000066400000000000000000000105721340672067200265370ustar00rootroot00000000000000 basic_socket_acceptor::accept (4 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection and obtain the endpoint of the peer.

void accept(
    basic_socket< protocol_type > & peer,
    endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to accept a new connection from a peer into the given socket, and additionally provide the endpoint of the remote peer. The function call will block until a new connection has been accepted successfully or an error occurs.

Parameters

peer

The socket into which the new connection will be accepted.

peer_endpoint

An endpoint object which will receive the endpoint of the remote peer.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint;
asio::error_code ec;
acceptor.accept(socket, endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload5.html000066400000000000000000000103641340672067200265370ustar00rootroot00000000000000 basic_socket_acceptor::accept (5 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept();

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Return Value

A socket object representing the newly accepted connection.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(acceptor.accept());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload6.html000066400000000000000000000106621340672067200265410ustar00rootroot00000000000000 basic_socket_acceptor::accept (6 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    asio::error_code & ec);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

On success, a socket object representing the newly accepted connection. On error, a socket object where is_open() is false.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(acceptor.accept(ec));
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload7.html000066400000000000000000000116731340672067200265450ustar00rootroot00000000000000 basic_socket_acceptor::accept (7 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    asio::io_context & io_context);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

io_context

The io_context object to be used for the newly accepted socket.

Return Value

A socket object representing the newly accepted connection.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(acceptor.accept());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload8.html000066400000000000000000000114021340672067200265340ustar00rootroot00000000000000 basic_socket_acceptor::accept (8 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    asio::io_context & io_context,
    asio::error_code & ec);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

io_context

The io_context object to be used for the newly accepted socket.

ec

Set to indicate what error occurred, if any.

Return Value

On success, a socket object representing the newly accepted connection. On error, a socket object where is_open() is false.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(acceptor.accept(io_context2, ec));
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/accept/overload9.html000066400000000000000000000116231340672067200265420ustar00rootroot00000000000000 basic_socket_acceptor::accept (9 of 12 overloads)
asio C++ library

PrevUpHomeNext

Accept a new connection.

Protocol::socket accept(
    endpoint_type & peer_endpoint);

This function is used to accept a new connection from a peer. The function call will block until a new connection has been accepted successfully or an error occurs.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written.

Return Value

A socket object representing the newly accepted connection.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint;
asio::ip::tcp::socket socket(acceptor.accept(endpoint));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/assign.html000066400000000000000000000065261340672067200246710ustar00rootroot00000000000000 basic_socket_acceptor::assign
asio C++ library

PrevUpHomeNext

Assigns an existing native acceptor to the acceptor.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_acceptor);
  » more...

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_acceptor,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/assign/000077500000000000000000000000001340672067200237725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/assign/overload1.html000066400000000000000000000051601340672067200265560ustar00rootroot00000000000000 basic_socket_acceptor::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assigns an existing native acceptor to the acceptor.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_acceptor);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/assign/overload2.html000066400000000000000000000052471340672067200265650ustar00rootroot00000000000000 basic_socket_acceptor::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assigns an existing native acceptor to the acceptor.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_acceptor,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept.html000066400000000000000000000161511340672067200260340ustar00rootroot00000000000000 basic_socket_acceptor::async_accept
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename Protocol1,
    typename AcceptHandler>
DEDUCED async_accept(
    basic_socket< Protocol1 > & peer,
    AcceptHandler && handler,
    typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);
  » more...

template<
    typename AcceptHandler>
DEDUCED async_accept(
    basic_socket< protocol_type > & peer,
    endpoint_type & peer_endpoint,
    AcceptHandler && handler);
  » more...

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    MoveAcceptHandler && handler);
  » more...

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    asio::io_context & io_context,
    MoveAcceptHandler && handler);
  » more...

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    endpoint_type & peer_endpoint,
    MoveAcceptHandler && handler);
  » more...

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    asio::io_context & io_context,
    endpoint_type & peer_endpoint,
    MoveAcceptHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/000077500000000000000000000000001340672067200251425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload1.html000066400000000000000000000126051340672067200277300ustar00rootroot00000000000000 basic_socket_acceptor::async_accept (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename Protocol1,
    typename AcceptHandler>
DEDUCED async_accept(
    basic_socket< Protocol1 > & peer,
    AcceptHandler && handler,
    typename enable_if< is_convertible< Protocol, Protocol1 >::value >::type *  = 0);

This function is used to asynchronously accept a new connection into a socket. The function call always returns immediately.

Parameters

peer

The socket into which the new connection will be accepted. Ownership of the peer object is retained by the caller, which must guarantee that it is valid until the handler is called.

handler

The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void accept_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Accept succeeded.
  }
}

...

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::socket socket(io_context);
acceptor.async_accept(socket, accept_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload2.html000066400000000000000000000120741340672067200277310ustar00rootroot00000000000000 basic_socket_acceptor::async_accept (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename AcceptHandler>
DEDUCED async_accept(
    basic_socket< protocol_type > & peer,
    endpoint_type & peer_endpoint,
    AcceptHandler && handler);

This function is used to asynchronously accept a new connection into a socket, and additionally obtain the endpoint of the remote peer. The function call always returns immediately.

Parameters

peer

The socket into which the new connection will be accepted. Ownership of the peer object is retained by the caller, which must guarantee that it is valid until the handler is called.

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

handler

The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload3.html000066400000000000000000000120601340672067200277250ustar00rootroot00000000000000 basic_socket_acceptor::async_accept (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    MoveAcceptHandler && handler);

This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

handler

The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  typename Protocol::socket peer // On success, the newly accepted socket.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void accept_handler(const asio::error_code& error,
    asio::ip::tcp::socket peer)
{
  if (!error)
  {
    // Accept succeeded.
  }
}

...

asio::ip::tcp::acceptor acceptor(io_context);
...
acceptor.async_accept(accept_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload4.html000066400000000000000000000126001340672067200277260ustar00rootroot00000000000000 basic_socket_acceptor::async_accept (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    asio::io_context & io_context,
    MoveAcceptHandler && handler);

This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

io_context

The io_context object to be used for the newly accepted socket.

handler

The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  typename Protocol::socket peer // On success, the newly accepted socket.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void accept_handler(const asio::error_code& error,
    asio::ip::tcp::socket peer)
{
  if (!error)
  {
    // Accept succeeded.
  }
}

...

asio::ip::tcp::acceptor acceptor(io_context);
...
acceptor.async_accept(io_context2, accept_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload5.html000066400000000000000000000127611340672067200277370ustar00rootroot00000000000000 basic_socket_acceptor::async_accept (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    endpoint_type & peer_endpoint,
    MoveAcceptHandler && handler);

This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

handler

The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  typename Protocol::socket peer // On success, the newly accepted socket.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void accept_handler(const asio::error_code& error,
    asio::ip::tcp::socket peer)
{
  if (!error)
  {
    // Accept succeeded.
  }
}

...

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint;
acceptor.async_accept(endpoint, accept_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_accept/overload6.html000066400000000000000000000134701340672067200277360ustar00rootroot00000000000000 basic_socket_acceptor::async_accept (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous accept.

template<
    typename MoveAcceptHandler>
DEDUCED async_accept(
    asio::io_context & io_context,
    endpoint_type & peer_endpoint,
    MoveAcceptHandler && handler);

This function is used to asynchronously accept a new connection. The function call always returns immediately.

This overload requires that the Protocol template parameter satisfy the AcceptableProtocol type requirements.

Parameters

io_context

The io_context object to be used for the newly accepted socket.

peer_endpoint

An endpoint object into which the endpoint of the remote peer will be written. Ownership of the peer_endpoint object is retained by the caller, which must guarantee that it is valid until the handler is called.

handler

The handler to be called when the accept operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  typename Protocol::socket peer // On success, the newly accepted socket.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void accept_handler(const asio::error_code& error,
    asio::ip::tcp::socket peer)
{
  if (!error)
  {
    // Accept succeeded.
  }
}

...

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint;
acceptor.async_accept(io_context2, endpoint, accept_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/async_wait.html000066400000000000000000000117571340672067200255500ustar00rootroot00000000000000 basic_socket_acceptor::async_wait
asio C++ library

PrevUpHomeNext

Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for an acceptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired acceptor state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::ip::tcp::acceptor acceptor(io_context);
...
acceptor.async_wait(
    asio::ip::tcp::acceptor::wait_read,
    wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor.html000066400000000000000000000145701340672067200277140ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor
asio C++ library

PrevUpHomeNext

Construct an acceptor without opening it.

explicit basic_socket_acceptor(
    asio::io_context & io_context);
  » more...

Construct an open acceptor.

basic_socket_acceptor(
    asio::io_context & io_context,
    const protocol_type & protocol);
  » more...

Construct an acceptor opened on the given endpoint.

basic_socket_acceptor(
    asio::io_context & io_context,
    const endpoint_type & endpoint,
    bool reuse_addr = true);
  » more...

Construct a basic_socket_acceptor on an existing native acceptor.

basic_socket_acceptor(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_acceptor);
  » more...

Move-construct a basic_socket_acceptor from another.

basic_socket_acceptor(
    basic_socket_acceptor && other);
  » more...

Move-construct a basic_socket_acceptor from an acceptor of another protocol type.

template<
    typename Protocol1>
basic_socket_acceptor(
    basic_socket_acceptor< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/000077500000000000000000000000001340672067200270175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload1.html000066400000000000000000000074521340672067200316110ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct an acceptor without opening it.

basic_socket_acceptor(
    asio::io_context & io_context);

This constructor creates an acceptor without opening it to listen for new connections. The open() function must be called before the acceptor can accept new socket connections.

Parameters

io_context

The io_context object that the acceptor will use to dispatch handlers for any asynchronous operations performed on the acceptor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload2.html000066400000000000000000000105021340672067200316000ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct an open acceptor.

basic_socket_acceptor(
    asio::io_context & io_context,
    const protocol_type & protocol);

This constructor creates an acceptor and automatically opens it.

Parameters

io_context

The io_context object that the acceptor will use to dispatch handlers for any asynchronous operations performed on the acceptor.

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload3.html000066400000000000000000000126001340672067200316020ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct an acceptor opened on the given endpoint.

basic_socket_acceptor(
    asio::io_context & io_context,
    const endpoint_type & endpoint,
    bool reuse_addr = true);

This constructor creates an acceptor and automatically opens it to listen for new connections on the specified endpoint.

Parameters

io_context

The io_context object that the acceptor will use to dispatch handlers for any asynchronous operations performed on the acceptor.

endpoint

An endpoint on the local machine on which the acceptor will listen for new connections.

reuse_addr

Whether the constructor should set the socket option socket_base::reuse_address.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This constructor is equivalent to the following code:

basic_socket_acceptor<Protocol> acceptor(io_context);
acceptor.open(endpoint.protocol());
if (reuse_addr)
  acceptor.set_option(socket_base::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen(listen_backlog);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload4.html000066400000000000000000000112741340672067200316110ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket_acceptor on an existing native acceptor.

basic_socket_acceptor(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_acceptor);

This constructor creates an acceptor object to hold an existing native acceptor.

Parameters

io_context

The io_context object that the acceptor will use to dispatch handlers for any asynchronous operations performed on the acceptor.

protocol

An object specifying protocol parameters to be used.

native_acceptor

A native acceptor.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload5.html000066400000000000000000000103761340672067200316140ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_socket_acceptor from another.

basic_socket_acceptor(
    basic_socket_acceptor && other);

This constructor moves an acceptor from one object to another.

Parameters

other

The other basic_socket_acceptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket_acceptor(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload6.html000066400000000000000000000107211340672067200316070ustar00rootroot00000000000000 basic_socket_acceptor::basic_socket_acceptor (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_socket_acceptor from an acceptor of another protocol type.

template<
    typename Protocol1>
basic_socket_acceptor(
    basic_socket_acceptor< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);

This constructor moves an acceptor from one object to another.

Parameters

other

The other basic_socket_acceptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/bind.html000066400000000000000000000063671340672067200243240ustar00rootroot00000000000000 basic_socket_acceptor::bind
asio C++ library

PrevUpHomeNext

Bind the acceptor to the given local endpoint.

void bind(
    const endpoint_type & endpoint);
  » more...

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/bind/000077500000000000000000000000001340672067200234225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/bind/overload1.html000066400000000000000000000103171340672067200262060ustar00rootroot00000000000000 basic_socket_acceptor::bind (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Bind the acceptor to the given local endpoint.

void bind(
    const endpoint_type & endpoint);

This function binds the socket acceptor to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket acceptor will be bound.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345);
acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/bind/overload2.html000066400000000000000000000077121340672067200262140ustar00rootroot00000000000000 basic_socket_acceptor::bind (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Bind the acceptor to the given local endpoint.

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);

This function binds the socket acceptor to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket acceptor will be bound.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::acceptor acceptor(io_context);
asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345);
acceptor.open(endpoint.protocol());
asio::error_code ec;
acceptor.bind(endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/broadcast.html000066400000000000000000000100211340672067200253300ustar00rootroot00000000000000 basic_socket_acceptor::broadcast
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/bytes_readable.html000066400000000000000000000075031340672067200263460ustar00rootroot00000000000000 basic_socket_acceptor::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/cancel.html000066400000000000000000000062251340672067200246260ustar00rootroot00000000000000 basic_socket_acceptor::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the acceptor.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/cancel/000077500000000000000000000000001340672067200237335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/cancel/overload1.html000066400000000000000000000065171340672067200265260ustar00rootroot00000000000000 basic_socket_acceptor::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the acceptor.

void cancel();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/cancel/overload2.html000066400000000000000000000065631340672067200265300ustar00rootroot00000000000000 basic_socket_acceptor::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the acceptor.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/close.html000066400000000000000000000061451340672067200245070ustar00rootroot00000000000000 basic_socket_acceptor::close
asio C++ library

PrevUpHomeNext

Close the acceptor.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/close/000077500000000000000000000000001340672067200236135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/close/overload1.html000066400000000000000000000065071340672067200264050ustar00rootroot00000000000000 basic_socket_acceptor::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the acceptor.

void close();

This function is used to close the acceptor. Any asynchronous accept operations will be cancelled immediately.

A subsequent call to open() is required before the acceptor can again be used to again perform socket accept operations.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/close/overload2.html000066400000000000000000000075001340672067200264000ustar00rootroot00000000000000 basic_socket_acceptor::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the acceptor.

void close(
    asio::error_code & ec);

This function is used to close the acceptor. Any asynchronous accept operations will be cancelled immediately.

A subsequent call to open() is required before the acceptor can again be used to again perform socket accept operations.

Parameters

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::error_code ec;
acceptor.close(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/debug.html000066400000000000000000000076761340672067200245020ustar00rootroot00000000000000 basic_socket_acceptor::debug
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/do_not_route.html000066400000000000000000000101111340672067200260660ustar00rootroot00000000000000 basic_socket_acceptor::do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/enable_connection_aborted.html000066400000000000000000000107121340672067200305420ustar00rootroot00000000000000 basic_socket_acceptor::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/endpoint_type.html000066400000000000000000000062671340672067200262700ustar00rootroot00000000000000 basic_socket_acceptor::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/executor_type.html000066400000000000000000000203021340672067200262700ustar00rootroot00000000000000 basic_socket_acceptor::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_executor.html000066400000000000000000000051311340672067200260710ustar00rootroot00000000000000 basic_socket_acceptor::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_io_context.html000066400000000000000000000072201340672067200264070ustar00rootroot00000000000000 basic_socket_acceptor::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_io_service.html000066400000000000000000000072101340672067200263620ustar00rootroot00000000000000 basic_socket_acceptor::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_option.html000066400000000000000000000071141340672067200255460ustar00rootroot00000000000000 basic_socket_acceptor::get_option
asio C++ library

PrevUpHomeNext

Get an option from the acceptor.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;
  » more...

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_option/000077500000000000000000000000001340672067200246555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_option/overload1.html000066400000000000000000000107561340672067200274500ustar00rootroot00000000000000 basic_socket_acceptor::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get an option from the acceptor.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;

This function is used to get the current value of an option on the acceptor.

Parameters

option

The option value to be obtained from the acceptor.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the value of the SOL_SOCKET/SO_REUSEADDR option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::acceptor::reuse_address option;
acceptor.get_option(option);
bool is_set = option.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/get_option/overload2.html000066400000000000000000000103031340672067200274350ustar00rootroot00000000000000 basic_socket_acceptor::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get an option from the acceptor.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;

This function is used to get the current value of an option on the acceptor.

Parameters

option

The option value to be obtained from the acceptor.

ec

Set to indicate what error occurred, if any.

Example

Getting the value of the SOL_SOCKET/SO_REUSEADDR option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::acceptor::reuse_address option;
asio::error_code ec;
acceptor.get_option(option, ec);
if (ec)
{
  // An error occurred.
}
bool is_set = option.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/io_control.html000066400000000000000000000071231340672067200255460ustar00rootroot00000000000000 basic_socket_acceptor::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the acceptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/io_control/000077500000000000000000000000001340672067200246555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/io_control/overload1.html000066400000000000000000000107071340672067200274440ustar00rootroot00000000000000 basic_socket_acceptor::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform an IO control command on the acceptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the acceptor.

Parameters

command

The IO control command to be performed on the acceptor.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::acceptor::non_blocking_io command(true);
socket.io_control(command);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/io_control/overload2.html000066400000000000000000000102201340672067200274330ustar00rootroot00000000000000 basic_socket_acceptor::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform an IO control command on the acceptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the acceptor.

Parameters

command

The IO control command to be performed on the acceptor.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::acceptor::non_blocking_io command(true);
asio::error_code ec;
socket.io_control(command, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/is_open.html000066400000000000000000000051031340672067200250270ustar00rootroot00000000000000 basic_socket_acceptor::is_open
asio C++ library

PrevUpHomeNext

Determine whether the acceptor is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/keep_alive.html000066400000000000000000000077111340672067200255060ustar00rootroot00000000000000 basic_socket_acceptor::keep_alive
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/linger.html000066400000000000000000000077761340672067200246750ustar00rootroot00000000000000 basic_socket_acceptor::linger
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/listen.html000066400000000000000000000063071340672067200247000ustar00rootroot00000000000000 basic_socket_acceptor::listen
asio C++ library

PrevUpHomeNext

Place the acceptor into the state where it will listen for new connections.

void listen(
    int backlog = socket_base::max_listen_connections);
  » more...

void listen(
    int backlog,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/listen/000077500000000000000000000000001340672067200240045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/listen/overload1.html000066400000000000000000000074061340672067200265750ustar00rootroot00000000000000 basic_socket_acceptor::listen (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Place the acceptor into the state where it will listen for new connections.

void listen(
    int backlog = socket_base::max_listen_connections);

This function puts the socket acceptor into the state where it may accept new connections.

Parameters

backlog

The maximum length of the queue of pending connections.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/listen/overload2.html000066400000000000000000000076441340672067200266020ustar00rootroot00000000000000 basic_socket_acceptor::listen (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Place the acceptor into the state where it will listen for new connections.

void listen(
    int backlog,
    asio::error_code & ec);

This function puts the socket acceptor into the state where it may accept new connections.

Parameters

backlog

The maximum length of the queue of pending connections.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::error_code ec;
acceptor.listen(asio::socket_base::max_listen_connections, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/local_endpoint.html000066400000000000000000000065131340672067200263730ustar00rootroot00000000000000 basic_socket_acceptor::local_endpoint
asio C++ library

PrevUpHomeNext

Get the local endpoint of the acceptor.

endpoint_type local_endpoint() const;
  » more...

endpoint_type local_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/local_endpoint/000077500000000000000000000000001340672067200255005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/local_endpoint/overload1.html000066400000000000000000000102531340672067200302630ustar00rootroot00000000000000 basic_socket_acceptor::local_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the local endpoint of the acceptor.

endpoint_type local_endpoint() const;

This function is used to obtain the locally bound endpoint of the acceptor.

Return Value

An object that represents the local endpoint of the acceptor.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/local_endpoint/overload2.html000066400000000000000000000106371340672067200302720ustar00rootroot00000000000000 basic_socket_acceptor::local_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the local endpoint of the acceptor.

endpoint_type local_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the locally bound endpoint of the acceptor.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the local endpoint of the acceptor. Returns a default-constructed endpoint object if an error occurred and the error handler did not throw an exception.

Example
asio::ip::tcp::acceptor acceptor(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/max_connections.html000066400000000000000000000056031340672067200265670ustar00rootroot00000000000000 basic_socket_acceptor::max_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/max_listen_connections.html000066400000000000000000000055131340672067200301450ustar00rootroot00000000000000 basic_socket_acceptor::max_listen_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/message_do_not_route.html000066400000000000000000000055241340672067200276060ustar00rootroot00000000000000 basic_socket_acceptor::message_do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/message_end_of_record.html000066400000000000000000000054561340672067200277020ustar00rootroot00000000000000 basic_socket_acceptor::message_end_of_record
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/message_flags.html000066400000000000000000000065051340672067200262020ustar00rootroot00000000000000 basic_socket_acceptor::message_flags
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/message_out_of_band.html000066400000000000000000000053471340672067200273700ustar00rootroot00000000000000 basic_socket_acceptor::message_out_of_band
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/message_peek.html000066400000000000000000000053701340672067200260310ustar00rootroot00000000000000 basic_socket_acceptor::message_peek
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_handle.html000066400000000000000000000055201340672067200261770ustar00rootroot00000000000000 basic_socket_acceptor::native_handle
asio C++ library

PrevUpHomeNext

Get the native acceptor representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the acceptor. This is intended to allow access to native acceptor functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_handle_type.html000066400000000000000000000063611340672067200272440ustar00rootroot00000000000000 basic_socket_acceptor::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of an acceptor.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_non_blocking.html000066400000000000000000000076511340672067200274150ustar00rootroot00000000000000 basic_socket_acceptor::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native acceptor implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native acceptor implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_non_blocking/000077500000000000000000000000001340672067200265165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_non_blocking/overload1.html000066400000000000000000000102301340672067200312740ustar00rootroot00000000000000 basic_socket_acceptor::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native acceptor implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native acceptor. This mode has no effect on the behaviour of the acceptor object's synchronous operations.

Return Value

true if the underlying acceptor is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the acceptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native acceptor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_non_blocking/overload2.html000066400000000000000000000112031340672067200312760ustar00rootroot00000000000000 basic_socket_acceptor::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the native acceptor implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native acceptor. It has no effect on the behaviour of the acceptor object's synchronous operations.

Parameters

mode

If true, the underlying acceptor is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/native_non_blocking/overload3.html000066400000000000000000000103701340672067200313030ustar00rootroot00000000000000 basic_socket_acceptor::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the native acceptor implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native acceptor. It has no effect on the behaviour of the acceptor object's synchronous operations.

Parameters

mode

If true, the underlying acceptor is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/non_blocking.html000066400000000000000000000074031340672067200260420ustar00rootroot00000000000000 basic_socket_acceptor::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the acceptor.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the acceptor.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/non_blocking/000077500000000000000000000000001340672067200251505ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/non_blocking/overload1.html000066400000000000000000000075761340672067200277510ustar00rootroot00000000000000 basic_socket_acceptor::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the acceptor.

bool non_blocking() const;
Return Value

true if the acceptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/non_blocking/overload2.html000066400000000000000000000110431340672067200277320ustar00rootroot00000000000000 basic_socket_acceptor::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the acceptor.

void non_blocking(
    bool mode);
Parameters

mode

If true, the acceptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/non_blocking/overload3.html000066400000000000000000000102241340672067200277330ustar00rootroot00000000000000 basic_socket_acceptor::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the acceptor.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the acceptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/open.html000066400000000000000000000063461340672067200243460ustar00rootroot00000000000000 basic_socket_acceptor::open
asio C++ library

PrevUpHomeNext

Open the acceptor using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());
  » more...

void open(
    const protocol_type & protocol,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/open/000077500000000000000000000000001340672067200234475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/open/overload1.html000066400000000000000000000101331340672067200262270ustar00rootroot00000000000000 basic_socket_acceptor::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Open the acceptor using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());

This function opens the socket acceptor so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::acceptor acceptor(io_context);
acceptor.open(asio::ip::tcp::v4());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/open/overload2.html000066400000000000000000000075151340672067200262420ustar00rootroot00000000000000 basic_socket_acceptor::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Open the acceptor using the specified protocol.

void open(
    const protocol_type & protocol,
    asio::error_code & ec);

This function opens the socket acceptor so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::acceptor acceptor(io_context);
asio::error_code ec;
acceptor.open(asio::ip::tcp::v4(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/operator_eq_.html000066400000000000000000000076671340672067200260730ustar00rootroot00000000000000 basic_socket_acceptor::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket_acceptor from another.

basic_socket_acceptor & operator=(
    basic_socket_acceptor && other);
  » more...

Move-assign a basic_socket_acceptor from an acceptor of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket_acceptor >::type & operator=(
    basic_socket_acceptor< Protocol1 > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/operator_eq_/000077500000000000000000000000001340672067200251655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/operator_eq_/overload1.html000066400000000000000000000101601340672067200277450ustar00rootroot00000000000000 basic_socket_acceptor::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket_acceptor from another.

basic_socket_acceptor & operator=(
    basic_socket_acceptor && other);

This assignment operator moves an acceptor from one object to another.

Parameters

other

The other basic_socket_acceptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket_acceptor(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/operator_eq_/overload2.html000066400000000000000000000105641340672067200277560ustar00rootroot00000000000000 basic_socket_acceptor::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket_acceptor from an acceptor of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_socket_acceptor >::type & operator=(
    basic_socket_acceptor< Protocol1 > && other);

This assignment operator moves an acceptor from one object to another.

Parameters

other

The other basic_socket_acceptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/out_of_band_inline.html000066400000000000000000000103071340672067200272120ustar00rootroot00000000000000 basic_socket_acceptor::out_of_band_inline
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/protocol_type.html000066400000000000000000000062511340672067200263020ustar00rootroot00000000000000 basic_socket_acceptor::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/receive_buffer_size.html000066400000000000000000000103041340672067200273770ustar00rootroot00000000000000 basic_socket_acceptor::receive_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/receive_low_watermark.html000066400000000000000000000102761340672067200277620ustar00rootroot00000000000000 basic_socket_acceptor::receive_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/release.html000066400000000000000000000063251340672067200250220ustar00rootroot00000000000000 basic_socket_acceptor::release
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native acceptor.

native_handle_type release();
  » more...

native_handle_type release(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/release/000077500000000000000000000000001340672067200241265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/release/overload1.html000066400000000000000000000077021340672067200267160ustar00rootroot00000000000000 basic_socket_acceptor::release (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native acceptor.

native_handle_type release();

This function causes all outstanding asynchronous accept operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native acceptor is then transferred to the caller.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/release/overload2.html000066400000000000000000000100021340672067200267020ustar00rootroot00000000000000 basic_socket_acceptor::release (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native acceptor.

native_handle_type release(
    asio::error_code & ec);

This function causes all outstanding asynchronous accept operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native acceptor is then transferred to the caller.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/reuse_address.html000066400000000000000000000102341340672067200262240ustar00rootroot00000000000000 basic_socket_acceptor::reuse_address
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/send_buffer_size.html000066400000000000000000000102021340672067200267030ustar00rootroot00000000000000 basic_socket_acceptor::send_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/send_low_watermark.html000066400000000000000000000102101340672067200272550ustar00rootroot00000000000000 basic_socket_acceptor::send_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_socket_acceptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/set_option.html000066400000000000000000000071321340672067200255620ustar00rootroot00000000000000 basic_socket_acceptor::set_option
asio C++ library

PrevUpHomeNext

Set an option on the acceptor.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);
  » more...

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/set_option/000077500000000000000000000000001340672067200246715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/set_option/overload1.html000066400000000000000000000106611340672067200274570ustar00rootroot00000000000000 basic_socket_acceptor::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set an option on the acceptor.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);

This function is used to set an option on the acceptor.

Parameters

option

The new option value to be set on the acceptor.

Exceptions

asio::system_error

Thrown on failure.

Example

Setting the SOL_SOCKET/SO_REUSEADDR option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::acceptor::reuse_address option(true);
acceptor.set_option(option);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/set_option/overload2.html000066400000000000000000000102221340672067200274510ustar00rootroot00000000000000 basic_socket_acceptor::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set an option on the acceptor.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);

This function is used to set an option on the acceptor.

Parameters

option

The new option value to be set on the acceptor.

ec

Set to indicate what error occurred, if any.

Example

Setting the SOL_SOCKET/SO_REUSEADDR option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::ip::tcp::acceptor::reuse_address option(true);
asio::error_code ec;
acceptor.set_option(option, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/shutdown_type.html000066400000000000000000000074041340672067200263150ustar00rootroot00000000000000 basic_socket_acceptor::shutdown_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/wait.html000066400000000000000000000062671340672067200243530ustar00rootroot00000000000000 basic_socket_acceptor::wait
asio C++ library

PrevUpHomeNext

Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/wait/000077500000000000000000000000001340672067200234525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_acceptor/wait/overload1.html000066400000000000000000000073471340672067200262470ustar00rootroot00000000000000 basic_socket_acceptor::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for an acceptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired acceptor state.

Example

Waiting for an acceptor to become readable.

asio::ip::tcp::acceptor acceptor(io_context);
...
acceptor.wait(asio::ip::tcp::acceptor::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/wait/overload2.html000066400000000000000000000076721340672067200262510ustar00rootroot00000000000000 basic_socket_acceptor::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for an acceptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired acceptor state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for an acceptor to become readable.

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::error_code ec;
acceptor.wait(asio::ip::tcp::acceptor::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_acceptor/wait_type.html000066400000000000000000000075701340672067200254120ustar00rootroot00000000000000 basic_socket_acceptor::wait_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream.html000066400000000000000000000276541340672067200234350ustar00rootroot00000000000000 basic_socket_iostream
asio C++ library

PrevUpHomeNext

Iostream interface for a socket.

template<
    typename Protocol,
    typename Clock = chrono::steady_clock,
    typename WaitTraits = wait_traits<Clock>>
class basic_socket_iostream
Types

Name

Description

clock_type

The clock type.

duration

The duration type.

duration_type

(Deprecated: Use duration.) The duration type.

endpoint_type

The endpoint type.

protocol_type

The protocol type.

time_point

The time type.

time_type

(Deprecated: Use time_point.) The time type.

Member Functions

Name

Description

basic_socket_iostream

Construct a basic_socket_iostream without establishing a connection.

Construct a basic_socket_iostream from the supplied socket.

Move-construct a basic_socket_iostream from another.

Establish a connection to an endpoint corresponding to a resolver query.

close

Close the connection.

connect

Establish a connection to an endpoint corresponding to a resolver query.

error

Get the last error associated with the stream.

expires_after

Set the stream's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time.

Set the stream's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the stream's expiry time relative to now.

(Deprecated: Use expires_after().) Set the stream's expiry time relative to now.

expiry

Get the stream's expiry time as an absolute time.

operator=

Move-assign a basic_socket_iostream from another.

rdbuf

Return a pointer to the underlying streambuf.

socket

Get a reference to the underlying socket.

Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/000077500000000000000000000000001340672067200225315ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_iostream/basic_socket_iostream.html000066400000000000000000000120701340672067200277530ustar00rootroot00000000000000 basic_socket_iostream::basic_socket_iostream
asio C++ library

PrevUpHomeNext

Construct a basic_socket_iostream without establishing a connection.

basic_socket_iostream();
  » more...

Construct a basic_socket_iostream from the supplied socket.

explicit basic_socket_iostream(
    basic_stream_socket< protocol_type > s);
  » more...

Move-construct a basic_socket_iostream from another.

basic_socket_iostream(
    basic_socket_iostream && other);
  » more...

Establish a connection to an endpoint corresponding to a resolver query.

template<
    typename T1,
    ... ,
    typename TN>
explicit basic_socket_iostream(
    T1 t1,
    ... ,
    TN tn);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/basic_socket_iostream/000077500000000000000000000000001340672067200270655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_iostream/basic_socket_iostream/overload1.html000066400000000000000000000055741340672067200316620ustar00rootroot00000000000000 basic_socket_iostream::basic_socket_iostream (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket_iostream without establishing a connection.

basic_socket_iostream();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/basic_socket_iostream/overload2.html000066400000000000000000000056121340672067200316540ustar00rootroot00000000000000 basic_socket_iostream::basic_socket_iostream (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket_iostream from the supplied socket.

basic_socket_iostream(
    basic_stream_socket< protocol_type > s);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/basic_socket_iostream/overload3.html000066400000000000000000000055751340672067200316650ustar00rootroot00000000000000 basic_socket_iostream::basic_socket_iostream (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_socket_iostream from another.

basic_socket_iostream(
    basic_socket_iostream && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/basic_socket_iostream/overload4.html000066400000000000000000000060021340672067200316500ustar00rootroot00000000000000 basic_socket_iostream::basic_socket_iostream (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Establish a connection to an endpoint corresponding to a resolver query.

template<
    typename T1,
    ... ,
    typename TN>
basic_socket_iostream(
    T1 t1,
    ... ,
    TN tn);

This constructor automatically establishes a connection based on the supplied resolver query parameters. The arguments are used to construct a resolver query object.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/clock_type.html000066400000000000000000000062071340672067200255600ustar00rootroot00000000000000 basic_socket_iostream::clock_type
asio C++ library

PrevUpHomeNext

The clock type.

typedef Clock clock_type;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/close.html000066400000000000000000000047401340672067200245310ustar00rootroot00000000000000 basic_socket_iostream::close
asio C++ library

PrevUpHomeNext

Close the connection.

void close();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/connect.html000066400000000000000000000054761340672067200250640ustar00rootroot00000000000000 basic_socket_iostream::connect
asio C++ library

PrevUpHomeNext

Establish a connection to an endpoint corresponding to a resolver query.

template<
    typename T1,
    ... ,
    typename TN>
void connect(
    T1 t1,
    ... ,
    TN tn);

This function automatically establishes a connection based on the supplied resolver query parameters. The arguments are used to construct a resolver query object.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/duration.html000066400000000000000000000060721340672067200252510ustar00rootroot00000000000000 basic_socket_iostream::duration
asio C++ library

PrevUpHomeNext

The duration type.

typedef WaitTraits::duration duration;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/duration_type.html000066400000000000000000000062261340672067200263130ustar00rootroot00000000000000 basic_socket_iostream::duration_type
asio C++ library

PrevUpHomeNext

(Deprecated: Use duration.) The duration type.

typedef WaitTraits::duration_type duration_type;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/endpoint_type.html000066400000000000000000000061471340672067200263100ustar00rootroot00000000000000 basic_socket_iostream::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/error.html000066400000000000000000000067601340672067200245610ustar00rootroot00000000000000 basic_socket_iostream::error
asio C++ library

PrevUpHomeNext

Get the last error associated with the stream.

const asio::error_code & error() const;
Return Value

An error_code corresponding to the last error from the stream.

Example

To print the error associated with a failure to establish a connection:

tcp::iostream s("www.boost.org", "http");
if (!s)
{
  std::cout << "Error: " << s.error().message() << std::endl;
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_after.html000066400000000000000000000066171340672067200262710ustar00rootroot00000000000000 basic_socket_iostream::expires_after
asio C++ library

PrevUpHomeNext

Set the stream's expiry time relative to now.

void expires_after(
    const duration & expiry_time);

This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error asio::error::operation_aborted.

Parameters

expiry_time

The expiry time to be used for the timer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_at.html000066400000000000000000000066401340672067200255700ustar00rootroot00000000000000 basic_socket_iostream::expires_at
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time.

time_point expires_at() const;
  » more...

Set the stream's expiry time as an absolute time.

void expires_at(
    const time_point & expiry_time);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_at/000077500000000000000000000000001340672067200246745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_at/overload1.html000066400000000000000000000061301340672067200274560ustar00rootroot00000000000000 basic_socket_iostream::expires_at (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time.

time_point expires_at() const;
Return Value

An absolute time value representing the stream's expiry time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_at/overload2.html000066400000000000000000000067551340672067200274740ustar00rootroot00000000000000 basic_socket_iostream::expires_at (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the stream's expiry time as an absolute time.

void expires_at(
    const time_point & expiry_time);

This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error asio::error::operation_aborted.

Parameters

expiry_time

The expiry time to be used for the stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_from_now.html000066400000000000000000000071701340672067200270110ustar00rootroot00000000000000 basic_socket_iostream::expires_from_now
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream's expiry time relative to now.

duration expires_from_now() const;
  » more...

(Deprecated: Use expires_after().) Set the stream's expiry time relative to now.

void expires_from_now(
    const duration & expiry_time);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_from_now/000077500000000000000000000000001340672067200261165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_from_now/overload1.html000066400000000000000000000062671340672067200307130ustar00rootroot00000000000000 basic_socket_iostream::expires_from_now (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream's expiry time relative to now.

duration expires_from_now() const;
Return Value

A relative time value representing the stream's expiry time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expires_from_now/overload2.html000066400000000000000000000071371340672067200307110ustar00rootroot00000000000000 basic_socket_iostream::expires_from_now (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expires_after().) Set the stream's expiry time relative to now.

void expires_from_now(
    const duration & expiry_time);

This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error asio::error::operation_aborted.

Parameters

expiry_time

The expiry time to be used for the timer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/expiry.html000066400000000000000000000057501340672067200247460ustar00rootroot00000000000000 basic_socket_iostream::expiry
asio C++ library

PrevUpHomeNext

Get the stream's expiry time as an absolute time.

time_point expiry() const;
Return Value

An absolute time value representing the stream's expiry time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/operator_eq_.html000066400000000000000000000053601340672067200261020ustar00rootroot00000000000000 basic_socket_iostream::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket_iostream from another.

basic_socket_iostream & operator=(
    basic_socket_iostream && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/protocol_type.html000066400000000000000000000061261340672067200263260ustar00rootroot00000000000000 basic_socket_iostream::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/rdbuf.html000066400000000000000000000050771340672067200245320ustar00rootroot00000000000000 basic_socket_iostream::rdbuf
asio C++ library

PrevUpHomeNext

Return a pointer to the underlying streambuf.

basic_socket_streambuf< Protocol, Clock, WaitTraits > * rdbuf() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/socket.html000066400000000000000000000050231340672067200247070ustar00rootroot00000000000000 basic_socket_iostream::socket
asio C++ library

PrevUpHomeNext

Get a reference to the underlying socket.

basic_socket< Protocol > & socket();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/time_point.html000066400000000000000000000060721340672067200255730ustar00rootroot00000000000000 basic_socket_iostream::time_point
asio C++ library

PrevUpHomeNext

The time type.

typedef WaitTraits::time_point time_point;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_iostream/time_type.html000066400000000000000000000062021340672067200254160ustar00rootroot00000000000000 basic_socket_iostream::time_type
asio C++ library

PrevUpHomeNext

(Deprecated: Use time_point.) The time type.

typedef WaitTraits::time_type time_type;
Requirements

Header: asio/basic_socket_iostream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf.html000066400000000000000000000337671340672067200236040ustar00rootroot00000000000000 basic_socket_streambuf
asio C++ library

PrevUpHomeNext

Iostream streambuf for a socket.

template<
    typename Protocol,
    typename Clock = chrono::steady_clock,
    typename WaitTraits = wait_traits<Clock>>
class basic_socket_streambuf :
  basic_socket< Protocol >
Types

Name

Description

clock_type

The clock type.

duration

The duration type.

duration_type

(Deprecated: Use duration.) The duration type.

endpoint_type

The endpoint type.

protocol_type

The protocol type.

time_point

The time type.

time_type

(Deprecated: Use time_point.) The time type.

Member Functions

Name

Description

basic_socket_streambuf

Construct a basic_socket_streambuf without establishing a connection.

Construct a basic_socket_streambuf from the supplied socket.

Move-construct a basic_socket_streambuf from another.

close

Close the connection.

connect

Establish a connection.

error

Get the last error associated with the stream buffer.

expires_after

Set the stream buffer's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the stream buffer's expiry time as an absolute time.

Set the stream buffer's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the stream buffer's expiry time relative to now.

(Deprecated: Use expires_after().) Set the stream buffer's expiry time relative to now.

expiry

Get the stream buffer's expiry time as an absolute time.

operator=

Move-assign a basic_socket_streambuf from another.

puberror

(Deprecated: Use error().) Get the last error associated with the stream buffer.

socket

Get a reference to the underlying socket.

~basic_socket_streambuf

Destructor flushes buffered data.

Protected Member Functions

Name

Description

overflow

setbuf

sync

underflow

Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/000077500000000000000000000000001340672067200226765ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_streambuf/_basic_socket_streambuf.html000066400000000000000000000052251340672067200304300ustar00rootroot00000000000000 basic_socket_streambuf::~basic_socket_streambuf
asio C++ library

PrevUpHomeNext

Destructor flushes buffered data.

virtual ~basic_socket_streambuf();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/basic_socket_streambuf.html000066400000000000000000000110431340672067200302640ustar00rootroot00000000000000 basic_socket_streambuf::basic_socket_streambuf
asio C++ library

PrevUpHomeNext

Construct a basic_socket_streambuf without establishing a connection.

basic_socket_streambuf();
  » more...

Construct a basic_socket_streambuf from the supplied socket.

explicit basic_socket_streambuf(
    basic_stream_socket< protocol_type > s);
  » more...

Move-construct a basic_socket_streambuf from another.

basic_socket_streambuf(
    basic_socket_streambuf && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/basic_socket_streambuf/000077500000000000000000000000001340672067200273775ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_streambuf/basic_socket_streambuf/overload1.html000066400000000000000000000056241340672067200321700ustar00rootroot00000000000000 basic_socket_streambuf::basic_socket_streambuf (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket_streambuf without establishing a connection.

basic_socket_streambuf();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/basic_socket_streambuf/overload2.html000066400000000000000000000056371340672067200321750ustar00rootroot00000000000000 basic_socket_streambuf::basic_socket_streambuf (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_socket_streambuf from the supplied socket.

basic_socket_streambuf(
    basic_stream_socket< protocol_type > s);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/basic_socket_streambuf/overload3.html000066400000000000000000000056001340672067200321640ustar00rootroot00000000000000 basic_socket_streambuf::basic_socket_streambuf (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_socket_streambuf from another.

basic_socket_streambuf(
    basic_socket_streambuf && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/clock_type.html000066400000000000000000000062321340672067200257230ustar00rootroot00000000000000 basic_socket_streambuf::clock_type
asio C++ library

PrevUpHomeNext

The clock type.

typedef Clock clock_type;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/close.html000066400000000000000000000056721340672067200247030ustar00rootroot00000000000000 basic_socket_streambuf::close
asio C++ library

PrevUpHomeNext

Close the connection.

basic_socket_streambuf * close();
Return Value

this if a connection was successfully established, a null pointer otherwise.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/connect.html000066400000000000000000000063671340672067200252310ustar00rootroot00000000000000 basic_socket_streambuf::connect
asio C++ library

PrevUpHomeNext

Establish a connection.

basic_socket_streambuf * connect(
    const endpoint_type & endpoint);
  » more...

template<
    typename T1,
    ... ,
    typename TN>
basic_socket_streambuf * connect(
    T1 t1,
    ... ,
    TN tn);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/connect/000077500000000000000000000000001340672067200243275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_streambuf/connect/overload1.html000066400000000000000000000062301340672067200271120ustar00rootroot00000000000000 basic_socket_streambuf::connect (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Establish a connection.

basic_socket_streambuf * connect(
    const endpoint_type & endpoint);

This function establishes a connection to the specified endpoint.

Return Value

this if a connection was successfully established, a null pointer otherwise.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/connect/overload2.html000066400000000000000000000065111340672067200271150ustar00rootroot00000000000000 basic_socket_streambuf::connect (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Establish a connection.

template<
    typename T1,
    ... ,
    typename TN>
basic_socket_streambuf * connect(
    T1 t1,
    ... ,
    TN tn);

This function automatically establishes a connection based on the supplied resolver query parameters. The arguments are used to construct a resolver query object.

Return Value

this if a connection was successfully established, a null pointer otherwise.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/duration.html000066400000000000000000000061721340672067200254170ustar00rootroot00000000000000 basic_socket_streambuf::duration
asio C++ library

PrevUpHomeNext

The duration type.

typedef WaitTraits::duration duration;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/duration_type.html000066400000000000000000000062451340672067200264610ustar00rootroot00000000000000 basic_socket_streambuf::duration_type
asio C++ library

PrevUpHomeNext

(Deprecated: Use duration.) The duration type.

typedef WaitTraits::duration_type duration_type;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/endpoint_type.html000066400000000000000000000061661340672067200264560ustar00rootroot00000000000000 basic_socket_streambuf::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/error.html000066400000000000000000000060011340672067200247120ustar00rootroot00000000000000 basic_socket_streambuf::error
asio C++ library

PrevUpHomeNext

Get the last error associated with the stream buffer.

const asio::error_code & error() const;
Return Value

An error_code corresponding to the last error from the stream buffer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_after.html000066400000000000000000000066441340672067200264360ustar00rootroot00000000000000 basic_socket_streambuf::expires_after
asio C++ library

PrevUpHomeNext

Set the stream buffer's expiry time relative to now.

void expires_after(
    const duration & expiry_time);

This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error asio::error::operation_aborted.

Parameters

expiry_time

The expiry time to be used for the timer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_at.html000066400000000000000000000066751340672067200257450ustar00rootroot00000000000000 basic_socket_streambuf::expires_at
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream buffer's expiry time as an absolute time.

time_point expires_at() const;
  » more...

Set the stream buffer's expiry time as an absolute time.

void expires_at(
    const time_point & expiry_time);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_at/000077500000000000000000000000001340672067200250415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_at/overload1.html000066400000000000000000000061601340672067200276260ustar00rootroot00000000000000 basic_socket_streambuf::expires_at (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream buffer's expiry time as an absolute time.

time_point expires_at() const;
Return Value

An absolute time value representing the stream buffer's expiry time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_at/overload2.html000066400000000000000000000067761340672067200276440ustar00rootroot00000000000000 basic_socket_streambuf::expires_at (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the stream buffer's expiry time as an absolute time.

void expires_at(
    const time_point & expiry_time);

This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error asio::error::operation_aborted.

Parameters

expiry_time

The expiry time to be used for the stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_from_now.html000066400000000000000000000072371340672067200271620ustar00rootroot00000000000000 basic_socket_streambuf::expires_from_now
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream buffer's expiry time relative to now.

duration expires_from_now() const;
  » more...

(Deprecated: Use expires_after().) Set the stream buffer's expiry time relative to now.

void expires_from_now(
    const duration & expiry_time);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_from_now/000077500000000000000000000000001340672067200262635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_from_now/overload1.html000066400000000000000000000063171340672067200310540ustar00rootroot00000000000000 basic_socket_streambuf::expires_from_now (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the stream buffer's expiry time relative to now.

duration expires_from_now() const;
Return Value

A relative time value representing the stream buffer's expiry time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expires_from_now/overload2.html000066400000000000000000000071601340672067200310520ustar00rootroot00000000000000 basic_socket_streambuf::expires_from_now (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expires_after().) Set the stream buffer's expiry time relative to now.

void expires_from_now(
    const duration & expiry_time);

This function sets the expiry time associated with the stream. Stream operations performed after this time (where the operations cannot be completed using the internal buffers) will fail with the error asio::error::operation_aborted.

Parameters

expiry_time

The expiry time to be used for the timer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/expiry.html000066400000000000000000000060041340672067200251040ustar00rootroot00000000000000 basic_socket_streambuf::expiry
asio C++ library

PrevUpHomeNext

Get the stream buffer's expiry time as an absolute time.

time_point expiry() const;
Return Value

An absolute time value representing the stream buffer's expiry time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/operator_eq_.html000066400000000000000000000053541340672067200262520ustar00rootroot00000000000000 basic_socket_streambuf::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_socket_streambuf from another.

basic_socket_streambuf & operator=(
    basic_socket_streambuf && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/overflow.html000066400000000000000000000050171340672067200254320ustar00rootroot00000000000000 basic_socket_streambuf::overflow
asio C++ library

PrevUpHomeNext

int_type overflow(
    int_type c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/protocol_type.html000066400000000000000000000061441340672067200264730ustar00rootroot00000000000000 basic_socket_streambuf::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/puberror.html000066400000000000000000000061171340672067200254310ustar00rootroot00000000000000 basic_socket_streambuf::puberror
asio C++ library

PrevUpHomeNext

(Deprecated: Use error().) Get the last error associated with the stream buffer.

const asio::error_code & puberror() const;
Return Value

An error_code corresponding to the last error from the stream buffer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/setbuf.html000066400000000000000000000047721340672067200250660ustar00rootroot00000000000000 basic_socket_streambuf::setbuf
asio C++ library

PrevUpHomeNext

std::streambuf * setbuf(
    char_type * s,
    std::streamsize n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/socket.html000066400000000000000000000050121340672067200250520ustar00rootroot00000000000000 basic_socket_streambuf::socket
asio C++ library

PrevUpHomeNext

Get a reference to the underlying socket.

basic_socket< Protocol > & socket();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/sync.html000066400000000000000000000046761340672067200245550ustar00rootroot00000000000000 basic_socket_streambuf::sync
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/time_point.html000066400000000000000000000061011340672067200257310ustar00rootroot00000000000000 basic_socket_streambuf::time_point
asio C++ library

PrevUpHomeNext

The time type.

typedef WaitTraits::time_point time_point;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/time_type.html000066400000000000000000000061531340672067200255700ustar00rootroot00000000000000 basic_socket_streambuf::time_type
asio C++ library

PrevUpHomeNext

(Deprecated: Use time_point.) The time type.

typedef WaitTraits::time_type time_type;
Requirements

Header: asio/basic_socket_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_socket_streambuf/underflow.html000066400000000000000000000050461340672067200255760ustar00rootroot00000000000000 basic_socket_streambuf::underflow
asio C++ library

PrevUpHomeNext

int_type underflow();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket.html000066400000000000000000000767601340672067200231070ustar00rootroot00000000000000 basic_stream_socket
asio C++ library

PrevUpHomeNext

Provides stream-oriented socket functionality.

template<
    typename Protocol>
class basic_stream_socket :
  public basic_socket< Protocol >
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_read_some

Start an asynchronous read.

async_receive

Start an asynchronous receive.

async_send

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

async_write_some

Start an asynchronous write.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_stream_socket

Construct a basic_stream_socket without opening it.

Construct and open a basic_stream_socket.

Construct a basic_stream_socket, opening it and binding it to the given local endpoint.

Construct a basic_stream_socket on an existing native socket.

Move-construct a basic_stream_socket from another.

Move-construct a basic_stream_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_stream_socket from another.

Move-assign a basic_stream_socket from a socket of another protocol type.

read_some

Read some data from the socket.

receive

Receive some data on the socket.

Receive some data on a connected socket.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

write_some

Write some data to the socket.

~basic_stream_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_stream_socket class template provides asynchronous and blocking stream-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/000077500000000000000000000000001340672067200222015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/_basic_stream_socket.html000066400000000000000000000055051340672067200272370ustar00rootroot00000000000000 basic_stream_socket::~basic_stream_socket
asio C++ library

PrevUpHomeNext

Destroys the socket.

~basic_stream_socket();

This function destroys the socket, cancelling any outstanding asynchronous operations associated with the socket as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/assign.html000066400000000000000000000064411340672067200243600ustar00rootroot00000000000000 basic_stream_socket::assign
asio C++ library

PrevUpHomeNext

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/assign/000077500000000000000000000000001340672067200234655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/assign/overload1.html000066400000000000000000000052761340672067200262610ustar00rootroot00000000000000 basic_stream_socket::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/assign/overload2.html000066400000000000000000000053711340672067200262560ustar00rootroot00000000000000 basic_stream_socket::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Assign an existing native socket to the socket.

void assign(
    const protocol_type & protocol,
    const native_handle_type & native_socket,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_connect.html000066400000000000000000000125771340672067200257310ustar00rootroot00000000000000 basic_stream_socket::async_connect
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Start an asynchronous connect.

template<
    typename ConnectHandler>
DEDUCED async_connect(
    const endpoint_type & peer_endpoint,
    ConnectHandler && handler);

This function is used to asynchronously connect a socket to the specified remote endpoint. The function call always returns immediately.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected. Copies will be made of the endpoint object as required.

handler

The handler to be called when the connection operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void connect_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Connect succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.async_connect(endpoint, connect_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_read_some.html000066400000000000000000000144641340672067200262330ustar00rootroot00000000000000 basic_stream_socket::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read data from the stream socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes read.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The read operation may not read all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.

Example

To read into a single data buffer use the buffer function as follows:

socket.async_read_some(asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_receive.html000066400000000000000000000104411340672067200257060ustar00rootroot00000000000000 basic_stream_socket::async_receive
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);
  » more...

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    ReadHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_receive/000077500000000000000000000000001340672067200250205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/async_receive/overload1.html000066400000000000000000000147641340672067200276160ustar00rootroot00000000000000 basic_stream_socket::async_receive (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously receive data from the stream socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is received before the asynchronous operation completes.

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive(asio::buffer(data, size), handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_receive/overload2.html000066400000000000000000000152431340672067200276100ustar00rootroot00000000000000 basic_stream_socket::async_receive (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous receive.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    ReadHandler && handler);

This function is used to asynchronously receive data from the stream socket. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be received. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the receive call is to be made.

handler

The handler to be called when the receive operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes received.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is received before the asynchronous operation completes.

Example

To receive into a single data buffer use the buffer function as follows:

socket.async_receive(asio::buffer(data, size), 0, handler);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_send.html000066400000000000000000000104111340672067200252120ustar00rootroot00000000000000 basic_stream_socket::async_send
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);
  » more...

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_send/000077500000000000000000000000001340672067200243275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/async_send/overload1.html000066400000000000000000000145511340672067200271170ustar00rootroot00000000000000 basic_stream_socket::async_send (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously send data on the stream socket. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The send operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To send a single data buffer use the buffer function as follows:

socket.async_send(asio::buffer(data, size), handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_send/overload2.html000066400000000000000000000150411340672067200271130ustar00rootroot00000000000000 basic_stream_socket::async_send (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous send.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    WriteHandler && handler);

This function is used to asynchronously send data on the stream socket. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be sent on the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

flags

Flags specifying how the send call is to be made.

handler

The handler to be called when the send operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes sent.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The send operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To send a single data buffer use the buffer function as follows:

socket.async_send(asio::buffer(data, size), 0, handler);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_wait.html000066400000000000000000000117701340672067200252360ustar00rootroot00000000000000 basic_stream_socket::async_wait
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::ip::tcp::socket socket(io_context);
...
socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/async_write_some.html000066400000000000000000000144141340672067200264450ustar00rootroot00000000000000 basic_stream_socket::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write data to the stream socket. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be written to the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes written.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The write operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To write a single data buffer use the buffer function as follows:

socket.async_write_some(asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/at_mark.html000066400000000000000000000062341340672067200245120ustar00rootroot00000000000000 basic_stream_socket::at_mark
asio C++ library

PrevUpHomeNext

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;
  » more...

bool at_mark(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/at_mark/000077500000000000000000000000001340672067200236175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/at_mark/overload1.html000066400000000000000000000073161340672067200264100ustar00rootroot00000000000000 basic_stream_socket::at_mark (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark() const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/at_mark/overload2.html000066400000000000000000000073761340672067200264170ustar00rootroot00000000000000 basic_stream_socket::at_mark (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is at the out-of-band data mark.

bool at_mark(
    asio::error_code & ec) const;

This function is used to check whether the socket input is currently positioned at the out-of-band data mark.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

A bool indicating whether the socket is at the out-of-band data mark.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/available.html000066400000000000000000000063261340672067200250160ustar00rootroot00000000000000 basic_stream_socket::available
asio C++ library

PrevUpHomeNext

Determine the number of bytes available for reading.

std::size_t available() const;
  » more...

std::size_t available(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/available/000077500000000000000000000000001340672067200241215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/available/overload1.html000066400000000000000000000073661340672067200267170ustar00rootroot00000000000000 basic_stream_socket::available (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available() const;

This function is used to determine the number of bytes that may be read without blocking.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/available/overload2.html000066400000000000000000000075061340672067200267140ustar00rootroot00000000000000 basic_stream_socket::available (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine the number of bytes available for reading.

std::size_t available(
    asio::error_code & ec) const;

This function is used to determine the number of bytes that may be read without blocking.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes that may be read without blocking, or 0 if an error occurs.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket.html000066400000000000000000000152431340672067200271000ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket
asio C++ library

PrevUpHomeNext

Construct a basic_stream_socket without opening it.

explicit basic_stream_socket(
    asio::io_context & io_context);
  » more...

Construct and open a basic_stream_socket.

basic_stream_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);
  » more...

Construct a basic_stream_socket, opening it and binding it to the given local endpoint.

basic_stream_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);
  » more...

Construct a basic_stream_socket on an existing native socket.

basic_stream_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);
  » more...

Move-construct a basic_stream_socket from another.

basic_stream_socket(
    basic_stream_socket && other);
  » more...

Move-construct a basic_stream_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_stream_socket(
    basic_stream_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/000077500000000000000000000000001340672067200262055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/overload1.html000066400000000000000000000075271340672067200310020ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_stream_socket without opening it.

basic_stream_socket(
    asio::io_context & io_context);

This constructor creates a stream socket without opening it. The socket needs to be opened and then connected or accepted before data can be sent or received on it.

Parameters

io_context

The io_context object that the stream socket will use to dispatch handlers for any asynchronous operations performed on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/overload2.html000066400000000000000000000107501340672067200307730ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a basic_stream_socket.

basic_stream_socket(
    asio::io_context & io_context,
    const protocol_type & protocol);

This constructor creates and opens a stream socket. The socket needs to be connected or accepted before data can be sent or received on it.

Parameters

io_context

The io_context object that the stream socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/overload3.html000066400000000000000000000112121340672067200307660ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_stream_socket, opening it and binding it to the given local endpoint.

basic_stream_socket(
    asio::io_context & io_context,
    const endpoint_type & endpoint);

This constructor creates a stream socket and automatically opens it bound to the specified endpoint on the local machine. The protocol used is the protocol associated with the given endpoint.

Parameters

io_context

The io_context object that the stream socket will use to dispatch handlers for any asynchronous operations performed on the socket.

endpoint

An endpoint on the local machine to which the stream socket will be bound.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/overload4.html000066400000000000000000000112201340672067200307660ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_stream_socket on an existing native socket.

basic_stream_socket(
    asio::io_context & io_context,
    const protocol_type & protocol,
    const native_handle_type & native_socket);

This constructor creates a stream socket object to hold an existing native socket.

Parameters

io_context

The io_context object that the stream socket will use to dispatch handlers for any asynchronous operations performed on the socket.

protocol

An object specifying protocol parameters to be used.

native_socket

The new underlying socket implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/overload5.html000066400000000000000000000102661340672067200310000ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_stream_socket from another.

basic_stream_socket(
    basic_stream_socket && other);

This constructor moves a stream socket from one object to another.

Parameters

other

The other basic_stream_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_stream_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/basic_stream_socket/overload6.html000066400000000000000000000106211340672067200307740ustar00rootroot00000000000000 basic_stream_socket::basic_stream_socket (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_stream_socket from a socket of another protocol type.

template<
    typename Protocol1>
basic_stream_socket(
    basic_stream_socket< Protocol1 > && other,
    typename enable_if< is_convertible< Protocol1, Protocol >::value >::type *  = 0);

This constructor moves a stream socket from one object to another.

Parameters

other

The other basic_stream_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_stream_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/bind.html000066400000000000000000000063171340672067200240120ustar00rootroot00000000000000 basic_stream_socket::bind
asio C++ library

PrevUpHomeNext

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);
  » more...

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/bind/000077500000000000000000000000001340672067200231155ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/bind/overload1.html000066400000000000000000000103301340672067200256740ustar00rootroot00000000000000 basic_stream_socket::bind (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/bind/overload2.html000066400000000000000000000077311340672067200257100ustar00rootroot00000000000000 basic_stream_socket::bind (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Bind the socket to the given local endpoint.

void bind(
    const endpoint_type & endpoint,
    asio::error_code & ec);

This function binds the socket to the specified endpoint on the local machine.

Parameters

endpoint

An endpoint on the local machine to which the socket will be bound.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());
asio::error_code ec;
socket.bind(asio::ip::tcp::endpoint(
      asio::ip::tcp::v4(), 12345), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/broadcast.html000066400000000000000000000077551340672067200250470ustar00rootroot00000000000000 basic_stream_socket::broadcast
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/bytes_readable.html000066400000000000000000000074371340672067200260470ustar00rootroot00000000000000 basic_stream_socket::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/cancel.html000066400000000000000000000061651340672067200243240ustar00rootroot00000000000000 basic_stream_socket::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the socket.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/cancel/000077500000000000000000000000001340672067200234265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/cancel/overload1.html000066400000000000000000000126301340672067200262120ustar00rootroot00000000000000 basic_stream_socket::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/cancel/overload2.html000066400000000000000000000126741340672067200262230ustar00rootroot00000000000000 basic_stream_socket::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Cancel all asynchronous operations associated with the socket.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Calls to cancel() will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows, unless ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has two issues that should be considered before enabling its use:

  • It will only cancel asynchronous operations that were initiated in the current thread.
  • It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

  • Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.
  • Use the close() function to simultaneously cancel the outstanding operations and close the socket.

When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used. This function does not have the problems described above.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/close.html000066400000000000000000000061051340672067200241760ustar00rootroot00000000000000 basic_stream_socket::close
asio C++ library

PrevUpHomeNext

Close the socket.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/close/000077500000000000000000000000001340672067200233065ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/close/overload1.html000066400000000000000000000076521340672067200261020ustar00rootroot00000000000000 basic_stream_socket::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close();

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.

Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/close/overload2.html000066400000000000000000000106371340672067200261000ustar00rootroot00000000000000 basic_stream_socket::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Close the socket.

void close(
    asio::error_code & ec);

This function is used to close the socket. Any asynchronous send, receive or connect operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.close(ec);
if (ec)
{
  // An error occurred.
}
Remarks

For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/connect.html000066400000000000000000000063361340672067200245300ustar00rootroot00000000000000 basic_stream_socket::connect
asio C++ library

PrevUpHomeNext

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);
  » more...

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/connect/000077500000000000000000000000001340672067200236325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/connect/overload1.html000066400000000000000000000111571340672067200264210ustar00rootroot00000000000000 basic_stream_socket::connect (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
socket.connect(endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/connect/overload2.html000066400000000000000000000105131340672067200264150ustar00rootroot00000000000000 basic_stream_socket::connect (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Connect the socket to the specified endpoint.

void connect(
    const endpoint_type & peer_endpoint,
    asio::error_code & ec);

This function is used to connect a socket to the specified remote endpoint. The function call will block until the connection is successfully made or an error occurs.

The socket is automatically opened if it is not already open. If the connect fails, and the socket was automatically opened, the socket is not returned to the closed state.

Parameters

peer_endpoint

The remote endpoint to which the socket will be connected.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::ip::tcp::endpoint endpoint(
    asio::ip::address::from_string("1.2.3.4"), 12345);
asio::error_code ec;
socket.connect(endpoint, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/debug.html000066400000000000000000000076421340672067200241660ustar00rootroot00000000000000 basic_stream_socket::debug
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/do_not_route.html000066400000000000000000000100451340672067200255670ustar00rootroot00000000000000 basic_stream_socket::do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/enable_connection_aborted.html000066400000000000000000000106461340672067200302430ustar00rootroot00000000000000 basic_stream_socket::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/endpoint_type.html000066400000000000000000000062311340672067200257520ustar00rootroot00000000000000 basic_stream_socket::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef Protocol::endpoint endpoint_type;
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/executor_type.html000066400000000000000000000203671340672067200257760ustar00rootroot00000000000000 basic_stream_socket::executor_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/get_executor.html000066400000000000000000000052421340672067200255670ustar00rootroot00000000000000 basic_stream_socket::get_executor
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/get_io_context.html000066400000000000000000000073231340672067200261060ustar00rootroot00000000000000 basic_stream_socket::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/get_io_service.html000066400000000000000000000073131340672067200260610ustar00rootroot00000000000000 basic_stream_socket::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/get_option.html000066400000000000000000000070541340672067200252440ustar00rootroot00000000000000 basic_stream_socket::get_option
asio C++ library

PrevUpHomeNext

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;
  » more...

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/get_option/000077500000000000000000000000001340672067200243505ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/get_option/overload1.html000066400000000000000000000110421340672067200271300ustar00rootroot00000000000000 basic_stream_socket::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
socket.get_option(option);
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/get_option/overload2.html000066400000000000000000000103751340672067200271410ustar00rootroot00000000000000 basic_stream_socket::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get an option from the socket.

template<
    typename GettableSocketOption>
void get_option(
    GettableSocketOption & option,
    asio::error_code & ec) const;

This function is used to get the current value of an option on the socket.

Parameters

option

The option value to be obtained from the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the value of the SOL_SOCKET/SO_KEEPALIVE option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::keep_alive option;
asio::error_code ec;
socket.get_option(option, ec);
if (ec)
{
  // An error occurred.
}
bool is_set = option.value();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/io_control.html000066400000000000000000000070631340672067200252440ustar00rootroot00000000000000 basic_stream_socket::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/io_control/000077500000000000000000000000001340672067200243505ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/io_control/overload1.html000066400000000000000000000110431340672067200271310ustar00rootroot00000000000000 basic_stream_socket::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
socket.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/io_control/overload2.html000066400000000000000000000103621340672067200271350ustar00rootroot00000000000000 basic_stream_socket::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Perform an IO control command on the socket.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the socket.

Parameters

command

The IO control command to be performed on the socket.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::socket::bytes_readable command;
asio::error_code ec;
socket.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/is_open.html000066400000000000000000000052121340672067200245230ustar00rootroot00000000000000 basic_stream_socket::is_open
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Determine whether the socket is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/keep_alive.html000066400000000000000000000076451340672067200252070ustar00rootroot00000000000000 basic_stream_socket::keep_alive
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/linger.html000066400000000000000000000077721340672067200243640ustar00rootroot00000000000000 basic_stream_socket::linger
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/local_endpoint.html000066400000000000000000000063721340672067200260710ustar00rootroot00000000000000 basic_stream_socket::local_endpoint
asio C++ library

PrevUpHomeNext

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;
  » more...

endpoint_type local_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/local_endpoint/000077500000000000000000000000001340672067200251735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/local_endpoint/overload1.html000066400000000000000000000103421340672067200277550ustar00rootroot00000000000000 basic_stream_socket::local_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint() const;

This function is used to obtain the locally bound endpoint of the socket.

Return Value

An object that represents the local endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.local_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/local_endpoint/overload2.html000066400000000000000000000106151340672067200277610ustar00rootroot00000000000000 basic_stream_socket::local_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the local endpoint of the socket.

endpoint_type local_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the locally bound endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the local endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/lowest_layer.html000066400000000000000000000066001340672067200256020ustar00rootroot00000000000000 basic_stream_socket::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/lowest_layer/000077500000000000000000000000001340672067200247125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/lowest_layer/overload1.html000066400000000000000000000067711340672067200275070ustar00rootroot00000000000000 basic_stream_socket::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/lowest_layer/overload2.html000066400000000000000000000070531340672067200275020ustar00rootroot00000000000000 basic_stream_socket::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a basic_socket cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/lowest_layer_type.html000066400000000000000000000741351340672067200266530ustar00rootroot00000000000000 basic_stream_socket::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

A basic_socket is always the lowest layer.

typedef basic_socket< Protocol > lowest_layer_type;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_socket

Construct a basic_socket without opening it.

Construct and open a basic_socket.

Construct a basic_socket, opening it and binding it to the given local endpoint.

Construct a basic_socket on an existing native socket.

Move-construct a basic_socket from another.

Move-construct a basic_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_socket from another.

Move-assign a basic_socket from a socket of another protocol type.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~basic_socket

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket class template provides functionality that is common to both stream-oriented and datagram-oriented sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/max_connections.html000066400000000000000000000055101340672067200262570ustar00rootroot00000000000000 basic_stream_socket::max_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/max_listen_connections.html000066400000000000000000000054651340672067200276460ustar00rootroot00000000000000 basic_stream_socket::max_listen_connections
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/message_do_not_route.html000066400000000000000000000054761340672067200273070ustar00rootroot00000000000000 basic_stream_socket::message_do_not_route
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/message_end_of_record.html000066400000000000000000000054301340672067200273650ustar00rootroot00000000000000 basic_stream_socket::message_end_of_record
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/message_flags.html000066400000000000000000000064471340672067200257020ustar00rootroot00000000000000 basic_stream_socket::message_flags
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/message_out_of_band.html000066400000000000000000000053211340672067200270530ustar00rootroot00000000000000 basic_stream_socket::message_out_of_band
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/message_peek.html000066400000000000000000000053421340672067200255230ustar00rootroot00000000000000 basic_stream_socket::message_peek
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/native_handle.html000066400000000000000000000056231340672067200256760ustar00rootroot00000000000000 basic_stream_socket::native_handle
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the native socket representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the socket. This is intended to allow access to native socket functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/native_handle_type.html000066400000000000000000000063201340672067200267320ustar00rootroot00000000000000 basic_stream_socket::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a socket.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/native_non_blocking.html000066400000000000000000000076031340672067200271050ustar00rootroot00000000000000 basic_stream_socket::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/native_non_blocking/000077500000000000000000000000001340672067200262115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/native_non_blocking/overload1.html000066400000000000000000000153701340672067200310010ustar00rootroot00000000000000 basic_stream_socket::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the native socket implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native socket. This mode has no effect on the behaviour of the socket object's synchronous operations.

Return Value

true if the underlying socket is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the socket object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native socket.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/native_non_blocking/overload2.html000066400000000000000000000163471340672067200310070ustar00rootroot00000000000000 basic_stream_socket::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/native_non_blocking/overload3.html000066400000000000000000000155421340672067200310040ustar00rootroot00000000000000 basic_stream_socket::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the native socket implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native socket. It has no effect on the behaviour of the socket object's synchronous operations.

Parameters

mode

If true, the underlying socket is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.

Example

This function is intended to allow the encapsulation of arbitrary non-blocking system calls as asynchronous operations, in a way that is transparent to the user of the socket object. The following example illustrates how Linux's sendfile system call might be encapsulated:

template <typename Handler>
struct sendfile_op
{
  tcp::socket& sock_;
  int fd_;
  Handler handler_;
  off_t offset_;
  std::size_t total_bytes_transferred_;

  // Function call operator meeting WriteHandler requirements.
  // Used as the handler for the async_write_some operation.
  void operator()(asio::error_code ec, std::size_t)
  {
    // Put the underlying socket into non-blocking mode.
    if (!ec)
      if (!sock_.native_non_blocking())
        sock_.native_non_blocking(true, ec);

    if (!ec)
    {
      for (;;)
      {
        // Try the system call.
        errno = 0;
        int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536);
        ec = asio::error_code(n < 0 ? errno : 0,
            asio::error::get_system_category());
        total_bytes_transferred_ += ec ? 0 : n;

        // Retry operation immediately if interrupted by signal.
        if (ec == asio::error::interrupted)
          continue;

        // Check if we need to run the operation again.
        if (ec == asio::error::would_block
            || ec == asio::error::try_again)
        {
          // We have to wait for the socket to become ready again.
          sock_.async_wait(tcp::socket::wait_write, *this);
          return;
        }

        if (ec || n == 0)
        {
          // An error occurred, or we have reached the end of the file.
          // Either way we must exit the loop so we can call the handler.
          break;
        }

        // Loop around to try calling sendfile again.
      }
    }

    // Pass result back to user's handler.
    handler_(ec, total_bytes_transferred_);
  }
};

template <typename Handler>
void async_sendfile(tcp::socket& sock, int fd, Handler h)
{
  sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
  sock.async_wait(tcp::socket::wait_write, op);
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/non_blocking.html000066400000000000000000000073351340672067200255410ustar00rootroot00000000000000 basic_stream_socket::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the socket.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/non_blocking/000077500000000000000000000000001340672067200246435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/non_blocking/overload1.html000066400000000000000000000077031340672067200274340ustar00rootroot00000000000000 basic_stream_socket::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Gets the non-blocking mode of the socket.

bool non_blocking() const;
Return Value

true if the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/non_blocking/overload2.html000066400000000000000000000111421340672067200274250ustar00rootroot00000000000000 basic_stream_socket::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/non_blocking/overload3.html000066400000000000000000000103311340672067200274250ustar00rootroot00000000000000 basic_stream_socket::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Sets the non-blocking mode of the socket.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the socket's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/open.html000066400000000000000000000063061340672067200240350ustar00rootroot00000000000000 basic_stream_socket::open
asio C++ library

PrevUpHomeNext

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());
  » more...

void open(
    const protocol_type & protocol,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/open/000077500000000000000000000000001340672067200231425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/open/overload1.html000066400000000000000000000102031340672067200257200ustar00rootroot00000000000000 basic_stream_socket::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol = protocol_type());

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying protocol parameters to be used.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
socket.open(asio::ip::tcp::v4());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/open/overload2.html000066400000000000000000000075711340672067200257370ustar00rootroot00000000000000 basic_stream_socket::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Open the socket using the specified protocol.

void open(
    const protocol_type & protocol,
    asio::error_code & ec);

This function opens the socket so that it will use the specified protocol.

Parameters

protocol

An object specifying which protocol is to be used.

ec

Set to indicate what error occurred, if any.

Example
asio::ip::tcp::socket socket(io_context);
asio::error_code ec;
socket.open(asio::ip::tcp::v4(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/operator_eq_.html000066400000000000000000000076021340672067200255530ustar00rootroot00000000000000 basic_stream_socket::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_stream_socket from another.

basic_stream_socket & operator=(
    basic_stream_socket && other);
  » more...

Move-assign a basic_stream_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_stream_socket >::type & operator=(
    basic_stream_socket< Protocol1 > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/operator_eq_/000077500000000000000000000000001340672067200246605ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/operator_eq_/overload1.html000066400000000000000000000101101340672067200274330ustar00rootroot00000000000000 basic_stream_socket::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_stream_socket from another.

basic_stream_socket & operator=(
    basic_stream_socket && other);

This assignment operator moves a stream socket from one object to another.

Parameters

other

The other basic_stream_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_stream_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/operator_eq_/overload2.html000066400000000000000000000105221340672067200274430ustar00rootroot00000000000000 basic_stream_socket::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign a basic_stream_socket from a socket of another protocol type.

template<
    typename Protocol1>
enable_if< is_convertible< Protocol1, Protocol >::value, basic_stream_socket >::type & operator=(
    basic_stream_socket< Protocol1 > && other);

This assignment operator moves a stream socket from one object to another.

Parameters

other

The other basic_stream_socket object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_stream_socket(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/out_of_band_inline.html000066400000000000000000000102431340672067200267040ustar00rootroot00000000000000 basic_stream_socket::out_of_band_inline
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/protocol_type.html000066400000000000000000000061431340672067200257750ustar00rootroot00000000000000 basic_stream_socket::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef Protocol protocol_type;
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/read_some.html000066400000000000000000000070551340672067200250340ustar00rootroot00000000000000 basic_stream_socket::read_some
asio C++ library

PrevUpHomeNext

Read some data from the socket.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/read_some/000077500000000000000000000000001340672067200241375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/read_some/overload1.html000066400000000000000000000140661340672067200267300ustar00rootroot00000000000000 basic_stream_socket::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the socket.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

This function is used to read data from the stream socket. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

Return Value

The number of bytes read.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To read into a single data buffer use the buffer function as follows:

socket.read_some(asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/read_some/overload2.html000066400000000000000000000113401340672067200267210ustar00rootroot00000000000000 basic_stream_socket::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the socket.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read data from the stream socket. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. Returns 0 if an error occurred.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/receive.html000066400000000000000000000103051340672067200245100ustar00rootroot00000000000000 basic_stream_socket::receive
asio C++ library

PrevUpHomeNext

Receive some data on the socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/receive/000077500000000000000000000000001340672067200236235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/receive/overload1.html000066400000000000000000000140161340672067200264070ustar00rootroot00000000000000 basic_stream_socket::receive (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on the socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers);

This function is used to receive data on the stream socket. The function call will block until one or more bytes of data has been received successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To receive into a single data buffer use the buffer function as follows:

socket.receive(asio::buffer(data, size));

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/receive/overload2.html000066400000000000000000000143311340672067200264100ustar00rootroot00000000000000 basic_stream_socket::receive (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on the socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to receive data on the stream socket. The function call will block until one or more bytes of data has been received successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

flags

Flags specifying how the receive call is to be made.

Return Value

The number of bytes received.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To receive into a single data buffer use the buffer function as follows:

socket.receive(asio::buffer(data, size), 0);

See the buffer documentation for information on receiving into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/receive/overload3.html000066400000000000000000000116711340672067200264150ustar00rootroot00000000000000 basic_stream_socket::receive (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Receive some data on a connected socket.

template<
    typename MutableBufferSequence>
std::size_t receive(
    const MutableBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to receive data on the stream socket. The function call will block until one or more bytes of data has been received successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be received.

flags

Flags specifying how the receive call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes received. Returns 0 if an error occurred.

Remarks

The receive operation may not receive all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/receive_buffer_size.html000066400000000000000000000102711340672067200270750ustar00rootroot00000000000000 basic_stream_socket::receive_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/receive_low_watermark.html000066400000000000000000000102321340672067200274450ustar00rootroot00000000000000 basic_stream_socket::receive_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/release.html000066400000000000000000000062651340672067200245200ustar00rootroot00000000000000 basic_stream_socket::release
asio C++ library

PrevUpHomeNext

Release ownership of the underlying native socket.

native_handle_type release();
  » more...

native_handle_type release(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/release/000077500000000000000000000000001340672067200236215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/release/overload1.html000066400000000000000000000100321340672067200263770ustar00rootroot00000000000000 basic_stream_socket::release (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release();

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/release/overload2.html000066400000000000000000000101421340672067200264020ustar00rootroot00000000000000 basic_stream_socket::release (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Release ownership of the underlying native socket.

native_handle_type release(
    asio::error_code & ec);

This function causes all outstanding asynchronous connect, send and receive operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error. Ownership of the native socket is then transferred to the caller.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

This function is unsupported on Windows versions prior to Windows 8.1, and will fail with asio::error::operation_not_supported on these platforms.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/remote_endpoint.html000066400000000000000000000065041340672067200262670ustar00rootroot00000000000000 basic_stream_socket::remote_endpoint
asio C++ library

PrevUpHomeNext

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;
  » more...

endpoint_type remote_endpoint(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/remote_endpoint/000077500000000000000000000000001340672067200253745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/remote_endpoint/overload1.html000066400000000000000000000103651340672067200301630ustar00rootroot00000000000000 basic_stream_socket::remote_endpoint (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint() const;

This function is used to obtain the remote endpoint of the socket.

Return Value

An object that represents the remote endpoint of the socket.

Exceptions

asio::system_error

Thrown on failure.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/remote_endpoint/overload2.html000066400000000000000000000106401340672067200301600ustar00rootroot00000000000000 basic_stream_socket::remote_endpoint (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Get the remote endpoint of the socket.

endpoint_type remote_endpoint(
    asio::error_code & ec) const;

This function is used to obtain the remote endpoint of the socket.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

An object that represents the remote endpoint of the socket. Returns a default-constructed endpoint object if an error occurred.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/reuse_address.html000066400000000000000000000101501340672067200257140ustar00rootroot00000000000000 basic_stream_socket::reuse_address
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/send.html000066400000000000000000000077411340672067200240310ustar00rootroot00000000000000 basic_stream_socket::send
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);
  » more...

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/send/000077500000000000000000000000001340672067200231325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/send/overload1.html000066400000000000000000000133501340672067200257160ustar00rootroot00000000000000 basic_stream_socket::send (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers);

This function is used to send data on the stream socket. The function call will block until one or more bytes of the data has been sent successfully, or an until error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The send operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.

Example

To send a single data buffer use the buffer function as follows:

socket.send(asio::buffer(data, size));

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/send/overload2.html000066400000000000000000000136711340672067200257250ustar00rootroot00000000000000 basic_stream_socket::send (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags);

This function is used to send data on the stream socket. The function call will block until one or more bytes of the data has been sent successfully, or an until error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

Return Value

The number of bytes sent.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The send operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.

Example

To send a single data buffer use the buffer function as follows:

socket.send(asio::buffer(data, size), 0);

See the buffer documentation for information on sending multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/send/overload3.html000066400000000000000000000114721340672067200257230ustar00rootroot00000000000000 basic_stream_socket::send (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Send some data on the socket.

template<
    typename ConstBufferSequence>
std::size_t send(
    const ConstBufferSequence & buffers,
    socket_base::message_flags flags,
    asio::error_code & ec);

This function is used to send data on the stream socket. The function call will block until one or more bytes of the data has been sent successfully, or an until error occurs.

Parameters

buffers

One or more data buffers to be sent on the socket.

flags

Flags specifying how the send call is to be made.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes sent. Returns 0 if an error occurred.

Remarks

The send operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/send_buffer_size.html000066400000000000000000000101531340672067200264030ustar00rootroot00000000000000 basic_stream_socket::send_buffer_size
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/send_low_watermark.html000066400000000000000000000101441340672067200267560ustar00rootroot00000000000000 basic_stream_socket::send_low_watermark
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/basic_stream_socket.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/set_option.html000066400000000000000000000070721340672067200252600ustar00rootroot00000000000000 basic_stream_socket::set_option
asio C++ library

PrevUpHomeNext

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);
  » more...

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/set_option/000077500000000000000000000000001340672067200243645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/set_option/overload1.html000066400000000000000000000107311340672067200271500ustar00rootroot00000000000000 basic_stream_socket::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

Exceptions

asio::system_error

Thrown on failure.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
socket.set_option(option);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/set_option/overload2.html000066400000000000000000000102541340672067200271510ustar00rootroot00000000000000 basic_stream_socket::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Set an option on the socket.

template<
    typename SettableSocketOption>
void set_option(
    const SettableSocketOption & option,
    asio::error_code & ec);

This function is used to set an option on the socket.

Parameters

option

The new option value to be set on the socket.

ec

Set to indicate what error occurred, if any.

Example

Setting the IPPROTO_TCP/TCP_NODELAY option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
asio::error_code ec;
socket.set_option(option, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/shutdown.html000066400000000000000000000063271340672067200247520ustar00rootroot00000000000000 basic_stream_socket::shutdown
asio C++ library

PrevUpHomeNext

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);
  » more...

void shutdown(
    shutdown_type what,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/shutdown/000077500000000000000000000000001340672067200240545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/shutdown/overload1.html000066400000000000000000000104601340672067200266370ustar00rootroot00000000000000 basic_stream_socket::shutdown (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

Exceptions

asio::system_error

Thrown on failure.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
socket.shutdown(asio::ip::tcp::socket::shutdown_send);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/shutdown/overload2.html000066400000000000000000000100451340672067200266370ustar00rootroot00000000000000 basic_stream_socket::shutdown (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Disable sends or receives on the socket.

void shutdown(
    shutdown_type what,
    asio::error_code & ec);

This function is used to disable send operations, receive operations, or both.

Parameters

what

Determines what types of operation will no longer be allowed.

ec

Set to indicate what error occurred, if any.

Example

Shutting down the send side of the socket:

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/shutdown_type.html000066400000000000000000000073321340672067200260100ustar00rootroot00000000000000 basic_stream_socket::shutdown_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/wait.html000066400000000000000000000062271340672067200240420ustar00rootroot00000000000000 basic_stream_socket::wait
asio C++ library

PrevUpHomeNext

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/wait/000077500000000000000000000000001340672067200231455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/wait/overload1.html000066400000000000000000000074361340672067200257410ustar00rootroot00000000000000 basic_stream_socket::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
socket.wait(asio::ip::tcp::socket::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/wait/overload2.html000066400000000000000000000077611340672067200257430ustar00rootroot00000000000000 basic_stream_socket::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from basic_socket.

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a socket to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired socket state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a socket to become readable.

asio::ip::tcp::socket socket(io_context);
...
asio::error_code ec;
socket.wait(asio::ip::tcp::socket::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/wait_type.html000066400000000000000000000074461340672067200251070ustar00rootroot00000000000000 basic_stream_socket::wait_type
asio C++ library

PrevUpHomeNext

Inherited from socket_base.

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/write_some.html000066400000000000000000000070461340672067200252530ustar00rootroot00000000000000 basic_stream_socket::write_some
asio C++ library

PrevUpHomeNext

Write some data to the socket.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/write_some/000077500000000000000000000000001340672067200243565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_stream_socket/write_some/overload1.html000066400000000000000000000140741340672067200271460ustar00rootroot00000000000000 basic_stream_socket::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the socket.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

This function is used to write data to the stream socket. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the socket.

Return Value

The number of bytes written.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.

Example

To write a single data buffer use the buffer function as follows:

socket.write_some(asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_stream_socket/write_some/overload2.html000066400000000000000000000114301340672067200271400ustar00rootroot00000000000000 basic_stream_socket::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the socket.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write data to the stream socket. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the socket.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. Returns 0 if an error occurred.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf.html000066400000000000000000000322231340672067200222160ustar00rootroot00000000000000 basic_streambuf
asio C++ library

PrevUpHomeNext

Automatically resizable buffer class based on std::streambuf.

template<
    typename Allocator = std::allocator<char>>
class basic_streambuf :
  noncopyable
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

basic_streambuf

Construct a basic_streambuf object.

capacity

Get the current capacity of the basic_streambuf.

commit

Move characters from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

max_size

Get the maximum size of the basic_streambuf.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Protected Member Functions

Name

Description

overflow

Override std::streambuf behaviour.

reserve

underflow

Override std::streambuf behaviour.

The basic_streambuf class is derived from std::streambuf to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the basic_streambuf object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a basic_streambuf object are appended to the input sequence of the same object.

The basic_streambuf class's public interface is intended to permit the following implementation strategies:

  • A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.
  • A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
  • A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for basic_streambuf accepts a size_t argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the basic_streambuf object, the following invariant holds:

size() <= max_size()

Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class std::length_error.

The constructor for basic_streambuf takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each basic_streambuf object.

Examples

Writing directly from an streambuf to a socket:

asio::streambuf b;
std::ostream os(&b);
os << "Hello, World!\n";

// try sending some data in input sequence
size_t n = sock.send(b.data());

b.consume(n); // sent data is removed from input sequence

Reading from a socket directly into a streambuf:

asio::streambuf b;

// reserve 512 bytes in output sequence
asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

size_t n = sock.receive(bufs);

// received data is "committed" from output sequence to input sequence
b.commit(n);

std::istream is(&b);
std::string s;
is >> s;
Requirements

Header: asio/basic_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/000077500000000000000000000000001340672067200213265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_streambuf/basic_streambuf.html000066400000000000000000000056201340672067200253500ustar00rootroot00000000000000 basic_streambuf::basic_streambuf
asio C++ library

PrevUpHomeNext

Construct a basic_streambuf object.

basic_streambuf(
    std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)(),
    const Allocator & allocator = Allocator());

Constructs a streambuf with the specified maximum size. The initial size of the streambuf's input sequence is 0.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/capacity.html000066400000000000000000000057641340672067200240250ustar00rootroot00000000000000 basic_streambuf::capacity
asio C++ library

PrevUpHomeNext

Get the current capacity of the basic_streambuf.

std::size_t capacity() const;
Return Value

The current total capacity of the streambuf, i.e. for both the input sequence and output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/commit.html000066400000000000000000000067071340672067200235160ustar00rootroot00000000000000 basic_streambuf::commit
asio C++ library

PrevUpHomeNext

Move characters from the output sequence to the input sequence.

void commit(
    std::size_t n);

Appends n characters from the start of the output sequence to the input sequence. The beginning of the output sequence is advanced by n characters.

Requires a preceding call prepare(x) where x >= n, and no intervening operations that modify the input or output sequence.

Remarks

If n is greater than the size of the output sequence, the entire output sequence is moved to the input sequence and no error is issued.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/const_buffers_type.html000066400000000000000000000061451340672067200261250ustar00rootroot00000000000000 basic_streambuf::const_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the input sequence as a list of buffers.

typedef implementation_defined const_buffers_type;
Requirements

Header: asio/basic_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/consume.html000066400000000000000000000060401340672067200236650ustar00rootroot00000000000000 basic_streambuf::consume
asio C++ library

PrevUpHomeNext

Remove characters from the input sequence.

void consume(
    std::size_t n);

Removes n characters from the beginning of the input sequence.

Remarks

If n is greater than the size of the input sequence, the entire input sequence is consumed and no error is issued.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/data.html000066400000000000000000000065461340672067200231400ustar00rootroot00000000000000 basic_streambuf::data
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the input sequence.

const_buffers_type data() const;
Return Value

An object of type const_buffers_type that satisfies ConstBufferSequence requirements, representing all character arrays in the input sequence.

Remarks

The returned object is invalidated by any basic_streambuf member function that modifies the input sequence or output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/max_size.html000066400000000000000000000057601340672067200240430ustar00rootroot00000000000000 basic_streambuf::max_size
asio C++ library

PrevUpHomeNext

Get the maximum size of the basic_streambuf.

std::size_t max_size() const;
Return Value

The allowed maximum of the sum of the sizes of the input sequence and output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/mutable_buffers_type.html000066400000000000000000000062101340672067200264210ustar00rootroot00000000000000 basic_streambuf::mutable_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the output sequence as a list of buffers.

typedef implementation_defined mutable_buffers_type;
Requirements

Header: asio/basic_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/overflow.html000066400000000000000000000056171340672067200240700ustar00rootroot00000000000000 basic_streambuf::overflow
asio C++ library

PrevUpHomeNext

Override std::streambuf behaviour.

int_type overflow(
    int_type c);

Behaves according to the specification of std::streambuf::overflow(), with the specialisation that std::length_error is thrown if appending the character to the input sequence would require the condition size() > max_size() to be true.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/prepare.html000066400000000000000000000103201340672067200236460ustar00rootroot00000000000000 basic_streambuf::prepare
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the output sequence, with the given size.

mutable_buffers_type prepare(
    std::size_t n);

Ensures that the output sequence can accommodate n characters, reallocating character array objects as necessary.

Return Value

An object of type mutable_buffers_type that satisfies MutableBufferSequence requirements, representing character array objects at the start of the output sequence such that the sum of the buffer sizes is n.

Exceptions

std::length_error

If size() + n > max_size().

Remarks

The returned object is invalidated by any basic_streambuf member function that modifies the input sequence or output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/reserve.html000066400000000000000000000046051340672067200236740ustar00rootroot00000000000000 basic_streambuf::reserve
asio C++ library

PrevUpHomeNext

void reserve(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/size.html000066400000000000000000000060671340672067200231770ustar00rootroot00000000000000 basic_streambuf::size
asio C++ library

PrevUpHomeNext

Get the size of the input sequence.

std::size_t size() const;
Return Value

The size of the input sequence. The value is equal to that calculated for s in the following code:

size_t s = 0;
const_buffers_type bufs = data();
const_buffers_type::const_iterator i = bufs.begin();
while (i != bufs.end())
{
  const_buffer buf(*i++);
  s += buf.size();
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf/underflow.html000066400000000000000000000051411340672067200242220ustar00rootroot00000000000000 basic_streambuf::underflow
asio C++ library

PrevUpHomeNext

Override std::streambuf behaviour.

int_type underflow();

Behaves according to the specification of std::streambuf::underflow().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref.html000066400000000000000000000206001340672067200230460ustar00rootroot00000000000000 basic_streambuf_ref
asio C++ library

PrevUpHomeNext

Adapts basic_streambuf to the dynamic buffer sequence type requirements.

template<
    typename Allocator = std::allocator<char>>
class basic_streambuf_ref
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

basic_streambuf_ref

Construct a basic_streambuf_ref for the given basic_streambuf object.

Copy construct a basic_streambuf_ref.

Move construct a basic_streambuf_ref.

capacity

Get the current capacity of the dynamic buffer.

commit

Move bytes from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

max_size

Get the maximum size of the dynamic buffer.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Requirements

Header: asio/basic_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/000077500000000000000000000000001340672067200221625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_streambuf_ref/basic_streambuf_ref.html000066400000000000000000000107561340672067200270460ustar00rootroot00000000000000 basic_streambuf_ref::basic_streambuf_ref
asio C++ library

PrevUpHomeNext

Construct a basic_streambuf_ref for the given basic_streambuf object.

explicit basic_streambuf_ref(
    basic_streambuf< Allocator > & sb);
  » more...

Copy construct a basic_streambuf_ref.

basic_streambuf_ref(
    const basic_streambuf_ref & other);
  » more...

Move construct a basic_streambuf_ref.

basic_streambuf_ref(
    basic_streambuf_ref && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/basic_streambuf_ref/000077500000000000000000000000001340672067200261475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_streambuf_ref/basic_streambuf_ref/overload1.html000066400000000000000000000057751340672067200307470ustar00rootroot00000000000000 basic_streambuf_ref::basic_streambuf_ref (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a basic_streambuf_ref for the given basic_streambuf object.

basic_streambuf_ref(
    basic_streambuf< Allocator > & sb);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/basic_streambuf_ref/overload2.html000066400000000000000000000054711340672067200307410ustar00rootroot00000000000000 basic_streambuf_ref::basic_streambuf_ref (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy construct a basic_streambuf_ref.

basic_streambuf_ref(
    const basic_streambuf_ref & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/basic_streambuf_ref/overload3.html000066400000000000000000000054401340672067200307360ustar00rootroot00000000000000 basic_streambuf_ref::basic_streambuf_ref (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move construct a basic_streambuf_ref.

basic_streambuf_ref(
    basic_streambuf_ref && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/capacity.html000066400000000000000000000051271340672067200246520ustar00rootroot00000000000000 basic_streambuf_ref::capacity
asio C++ library

PrevUpHomeNext

Get the current capacity of the dynamic buffer.

std::size_t capacity() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/commit.html000066400000000000000000000050541340672067200243440ustar00rootroot00000000000000 basic_streambuf_ref::commit
asio C++ library

PrevUpHomeNext

Move bytes from the output sequence to the input sequence.

void commit(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/const_buffers_type.html000066400000000000000000000337261340672067200267660ustar00rootroot00000000000000 basic_streambuf_ref::const_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the input sequence as a list of buffers.

typedef basic_streambuf< Allocator >::const_buffers_type const_buffers_type;
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

basic_streambuf

Construct a basic_streambuf object.

capacity

Get the current capacity of the basic_streambuf.

commit

Move characters from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

max_size

Get the maximum size of the basic_streambuf.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Protected Member Functions

Name

Description

overflow

Override std::streambuf behaviour.

reserve

underflow

Override std::streambuf behaviour.

The basic_streambuf class is derived from std::streambuf to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the basic_streambuf object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a basic_streambuf object are appended to the input sequence of the same object.

The basic_streambuf class's public interface is intended to permit the following implementation strategies:

  • A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.
  • A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
  • A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for basic_streambuf accepts a size_t argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the basic_streambuf object, the following invariant holds:

size() <= max_size()

Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class std::length_error.

The constructor for basic_streambuf takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each basic_streambuf object.

Examples

Writing directly from an streambuf to a socket:

asio::streambuf b;
std::ostream os(&b);
os << "Hello, World!\n";

// try sending some data in input sequence
size_t n = sock.send(b.data());

b.consume(n); // sent data is removed from input sequence

Reading from a socket directly into a streambuf:

asio::streambuf b;

// reserve 512 bytes in output sequence
asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

size_t n = sock.receive(bufs);

// received data is "committed" from output sequence to input sequence
b.commit(n);

std::istream is(&b);
std::string s;
is >> s;
Requirements

Header: asio/basic_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/consume.html000066400000000000000000000050231340672067200245210ustar00rootroot00000000000000 basic_streambuf_ref::consume
asio C++ library

PrevUpHomeNext

Remove characters from the input sequence.

void consume(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/data.html000066400000000000000000000047631340672067200237730ustar00rootroot00000000000000 basic_streambuf_ref::data
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the input sequence.

const_buffers_type data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/max_size.html000066400000000000000000000050361340672067200246730ustar00rootroot00000000000000 basic_streambuf_ref::max_size
asio C++ library

PrevUpHomeNext

Get the maximum size of the dynamic buffer.

std::size_t max_size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/mutable_buffers_type.html000066400000000000000000000340271340672067200272640ustar00rootroot00000000000000 basic_streambuf_ref::mutable_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the output sequence as a list of buffers.

typedef basic_streambuf< Allocator >::mutable_buffers_type mutable_buffers_type;
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

basic_streambuf

Construct a basic_streambuf object.

capacity

Get the current capacity of the basic_streambuf.

commit

Move characters from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

max_size

Get the maximum size of the basic_streambuf.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Protected Member Functions

Name

Description

overflow

Override std::streambuf behaviour.

reserve

underflow

Override std::streambuf behaviour.

The basic_streambuf class is derived from std::streambuf to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the basic_streambuf object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a basic_streambuf object are appended to the input sequence of the same object.

The basic_streambuf class's public interface is intended to permit the following implementation strategies:

  • A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.
  • A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
  • A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for basic_streambuf accepts a size_t argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the basic_streambuf object, the following invariant holds:

size() <= max_size()

Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class std::length_error.

The constructor for basic_streambuf takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each basic_streambuf object.

Examples

Writing directly from an streambuf to a socket:

asio::streambuf b;
std::ostream os(&b);
os << "Hello, World!\n";

// try sending some data in input sequence
size_t n = sock.send(b.data());

b.consume(n); // sent data is removed from input sequence

Reading from a socket directly into a streambuf:

asio::streambuf b;

// reserve 512 bytes in output sequence
asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

size_t n = sock.receive(bufs);

// received data is "committed" from output sequence to input sequence
b.commit(n);

std::istream is(&b);
std::string s;
is >> s;
Requirements

Header: asio/basic_streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/prepare.html000066400000000000000000000051201340672067200245040ustar00rootroot00000000000000 basic_streambuf_ref::prepare
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the output sequence, with the given size.

mutable_buffers_type prepare(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_streambuf_ref/size.html000066400000000000000000000047721340672067200240340ustar00rootroot00000000000000 basic_streambuf_ref::size
asio C++ library

PrevUpHomeNext

Get the size of the input sequence.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer.html000066400000000000000000000430441340672067200232210ustar00rootroot00000000000000 basic_waitable_timer
asio C++ library

PrevUpHomeNext

Provides waitable timer functionality.

template<
    typename Clock,
    typename WaitTraits>
class basic_waitable_timer
Types

Name

Description

clock_type

The clock type.

duration

The duration type of the clock.

executor_type

The type of the executor associated with the object.

time_point

The time point type of the clock.

traits_type

The wait traits type.

Member Functions

Name

Description

async_wait

Start an asynchronous wait on the timer.

basic_waitable_timer

Constructor.

Constructor to set a particular expiry time as an absolute time.

Constructor to set a particular expiry time relative to now.

Move-construct a basic_waitable_timer from another.

cancel

Cancel any asynchronous operations that are waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer.

cancel_one

Cancels one asynchronous operation that is waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer.

expires_after

Set the timer's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time.

Set the timer's expiry time as an absolute time.

(Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the timer's expiry time relative to now.

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

expiry

Get the timer's expiry time as an absolute time.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_waitable_timer from another.

wait

Perform a blocking wait on the timer.

~basic_waitable_timer

Destroys the timer.

The basic_waitable_timer class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the wait() or async_wait() function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the steady_timer, system_timer or high_resolution_timer typedefs.

Remarks

This waitable timer functionality is for use with the C++11 standard library's <chrono> facility, or with the Boost.Chrono library.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Examples

Performing a blocking wait (C++11):

// Construct a timer without setting an expiry time.
asio::steady_timer timer(io_context);

// Set an expiry time relative to now.
timer.expires_after(std::chrono::seconds(5));

// Wait for the timer to expire.
timer.wait();

Performing an asynchronous wait (C++11):

void handler(const asio::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
asio::steady_timer timer(io_context,
    std::chrono::steady_clock::now() + std::chrono::seconds(60));

// Start an asynchronous wait.
timer.async_wait(handler);
Changing an active waitable timer's expiry time

Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:

void on_some_event()
{
  if (my_timer.expires_after(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const asio::error_code& e)
{
  if (e != asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}
  • The asio::basic_waitable_timer::expires_after() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.
  • If a wait handler is cancelled, the error_code passed to it contains the value asio::error::operation_aborted.
Requirements

Header: asio/basic_waitable_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/000077500000000000000000000000001340672067200223265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/_basic_waitable_timer.html000066400000000000000000000055201340672067200275060ustar00rootroot00000000000000 basic_waitable_timer::~basic_waitable_timer
asio C++ library

PrevUpHomeNext

Destroys the timer.

~basic_waitable_timer();

This function destroys the timer, cancelling any outstanding asynchronous wait operations associated with the timer as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/async_wait.html000066400000000000000000000112741340672067200253620ustar00rootroot00000000000000 basic_waitable_timer::async_wait
asio C++ library

PrevUpHomeNext

Start an asynchronous wait on the timer.

template<
    typename WaitHandler>
DEDUCED async_wait(
    WaitHandler && handler);

This function may be used to initiate an asynchronous wait against the timer. It always returns immediately.

For each call to async_wait(), the supplied handler will be called exactly once. The handler will be called when:

  • The timer has expired.
  • The timer was cancelled, in which case the handler is passed the error code asio::error::operation_aborted.
Parameters

handler

The handler to be called when the timer expires. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/basic_waitable_timer.html000066400000000000000000000112751340672067200273530ustar00rootroot00000000000000 basic_waitable_timer::basic_waitable_timer
asio C++ library

PrevUpHomeNext

Constructor.

explicit basic_waitable_timer(
    asio::io_context & io_context);
  » more...

Constructor to set a particular expiry time as an absolute time.

basic_waitable_timer(
    asio::io_context & io_context,
    const time_point & expiry_time);
  » more...

Constructor to set a particular expiry time relative to now.

basic_waitable_timer(
    asio::io_context & io_context,
    const duration & expiry_time);
  » more...

Move-construct a basic_waitable_timer from another.

basic_waitable_timer(
    basic_waitable_timer && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/basic_waitable_timer/000077500000000000000000000000001340672067200264575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/basic_waitable_timer/overload1.html000066400000000000000000000074261340672067200312520ustar00rootroot00000000000000 basic_waitable_timer::basic_waitable_timer (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Constructor.

basic_waitable_timer(
    asio::io_context & io_context);

This constructor creates a timer without setting an expiry time. The expires_at() or expires_after() functions must be called to set an expiry time before the timer can be waited on.

Parameters

io_context

The io_context object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/basic_waitable_timer/overload2.html000066400000000000000000000074751340672067200312570ustar00rootroot00000000000000 basic_waitable_timer::basic_waitable_timer (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Constructor to set a particular expiry time as an absolute time.

basic_waitable_timer(
    asio::io_context & io_context,
    const time_point & expiry_time);

This constructor creates a timer and sets the expiry time.

Parameters

io_context

The io_context object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer.

expiry_time

The expiry time to be used for the timer, expressed as an absolute time.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/basic_waitable_timer/overload3.html000066400000000000000000000074271340672067200312550ustar00rootroot00000000000000 basic_waitable_timer::basic_waitable_timer (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Constructor to set a particular expiry time relative to now.

basic_waitable_timer(
    asio::io_context & io_context,
    const duration & expiry_time);

This constructor creates a timer and sets the expiry time.

Parameters

io_context

The io_context object that the timer will use to dispatch handlers for any asynchronous operations performed on the timer.

expiry_time

The expiry time to be used for the timer, relative to now.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/basic_waitable_timer/overload4.html000066400000000000000000000102631340672067200312460ustar00rootroot00000000000000 basic_waitable_timer::basic_waitable_timer (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a basic_waitable_timer from another.

basic_waitable_timer(
    basic_waitable_timer && other);

This constructor moves a timer from one object to another.

Parameters

other

The other basic_waitable_timer object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_waitable_timer(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel.html000066400000000000000000000066221340672067200244470ustar00rootroot00000000000000 basic_waitable_timer::cancel
asio C++ library

PrevUpHomeNext

Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel();
  » more...

(Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel/000077500000000000000000000000001340672067200235535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel/overload1.html000066400000000000000000000114211340672067200263340ustar00rootroot00000000000000 basic_waitable_timer::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel();

This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when cancel() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel/overload2.html000066400000000000000000000116001340672067200263340ustar00rootroot00000000000000 basic_waitable_timer::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer.

std::size_t cancel(
    asio::error_code & ec);

This function forces the completion of any pending asynchronous wait operations against the timer. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled.

Remarks

If the timer has already expired when cancel() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel_one.html000066400000000000000000000066501340672067200253110ustar00rootroot00000000000000 basic_waitable_timer::cancel_one
asio C++ library

PrevUpHomeNext

Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one();
  » more...

(Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel_one/000077500000000000000000000000001340672067200244145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel_one/overload1.html000066400000000000000000000116701340672067200272030ustar00rootroot00000000000000 basic_waitable_timer::cancel_one (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one();

This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Return Value

The number of asynchronous operations that were cancelled. That is, either 0 or 1.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when cancel_one() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/cancel_one/overload2.html000066400000000000000000000120271340672067200272010ustar00rootroot00000000000000 basic_waitable_timer::cancel_one (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer.

std::size_t cancel_one(
    asio::error_code & ec);

This function forces the completion of one pending asynchronous wait operation against the timer. Handlers are cancelled in FIFO order. The handler for the cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancelling the timer does not change the expiry time.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled. That is, either 0 or 1.

Remarks

If the timer has already expired when cancel_one() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/clock_type.html000066400000000000000000000061301340672067200253500ustar00rootroot00000000000000 basic_waitable_timer::clock_type
asio C++ library

PrevUpHomeNext

The clock type.

typedef Clock clock_type;
Requirements

Header: asio/basic_waitable_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/duration.html000066400000000000000000000061041340672067200250420ustar00rootroot00000000000000 basic_waitable_timer::duration
asio C++ library

PrevUpHomeNext

The duration type of the clock.

typedef clock_type::duration duration;
Requirements

Header: asio/basic_waitable_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/executor_type.html000066400000000000000000000202351340672067200261150ustar00rootroot00000000000000 basic_waitable_timer::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/basic_waitable_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_after.html000066400000000000000000000122731340672067200260610ustar00rootroot00000000000000 basic_waitable_timer::expires_after
asio C++ library

PrevUpHomeNext

Set the timer's expiry time relative to now.

std::size_t expires_after(
    const duration & expiry_time);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when expires_after() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_at.html000066400000000000000000000076641340672067200253740ustar00rootroot00000000000000 basic_waitable_timer::expires_at
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time.

time_point expires_at() const;
  » more...

Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_point & expiry_time);
  » more...

(Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_point & expiry_time,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_at/000077500000000000000000000000001340672067200244715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_at/overload1.html000066400000000000000000000055131340672067200272570ustar00rootroot00000000000000 basic_waitable_timer::expires_at (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time.

time_point expires_at() const;

This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_at/overload2.html000066400000000000000000000125051340672067200272570ustar00rootroot00000000000000 basic_waitable_timer::expires_at (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_point & expiry_time);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when expires_at() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_at/overload3.html000066400000000000000000000120501340672067200272530ustar00rootroot00000000000000 basic_waitable_timer::expires_at (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time.

std::size_t expires_at(
    const time_point & expiry_time,
    asio::error_code & ec);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled.

Remarks

If the timer has already expired when expires_at() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_from_now.html000066400000000000000000000100051340672067200265750ustar00rootroot00000000000000 basic_waitable_timer::expires_from_now
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the timer's expiry time relative to now.

duration expires_from_now() const;
  » more...

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

std::size_t expires_from_now(
    const duration & expiry_time);
  » more...

std::size_t expires_from_now(
    const duration & expiry_time,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_from_now/000077500000000000000000000000001340672067200257135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_from_now/overload1.html000066400000000000000000000056311340672067200305020ustar00rootroot00000000000000 basic_waitable_timer::expires_from_now (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expiry().) Get the timer's expiry time relative to now.

duration expires_from_now() const;

This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_from_now/overload2.html000066400000000000000000000130421340672067200304760ustar00rootroot00000000000000 basic_waitable_timer::expires_from_now (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

std::size_t expires_from_now(
    const duration & expiry_time);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

Return Value

The number of asynchronous operations that were cancelled.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If the timer has already expired when expires_from_now() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expires_from_now/overload3.html000066400000000000000000000122161340672067200305010ustar00rootroot00000000000000 basic_waitable_timer::expires_from_now (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

std::size_t expires_from_now(
    const duration & expiry_time,
    asio::error_code & ec);

This function sets the expiry time. Any pending asynchronous wait operations will be cancelled. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Parameters

expiry_time

The expiry time to be used for the timer.

ec

Set to indicate what error occurred, if any.

Return Value

The number of asynchronous operations that were cancelled.

Remarks

If the timer has already expired when expires_from_now() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/expiry.html000066400000000000000000000054131340672067200245370ustar00rootroot00000000000000 basic_waitable_timer::expiry
asio C++ library

PrevUpHomeNext

Get the timer's expiry time as an absolute time.

time_point expiry() const;

This function may be used to obtain the timer's current expiry time. Whether the timer has expired or not does not affect this value.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/get_executor.html000066400000000000000000000050621340672067200257140ustar00rootroot00000000000000 basic_waitable_timer::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/get_io_context.html000066400000000000000000000072021340672067200262270ustar00rootroot00000000000000 basic_waitable_timer::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/get_io_service.html000066400000000000000000000071771340672067200262160ustar00rootroot00000000000000 basic_waitable_timer::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/operator_eq_.html000066400000000000000000000101051340672067200256700ustar00rootroot00000000000000 basic_waitable_timer::operator=
asio C++ library

PrevUpHomeNext

Move-assign a basic_waitable_timer from another.

basic_waitable_timer & operator=(
    basic_waitable_timer && other);

This assignment operator moves a timer from one object to another. Cancels any outstanding asynchronous operations associated with the target object.

Parameters

other

The other basic_waitable_timer object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_waitable_timer(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/time_point.html000066400000000000000000000061331340672067200253660ustar00rootroot00000000000000 basic_waitable_timer::time_point
asio C++ library

PrevUpHomeNext

The time point type of the clock.

typedef clock_type::time_point time_point;
Requirements

Header: asio/basic_waitable_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/traits_type.html000066400000000000000000000060551340672067200255710ustar00rootroot00000000000000 basic_waitable_timer::traits_type
asio C++ library

PrevUpHomeNext

The wait traits type.

typedef WaitTraits traits_type;
Requirements

Header: asio/basic_waitable_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/wait.html000066400000000000000000000060671340672067200241710ustar00rootroot00000000000000 basic_waitable_timer::wait
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the timer.

void wait();
  » more...

void wait(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/wait/000077500000000000000000000000001340672067200232725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_waitable_timer/wait/overload1.html000066400000000000000000000062041340672067200260560ustar00rootroot00000000000000 basic_waitable_timer::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the timer.

void wait();

This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_waitable_timer/wait/overload2.html000066400000000000000000000063601340672067200260620ustar00rootroot00000000000000 basic_waitable_timer::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the timer.

void wait(
    asio::error_code & ec);

This function is used to wait for the timer to expire. This function blocks and does not return until the timer has expired.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context.html000066400000000000000000000155521340672067200231060ustar00rootroot00000000000000 basic_yield_context
asio C++ library

PrevUpHomeNext

Context object the represents the currently executing coroutine.

template<
    typename Handler>
class basic_yield_context
Types

Name

Description

callee_type

The coroutine callee type, used by the implementation.

caller_type

The coroutine caller type, used by the implementation.

Member Functions

Name

Description

basic_yield_context

Construct a yield context to represent the specified coroutine.

Construct a yield context from another yield context type.

operator[]

Return a yield context that sets the specified error_code.

The basic_yield_context class is used to represent the currently executing stackful coroutine. A basic_yield_context may be passed as a handler to an asynchronous operation. For example:

template <typename Handler>
void my_coroutine(basic_yield_context<Handler> yield)
{
  ...
  std::size_t n = my_socket.async_read_some(buffer, yield);
  ...
}

The initiating function (async_read_some in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned.

Requirements

Header: asio/spawn.hpp

Convenience header: None


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context/000077500000000000000000000000001340672067200222105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_yield_context/basic_yield_context.html000066400000000000000000000072551340672067200271220ustar00rootroot00000000000000 basic_yield_context::basic_yield_context
asio C++ library

PrevUpHomeNext

Construct a yield context to represent the specified coroutine.

basic_yield_context(
    const detail::weak_ptr< callee_type > & coro,
    caller_type & ca,
    Handler & handler);
  » more...

Construct a yield context from another yield context type.

template<
    typename OtherHandler>
basic_yield_context(
    const basic_yield_context< OtherHandler > & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context/basic_yield_context/000077500000000000000000000000001340672067200262235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/basic_yield_context/basic_yield_context/overload1.html000066400000000000000000000060441340672067200310110ustar00rootroot00000000000000 basic_yield_context::basic_yield_context (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a yield context to represent the specified coroutine.

basic_yield_context(
    const detail::weak_ptr< callee_type > & coro,
    caller_type & ca,
    Handler & handler);

Most applications do not need to use this constructor. Instead, the spawn() function passes a yield context as an argument to the coroutine function.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context/basic_yield_context/overload2.html000066400000000000000000000055361340672067200310170ustar00rootroot00000000000000 basic_yield_context::basic_yield_context (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a yield context from another yield context type.

template<
    typename OtherHandler>
basic_yield_context(
    const basic_yield_context< OtherHandler > & other);

Requires that OtherHandler be convertible to Handler.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context/callee_type.html000066400000000000000000000066731340672067200254000ustar00rootroot00000000000000 basic_yield_context::callee_type
asio C++ library

PrevUpHomeNext

The coroutine callee type, used by the implementation.

typedef implementation_defined callee_type;

When using Boost.Coroutine v1, this type is:

typename coroutine<void()>

When using Boost.Coroutine v2 (unidirectional coroutines), this type is:

push_coroutine<void>
Requirements

Header: asio/spawn.hpp

Convenience header: None


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context/caller_type.html000066400000000000000000000066051340672067200254100ustar00rootroot00000000000000 basic_yield_context::caller_type
asio C++ library

PrevUpHomeNext

The coroutine caller type, used by the implementation.

typedef implementation_defined caller_type;

When using Boost.Coroutine v1, this type is:

typename coroutine<void()>::caller_type

When using Boost.Coroutine v2 (unidirectional coroutines), this type is:

pull_coroutine<void>
Requirements

Header: asio/spawn.hpp

Convenience header: None


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/basic_yield_context/operator_lb__rb_.html000066400000000000000000000071401340672067200263710ustar00rootroot00000000000000 basic_yield_context::operator[]
asio C++ library

PrevUpHomeNext

Return a yield context that sets the specified error_code.

basic_yield_context operator[](
    asio::error_code & ec) const;

By default, when a yield context is used with an asynchronous operation, a non-success error_code is converted to system_error and thrown. This operator may be used to specify an error_code object that should instead be set with the asynchronous operation's result. For example:

template <typename Handler>
void my_coroutine(basic_yield_context<Handler> yield)
{
  ...
  std::size_t n = my_socket.async_read_some(buffer, yield[ec]);
  if (ec)
  {
    // An error occurred.
  }
  ...
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/bind_executor.html000066400000000000000000000105301340672067200217140ustar00rootroot00000000000000 bind_executor
asio C++ library

PrevUpHomeNext

Associate an object of type T with an executor of type Executor.

template<
    typename Executor,
    typename T>
executor_binder< typename decay< T >::type, Executor > bind_executor(
    const Executor & ex,
    T && t,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

Associate an object of type T with an execution context's executor.

template<
    typename ExecutionContext,
    typename T>
executor_binder< typename decay< T >::type, typename ExecutionContext::executor_type > bind_executor(
    ExecutionContext & ctx,
    T && t,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/bind_executor/000077500000000000000000000000001340672067200210275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/bind_executor/overload1.html000066400000000000000000000055011340672067200236120ustar00rootroot00000000000000 bind_executor (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Associate an object of type T with an executor of type Executor.

template<
    typename Executor,
    typename T>
executor_binder< typename decay< T >::type, Executor > bind_executor(
    const Executor & ex,
    T && t,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/bind_executor/overload2.html000066400000000000000000000054301340672067200236140ustar00rootroot00000000000000 bind_executor (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Associate an object of type T with an execution context's executor.

template<
    typename ExecutionContext,
    typename T>
executor_binder< typename decay< T >::type, typename ExecutionContext::executor_type > bind_executor(
    ExecutionContext & ctx,
    T && t,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer.html000066400000000000000000000634141340672067200203440ustar00rootroot00000000000000 buffer
asio C++ library

PrevUpHomeNext

The asio::buffer function is used to create a buffer object to represent raw memory, an array of POD elements, a vector of POD elements, or a std::string.

Create a new modifiable buffer from an existing buffer.

mutable_buffer buffer(
    const mutable_buffer & b);
  » more...

mutable_buffer buffer(
    const mutable_buffer & b,
    std::size_t max_size_in_bytes);
  » more...

Create a new non-modifiable buffer from an existing buffer.

const_buffer buffer(
    const const_buffer & b);
  » more...

const_buffer buffer(
    const const_buffer & b,
    std::size_t max_size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given memory range.

mutable_buffer buffer(
    void * data,
    std::size_t size_in_bytes);
  » more...

Create a new non-modifiable buffer that represents the given memory range.

const_buffer buffer(
    const void * data,
    std::size_t size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    PodType (&data)[N]);
  » more...

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    PodType (&data)[N],
    std::size_t max_size_in_bytes);
  » more...

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const PodType (&data)[N]);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const PodType (&data)[N],
    std::size_t max_size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    boost::array< PodType, N > & data);
  » more...

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    boost::array< const PodType, N > & data);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    boost::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const boost::array< PodType, N > & data);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    std::array< PodType, N > & data);
  » more...

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    std::array< const PodType, N > & data);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    std::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const std::array< PodType, N > & data);
  » more...

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given POD vector.

template<
    typename PodType,
    typename Allocator>
mutable_buffer buffer(
    std::vector< PodType, Allocator > & data);
  » more...

template<
    typename PodType,
    typename Allocator>
mutable_buffer buffer(
    std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new non-modifiable buffer that represents the given POD vector.

template<
    typename PodType,
    typename Allocator>
const_buffer buffer(
    const std::vector< PodType, Allocator > & data);
  » more...

template<
    typename PodType,
    typename Allocator>
const_buffer buffer(
    const std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
mutable_buffer buffer(
    std::basic_string< Elem, Traits, Allocator > & data);
  » more...

template<
    typename Elem,
    typename Traits,
    typename Allocator>
mutable_buffer buffer(
    std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new non-modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffer buffer(
    const std::basic_string< Elem, Traits, Allocator > & data);
  » more...

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffer buffer(
    const std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);
  » more...

Create a new modifiable buffer that represents the given string_view.

template<
    typename Elem,
    typename Traits>
const_buffer buffer(
    basic_string_view< Elem, Traits > data);
  » more...

Create a new non-modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits>
const_buffer buffer(
    basic_string_view< Elem, Traits > data,
    std::size_t max_size_in_bytes);
  » more...

A buffer object represents a contiguous region of memory as a 2-tuple consisting of a pointer and size in bytes. A tuple of the form {void*, size_t} specifies a mutable (modifiable) region of memory. Similarly, a tuple of the form {const void*, size_t} specifies a const (non-modifiable) region of memory. These two forms correspond to the classes mutable_buffer and const_buffer, respectively. To mirror C++'s conversion rules, a mutable_buffer is implicitly convertible to a const_buffer, and the opposite conversion is not permitted.

The simplest use case involves reading or writing a single buffer of a specified size:

sock.send(asio::buffer(data, size));

In the above example, the return value of asio::buffer meets the requirements of the ConstBufferSequence concept so that it may be directly passed to the socket's write function. A buffer created for modifiable memory also meets the requirements of the MutableBufferSequence concept.

An individual buffer may be created from a builtin array, std::vector, std::array or boost::array of POD elements. This helps prevent buffer overruns by automatically determining the size of the buffer:

char d1[128];
size_t bytes_transferred = sock.receive(asio::buffer(d1));

std::vector<char> d2(128);
bytes_transferred = sock.receive(asio::buffer(d2));

std::array<char, 128> d3;
bytes_transferred = sock.receive(asio::buffer(d3));

boost::array<char, 128> d4;
bytes_transferred = sock.receive(asio::buffer(d4));

In all three cases above, the buffers created are exactly 128 bytes long. Note that a vector is never automatically resized when creating or using a buffer. The buffer size is determined using the vector's size() member function, and not its capacity.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

asio::const_buffer b2 = ...;
std::size_t s2 = b2.size();
const void* p2 = b2.data();

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

For convenience, a buffer_size function is provided that works with both buffers and buffer sequences (that is, types meeting the ConstBufferSequence or MutableBufferSequence type requirements). In this case, the function returns the total size of all buffers in the sequence.

Buffer Copying

The buffer_copy function may be used to copy raw bytes between individual buffers and buffer sequences.

In particular, when used with the buffer_size function, the buffer_copy function can be used to linearise a sequence of buffers. For example:

vector<const_buffer> buffers = ...;

vector<unsigned char> data(asio::buffer_size(buffers));
asio::buffer_copy(asio::buffer(data), buffers);

Note that buffer_copy is implemented in terms of memcpy, and consequently it cannot be used to copy between overlapping memory regions.

Buffer Invalidation

A buffer object does not have any ownership of the memory it refers to. It is the responsibility of the application to ensure the memory region remains valid until it is no longer required for an I/O operation. When the memory is no longer available, the buffer is said to have been invalidated.

For the asio::buffer overloads that accept an argument of type std::vector, the buffer objects returned are invalidated by any vector operation that also invalidates all references, pointers and iterators referring to the elements in the sequence (C++ Std, 23.2.4)

For the asio::buffer overloads that accept an argument of type std::basic_string, the buffer objects returned are invalidated according to the rules defined for invalidation of references, pointers and iterators referring to elements of the sequence (C++ Std, 21.3).

Buffer Arithmetic

Buffer objects may be manipulated using simple arithmetic in a safe way which helps prevent buffer overruns. Consider an array initialised as follows:

boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };

A buffer object b1 created using:

b1 = asio::buffer(a);

represents the entire array, { 'a', 'b', 'c', 'd', 'e' }. An optional second argument to the asio::buffer function may be used to limit the size, in bytes, of the buffer:

b2 = asio::buffer(a, 3);

such that b2 represents the data { 'a', 'b', 'c' }. Even if the size argument exceeds the actual size of the array, the size of the buffer object created will be limited to the array size.

An offset may be applied to an existing buffer to create a new one:

b3 = b1 + 2;

where b3 will set to represent { 'c', 'd', 'e' }. If the offset exceeds the size of the existing buffer, the newly created buffer will be empty.

Both an offset and size may be specified to create a buffer that corresponds to a specific range of bytes within an existing buffer:

b4 = asio::buffer(b1 + 1, 3);

so that b4 will refer to the bytes { 'b', 'c', 'd' }.

Buffers and Scatter-Gather I/O

To read or write using multiple buffers (i.e. scatter-gather I/O), multiple buffer objects may be assigned into a container that supports the MutableBufferSequence (for read) or ConstBufferSequence (for write) concepts:

char d1[128];
std::vector<char> d2(128);
boost::array<char, 128> d3;

boost::array<mutable_buffer, 3> bufs1 = {
  asio::buffer(d1),
  asio::buffer(d2),
  asio::buffer(d3) };
bytes_transferred = sock.receive(bufs1);

std::vector<const_buffer> bufs2;
bufs2.push_back(asio::buffer(d1));
bufs2.push_back(asio::buffer(d2));
bufs2.push_back(asio::buffer(d3));
bytes_transferred = sock.send(bufs2);
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/000077500000000000000000000000001340672067200174465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffer/overload1.html000066400000000000000000000053111340672067200222300ustar00rootroot00000000000000 buffer (1 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer from an existing buffer.

mutable_buffer buffer(
    const mutable_buffer & b);
Return Value

mutable_buffer(b).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload10.html000066400000000000000000000061111340672067200223070ustar00rootroot00000000000000 buffer (10 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const PodType (&data)[N],
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    static_cast<const void*>(data),
    min(N * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload11.html000066400000000000000000000060301340672067200223100ustar00rootroot00000000000000 buffer (11 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    boost::array< PodType, N > & data);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.data(),
    data.size() * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload12.html000066400000000000000000000061231340672067200223140ustar00rootroot00000000000000 buffer (12 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.data(),
    min(data.size() * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload13.html000066400000000000000000000060301340672067200223120ustar00rootroot00000000000000 buffer (13 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    boost::array< const PodType, N > & data);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    data.size() * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload14.html000066400000000000000000000061231340672067200223160ustar00rootroot00000000000000 buffer (14 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    boost::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    min(data.size() * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload15.html000066400000000000000000000060301340672067200223140ustar00rootroot00000000000000 buffer (15 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const boost::array< PodType, N > & data);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    data.size() * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload16.html000066400000000000000000000061231340672067200223200ustar00rootroot00000000000000 buffer (16 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const boost::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    min(data.size() * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload17.html000066400000000000000000000060261340672067200223230ustar00rootroot00000000000000 buffer (17 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    std::array< PodType, N > & data);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.data(),
    data.size() * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload18.html000066400000000000000000000061211340672067200223200ustar00rootroot00000000000000 buffer (18 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.data(),
    min(data.size() * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload19.html000066400000000000000000000060261340672067200223250ustar00rootroot00000000000000 buffer (19 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    std::array< const PodType, N > & data);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    data.size() * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload2.html000066400000000000000000000057161340672067200222420ustar00rootroot00000000000000 buffer (2 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer from an existing buffer.

mutable_buffer buffer(
    const mutable_buffer & b,
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    b.data(),
    min(b.size(), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload20.html000066400000000000000000000061211340672067200223110ustar00rootroot00000000000000 buffer (20 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    std::array< const PodType, N > & data,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    min(data.size() * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload21.html000066400000000000000000000060261340672067200223160ustar00rootroot00000000000000 buffer (21 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const std::array< PodType, N > & data);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    data.size() * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload22.html000066400000000000000000000061211340672067200223130ustar00rootroot00000000000000 buffer (22 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const std::array< PodType, N > & data,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    min(data.size() * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload23.html000066400000000000000000000066451340672067200223270ustar00rootroot00000000000000 buffer (23 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD vector.

template<
    typename PodType,
    typename Allocator>
mutable_buffer buffer(
    std::vector< PodType, Allocator > & data);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.size() ? &data[0] : 0,
    data.size() * sizeof(PodType));
Remarks

The buffer is invalidated by any vector operation that would also invalidate iterators.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload24.html000066400000000000000000000067401340672067200223240ustar00rootroot00000000000000 buffer (24 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD vector.

template<
    typename PodType,
    typename Allocator>
mutable_buffer buffer(
    std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.size() ? &data[0] : 0,
    min(data.size() * sizeof(PodType), max_size_in_bytes));
Remarks

The buffer is invalidated by any vector operation that would also invalidate iterators.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload25.html000066400000000000000000000066451340672067200223310ustar00rootroot00000000000000 buffer (25 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD vector.

template<
    typename PodType,
    typename Allocator>
const_buffer buffer(
    const std::vector< PodType, Allocator > & data);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.size() ? &data[0] : 0,
    data.size() * sizeof(PodType));
Remarks

The buffer is invalidated by any vector operation that would also invalidate iterators.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload26.html000066400000000000000000000067401340672067200223260ustar00rootroot00000000000000 buffer (26 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD vector.

template<
    typename PodType,
    typename Allocator>
const_buffer buffer(
    const std::vector< PodType, Allocator > & data,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.size() ? &data[0] : 0,
    min(data.size() * sizeof(PodType), max_size_in_bytes));
Remarks

The buffer is invalidated by any vector operation that would also invalidate iterators.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload27.html000066400000000000000000000064261340672067200223300ustar00rootroot00000000000000 buffer (27 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
mutable_buffer buffer(
    std::basic_string< Elem, Traits, Allocator > & data);
Return Value

mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(Elem)).

Remarks

The buffer is invalidated by any non-const operation called on the given string object.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload28.html000066400000000000000000000067661340672067200223400ustar00rootroot00000000000000 buffer (28 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
mutable_buffer buffer(
    std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.size() ? &data[0] : 0,
    min(data.size() * sizeof(Elem), max_size_in_bytes));
Remarks

The buffer is invalidated by any non-const operation called on the given string object.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload29.html000066400000000000000000000064111340672067200223240ustar00rootroot00000000000000 buffer (29 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffer buffer(
    const std::basic_string< Elem, Traits, Allocator > & data);
Return Value

const_buffer(data.data(), data.size() * sizeof(Elem)).

Remarks

The buffer is invalidated by any non-const operation called on the given string object.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload3.html000066400000000000000000000053331340672067200222360ustar00rootroot00000000000000 buffer (3 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer from an existing buffer.

const_buffer buffer(
    const const_buffer & b);
Return Value

const_buffer(b).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload30.html000066400000000000000000000067431340672067200223240ustar00rootroot00000000000000 buffer (30 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
const_buffer buffer(
    const std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    data.data(),
    min(data.size() * sizeof(Elem), max_size_in_bytes));
Remarks

The buffer is invalidated by any non-const operation called on the given string object.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload31.html000066400000000000000000000056031340672067200223170ustar00rootroot00000000000000 buffer (31 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given string_view.

template<
    typename Elem,
    typename Traits>
const_buffer buffer(
    basic_string_view< Elem, Traits > data);
Return Value

mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(Elem)).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload32.html000066400000000000000000000061361340672067200223220ustar00rootroot00000000000000 buffer (32 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given string.

template<
    typename Elem,
    typename Traits>
const_buffer buffer(
    basic_string_view< Elem, Traits > data,
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    data.size() ? &data[0] : 0,
    min(data.size() * sizeof(Elem), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload4.html000066400000000000000000000057061340672067200222430ustar00rootroot00000000000000 buffer (4 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer from an existing buffer.

const_buffer buffer(
    const const_buffer & b,
    std::size_t max_size_in_bytes);
Return Value

A const_buffer value equivalent to:

const_buffer(
    b.data(),
    min(b.size(), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload5.html000066400000000000000000000054141340672067200222400ustar00rootroot00000000000000 buffer (5 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given memory range.

mutable_buffer buffer(
    void * data,
    std::size_t size_in_bytes);
Return Value

mutable_buffer(data, size_in_bytes).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload6.html000066400000000000000000000054221340672067200222400ustar00rootroot00000000000000 buffer (6 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given memory range.

const_buffer buffer(
    const void * data,
    std::size_t size_in_bytes);
Return Value

const_buffer(data, size_in_bytes).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload7.html000066400000000000000000000057631340672067200222510ustar00rootroot00000000000000 buffer (7 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    PodType (&data)[N]);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    static_cast<void*>(data),
    N * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload8.html000066400000000000000000000060561340672067200222460ustar00rootroot00000000000000 buffer (8 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
mutable_buffer buffer(
    PodType (&data)[N],
    std::size_t max_size_in_bytes);
Return Value

A mutable_buffer value equivalent to:

mutable_buffer(
    static_cast<void*>(data),
    min(N * sizeof(PodType), max_size_in_bytes));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer/overload9.html000066400000000000000000000057751340672067200222560ustar00rootroot00000000000000 buffer (9 of 32 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that represents the given POD array.

template<
    typename PodType,
    std::size_t N>
const_buffer buffer(
    const PodType (&data)[N]);
Return Value

A const_buffer value equivalent to:

const_buffer(
    static_cast<const void*>(data),
    N * sizeof(PodType));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_cast.html000066400000000000000000000111741340672067200213520ustar00rootroot00000000000000 buffer_cast
asio C++ library

PrevUpHomeNext

(Deprecated: Use the data() member function.) The asio::buffer_cast function is used to obtain a pointer to the underlying memory region associated with a buffer.

Cast a non-modifiable buffer to a specified pointer to POD type.

template<
    typename PointerToPodType>
PointerToPodType buffer_cast(
    const mutable_buffer & b);
  » more...

template<
    typename PointerToPodType>
PointerToPodType buffer_cast(
    const const_buffer & b);
  » more...
Examples:

To access the memory of a non-modifiable buffer, use:

asio::const_buffer b1 = ...;
const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);

To access the memory of a modifiable buffer, use:

asio::mutable_buffer b2 = ...;
unsigned char* p2 = asio::buffer_cast<unsigned char*>(b2);

The asio::buffer_cast function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_cast/000077500000000000000000000000001340672067200204605ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffer_cast/overload1.html000066400000000000000000000047661340672067200232570ustar00rootroot00000000000000 buffer_cast (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cast a non-modifiable buffer to a specified pointer to POD type.

template<
    typename PointerToPodType>
PointerToPodType buffer_cast(
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_cast/overload2.html000066400000000000000000000047641340672067200232560ustar00rootroot00000000000000 buffer_cast (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cast a non-modifiable buffer to a specified pointer to POD type.

template<
    typename PointerToPodType>
PointerToPodType buffer_cast(
    const const_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_copy.html000066400000000000000000000137131340672067200213730ustar00rootroot00000000000000 buffer_copy
asio C++ library

PrevUpHomeNext

The asio::buffer_copy function is used to copy bytes from a source buffer (or buffer sequence) to a target buffer (or buffer sequence).

Copies bytes from a source buffer sequence to a target buffer sequence.

template<
    typename MutableBufferSequence,
    typename ConstBufferSequence>
std::size_t buffer_copy(
    const MutableBufferSequence & target,
    const ConstBufferSequence & source);
  » more...

Copies a limited number of bytes from a source buffer sequence to a target buffer sequence.

template<
    typename MutableBufferSequence,
    typename ConstBufferSequence>
std::size_t buffer_copy(
    const MutableBufferSequence & target,
    const ConstBufferSequence & source,
    std::size_t max_bytes_to_copy);
  » more...

The buffer_copy function is available in two forms:

  • A 2-argument form: buffer_copy(target, source)
  • A 3-argument form: buffer_copy(target, source, max_bytes_to_copy)

Both forms return the number of bytes actually copied. The number of bytes copied is the lesser of:

  • buffer_size(target)
  • buffer_size(source)
  • If specified, max_bytes_to_copy.

This prevents buffer overflow, regardless of the buffer sizes used in the copy operation.

Note that buffer_copy is implemented in terms of memcpy, and consequently it cannot be used to copy between overlapping memory regions.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_copy/000077500000000000000000000000001340672067200205005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffer_copy/overload1.html000066400000000000000000000112111340672067200232560ustar00rootroot00000000000000 buffer_copy (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Copies bytes from a source buffer sequence to a target buffer sequence.

template<
    typename MutableBufferSequence,
    typename ConstBufferSequence>
std::size_t buffer_copy(
    const MutableBufferSequence & target,
    const ConstBufferSequence & source);
Parameters

target

A modifiable buffer sequence representing the memory regions to which the bytes will be copied.

source

A non-modifiable buffer sequence representing the memory regions from which the bytes will be copied.

Return Value

The number of bytes copied.

Remarks

The number of bytes copied is the lesser of:

  • buffer_size(target)
  • buffer_size(source)

This function is implemented in terms of memcpy, and consequently it cannot be used to copy between overlapping memory regions.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_copy/overload2.html000066400000000000000000000117551340672067200232740ustar00rootroot00000000000000 buffer_copy (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Copies a limited number of bytes from a source buffer sequence to a target buffer sequence.

template<
    typename MutableBufferSequence,
    typename ConstBufferSequence>
std::size_t buffer_copy(
    const MutableBufferSequence & target,
    const ConstBufferSequence & source,
    std::size_t max_bytes_to_copy);
Parameters

target

A modifiable buffer sequence representing the memory regions to which the bytes will be copied.

source

A non-modifiable buffer sequence representing the memory regions from which the bytes will be copied.

max_bytes_to_copy

The maximum number of bytes to be copied.

Return Value

The number of bytes copied.

Remarks

The number of bytes copied is the lesser of:

  • buffer_size(target)
  • buffer_size(source)
  • max_bytes_to_copy

This function is implemented in terms of memcpy, and consequently it cannot be used to copy between overlapping memory regions.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_begin.html000066400000000000000000000111111340672067200233630ustar00rootroot00000000000000 buffer_sequence_begin
asio C++ library

PrevUpHomeNext

The asio::buffer_sequence_begin function returns an iterator pointing to the first element in a buffer sequence.

Get an iterator to the first element in a buffer sequence.

const mutable_buffer * buffer_sequence_begin(
    const mutable_buffer & b);
  » more...

const const_buffer * buffer_sequence_begin(
    const const_buffer & b);
  » more...

template<
    typename C>
auto buffer_sequence_begin(
    C & c);
  » more...

template<
    typename C>
auto buffer_sequence_begin(
    const C & c);
  » more...
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_begin/000077500000000000000000000000001340672067200225025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffer_sequence_begin/overload1.html000066400000000000000000000051231340672067200252650ustar00rootroot00000000000000 buffer_sequence_begin (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to the first element in a buffer sequence.

const mutable_buffer * buffer_sequence_begin(
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_begin/overload2.html000066400000000000000000000050651340672067200252730ustar00rootroot00000000000000 buffer_sequence_begin (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to the first element in a buffer sequence.

const const_buffer * buffer_sequence_begin(
    const const_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_begin/overload3.html000066400000000000000000000050641340672067200252730ustar00rootroot00000000000000 buffer_sequence_begin (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to the first element in a buffer sequence.

template<
    typename C>
auto buffer_sequence_begin(
    C & c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_begin/overload4.html000066400000000000000000000051141340672067200252700ustar00rootroot00000000000000 buffer_sequence_begin (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to the first element in a buffer sequence.

template<
    typename C>
auto buffer_sequence_begin(
    const C & c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_end.html000066400000000000000000000111011340672067200230440ustar00rootroot00000000000000 buffer_sequence_end
asio C++ library

PrevUpHomeNext

The asio::buffer_sequence_end function returns an iterator pointing to one past the end element in a buffer sequence.

Get an iterator to one past the end element in a buffer sequence.

const mutable_buffer * buffer_sequence_end(
    const mutable_buffer & b);
  » more...

const const_buffer * buffer_sequence_end(
    const const_buffer & b);
  » more...

template<
    typename C>
auto buffer_sequence_end(
    C & c);
  » more...

template<
    typename C>
auto buffer_sequence_end(
    const C & c);
  » more...
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_end/000077500000000000000000000000001340672067200221645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffer_sequence_end/overload1.html000066400000000000000000000050761340672067200247560ustar00rootroot00000000000000 buffer_sequence_end (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to one past the end element in a buffer sequence.

const mutable_buffer * buffer_sequence_end(
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_end/overload2.html000066400000000000000000000050461340672067200247540ustar00rootroot00000000000000 buffer_sequence_end (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to one past the end element in a buffer sequence.

const const_buffer * buffer_sequence_end(
    const const_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_end/overload3.html000066400000000000000000000050451340672067200247540ustar00rootroot00000000000000 buffer_sequence_end (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to one past the end element in a buffer sequence.

template<
    typename C>
auto buffer_sequence_end(
    C & c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_sequence_end/overload4.html000066400000000000000000000050371340672067200247560ustar00rootroot00000000000000 buffer_sequence_end (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Get an iterator to one past the end element in a buffer sequence.

template<
    typename C>
auto buffer_sequence_end(
    const C & c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffer_size.html000066400000000000000000000072341340672067200213740ustar00rootroot00000000000000 buffer_size
asio C++ library

PrevUpHomeNext

Get the total number of bytes in a buffer sequence.

template<
    typename BufferSequence>
std::size_t buffer_size(
    const BufferSequence & b);

The buffer_size function determines the total size of all buffers in the buffer sequence, as if computed as follows:

size_t total_size = 0;
auto i = asio::buffer_sequence_begin(buffers);
auto end = asio::buffer_sequence_end(buffers);
for (; i != end; ++i)
{
  const_buffer b(*i);
  total_size += b.size();
}
return total_size;

The BufferSequence template parameter may meet either of the ConstBufferSequence or MutableBufferSequence type requirements.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream.html000066400000000000000000000342211340672067200232150ustar00rootroot00000000000000 buffered_read_stream
asio C++ library

PrevUpHomeNext

Adds buffering to the read-related operations of a stream.

template<
    typename Stream>
class buffered_read_stream :
  noncopyable
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

The type of the lowest layer.

next_layer_type

The type of the next layer.

Member Functions

Name

Description

async_fill

Start an asynchronous fill.

async_read_some

Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation.

async_write_some

Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation.

buffered_read_stream

Construct, passing the specified argument to initialise the next layer.

close

Close the stream.

fill

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure.

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

in_avail

Determine the amount of data that may be read without blocking.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

next_layer

Get a reference to the next layer.

peek

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

read_some

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

write_some

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred.

Data Members

Name

Description

default_buffer_size

The default buffer size.

The buffered_read_stream class template can be used to add buffering to the synchronous and asynchronous read operations of a stream.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/buffered_read_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/000077500000000000000000000000001340672067200223255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/async_fill.html000066400000000000000000000056321340672067200253440ustar00rootroot00000000000000 buffered_read_stream::async_fill
asio C++ library

PrevUpHomeNext

Start an asynchronous fill.

template<
    typename ReadHandler>
DEDUCED async_fill(
    ReadHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/async_read_some.html000066400000000000000000000063231340672067200263520ustar00rootroot00000000000000 buffered_read_stream::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/async_write_some.html000066400000000000000000000063511340672067200265720ustar00rootroot00000000000000 buffered_read_stream::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/buffered_read_stream.html000066400000000000000000000070171340672067200273500ustar00rootroot00000000000000 buffered_read_stream::buffered_read_stream
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
explicit buffered_read_stream(
    Arg & a);
  » more...

template<
    typename Arg>
buffered_read_stream(
    Arg & a,
    std::size_t buffer_size);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/buffered_read_stream/000077500000000000000000000000001340672067200264555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/buffered_read_stream/overload1.html000066400000000000000000000054221340672067200312420ustar00rootroot00000000000000 buffered_read_stream::buffered_read_stream (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
buffered_read_stream(
    Arg & a);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/buffered_read_stream/overload2.html000066400000000000000000000053631340672067200312470ustar00rootroot00000000000000 buffered_read_stream::buffered_read_stream (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
buffered_read_stream(
    Arg & a,
    std::size_t buffer_size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/close.html000066400000000000000000000062141340672067200243230ustar00rootroot00000000000000 buffered_read_stream::close
asio C++ library

PrevUpHomeNext

Close the stream.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/close/000077500000000000000000000000001340672067200234325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/close/overload1.html000066400000000000000000000047351340672067200262250ustar00rootroot00000000000000 buffered_read_stream::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the stream.

void close();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/close/overload2.html000066400000000000000000000050631340672067200262210ustar00rootroot00000000000000 buffered_read_stream::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the stream.

void close(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/default_buffer_size.html000066400000000000000000000052321340672067200272240ustar00rootroot00000000000000 buffered_read_stream::default_buffer_size
asio C++ library

PrevUpHomeNext

The default buffer size.

static const std::size_t default_buffer_size = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/executor_type.html000066400000000000000000000062341340672067200261170ustar00rootroot00000000000000 buffered_read_stream::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef lowest_layer_type::executor_type executor_type;
Requirements

Header: asio/buffered_read_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/fill.html000066400000000000000000000066211340672067200241460ustar00rootroot00000000000000 buffered_read_stream::fill
asio C++ library

PrevUpHomeNext

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure.

std::size_t fill();
  » more...

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred.

std::size_t fill(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/fill/000077500000000000000000000000001340672067200232535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/fill/overload1.html000066400000000000000000000051371340672067200260430ustar00rootroot00000000000000 buffered_read_stream::fill (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure.

std::size_t fill();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/fill/overload2.html000066400000000000000000000052301340672067200260360ustar00rootroot00000000000000 buffered_read_stream::fill (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred.

std::size_t fill(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/get_executor.html000066400000000000000000000051331340672067200257120ustar00rootroot00000000000000 buffered_read_stream::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/get_io_context.html000066400000000000000000000054301340672067200262270ustar00rootroot00000000000000 buffered_read_stream::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/get_io_service.html000066400000000000000000000054101340672067200262010ustar00rootroot00000000000000 buffered_read_stream::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/in_avail.html000066400000000000000000000062731340672067200250050ustar00rootroot00000000000000 buffered_read_stream::in_avail
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail();
  » more...

std::size_t in_avail(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/in_avail/000077500000000000000000000000001340672067200241075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/in_avail/overload1.html000066400000000000000000000050741340672067200266770ustar00rootroot00000000000000 buffered_read_stream::in_avail (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/in_avail/overload2.html000066400000000000000000000051521340672067200266750ustar00rootroot00000000000000 buffered_read_stream::in_avail (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/lowest_layer.html000066400000000000000000000065671340672067200257420ustar00rootroot00000000000000 buffered_read_stream::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/lowest_layer/000077500000000000000000000000001340672067200250365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/lowest_layer/overload1.html000066400000000000000000000051451340672067200276250ustar00rootroot00000000000000 buffered_read_stream::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/lowest_layer/overload2.html000066400000000000000000000052131340672067200276220ustar00rootroot00000000000000 buffered_read_stream::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/lowest_layer_type.html000066400000000000000000000063401340672067200267700ustar00rootroot00000000000000 buffered_read_stream::lowest_layer_type
asio C++ library

PrevUpHomeNext

The type of the lowest layer.

typedef next_layer_type::lowest_layer_type lowest_layer_type;
Requirements

Header: asio/buffered_read_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/next_layer.html000066400000000000000000000051221340672067200253650ustar00rootroot00000000000000 buffered_read_stream::next_layer
asio C++ library

PrevUpHomeNext

Get a reference to the next layer.

next_layer_type & next_layer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/next_layer_type.html000066400000000000000000000061731340672067200264350ustar00rootroot00000000000000 buffered_read_stream::next_layer_type
asio C++ library

PrevUpHomeNext

The type of the next layer.

typedef remove_reference< Stream >::type next_layer_type;
Requirements

Header: asio/buffered_read_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/peek.html000066400000000000000000000073421340672067200241450ustar00rootroot00000000000000 buffered_read_stream::peek
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers);
  » more...

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/peek/000077500000000000000000000000001340672067200232515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/peek/overload1.html000066400000000000000000000054061340672067200260400ustar00rootroot00000000000000 buffered_read_stream::peek (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/peek/overload2.html000066400000000000000000000054641340672067200260450ustar00rootroot00000000000000 buffered_read_stream::peek (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/read_some.html000066400000000000000000000074701340672067200251610ustar00rootroot00000000000000 buffered_read_stream::read_some
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/read_some/000077500000000000000000000000001340672067200242635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/read_some/overload1.html000066400000000000000000000055031340672067200270500ustar00rootroot00000000000000 buffered_read_stream::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/read_some/overload2.html000066400000000000000000000055401340672067200270520ustar00rootroot00000000000000 buffered_read_stream::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/write_some.html000066400000000000000000000075451340672067200254030ustar00rootroot00000000000000 buffered_read_stream::write_some
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/write_some/000077500000000000000000000000001340672067200245025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_read_stream/write_some/overload1.html000066400000000000000000000055231340672067200272710ustar00rootroot00000000000000 buffered_read_stream::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_read_stream/write_some/overload2.html000066400000000000000000000055641340672067200272770ustar00rootroot00000000000000 buffered_read_stream::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream.html000066400000000000000000000341441340672067200222260ustar00rootroot00000000000000 buffered_stream
asio C++ library

PrevUpHomeNext

Adds buffering to the read- and write-related operations of a stream.

template<
    typename Stream>
class buffered_stream :
  noncopyable
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

The type of the lowest layer.

next_layer_type

The type of the next layer.

Member Functions

Name

Description

async_fill

Start an asynchronous fill.

async_flush

Start an asynchronous flush.

async_read_some

Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation.

async_write_some

Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation.

buffered_stream

Construct, passing the specified argument to initialise the next layer.

close

Close the stream.

fill

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure.

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred.

flush

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure.

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

in_avail

Determine the amount of data that may be read without blocking.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

next_layer

Get a reference to the next layer.

peek

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

read_some

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

write_some

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred.

The buffered_stream class template can be used to add buffering to the synchronous and asynchronous read and write operations of a stream.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/buffered_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/000077500000000000000000000000001340672067200213325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/async_fill.html000066400000000000000000000055041340672067200243470ustar00rootroot00000000000000 buffered_stream::async_fill
asio C++ library

PrevUpHomeNext

Start an asynchronous fill.

template<
    typename ReadHandler>
DEDUCED async_fill(
    ReadHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/async_flush.html000066400000000000000000000055241340672067200245440ustar00rootroot00000000000000 buffered_stream::async_flush
asio C++ library

PrevUpHomeNext

Start an asynchronous flush.

template<
    typename WriteHandler>
DEDUCED async_flush(
    WriteHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/async_read_some.html000066400000000000000000000062401340672067200253550ustar00rootroot00000000000000 buffered_stream::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/async_write_some.html000066400000000000000000000062361340672067200256010ustar00rootroot00000000000000 buffered_stream::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/buffered_stream.html000066400000000000000000000066211340672067200253620ustar00rootroot00000000000000 buffered_stream::buffered_stream
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
explicit buffered_stream(
    Arg & a);
  » more...

template<
    typename Arg>
explicit buffered_stream(
    Arg & a,
    std::size_t read_buffer_size,
    std::size_t write_buffer_size);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/buffered_stream/000077500000000000000000000000001340672067200244675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/buffered_stream/overload1.html000066400000000000000000000052511340672067200272540ustar00rootroot00000000000000 buffered_stream::buffered_stream (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
buffered_stream(
    Arg & a);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/buffered_stream/overload2.html000066400000000000000000000053061340672067200272560ustar00rootroot00000000000000 buffered_stream::buffered_stream (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
buffered_stream(
    Arg & a,
    std::size_t read_buffer_size,
    std::size_t write_buffer_size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/close.html000066400000000000000000000060431340672067200233300ustar00rootroot00000000000000 buffered_stream::close
asio C++ library

PrevUpHomeNext

Close the stream.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/close/000077500000000000000000000000001340672067200224375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/close/overload1.html000066400000000000000000000046721340672067200252320ustar00rootroot00000000000000 buffered_stream::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the stream.

void close();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/close/overload2.html000066400000000000000000000047701340672067200252320ustar00rootroot00000000000000 buffered_stream::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the stream.

void close(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/executor_type.html000066400000000000000000000061121340672067200251170ustar00rootroot00000000000000 buffered_stream::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef lowest_layer_type::executor_type executor_type;
Requirements

Header: asio/buffered_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/fill.html000066400000000000000000000065061340672067200231550ustar00rootroot00000000000000 buffered_stream::fill
asio C++ library

PrevUpHomeNext

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure.

std::size_t fill();
  » more...

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred.

std::size_t fill(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/fill/000077500000000000000000000000001340672067200222605ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/fill/overload1.html000066400000000000000000000050741340672067200250500ustar00rootroot00000000000000 buffered_stream::fill (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation. Throws an exception on failure.

std::size_t fill();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/fill/overload2.html000066400000000000000000000051311340672067200250430ustar00rootroot00000000000000 buffered_stream::fill (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Fill the buffer with some data. Returns the number of bytes placed in the buffer as a result of the operation, or 0 if an error occurred.

std::size_t fill(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/flush.html000066400000000000000000000066351340672067200233530ustar00rootroot00000000000000 buffered_stream::flush
asio C++ library

PrevUpHomeNext

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure.

std::size_t flush();
  » more...

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred.

std::size_t flush(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/flush/000077500000000000000000000000001340672067200224535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/flush/overload1.html000066400000000000000000000051541340672067200252420ustar00rootroot00000000000000 buffered_stream::flush (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure.

std::size_t flush();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/flush/overload2.html000066400000000000000000000052411340672067200252400ustar00rootroot00000000000000 buffered_stream::flush (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred.

std::size_t flush(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/get_executor.html000066400000000000000000000050501340672067200247150ustar00rootroot00000000000000 buffered_stream::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/get_io_context.html000066400000000000000000000053411340672067200252350ustar00rootroot00000000000000 buffered_stream::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/get_io_service.html000066400000000000000000000053211340672067200252070ustar00rootroot00000000000000 buffered_stream::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/in_avail.html000066400000000000000000000061601340672067200240050ustar00rootroot00000000000000 buffered_stream::in_avail
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail();
  » more...

std::size_t in_avail(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/in_avail/000077500000000000000000000000001340672067200231145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/in_avail/overload1.html000066400000000000000000000050311340672067200256750ustar00rootroot00000000000000 buffered_stream::in_avail (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/in_avail/overload2.html000066400000000000000000000051071340672067200257020ustar00rootroot00000000000000 buffered_stream::in_avail (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/lowest_layer.html000066400000000000000000000064541340672067200247420ustar00rootroot00000000000000 buffered_stream::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/lowest_layer/000077500000000000000000000000001340672067200240435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/lowest_layer/overload1.html000066400000000000000000000051021340672067200266230ustar00rootroot00000000000000 buffered_stream::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/lowest_layer/overload2.html000066400000000000000000000051501340672067200266270ustar00rootroot00000000000000 buffered_stream::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/lowest_layer_type.html000066400000000000000000000062251340672067200257770ustar00rootroot00000000000000 buffered_stream::lowest_layer_type
asio C++ library

PrevUpHomeNext

The type of the lowest layer.

typedef next_layer_type::lowest_layer_type lowest_layer_type;
Requirements

Header: asio/buffered_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/next_layer.html000066400000000000000000000050331340672067200243730ustar00rootroot00000000000000 buffered_stream::next_layer
asio C++ library

PrevUpHomeNext

Get a reference to the next layer.

next_layer_type & next_layer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/next_layer_type.html000066400000000000000000000060601340672067200254350ustar00rootroot00000000000000 buffered_stream::next_layer_type
asio C++ library

PrevUpHomeNext

The type of the next layer.

typedef remove_reference< Stream >::type next_layer_type;
Requirements

Header: asio/buffered_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/peek.html000066400000000000000000000072271340672067200231540ustar00rootroot00000000000000 buffered_stream::peek
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers);
  » more...

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/peek/000077500000000000000000000000001340672067200222565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/peek/overload1.html000066400000000000000000000053431340672067200250450ustar00rootroot00000000000000 buffered_stream::peek (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/peek/overload2.html000066400000000000000000000054211340672067200250430ustar00rootroot00000000000000 buffered_stream::peek (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/read_some.html000066400000000000000000000073551340672067200241700ustar00rootroot00000000000000 buffered_stream::read_some
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/read_some/000077500000000000000000000000001340672067200232705ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/read_some/overload1.html000066400000000000000000000054401340672067200260550ustar00rootroot00000000000000 buffered_stream::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/read_some/overload2.html000066400000000000000000000054751340672067200260660ustar00rootroot00000000000000 buffered_stream::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/write_some.html000066400000000000000000000074321340672067200244030ustar00rootroot00000000000000 buffered_stream::write_some
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/write_some/000077500000000000000000000000001340672067200235075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_stream/write_some/overload1.html000066400000000000000000000054601340672067200262760ustar00rootroot00000000000000 buffered_stream::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_stream/write_some/overload2.html000066400000000000000000000055561340672067200263050ustar00rootroot00000000000000 buffered_stream::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream.html000066400000000000000000000346711340672067200234450ustar00rootroot00000000000000 buffered_write_stream
asio C++ library

PrevUpHomeNext

Adds buffering to the write-related operations of a stream.

template<
    typename Stream>
class buffered_write_stream :
  noncopyable
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

The type of the lowest layer.

next_layer_type

The type of the next layer.

Member Functions

Name

Description

async_flush

Start an asynchronous flush.

async_read_some

Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation.

async_write_some

Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation.

buffered_write_stream

Construct, passing the specified argument to initialise the next layer.

close

Close the stream.

flush

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure.

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

in_avail

Determine the amount of data that may be read without blocking.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

next_layer

Get a reference to the next layer.

peek

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

read_some

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

write_some

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred and the error handler did not throw.

Data Members

Name

Description

default_buffer_size

The default buffer size.

The buffered_write_stream class template can be used to add buffering to the synchronous and asynchronous write operations of a stream.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/buffered_write_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/000077500000000000000000000000001340672067200225445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/async_flush.html000066400000000000000000000056641340672067200257630ustar00rootroot00000000000000 buffered_write_stream::async_flush
asio C++ library

PrevUpHomeNext

Start an asynchronous flush.

template<
    typename WriteHandler>
DEDUCED async_flush(
    WriteHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/async_read_some.html000066400000000000000000000063421340672067200265720ustar00rootroot00000000000000 buffered_write_stream::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read. The buffer into which the data will be read must be valid for the lifetime of the asynchronous operation.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/async_write_some.html000066400000000000000000000063701340672067200270120ustar00rootroot00000000000000 buffered_write_stream::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write. The data being written must be valid for the lifetime of the asynchronous operation.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/buffered_write_stream.html000066400000000000000000000070621340672067200300060ustar00rootroot00000000000000 buffered_write_stream::buffered_write_stream
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
explicit buffered_write_stream(
    Arg & a);
  » more...

template<
    typename Arg>
buffered_write_stream(
    Arg & a,
    std::size_t buffer_size);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/buffered_write_stream/000077500000000000000000000000001340672067200271135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/buffered_write_stream/overload1.html000066400000000000000000000054471340672067200317070ustar00rootroot00000000000000 buffered_write_stream::buffered_write_stream (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
buffered_write_stream(
    Arg & a);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/buffered_write_stream/overload2.html000066400000000000000000000054041340672067200317010ustar00rootroot00000000000000 buffered_write_stream::buffered_write_stream (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct, passing the specified argument to initialise the next layer.

template<
    typename Arg>
buffered_write_stream(
    Arg & a,
    std::size_t buffer_size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/close.html000066400000000000000000000062371340672067200245470ustar00rootroot00000000000000 buffered_write_stream::close
asio C++ library

PrevUpHomeNext

Close the stream.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/close/000077500000000000000000000000001340672067200236515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/close/overload1.html000066400000000000000000000047441340672067200264440ustar00rootroot00000000000000 buffered_write_stream::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the stream.

void close();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/close/overload2.html000066400000000000000000000050721340672067200264400ustar00rootroot00000000000000 buffered_write_stream::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the stream.

void close(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/default_buffer_size.html000066400000000000000000000052451340672067200274470ustar00rootroot00000000000000 buffered_write_stream::default_buffer_size
asio C++ library

PrevUpHomeNext

The default buffer size.

static const std::size_t default_buffer_size = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/executor_type.html000066400000000000000000000062571340672067200263430ustar00rootroot00000000000000 buffered_write_stream::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef lowest_layer_type::executor_type executor_type;
Requirements

Header: asio/buffered_write_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/flush.html000066400000000000000000000067641340672067200245700ustar00rootroot00000000000000 buffered_write_stream::flush
asio C++ library

PrevUpHomeNext

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure.

std::size_t flush();
  » more...

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred.

std::size_t flush(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/flush/000077500000000000000000000000001340672067200236655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/flush/overload1.html000066400000000000000000000052261340672067200264540ustar00rootroot00000000000000 buffered_write_stream::flush (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation. Throws an exception on failure.

std::size_t flush();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/flush/overload2.html000066400000000000000000000053131340672067200264520ustar00rootroot00000000000000 buffered_write_stream::flush (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Flush all data from the buffer to the next layer. Returns the number of bytes written to the next layer on the last write operation, or 0 if an error occurred.

std::size_t flush(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/get_executor.html000066400000000000000000000051521340672067200261320ustar00rootroot00000000000000 buffered_write_stream::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/get_io_context.html000066400000000000000000000054431340672067200264520ustar00rootroot00000000000000 buffered_write_stream::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/get_io_service.html000066400000000000000000000054231340672067200264240ustar00rootroot00000000000000 buffered_write_stream::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/in_avail.html000066400000000000000000000063121340672067200252160ustar00rootroot00000000000000 buffered_write_stream::in_avail
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail();
  » more...

std::size_t in_avail(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/in_avail/000077500000000000000000000000001340672067200243265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/in_avail/overload1.html000066400000000000000000000051031340672067200271070ustar00rootroot00000000000000 buffered_write_stream::in_avail (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/in_avail/overload2.html000066400000000000000000000051611340672067200271140ustar00rootroot00000000000000 buffered_write_stream::in_avail (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Determine the amount of data that may be read without blocking.

std::size_t in_avail(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/lowest_layer.html000066400000000000000000000066061340672067200261530ustar00rootroot00000000000000 buffered_write_stream::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/lowest_layer/000077500000000000000000000000001340672067200252555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/lowest_layer/overload1.html000066400000000000000000000051541340672067200300440ustar00rootroot00000000000000 buffered_write_stream::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/lowest_layer/overload2.html000066400000000000000000000052221340672067200300410ustar00rootroot00000000000000 buffered_write_stream::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/lowest_layer_type.html000066400000000000000000000063571340672067200272170ustar00rootroot00000000000000 buffered_write_stream::lowest_layer_type
asio C++ library

PrevUpHomeNext

The type of the lowest layer.

typedef next_layer_type::lowest_layer_type lowest_layer_type;
Requirements

Header: asio/buffered_write_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/next_layer.html000066400000000000000000000051351340672067200256100ustar00rootroot00000000000000 buffered_write_stream::next_layer
asio C++ library

PrevUpHomeNext

Get a reference to the next layer.

next_layer_type & next_layer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/next_layer_type.html000066400000000000000000000062121340672067200266460ustar00rootroot00000000000000 buffered_write_stream::next_layer_type
asio C++ library

PrevUpHomeNext

The type of the next layer.

typedef remove_reference< Stream >::type next_layer_type;
Requirements

Header: asio/buffered_write_stream.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/peek.html000066400000000000000000000073611340672067200243650ustar00rootroot00000000000000 buffered_write_stream::peek
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers);
  » more...

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/peek/000077500000000000000000000000001340672067200234705ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/peek/overload1.html000066400000000000000000000054151340672067200262570ustar00rootroot00000000000000 buffered_write_stream::peek (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/peek/overload2.html000066400000000000000000000054731340672067200262640ustar00rootroot00000000000000 buffered_write_stream::peek (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Peek at the incoming data on the stream. Returns the number of bytes read, or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t peek(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/read_some.html000066400000000000000000000075071340672067200254010ustar00rootroot00000000000000 buffered_write_stream::read_some
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/read_some/000077500000000000000000000000001340672067200245025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/read_some/overload1.html000066400000000000000000000055121340672067200272670ustar00rootroot00000000000000 buffered_write_stream::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read. Throws an exception on failure.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/read_some/overload2.html000066400000000000000000000055471340672067200273000ustar00rootroot00000000000000 buffered_write_stream::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream. Returns the number of bytes read or 0 if an error occurred.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/write_some.html000066400000000000000000000076301340672067200256150ustar00rootroot00000000000000 buffered_write_stream::write_some
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred and the error handler did not throw.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/write_some/000077500000000000000000000000001340672067200247215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffered_write_stream/write_some/overload1.html000066400000000000000000000055321340672067200275100ustar00rootroot00000000000000 buffered_write_stream::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written. Throws an exception on failure.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffered_write_stream/write_some/overload2.html000066400000000000000000000056261340672067200275150ustar00rootroot00000000000000 buffered_write_stream::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write the given data to the stream. Returns the number of bytes written, or 0 if an error occurred and the error handler did not throw.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_begin.html000066400000000000000000000061061340672067200216660ustar00rootroot00000000000000 buffers_begin
asio C++ library

PrevUpHomeNext

Construct an iterator representing the beginning of the buffers' data.

template<
    typename BufferSequence>
buffers_iterator< BufferSequence > buffers_begin(
    const BufferSequence & buffers);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_end.html000066400000000000000000000057001340672067200213470ustar00rootroot00000000000000 buffers_end
asio C++ library

PrevUpHomeNext

Construct an iterator representing the end of the buffers' data.

template<
    typename BufferSequence>
buffers_iterator< BufferSequence > buffers_end(
    const BufferSequence & buffers);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator.html000066400000000000000000000321331340672067200224320ustar00rootroot00000000000000 buffers_iterator
asio C++ library

PrevUpHomeNext

A random access iterator over the bytes in a buffer sequence.

template<
    typename BufferSequence,
    typename ByteType = char>
class buffers_iterator
Types

Name

Description

difference_type

The type used for the distance between two iterators.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

reference

The type of the result of applying operator*() to the iterator.

value_type

The type of the value pointed to by the iterator.

Member Functions

Name

Description

begin

Construct an iterator representing the beginning of the buffers' data.

buffers_iterator

Default constructor. Creates an iterator in an undefined state.

end

Construct an iterator representing the end of the buffers' data.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator+=

Addition operator.

operator--

Decrement operator (prefix).

Decrement operator (postfix).

operator-=

Subtraction operator.

operator->

Dereference an iterator.

operator[]

Access an individual element.

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator+

Addition operator.

operator-

Subtraction operator.

operator<

Compare two iterators.

operator<=

Compare two iterators.

operator==

Test two iterators for equality.

operator>

Compare two iterators.

operator>=

Compare two iterators.

Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/000077500000000000000000000000001340672067200215425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffers_iterator/begin.html000066400000000000000000000051071340672067200235170ustar00rootroot00000000000000 buffers_iterator::begin
asio C++ library

PrevUpHomeNext

Construct an iterator representing the beginning of the buffers' data.

static buffers_iterator begin(
    const BufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/buffers_iterator.html000066400000000000000000000050471340672067200260030ustar00rootroot00000000000000 buffers_iterator::buffers_iterator
asio C++ library

PrevUpHomeNext

Default constructor. Creates an iterator in an undefined state.

buffers_iterator();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/difference_type.html000066400000000000000000000061251340672067200255670ustar00rootroot00000000000000 buffers_iterator::difference_type
asio C++ library

PrevUpHomeNext

The type used for the distance between two iterators.

typedef std::ptrdiff_t difference_type;
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/end.html000066400000000000000000000050741340672067200232040ustar00rootroot00000000000000 buffers_iterator::end
asio C++ library

PrevUpHomeNext

Construct an iterator representing the end of the buffers' data.

static buffers_iterator end(
    const BufferSequence & buffers);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/iterator_category.html000066400000000000000000000061241340672067200261610ustar00rootroot00000000000000 buffers_iterator::iterator_category
asio C++ library

PrevUpHomeNext

The iterator category.

typedef std::random_access_iterator_tag iterator_category;
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator__star_.html000066400000000000000000000050561340672067200256200ustar00rootroot00000000000000 buffers_iterator::operator *
asio C++ library

PrevUpHomeNext

Dereference an iterator.

reference operator *() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_arrow_.html000066400000000000000000000050421340672067200256350ustar00rootroot00000000000000 buffers_iterator::operator->
asio C++ library

PrevUpHomeNext

Dereference an iterator.

pointer operator->() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_eq__eq_.html000066400000000000000000000062221340672067200257350ustar00rootroot00000000000000 buffers_iterator::operator==
asio C++ library

PrevUpHomeNext

Test two iterators for equality.

friend bool operator==(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_gt_.html000066400000000000000000000061761340672067200251260ustar00rootroot00000000000000 buffers_iterator::operator>
asio C++ library

PrevUpHomeNext

Compare two iterators.

friend bool operator>(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_gt__eq_.html000066400000000000000000000062211340672067200257410ustar00rootroot00000000000000 buffers_iterator::operator>=
asio C++ library

PrevUpHomeNext

Compare two iterators.

friend bool operator>=(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_lb__rb_.html000066400000000000000000000050441340672067200257240ustar00rootroot00000000000000 buffers_iterator::operator[]
asio C++ library

PrevUpHomeNext

Access an individual element.

reference operator[](
    std::ptrdiff_t difference) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_lt_.html000066400000000000000000000061761340672067200251330ustar00rootroot00000000000000 buffers_iterator::operator<
asio C++ library

PrevUpHomeNext

Compare two iterators.

friend bool operator<(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_lt__eq_.html000066400000000000000000000062211340672067200257460ustar00rootroot00000000000000 buffers_iterator::operator<=
asio C++ library

PrevUpHomeNext

Compare two iterators.

friend bool operator<=(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus_.html000066400000000000000000000064611340672067200256440ustar00rootroot00000000000000 buffers_iterator::operator-
asio C++ library

PrevUpHomeNext

Subtraction operator.

friend buffers_iterator operator-(
    const buffers_iterator & iter,
    std::ptrdiff_t difference);
  » more...

friend std::ptrdiff_t operator-(
    const buffers_iterator & a,
    const buffers_iterator & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus_/000077500000000000000000000000001340672067200247475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus_/overload1.html000066400000000000000000000063211340672067200275330ustar00rootroot00000000000000 buffers_iterator::operator- (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Subtraction operator.

friend buffers_iterator operator-(
    const buffers_iterator & iter,
    std::ptrdiff_t difference);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus_/overload2.html000066400000000000000000000063471340672067200275440ustar00rootroot00000000000000 buffers_iterator::operator- (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Subtraction operator.

friend std::ptrdiff_t operator-(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus__eq_.html000066400000000000000000000052121340672067200264610ustar00rootroot00000000000000 buffers_iterator::operator-=
asio C++ library

PrevUpHomeNext

Subtraction operator.

buffers_iterator & operator-=(
    std::ptrdiff_t difference);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus__minus_.html000066400000000000000000000066011340672067200272120ustar00rootroot00000000000000 buffers_iterator::operator--
asio C++ library

PrevUpHomeNext

Decrement operator (prefix).

buffers_iterator & operator--();
  » more...

Decrement operator (postfix).

buffers_iterator operator--(
    int );
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus__minus_/000077500000000000000000000000001340672067200263215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus__minus_/overload1.html000066400000000000000000000051701340672067200311060ustar00rootroot00000000000000 buffers_iterator::operator-- (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Decrement operator (prefix).

buffers_iterator & operator--();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_minus__minus_/overload2.html000066400000000000000000000051631340672067200311110ustar00rootroot00000000000000 buffers_iterator::operator-- (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Decrement operator (postfix).

buffers_iterator operator--(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_not__eq_.html000066400000000000000000000062301340672067200261270ustar00rootroot00000000000000 buffers_iterator::operator!=
asio C++ library

PrevUpHomeNext

Test two iterators for inequality.

friend bool operator!=(
    const buffers_iterator & a,
    const buffers_iterator & b);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus_.html000066400000000000000000000064411340672067200254720ustar00rootroot00000000000000 buffers_iterator::operator+
asio C++ library

PrevUpHomeNext

Addition operator.

friend buffers_iterator operator+(
    const buffers_iterator & iter,
    std::ptrdiff_t difference);
  » more...

friend buffers_iterator operator+(
    std::ptrdiff_t difference,
    const buffers_iterator & iter);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus_/000077500000000000000000000000001340672067200245775ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus_/overload1.html000066400000000000000000000063041340672067200273640ustar00rootroot00000000000000 buffers_iterator::operator+ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Addition operator.

friend buffers_iterator operator+(
    const buffers_iterator & iter,
    std::ptrdiff_t difference);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus_/overload2.html000066400000000000000000000063271340672067200273720ustar00rootroot00000000000000 buffers_iterator::operator+ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Addition operator.

friend buffers_iterator operator+(
    std::ptrdiff_t difference,
    const buffers_iterator & iter);
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus__eq_.html000066400000000000000000000051721340672067200263160ustar00rootroot00000000000000 buffers_iterator::operator+=
asio C++ library

PrevUpHomeNext

Addition operator.

buffers_iterator & operator+=(
    std::ptrdiff_t difference);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus__plus_.html000066400000000000000000000065521340672067200266770ustar00rootroot00000000000000 buffers_iterator::operator++
asio C++ library

PrevUpHomeNext

Increment operator (prefix).

buffers_iterator & operator++();
  » more...

Increment operator (postfix).

buffers_iterator operator++(
    int );
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus__plus_/000077500000000000000000000000001340672067200260015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus__plus_/overload1.html000066400000000000000000000051521340672067200305660ustar00rootroot00000000000000 buffers_iterator::operator++ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Increment operator (prefix).

buffers_iterator & operator++();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/operator_plus__plus_/overload2.html000066400000000000000000000051501340672067200305650ustar00rootroot00000000000000 buffers_iterator::operator++ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Increment operator (postfix).

buffers_iterator operator++(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/pointer.html000066400000000000000000000066261340672067200241220ustar00rootroot00000000000000 buffers_iterator::pointer
asio C++ library

PrevUpHomeNext

The type of the result of applying operator->() to the iterator.

typedef const_or_non_const_ByteType * pointer;

If the buffer sequence stores buffer objects that are convertible to mutable_buffer, this is a pointer to a non-const ByteType. Otherwise, a pointer to a const ByteType.

Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/reference.html000066400000000000000000000066261340672067200244000ustar00rootroot00000000000000 buffers_iterator::reference
asio C++ library

PrevUpHomeNext

The type of the result of applying operator*() to the iterator.

typedef const_or_non_const_ByteType & reference;

If the buffer sequence stores buffer objects that are convertible to mutable_buffer, this is a reference to a non-const ByteType. Otherwise, a reference to a const ByteType.

Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/buffers_iterator/value_type.html000066400000000000000000000057771340672067200246250ustar00rootroot00000000000000 buffers_iterator::value_type
asio C++ library

PrevUpHomeNext

The type of the value pointed to by the iterator.

typedef ByteType value_type;
Requirements

Header: asio/buffers_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect.html000066400000000000000000000264131340672067200205220ustar00rootroot00000000000000 connect
asio C++ library

PrevUpHomeNext

The connect function is a composed operation that establishes a socket connection by trying each endpoint in a sequence.

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  » more...

template<
    typename Protocol,
    typename EndpointSequence>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    asio::error_code & ec,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  » more...

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  » more...

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    asio::error_code & ec,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  » more...

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end);
  » more...

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    asio::error_code & ec);
  » more...

template<
    typename Protocol,
    typename EndpointSequence,
    typename ConnectCondition>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    ConnectCondition connect_condition,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  » more...

template<
    typename Protocol,
    typename EndpointSequence,
    typename ConnectCondition>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    ConnectCondition connect_condition,
    asio::error_code & ec,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);
  » more...

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    ConnectCondition connect_condition,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  » more...

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    ConnectCondition connect_condition,
    asio::error_code & ec,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);
  » more...

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    ConnectCondition connect_condition);
  » more...

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    ConnectCondition connect_condition,
    asio::error_code & ec);
  » more...
Requirements

Header: asio/connect.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/000077500000000000000000000000001340672067200176265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/connect/overload1.html000066400000000000000000000121451340672067200224130ustar00rootroot00000000000000 connect (1 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

endpoints

A sequence of endpoints.

Return Value

The successfully connected endpoint.

Exceptions

asio::system_error

Thrown on failure. If the sequence is empty, the associated error_code is asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Example
tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);
asio::connect(s, r.resolve(q));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload10.html000066400000000000000000000140041340672067200224670ustar00rootroot00000000000000 connect (10 of 12 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    ConnectCondition connect_condition,
    asio::error_code & ec,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

ec

Set to indicate what error occurred, if any. If the sequence is empty, set to asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Return Value

On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.

Remarks

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as asio::ip::tcp::resolver::iterator.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload11.html000066400000000000000000000157571340672067200225100ustar00rootroot00000000000000 connect (11 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    ConnectCondition connect_condition);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

end

An iterator pointing to the end of a sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

Return Value

An iterator denoting the successfully connected endpoint.

Exceptions

asio::system_error

Thrown on failure. If the sequence is empty, the associated error_code is asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Example

The following connect condition function object can be used to output information about the individual connection attempts:

struct my_connect_condition
{
  bool operator()(
      const asio::error_code& ec,
      const::tcp::endpoint& next)
  {
    if (ec) std::cout << "Error: " << ec.message() << std::endl;
    std::cout << "Trying: " << next << std::endl;
    return true;
  }
};

It would be used with the asio::connect function as follows:

tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::resolver::results_type e = r.resolve(q);
tcp::socket s(io_context);
tcp::resolver::results_type::iterator i = asio::connect(
    s, e.begin(), e.end(), my_connect_condition());
std::cout << "Connected to: " << i->endpoint() << std::endl;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload12.html000066400000000000000000000154161340672067200225010ustar00rootroot00000000000000 connect (12 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    ConnectCondition connect_condition,
    asio::error_code & ec);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

end

An iterator pointing to the end of a sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

ec

Set to indicate what error occurred, if any. If the sequence is empty, set to asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Return Value

On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.

Example

The following connect condition function object can be used to output information about the individual connection attempts:

struct my_connect_condition
{
  bool operator()(
      const asio::error_code& ec,
      const::tcp::endpoint& next)
  {
    if (ec) std::cout << "Error: " << ec.message() << std::endl;
    std::cout << "Trying: " << next << std::endl;
    return true;
  }
};

It would be used with the asio::connect function as follows:

tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::resolver::results_type e = r.resolve(q);
tcp::socket s(io_context);
asio::error_code ec;
tcp::resolver::results_type::iterator i = asio::connect(
    s, e.begin(), e.end(), my_connect_condition());
if (ec)
{
  // An error occurred.
}
else
{
  std::cout << "Connected to: " << i->endpoint() << std::endl;
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload2.html000066400000000000000000000116411340672067200224140ustar00rootroot00000000000000 connect (2 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    asio::error_code & ec,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

endpoints

A sequence of endpoints.

ec

Set to indicate what error occurred, if any. If the sequence is empty, set to asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Return Value

On success, the successfully connected endpoint. Otherwise, a default-constructed endpoint.

Example
tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);
asio::error_code ec;
asio::connect(s, r.resolve(q), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload3.html000066400000000000000000000124251340672067200224160ustar00rootroot00000000000000 connect (3 of 12 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

Return Value

On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.

Exceptions

asio::system_error

Thrown on failure. If the sequence is empty, the associated error_code is asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Remarks

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as asio::ip::tcp::resolver::iterator.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload4.html000066400000000000000000000117021340672067200224140ustar00rootroot00000000000000 connect (4 of 12 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    asio::error_code & ec,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

ec

Set to indicate what error occurred, if any. If the sequence is empty, set to asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Return Value

On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.

Remarks

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as asio::ip::tcp::resolver::iterator.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload5.html000066400000000000000000000122341340672067200224160ustar00rootroot00000000000000 connect (5 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

end

An iterator pointing to the end of a sequence of endpoints.

Return Value

An iterator denoting the successfully connected endpoint.

Exceptions

asio::system_error

Thrown on failure. If the sequence is empty, the associated error_code is asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Example
tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::resolver::results_type e = r.resolve(q);
tcp::socket s(io_context);
asio::connect(s, e.begin(), e.end());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload6.html000066400000000000000000000116711340672067200224230ustar00rootroot00000000000000 connect (6 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    Iterator end,
    asio::error_code & ec);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

end

An iterator pointing to the end of a sequence of endpoints.

ec

Set to indicate what error occurred, if any. If the sequence is empty, set to asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Return Value

On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.

Example
tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::resolver::results_type e = r.resolve(q);
tcp::socket s(io_context);
asio::error_code ec;
asio::connect(s, e.begin(), e.end(), ec);
if (ec)
{
  // An error occurred.
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload7.html000066400000000000000000000156041340672067200224240ustar00rootroot00000000000000 connect (7 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence,
    typename ConnectCondition>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    ConnectCondition connect_condition,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

endpoints

A sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

Return Value

The successfully connected endpoint.

Exceptions

asio::system_error

Thrown on failure. If the sequence is empty, the associated error_code is asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Example

The following connect condition function object can be used to output information about the individual connection attempts:

struct my_connect_condition
{
  bool operator()(
      const asio::error_code& ec,
      const::tcp::endpoint& next)
  {
    if (ec) std::cout << "Error: " << ec.message() << std::endl;
    std::cout << "Trying: " << next << std::endl;
    return true;
  }
};

It would be used with the asio::connect function as follows:

tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);
tcp::endpoint e = asio::connect(s,
    r.resolve(q), my_connect_condition());
std::cout << "Connected to: " << e << std::endl;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload8.html000066400000000000000000000152721340672067200224260ustar00rootroot00000000000000 connect (8 of 12 overloads)
asio C++ library

PrevUpHomeNext

Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename EndpointSequence,
    typename ConnectCondition>
Protocol::endpoint connect(
    basic_socket< Protocol > & s,
    const EndpointSequence & endpoints,
    ConnectCondition connect_condition,
    asio::error_code & ec,
    typename enable_if< is_endpoint_sequence< EndpointSequence >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

endpoints

A sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

ec

Set to indicate what error occurred, if any. If the sequence is empty, set to asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Return Value

On success, the successfully connected endpoint. Otherwise, a default-constructed endpoint.

Example

The following connect condition function object can be used to output information about the individual connection attempts:

struct my_connect_condition
{
  bool operator()(
      const asio::error_code& ec,
      const::tcp::endpoint& next)
  {
    if (ec) std::cout << "Error: " << ec.message() << std::endl;
    std::cout << "Trying: " << next << std::endl;
    return true;
  }
};

It would be used with the asio::connect function as follows:

tcp::resolver r(io_context);
tcp::resolver::query q("host", "service");
tcp::socket s(io_context);
asio::error_code ec;
tcp::endpoint e = asio::connect(s,
    r.resolve(q), my_connect_condition(), ec);
if (ec)
{
  // An error occurred.
}
else
{
  std::cout << "Connected to: " << e << std::endl;
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/connect/overload9.html000066400000000000000000000145061340672067200224260ustar00rootroot00000000000000 connect (9 of 12 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use range overload.) Establishes a socket connection by trying each endpoint in a sequence.

template<
    typename Protocol,
    typename Iterator,
    typename ConnectCondition>
Iterator connect(
    basic_socket< Protocol > & s,
    Iterator begin,
    ConnectCondition connect_condition,
    typename enable_if<!is_endpoint_sequence< Iterator >::value >::type *  = 0);

This function attempts to connect a socket to one of a sequence of endpoints. It does this by repeated calls to the socket's connect member function, once for each endpoint in the sequence, until a connection is successfully established.

Parameters

s

The socket to be connected. If the socket is already open, it will be closed.

begin

An iterator pointing to the start of a sequence of endpoints.

connect_condition

A function object that is called prior to each connection attempt. The signature of the function object must be:

bool connect_condition(
    const asio::error_code& ec,
    const typename Protocol::endpoint& next);

The ec parameter contains the result from the most recent connect operation. Before the first connection attempt, ec is always set to indicate success. The next parameter is the next endpoint to be tried. The function object should return true if the next endpoint should be tried, and false if it should be skipped.

Return Value

On success, an iterator denoting the successfully connected endpoint. Otherwise, the end iterator.

Exceptions

asio::system_error

Thrown on failure. If the sequence is empty, the associated error_code is asio::error::not_found. Otherwise, contains the error from the last connection attempt.

Remarks

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as asio::ip::tcp::resolver::iterator.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer.html000066400000000000000000000161521340672067200215470ustar00rootroot00000000000000 const_buffer
asio C++ library

PrevUpHomeNext

Holds a buffer that cannot be modified.

class const_buffer
Member Functions

Name

Description

const_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

Construct a non-modifiable buffer from a modifiable one.

data

Get a pointer to the beginning of the memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new non-modifiable buffer that is offset from the start of another.

The const_buffer class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::const_buffer b1 = ...;
std::size_t s1 = b1.size();
const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/000077500000000000000000000000001340672067200206545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/const_buffer/const_buffer.html000066400000000000000000000072041340672067200242240ustar00rootroot00000000000000 const_buffer::const_buffer
asio C++ library

PrevUpHomeNext

Construct an empty buffer.

const_buffer();
  » more...

Construct a buffer to represent a given memory range.

const_buffer(
    const void * data,
    std::size_t size);
  » more...

Construct a non-modifiable buffer from a modifiable one.

const_buffer(
    const mutable_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/const_buffer/000077500000000000000000000000001340672067200233335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/const_buffer/const_buffer/overload1.html000066400000000000000000000050131340672067200261140ustar00rootroot00000000000000 const_buffer::const_buffer (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an empty buffer.

const_buffer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/const_buffer/overload2.html000066400000000000000000000051231340672067200261170ustar00rootroot00000000000000 const_buffer::const_buffer (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a buffer to represent a given memory range.

const_buffer(
    const void * data,
    std::size_t size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/const_buffer/overload3.html000066400000000000000000000050521340672067200261210ustar00rootroot00000000000000 const_buffer::const_buffer (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a non-modifiable buffer from a modifiable one.

const_buffer(
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/data.html000066400000000000000000000047621340672067200224640ustar00rootroot00000000000000 const_buffer::data
asio C++ library

PrevUpHomeNext

Get a pointer to the beginning of the memory range.

const void * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/operator_plus_.html000066400000000000000000000062661340672067200246110ustar00rootroot00000000000000 const_buffer::operator+
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that is offset from the start of another.

const_buffer operator+(
    const const_buffer & b,
    std::size_t n);
  » more...

const_buffer operator+(
    std::size_t n,
    const const_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/operator_plus_/000077500000000000000000000000001340672067200237115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/const_buffer/operator_plus_/overload1.html000066400000000000000000000051651340672067200265020ustar00rootroot00000000000000 const_buffer::operator+ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that is offset from the start of another.

const_buffer operator+(
    const const_buffer & b,
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/operator_plus_/overload2.html000066400000000000000000000052021340672067200264730ustar00rootroot00000000000000 const_buffer::operator+ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that is offset from the start of another.

const_buffer operator+(
    std::size_t n,
    const const_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/operator_plus__eq_.html000066400000000000000000000050611340672067200254250ustar00rootroot00000000000000 const_buffer::operator+=
asio C++ library

PrevUpHomeNext

Move the start of the buffer by the specified number of bytes.

const_buffer & operator+=(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffer/size.html000066400000000000000000000047021340672067200225170ustar00rootroot00000000000000 const_buffer::size
asio C++ library

PrevUpHomeNext

Get the size of the memory range.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1.html000066400000000000000000000203241340672067200221460ustar00rootroot00000000000000 const_buffers_1
asio C++ library

PrevUpHomeNext

(Deprecated: Use const_buffer.) Adapts a single non-modifiable buffer so that it meets the requirements of the ConstBufferSequence concept.

class const_buffers_1 :
  public const_buffer
Types

Name

Description

const_iterator

A random-access iterator type that may be used to read elements.

value_type

The type for each element in the list of buffers.

Member Functions

Name

Description

begin

Get a random-access iterator to the first element.

const_buffers_1

Construct to represent a given memory range.

Construct to represent a single non-modifiable buffer.

data

Get a pointer to the beginning of the memory range.

end

Get a random-access iterator for one past the last element.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new non-modifiable buffer that is offset from the start of another.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/000077500000000000000000000000001340672067200212575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/const_buffers_1/begin.html000066400000000000000000000047671340672067200232470ustar00rootroot00000000000000 const_buffers_1::begin
asio C++ library

PrevUpHomeNext

Get a random-access iterator to the first element.

const_iterator begin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/const_buffers_1.html000066400000000000000000000065271340672067200252410ustar00rootroot00000000000000 const_buffers_1::const_buffers_1
asio C++ library

PrevUpHomeNext

Construct to represent a given memory range.

const_buffers_1(
    const void * data,
    std::size_t size);
  » more...

Construct to represent a single non-modifiable buffer.

explicit const_buffers_1(
    const const_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/const_buffers_1/000077500000000000000000000000001340672067200243415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/const_buffers_1/const_buffers_1/overload1.html000066400000000000000000000052101340672067200271210ustar00rootroot00000000000000 const_buffers_1::const_buffers_1 (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct to represent a given memory range.

const_buffers_1(
    const void * data,
    std::size_t size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/const_buffers_1/overload2.html000066400000000000000000000052011340672067200271220ustar00rootroot00000000000000 const_buffers_1::const_buffers_1 (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct to represent a single non-modifiable buffer.

const_buffers_1(
    const const_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/const_iterator.html000066400000000000000000000061641340672067200252130ustar00rootroot00000000000000 const_buffers_1::const_iterator
asio C++ library

PrevUpHomeNext

A random-access iterator type that may be used to read elements.

typedef const const_buffer * const_iterator;
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/data.html000066400000000000000000000050421340672067200230570ustar00rootroot00000000000000 const_buffers_1::data
asio C++ library

PrevUpHomeNext

Inherited from const_buffer.

Get a pointer to the beginning of the memory range.

const void * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/end.html000066400000000000000000000047051340672067200227210ustar00rootroot00000000000000 const_buffers_1::end
asio C++ library

PrevUpHomeNext

Get a random-access iterator for one past the last element.

const_iterator end() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/operator_plus_.html000066400000000000000000000063371340672067200252130ustar00rootroot00000000000000 const_buffers_1::operator+
asio C++ library

PrevUpHomeNext

Create a new non-modifiable buffer that is offset from the start of another.

const_buffer operator+(
    const const_buffer & b,
    std::size_t n);
  » more...

const_buffer operator+(
    std::size_t n,
    const const_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/operator_plus_/000077500000000000000000000000001340672067200243145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/const_buffers_1/operator_plus_/overload1.html000066400000000000000000000053551340672067200271060ustar00rootroot00000000000000 const_buffers_1::operator+ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from const_buffer.

Create a new non-modifiable buffer that is offset from the start of another.

const_buffer operator+(
    const const_buffer & b,
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/operator_plus_/overload2.html000066400000000000000000000053721340672067200271060ustar00rootroot00000000000000 const_buffers_1::operator+ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from const_buffer.

Create a new non-modifiable buffer that is offset from the start of another.

const_buffer operator+(
    std::size_t n,
    const const_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/operator_plus__eq_.html000066400000000000000000000052611340672067200260320ustar00rootroot00000000000000 const_buffers_1::operator+=
asio C++ library

PrevUpHomeNext

Inherited from const_buffer.

Move the start of the buffer by the specified number of bytes.

const_buffer & operator+=(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/size.html000066400000000000000000000050631340672067200231230ustar00rootroot00000000000000 const_buffers_1::size
asio C++ library

PrevUpHomeNext

Inherited from const_buffer.

Get the size of the memory range.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/const_buffers_1/value_type.html000066400000000000000000000171051340672067200243260ustar00rootroot00000000000000 const_buffers_1::value_type
asio C++ library

PrevUpHomeNext

The type for each element in the list of buffers.

typedef const_buffer value_type;
Member Functions

Name

Description

const_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

Construct a non-modifiable buffer from a modifiable one.

data

Get a pointer to the beginning of the memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new non-modifiable buffer that is offset from the start of another.

The const_buffer class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::const_buffer b1 = ...;
std::size_t s1 = b1.size();
const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/coroutine.html000066400000000000000000000364751340672067200211110ustar00rootroot00000000000000 coroutine
asio C++ library

PrevUpHomeNext

Provides support for implementing stackless coroutines.

class coroutine
Member Functions

Name

Description

coroutine

Constructs a coroutine in its initial state.

is_child

Returns true if the coroutine is the child of a fork.

is_complete

Returns true if the coroutine has reached its terminal state.

is_parent

Returns true if the coroutine is the parent of a fork.

The coroutine class may be used to implement stackless coroutines. The class itself is used to store the current state of the coroutine.

Coroutines are copy-constructible and assignable, and the space overhead is a single int. They can be used as a base class:

class session : coroutine
{
  ...
};

or as a data member:

class session
{
  ...
  coroutine coro_;
};

or even bound in as a function argument using lambdas or bind(). The important thing is that as the application maintains a copy of the object for as long as the coroutine must be kept alive.

Pseudo-keywords

A coroutine is used in conjunction with certain "pseudo-keywords", which are implemented as macros. These macros are defined by a header file:

#include <asio/yield.hpp>

and may conversely be undefined as follows:

#include <asio/unyield.hpp>

reenter

The reenter macro is used to define the body of a coroutine. It takes a single argument: a pointer or reference to a coroutine object. For example, if the base class is a coroutine object you may write:

reenter (this)
{
  ... coroutine body ...
}

and if a data member or other variable you can write:

reenter (coro_)
{
  ... coroutine body ...
}

When reenter is executed at runtime, control jumps to the location of the last yield or fork.

The coroutine body may also be a single statement, such as:

reenter (this) for (;;)
{
  ...
}

Limitation: The reenter macro is implemented using a switch. This means that you must take care when using local variables within the coroutine body. The local variable is not allowed in a position where reentering the coroutine could bypass the variable definition.

yield statement

This form of the yield keyword is often used with asynchronous operations:

yield socket_->async_read_some(buffer(*buffer_), *this);

This divides into four logical steps:

  • yield saves the current state of the coroutine.
  • The statement initiates the asynchronous operation.
  • The resume point is defined immediately following the statement.
  • Control is transferred to the end of the coroutine body.

When the asynchronous operation completes, the function object is invoked and reenter causes control to transfer to the resume point. It is important to remember to carry the coroutine state forward with the asynchronous operation. In the above snippet, the current class is a function object object with a coroutine object as base class or data member.

The statement may also be a compound statement, and this permits us to define local variables with limited scope:

yield
{
  mutable_buffers_1 b = buffer(*buffer_);
  socket_->async_read_some(b, *this);
}

yield return expression ;

This form of yield is often used in generators or coroutine-based parsers. For example, the function object:

struct interleave : coroutine
{
  istream& is1;
  istream& is2;
  char operator()(char c)
  {
    reenter (this) for (;;)
    {
      yield return is1.get();
      yield return is2.get();
    }
  }
};

defines a trivial coroutine that interleaves the characters from two input streams.

This type of yield divides into three logical steps:

  • yield saves the current state of the coroutine.
  • The resume point is defined immediately following the semicolon.
  • The value of the expression is returned from the function.

yield ;

This form of yield is equivalent to the following steps:

  • yield saves the current state of the coroutine.
  • The resume point is defined immediately following the semicolon.
  • Control is transferred to the end of the coroutine body.

This form might be applied when coroutines are used for cooperative threading and scheduling is explicitly managed. For example:

struct task : coroutine
{
  ...
  void operator()()
  {
    reenter (this)
    {
      while (... not finished ...)
      {
        ... do something ...
        yield;
        ... do some more ...
        yield;
      }
    }
  }
  ...
};
...
task t1, t2;
for (;;)
{
  t1();
  t2();
}

yield break ;

The final form of yield is used to explicitly terminate the coroutine. This form is comprised of two steps:

  • yield sets the coroutine state to indicate termination.
  • Control is transferred to the end of the coroutine body.

Once terminated, calls to is_complete() return true and the coroutine cannot be reentered.

Note that a coroutine may also be implicitly terminated if the coroutine body is exited without a yield, e.g. by return, throw or by running to the end of the body.

fork statement

The fork pseudo-keyword is used when "forking" a coroutine, i.e. splitting it into two (or more) copies. One use of fork is in a server, where a new coroutine is created to handle each client connection:

reenter (this)
{
  do
  {
    socket_.reset(new tcp::socket(io_context_));
    yield acceptor->async_accept(*socket_, *this);
    fork server(*this)();
  } while (is_parent());
  ... client-specific handling follows ...
}

The logical steps involved in a fork are:

  • fork saves the current state of the coroutine.
  • The statement creates a copy of the coroutine and either executes it immediately or schedules it for later execution.
  • The resume point is defined immediately following the semicolon.
  • For the "parent", control immediately continues from the next line.

The functions is_parent() and is_child() can be used to differentiate between parent and child. You would use these functions to alter subsequent control flow.

Note that fork doesn't do the actual forking by itself. It is the application's responsibility to create a clone of the coroutine and call it. The clone can be called immediately, as above, or scheduled for delayed execution using something like io_context::post().

Alternate macro names

If preferred, an application can use macro names that follow a more typical naming convention, rather than the pseudo-keywords. These are:

  • ASIO_CORO_REENTER instead of reenter
  • ASIO_CORO_YIELD instead of yield
  • ASIO_CORO_FORK instead of fork
Requirements

Header: asio/coroutine.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/coroutine/000077500000000000000000000000001340672067200202045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/coroutine/coroutine.html000066400000000000000000000046101340672067200231020ustar00rootroot00000000000000 coroutine::coroutine
asio C++ library

PrevUpHomeNext

Constructs a coroutine in its initial state.

coroutine();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/coroutine/is_child.html000066400000000000000000000046431340672067200226570ustar00rootroot00000000000000 coroutine::is_child
asio C++ library

PrevUpHomeNext

Returns true if the coroutine is the child of a fork.

bool is_child() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/coroutine/is_complete.html000066400000000000000000000046641340672067200234070ustar00rootroot00000000000000 coroutine::is_complete
asio C++ library

PrevUpHomeNext

Returns true if the coroutine has reached its terminal state.

bool is_complete() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/coroutine/is_parent.html000066400000000000000000000046751340672067200230720ustar00rootroot00000000000000 coroutine::is_parent
asio C++ library

PrevUpHomeNext

Returns true if the coroutine is the parent of a fork.

bool is_parent() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/deadline_timer.html000066400000000000000000000354271340672067200220430ustar00rootroot00000000000000 deadline_timer
asio C++ library

PrevUpHomeNext

Typedef for the typical usage of timer. Uses a UTC clock.

typedef basic_deadline_timer< boost::posix_time::ptime > deadline_timer;
Types

Name

Description

duration_type

The duration type.

executor_type

The type of the executor associated with the object.

time_type

The time type.

traits_type

The time traits type.

Member Functions

Name

Description

async_wait

Start an asynchronous wait on the timer.

basic_deadline_timer

Constructor.

Constructor to set a particular expiry time as an absolute time.

Constructor to set a particular expiry time relative to now.

Move-construct a basic_deadline_timer from another.

cancel

Cancel any asynchronous operations that are waiting on the timer.

cancel_one

Cancels one asynchronous operation that is waiting on the timer.

expires_at

Get the timer's expiry time as an absolute time.

Set the timer's expiry time as an absolute time.

expires_from_now

Get the timer's expiry time relative to now.

Set the timer's expiry time relative to now.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_deadline_timer from another.

wait

Perform a blocking wait on the timer.

~basic_deadline_timer

Destroys the timer.

The basic_deadline_timer class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A deadline timer is always in one of two states: "expired" or "not expired". If the wait() or async_wait() function is called on an expired timer, the wait operation will complete immediately.

Most applications will use the deadline_timer typedef.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Examples

Performing a blocking wait:

// Construct a timer without setting an expiry time.
asio::deadline_timer timer(io_context);

// Set an expiry time relative to now.
timer.expires_from_now(boost::posix_time::seconds(5));

// Wait for the timer to expire.
timer.wait();

Performing an asynchronous wait:

void handler(const asio::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
asio::deadline_timer timer(io_context,
    boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));

// Start an asynchronous wait.
timer.async_wait(handler);
Changing an active deadline_timer's expiry time

Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:

void on_some_event()
{
  if (my_timer.expires_from_now(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const asio::error_code& e)
{
  if (e != asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}
  • The asio::basic_deadline_timer::expires_from_now() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.
  • If a wait handler is cancelled, the error_code passed to it contains the value asio::error::operation_aborted.
Requirements

Header: asio/deadline_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/defer.html000066400000000000000000000111601340672067200201470ustar00rootroot00000000000000 defer
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename CompletionToken>
DEDUCED defer(
    CompletionToken && token);
  » more...

template<
    typename Executor,
    typename CompletionToken>
DEDUCED defer(
    const Executor & ex,
    CompletionToken && token,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

template<
    typename ExecutionContext,
    typename CompletionToken>
DEDUCED defer(
    ExecutionContext & ctx,
    CompletionToken && token,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...
Requirements

Header: asio/defer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/defer/000077500000000000000000000000001340672067200172625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/defer/overload1.html000066400000000000000000000104001340672067200220370ustar00rootroot00000000000000 defer (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename CompletionToken>
DEDUCED defer(
    CompletionToken && token);

This function submits an object for execution using the object's associated executor. The function object is queued for execution, and is never called from the current thread prior to returning from defer().

This function has the following effects:

  • Constructs a function object handler of type Handler, initialized with handler(forward<CompletionToken>(token)).
  • Constructs an object result of type async_result<Handler>, initializing the object as result(handler).
  • Obtains the handler's associated executor object ex by performing get_associated_executor(handler).
  • Obtains the handler's associated allocator object alloc by performing get_associated_allocator(handler).
  • Performs ex.defer(std::move(handler), alloc).
  • Returns result.get().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/defer/overload2.html000066400000000000000000000117371340672067200220560ustar00rootroot00000000000000 defer (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename Executor,
    typename CompletionToken>
DEDUCED defer(
    const Executor & ex,
    CompletionToken && token,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

This function submits an object for execution using the specified executor. The function object is queued for execution, and is never called from the current thread prior to returning from defer().

This function has the following effects:

  • Constructs a function object handler of type Handler, initialized with handler(forward<CompletionToken>(token)).
  • Constructs an object result of type async_result<Handler>, initializing the object as result(handler).
  • Obtains the handler's associated executor object ex1 by performing get_associated_executor(handler).
  • Creates a work object w by performing make_work(ex1).
  • Obtains the handler's associated allocator object alloc by performing get_associated_allocator(handler).
  • Constructs a function object f with a function call operator that performs ex1.dispatch(std::move(handler), alloc) followed by w.reset().
  • Performs Executor(ex).defer(std::move(f), alloc).
  • Returns result.get().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/defer/overload3.html000066400000000000000000000062331340672067200220520ustar00rootroot00000000000000 defer (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename ExecutionContext,
    typename CompletionToken>
DEDUCED defer(
    ExecutionContext & ctx,
    CompletionToken && token,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
Return Value

defer(ctx.get_executor(), forward<CompletionToken>(token)).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dispatch.html000066400000000000000000000113271340672067200206660ustar00rootroot00000000000000 dispatch
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename CompletionToken>
DEDUCED dispatch(
    CompletionToken && token);
  » more...

template<
    typename Executor,
    typename CompletionToken>
DEDUCED dispatch(
    const Executor & ex,
    CompletionToken && token,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

template<
    typename ExecutionContext,
    typename CompletionToken>
DEDUCED dispatch(
    ExecutionContext & ctx,
    CompletionToken && token,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...
Requirements

Header: asio/dispatch.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dispatch/000077500000000000000000000000001340672067200177745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/dispatch/overload1.html000066400000000000000000000104701340672067200225600ustar00rootroot00000000000000 dispatch (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename CompletionToken>
DEDUCED dispatch(
    CompletionToken && token);

This function submits an object for execution using the object's associated executor. The function object is queued for execution, and is never called from the current thread prior to returning from dispatch().

This function has the following effects:

  • Constructs a function object handler of type Handler, initialized with handler(forward<CompletionToken>(token)).
  • Constructs an object result of type async_result<Handler>, initializing the object as result(handler).
  • Obtains the handler's associated executor object ex by performing get_associated_executor(handler).
  • Obtains the handler's associated allocator object alloc by performing get_associated_allocator(handler).
  • Performs ex.dispatch(std::move(handler), alloc).
  • Returns result.get().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dispatch/overload2.html000066400000000000000000000120161340672067200225570ustar00rootroot00000000000000 dispatch (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename Executor,
    typename CompletionToken>
DEDUCED dispatch(
    const Executor & ex,
    CompletionToken && token,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

This function submits an object for execution using the specified executor. The function object is queued for execution, and is never called from the current thread prior to returning from dispatch().

This function has the following effects:

  • Constructs a function object handler of type Handler, initialized with handler(forward<CompletionToken>(token)).
  • Constructs an object result of type async_result<Handler>, initializing the object as result(handler).
  • Obtains the handler's associated executor object ex1 by performing get_associated_executor(handler).
  • Creates a work object w by performing make_work(ex1).
  • Obtains the handler's associated allocator object alloc by performing get_associated_allocator(handler).
  • Constructs a function object f with a function call operator that performs ex1.dispatch(std::move(handler), alloc) followed by w.reset().
  • Performs Executor(ex).dispatch(std::move(f), alloc).
  • Returns result.get().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dispatch/overload3.html000066400000000000000000000063451340672067200225700ustar00rootroot00000000000000 dispatch (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename ExecutionContext,
    typename CompletionToken>
DEDUCED dispatch(
    ExecutionContext & ctx,
    CompletionToken && token,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
Return Value

dispatch(ctx.get_executor(), forward<CompletionToken>(token)).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_buffer.html000066400000000000000000000121141340672067200220370ustar00rootroot00000000000000 dynamic_buffer
asio C++ library

PrevUpHomeNext

The asio::dynamic_buffer function is used to create a dynamically resized buffer from a std::basic_string or std::vector.

Create a new dynamic buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
dynamic_string_buffer< Elem, Traits, Allocator > dynamic_buffer(
    std::basic_string< Elem, Traits, Allocator > & data);
  » more...

template<
    typename Elem,
    typename Traits,
    typename Allocator>
dynamic_string_buffer< Elem, Traits, Allocator > dynamic_buffer(
    std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size);
  » more...

Create a new dynamic buffer that represents the given vector.

template<
    typename Elem,
    typename Allocator>
dynamic_vector_buffer< Elem, Allocator > dynamic_buffer(
    std::vector< Elem, Allocator > & data);
  » more...

template<
    typename Elem,
    typename Allocator>
dynamic_vector_buffer< Elem, Allocator > dynamic_buffer(
    std::vector< Elem, Allocator > & data,
    std::size_t max_size);
  » more...
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_buffer/000077500000000000000000000000001340672067200211525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/dynamic_buffer/overload1.html000066400000000000000000000060231340672067200237350ustar00rootroot00000000000000 dynamic_buffer (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Create a new dynamic buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
dynamic_string_buffer< Elem, Traits, Allocator > dynamic_buffer(
    std::basic_string< Elem, Traits, Allocator > & data);
Return Value

dynamic_string_buffer<Elem, Traits, Allocator>(data).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_buffer/overload2.html000066400000000000000000000060621340672067200237410ustar00rootroot00000000000000 dynamic_buffer (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Create a new dynamic buffer that represents the given string.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
dynamic_string_buffer< Elem, Traits, Allocator > dynamic_buffer(
    std::basic_string< Elem, Traits, Allocator > & data,
    std::size_t max_size);
Return Value

dynamic_string_buffer<Elem, Traits, Allocator>(data, max_size).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_buffer/overload3.html000066400000000000000000000057331340672067200237460ustar00rootroot00000000000000 dynamic_buffer (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Create a new dynamic buffer that represents the given vector.

template<
    typename Elem,
    typename Allocator>
dynamic_vector_buffer< Elem, Allocator > dynamic_buffer(
    std::vector< Elem, Allocator > & data);
Return Value

dynamic_vector_buffer<Elem, Allocator>(data).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_buffer/overload4.html000066400000000000000000000060401340672067200237370ustar00rootroot00000000000000 dynamic_buffer (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Create a new dynamic buffer that represents the given vector.

template<
    typename Elem,
    typename Allocator>
dynamic_vector_buffer< Elem, Allocator > dynamic_buffer(
    std::vector< Elem, Allocator > & data,
    std::size_t max_size);
Return Value

dynamic_vector_buffer<Elem, Allocator>(data, max_size).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer.html000066400000000000000000000203741340672067200234340ustar00rootroot00000000000000 dynamic_string_buffer
asio C++ library

PrevUpHomeNext

Adapt a basic_string to the DynamicBuffer requirements.

template<
    typename Elem,
    typename Traits,
    typename Allocator>
class dynamic_string_buffer
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

capacity

Get the current capacity of the dynamic buffer.

commit

Move bytes from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

dynamic_string_buffer

Construct a dynamic buffer from a string.

Move construct a dynamic buffer.

max_size

Get the maximum size of the dynamic buffer.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Requires that sizeof(Elem) == 1.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/000077500000000000000000000000001340672067200225405ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/dynamic_string_buffer/capacity.html000066400000000000000000000057511340672067200252330ustar00rootroot00000000000000 dynamic_string_buffer::capacity
asio C++ library

PrevUpHomeNext

Get the current capacity of the dynamic buffer.

std::size_t capacity() const;
Return Value

The current total capacity of the buffer, i.e. for both the input sequence and output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/commit.html000066400000000000000000000075711340672067200247300ustar00rootroot00000000000000 dynamic_string_buffer::commit
asio C++ library

PrevUpHomeNext

Move bytes from the output sequence to the input sequence.

void commit(
    std::size_t n);
Parameters

n

The number of bytes to append from the start of the output sequence to the end of the input sequence. The remainder of the output sequence is discarded.

Requires a preceding call prepare(x) where x >= n, and no intervening operations that modify the input or output sequence.

Remarks

If n is greater than the size of the output sequence, the entire output sequence is moved to the input sequence and no error is issued.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/const_buffers_type.html000066400000000000000000000176411340672067200273420ustar00rootroot00000000000000 dynamic_string_buffer::const_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the input sequence as a list of buffers.

typedef const_buffer const_buffers_type;
Member Functions

Name

Description

const_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

Construct a non-modifiable buffer from a modifiable one.

data

Get a pointer to the beginning of the memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new non-modifiable buffer that is offset from the start of another.

The const_buffer class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::const_buffer b1 = ...;
std::size_t s1 = b1.size();
const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/consume.html000066400000000000000000000061641340672067200251060ustar00rootroot00000000000000 dynamic_string_buffer::consume
asio C++ library

PrevUpHomeNext

Remove characters from the input sequence.

void consume(
    std::size_t n);

Removes n characters from the beginning of the input sequence.

Remarks

If n is greater than the size of the input sequence, the entire input sequence is consumed and no error is issued.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/data.html000066400000000000000000000071031340672067200243400ustar00rootroot00000000000000 dynamic_string_buffer::data
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the input sequence.

const_buffers_type data() const;
Return Value

An object of type const_buffers_type that satisfies ConstBufferSequence requirements, representing the basic_string memory in input sequence.

Remarks

The returned object is invalidated by any dynamic_string_buffer or basic_string member function that modifies the input sequence or output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/dynamic_string_buffer.html000066400000000000000000000071751340672067200300030ustar00rootroot00000000000000 dynamic_string_buffer::dynamic_string_buffer
asio C++ library

PrevUpHomeNext

Construct a dynamic buffer from a string.

explicit dynamic_string_buffer(
    std::basic_string< Elem, Traits, Allocator > & s,
    std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());
  » more...

Move construct a dynamic buffer.

dynamic_string_buffer(
    dynamic_string_buffer && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/dynamic_string_buffer/000077500000000000000000000000001340672067200271035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/dynamic_string_buffer/dynamic_string_buffer/overload1.html000066400000000000000000000100451340672067200316650ustar00rootroot00000000000000 dynamic_string_buffer::dynamic_string_buffer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a dynamic buffer from a string.

dynamic_string_buffer(
    std::basic_string< Elem, Traits, Allocator > & s,
    std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());
Parameters

s

The string to be used as backing storage for the dynamic buffer. Any existing data in the string is treated as the dynamic buffer's input sequence. The object stores a reference to the string and the user is responsible for ensuring that the string object remains valid until the dynamic_string_buffer object is destroyed.

maximum_size

Specifies a maximum size for the buffer, in bytes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/dynamic_string_buffer/overload2.html000066400000000000000000000053051340672067200316710ustar00rootroot00000000000000 dynamic_string_buffer::dynamic_string_buffer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move construct a dynamic buffer.

dynamic_string_buffer(
    dynamic_string_buffer && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/max_size.html000066400000000000000000000061231340672067200252470ustar00rootroot00000000000000 dynamic_string_buffer::max_size
asio C++ library

PrevUpHomeNext

Get the maximum size of the dynamic buffer.

std::size_t max_size() const;
Return Value

The allowed maximum of the sum of the sizes of the input sequence and output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/mutable_buffers_type.html000066400000000000000000000175561340672067200276520ustar00rootroot00000000000000 dynamic_string_buffer::mutable_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the output sequence as a list of buffers.

typedef mutable_buffer mutable_buffers_type;
Member Functions

Name

Description

data

Get a pointer to the beginning of the memory range.

mutable_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new modifiable buffer that is offset from the start of another.

The mutable_buffer class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/prepare.html000066400000000000000000000106141340672067200250660ustar00rootroot00000000000000 dynamic_string_buffer::prepare
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the output sequence, with the given size.

mutable_buffers_type prepare(
    std::size_t n);

Ensures that the output sequence can accommodate n bytes, resizing the basic_string object as necessary.

Return Value

An object of type mutable_buffers_type that satisfies MutableBufferSequence requirements, representing basic_string memory at the start of the output sequence of size n.

Exceptions

std::length_error

If size() + n > max_size().

Remarks

The returned object is invalidated by any dynamic_string_buffer or basic_string member function that modifies the input sequence or output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_string_buffer/size.html000066400000000000000000000050221340672067200243770ustar00rootroot00000000000000 dynamic_string_buffer::size
asio C++ library

PrevUpHomeNext

Get the size of the input sequence.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer.html000066400000000000000000000203411340672067200234220ustar00rootroot00000000000000 dynamic_vector_buffer
asio C++ library

PrevUpHomeNext

Adapt a vector to the DynamicBuffer requirements.

template<
    typename Elem,
    typename Allocator>
class dynamic_vector_buffer
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

capacity

Get the current capacity of the dynamic buffer.

commit

Move bytes from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

dynamic_vector_buffer

Construct a dynamic buffer from a string.

Move construct a dynamic buffer.

max_size

Get the maximum size of the dynamic buffer.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Requires that sizeof(Elem) == 1.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/000077500000000000000000000000001340672067200225345ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/capacity.html000066400000000000000000000057511340672067200252270ustar00rootroot00000000000000 dynamic_vector_buffer::capacity
asio C++ library

PrevUpHomeNext

Get the current capacity of the dynamic buffer.

std::size_t capacity() const;
Return Value

The current total capacity of the buffer, i.e. for both the input sequence and output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/commit.html000066400000000000000000000075711340672067200247240ustar00rootroot00000000000000 dynamic_vector_buffer::commit
asio C++ library

PrevUpHomeNext

Move bytes from the output sequence to the input sequence.

void commit(
    std::size_t n);
Parameters

n

The number of bytes to append from the start of the output sequence to the end of the input sequence. The remainder of the output sequence is discarded.

Requires a preceding call prepare(x) where x >= n, and no intervening operations that modify the input or output sequence.

Remarks

If n is greater than the size of the output sequence, the entire output sequence is moved to the input sequence and no error is issued.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/const_buffers_type.html000066400000000000000000000176411340672067200273360ustar00rootroot00000000000000 dynamic_vector_buffer::const_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the input sequence as a list of buffers.

typedef const_buffer const_buffers_type;
Member Functions

Name

Description

const_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

Construct a non-modifiable buffer from a modifiable one.

data

Get a pointer to the beginning of the memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new non-modifiable buffer that is offset from the start of another.

The const_buffer class provides a safe representation of a buffer that cannot be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::const_buffer b1 = ...;
std::size_t s1 = b1.size();
const unsigned char* p1 = static_cast<const unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/consume.html000066400000000000000000000061641340672067200251020ustar00rootroot00000000000000 dynamic_vector_buffer::consume
asio C++ library

PrevUpHomeNext

Remove characters from the input sequence.

void consume(
    std::size_t n);

Removes n characters from the beginning of the input sequence.

Remarks

If n is greater than the size of the input sequence, the entire input sequence is consumed and no error is issued.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/data.html000066400000000000000000000071031340672067200243340ustar00rootroot00000000000000 dynamic_vector_buffer::data
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the input sequence.

const_buffers_type data() const;
Return Value

An object of type const_buffers_type that satisfies ConstBufferSequence requirements, representing the basic_string memory in input sequence.

Remarks

The returned object is invalidated by any dynamic_vector_buffer or basic_string member function that modifies the input sequence or output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/dynamic_vector_buffer.html000066400000000000000000000071571340672067200277730ustar00rootroot00000000000000 dynamic_vector_buffer::dynamic_vector_buffer
asio C++ library

PrevUpHomeNext

Construct a dynamic buffer from a string.

explicit dynamic_vector_buffer(
    std::vector< Elem, Allocator > & v,
    std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());
  » more...

Move construct a dynamic buffer.

dynamic_vector_buffer(
    dynamic_vector_buffer && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/dynamic_vector_buffer/000077500000000000000000000000001340672067200270735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/dynamic_vector_buffer/overload1.html000066400000000000000000000100271340672067200316550ustar00rootroot00000000000000 dynamic_vector_buffer::dynamic_vector_buffer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a dynamic buffer from a string.

dynamic_vector_buffer(
    std::vector< Elem, Allocator > & v,
    std::size_t maximum_size = (std::numeric_limits< std::size_t >::max)());
Parameters

v

The vector to be used as backing storage for the dynamic buffer. Any existing data in the vector is treated as the dynamic buffer's input sequence. The object stores a reference to the vector and the user is responsible for ensuring that the vector object remains valid until the dynamic_vector_buffer object is destroyed.

maximum_size

Specifies a maximum size for the buffer, in bytes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/dynamic_vector_buffer/overload2.html000066400000000000000000000053051340672067200316610ustar00rootroot00000000000000 dynamic_vector_buffer::dynamic_vector_buffer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move construct a dynamic buffer.

dynamic_vector_buffer(
    dynamic_vector_buffer && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/max_size.html000066400000000000000000000061231340672067200252430ustar00rootroot00000000000000 dynamic_vector_buffer::max_size
asio C++ library

PrevUpHomeNext

Get the maximum size of the dynamic buffer.

std::size_t max_size() const;
Return Value

The allowed maximum of the sum of the sizes of the input sequence and output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/mutable_buffers_type.html000066400000000000000000000175561340672067200276460ustar00rootroot00000000000000 dynamic_vector_buffer::mutable_buffers_type
asio C++ library

PrevUpHomeNext

The type used to represent the output sequence as a list of buffers.

typedef mutable_buffer mutable_buffers_type;
Member Functions

Name

Description

data

Get a pointer to the beginning of the memory range.

mutable_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new modifiable buffer that is offset from the start of another.

The mutable_buffer class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/prepare.html000066400000000000000000000106141340672067200250620ustar00rootroot00000000000000 dynamic_vector_buffer::prepare
asio C++ library

PrevUpHomeNext

Get a list of buffers that represents the output sequence, with the given size.

mutable_buffers_type prepare(
    std::size_t n);

Ensures that the output sequence can accommodate n bytes, resizing the basic_string object as necessary.

Return Value

An object of type mutable_buffers_type that satisfies MutableBufferSequence requirements, representing basic_string memory at the start of the output sequence of size n.

Exceptions

std::length_error

If size() + n > max_size().

Remarks

The returned object is invalidated by any dynamic_vector_buffer or basic_string member function that modifies the input sequence or output sequence.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/dynamic_vector_buffer/size.html000066400000000000000000000050361340672067200244000ustar00rootroot00000000000000 dynamic_vector_buffer::size
asio C++ library

PrevUpHomeNext

Get the size of the input sequence.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__addrinfo_category.html000066400000000000000000000060201340672067200241140ustar00rootroot00000000000000 error::addrinfo_category
asio C++ library

PrevUpHomeNext

static const asio::error_category & addrinfo_category = asio::error::get_addrinfo_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__addrinfo_errors.html000066400000000000000000000073361340672067200236260ustar00rootroot00000000000000 error::addrinfo_errors
asio C++ library

PrevUpHomeNext

enum addrinfo_errors

Values

service_not_found

The service is not supported for the given socket type.

socket_type_not_supported

The socket type is not supported.

Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__basic_errors.html000066400000000000000000000240651340672067200231170ustar00rootroot00000000000000 error::basic_errors
asio C++ library

PrevUpHomeNext

enum basic_errors

Values

access_denied

Permission denied.

address_family_not_supported

Address family not supported by protocol.

address_in_use

Address already in use.

already_connected

Transport endpoint is already connected.

already_started

Operation already in progress.

broken_pipe

Broken pipe.

connection_aborted

A connection has been aborted.

connection_refused

Connection refused.

connection_reset

Connection reset by peer.

bad_descriptor

Bad file descriptor.

fault

Bad address.

host_unreachable

No route to host.

in_progress

Operation now in progress.

interrupted

Interrupted system call.

invalid_argument

Invalid argument.

message_size

Message too long.

name_too_long

The name was too long.

network_down

Network is down.

network_reset

Network dropped connection on reset.

network_unreachable

Network is unreachable.

no_descriptors

Too many open files.

no_buffer_space

No buffer space available.

no_memory

Cannot allocate memory.

no_permission

Operation not permitted.

no_protocol_option

Protocol not available.

no_such_device

No such device.

not_connected

Transport endpoint is not connected.

not_socket

Socket operation on non-socket.

operation_aborted

Operation cancelled.

operation_not_supported

Operation not supported.

shut_down

Cannot send after transport endpoint shutdown.

timed_out

Connection timed out.

try_again

Resource temporarily unavailable.

would_block

The socket is marked non-blocking and the requested operation would block.

Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__get_addrinfo_category.html000066400000000000000000000057731340672067200247710ustar00rootroot00000000000000 error::get_addrinfo_category
asio C++ library

PrevUpHomeNext

const asio::error_category & get_addrinfo_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__get_misc_category.html000066400000000000000000000057671340672067200241410ustar00rootroot00000000000000 error::get_misc_category
asio C++ library

PrevUpHomeNext

const asio::error_category & get_misc_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__get_netdb_category.html000066400000000000000000000057521340672067200242740ustar00rootroot00000000000000 error::get_netdb_category
asio C++ library

PrevUpHomeNext

const asio::error_category & get_netdb_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__get_ssl_category.html000066400000000000000000000057541340672067200240030ustar00rootroot00000000000000 error::get_ssl_category
asio C++ library

PrevUpHomeNext

const asio::error_category & get_ssl_category();
Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__get_system_category.html000066400000000000000000000057551340672067200245270ustar00rootroot00000000000000 error::get_system_category
asio C++ library

PrevUpHomeNext

const asio::error_category & get_system_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__make_error_code.html000066400000000000000000000111011340672067200235450ustar00rootroot00000000000000 error::make_error_code
asio C++ library

PrevUpHomeNext

asio::error_code

[link asio.reference.error__make_error_code.overload1 make_error_code]

( basic_errors e);

[''''&raquo;''' [link asio.reference.error__make_error_code.overload1 more...]]

asio::error_code make_error_code(
    netdb_errors e);
  » more...

asio::error_code make_error_code(
    addrinfo_errors e);
  » more...

asio::error_code make_error_code(
    misc_errors e);
  » more...

asio::error_code make_error_code(
    ssl_errors e);
  » more...
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__make_error_code/000077500000000000000000000000001340672067200226655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/error__make_error_code/overload1.html000066400000000000000000000047601340672067200254560ustar00rootroot00000000000000 error::make_error_code (1 of 5 overloads)
asio C++ library

PrevUpHomeNext
asio::error_code make_error_code(
    basic_errors e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__make_error_code/overload2.html000066400000000000000000000047231340672067200254560ustar00rootroot00000000000000 error::make_error_code (2 of 5 overloads)
asio C++ library

PrevUpHomeNext
asio::error_code make_error_code(
    netdb_errors e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__make_error_code/overload3.html000066400000000000000000000047261340672067200254620ustar00rootroot00000000000000 error::make_error_code (3 of 5 overloads)
asio C++ library

PrevUpHomeNext
asio::error_code make_error_code(
    addrinfo_errors e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__make_error_code/overload4.html000066400000000000000000000047221340672067200254570ustar00rootroot00000000000000 error::make_error_code (4 of 5 overloads)
asio C++ library

PrevUpHomeNext
asio::error_code make_error_code(
    misc_errors e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__make_error_code/overload5.html000066400000000000000000000047461340672067200254660ustar00rootroot00000000000000 error::make_error_code (5 of 5 overloads)
asio C++ library

PrevUpHomeNext
asio::error_code make_error_code(
    ssl_errors e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__misc_category.html000066400000000000000000000057601340672067200232730ustar00rootroot00000000000000 error::misc_category
asio C++ library

PrevUpHomeNext

static const asio::error_category & misc_category = asio::error::get_misc_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__misc_errors.html000066400000000000000000000077221340672067200227720ustar00rootroot00000000000000 error::misc_errors
asio C++ library

PrevUpHomeNext

enum misc_errors

Values

already_open

Already open.

eof

End of file or stream.

not_found

Element not found.

fd_set_failure

The descriptor cannot fit into the select system call's fd_set.

Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__netdb_category.html000066400000000000000000000056771340672067200234430ustar00rootroot00000000000000 error::netdb_category
asio C++ library

PrevUpHomeNext

static const asio::error_category & netdb_category = asio::error::get_netdb_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__netdb_errors.html000066400000000000000000000100611340672067200231210ustar00rootroot00000000000000 error::netdb_errors
asio C++ library

PrevUpHomeNext

enum netdb_errors

Values

host_not_found

Host not found (authoritative).

host_not_found_try_again

Host not found (non-authoritative).

no_data

The query is valid but does not have associated address data.

no_recovery

A non-recoverable error occurred.

Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__ssl_category.html000066400000000000000000000056531340672067200231420ustar00rootroot00000000000000 error::ssl_category
asio C++ library

PrevUpHomeNext

static const asio::error_category & ssl_category = asio::error::get_ssl_category();
Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__ssl_errors.html000066400000000000000000000055431340672067200226370ustar00rootroot00000000000000 error::ssl_errors
asio C++ library

PrevUpHomeNext

enum ssl_errors
Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error__system_category.html000066400000000000000000000056631340672067200236660ustar00rootroot00000000000000 error::system_category
asio C++ library

PrevUpHomeNext

static const asio::error_category & system_category = asio::error::get_system_category();
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_category.html000066400000000000000000000123221340672067200221110ustar00rootroot00000000000000 error_category
asio C++ library

PrevUpHomeNext

Base class for all error categories.

class error_category :
  noncopyable
Member Functions

Name

Description

message

Returns a string describing the error denoted by value.

name

Returns a string naming the error gategory.

operator!=

Inequality operator to compare two error categories.

operator==

Equality operator to compare two error categories.

~error_category

Destructor.

Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_category/000077500000000000000000000000001340672067200212235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/error_category/_error_category.html000066400000000000000000000047371340672067200253110ustar00rootroot00000000000000 error_category::~error_category
asio C++ library

PrevUpHomeNext

Destructor.

virtual ~error_category();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_category/message.html000066400000000000000000000047771340672067200235540ustar00rootroot00000000000000 error_category::message
asio C++ library

PrevUpHomeNext

Returns a string describing the error denoted by value.

std::string message(
    int value) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_category/name.html000066400000000000000000000047051340672067200230370ustar00rootroot00000000000000 error_category::name
asio C++ library

PrevUpHomeNext

Returns a string naming the error gategory.

const char * name() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_category/operator_eq__eq_.html000066400000000000000000000051031340672067200254130ustar00rootroot00000000000000 error_category::operator==
asio C++ library

PrevUpHomeNext

Equality operator to compare two error categories.

bool operator==(
    const error_category & rhs) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_category/operator_not__eq_.html000066400000000000000000000050311340672067200256060ustar00rootroot00000000000000 error_category::operator!=
asio C++ library

PrevUpHomeNext

Inequality operator to compare two error categories.

bool operator!=(
    const error_category & rhs) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code.html000066400000000000000000000217141340672067200212130ustar00rootroot00000000000000 error_code
asio C++ library

PrevUpHomeNext

Class to represent an error code value.

class error_code
Types
Member Functions

Name

Description

assign

Assign a new error value.

category

Get the error category.

clear

Clear the error value to the default.

error_code

Default constructor.

Construct with specific error code and category.

Construct from an error code enum.

message

Get the message associated with the error.

operator unspecified_bool_type

Operator returns non-null if there is a non-success error code.

operator!

Operator to test if the error represents success.

unspecified_bool_true

value

Get the error value.

Friends

Name

Description

operator!=

Inequality operator to compare two error objects.

operator==

Equality operator to compare two error objects.

Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/000077500000000000000000000000001340672067200203205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/error_code/assign.html000066400000000000000000000046251340672067200225010ustar00rootroot00000000000000 error_code::assign
asio C++ library

PrevUpHomeNext

Assign a new error value.

void assign(
    int v,
    const error_category & c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/category.html000066400000000000000000000045701340672067200230310ustar00rootroot00000000000000 error_code::category
asio C++ library

PrevUpHomeNext

Get the error category.

const error_category & category() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/clear.html000066400000000000000000000045731340672067200223050ustar00rootroot00000000000000 error_code::clear
asio C++ library

PrevUpHomeNext

Clear the error value to the default.

void clear();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/error_code.html000066400000000000000000000070051340672067200233330ustar00rootroot00000000000000 error_code::error_code
asio C++ library

PrevUpHomeNext

Default constructor.

error_code();
  » more...

Construct with specific error code and category.

error_code(
    int v,
    const error_category & c);
  » more...

Construct from an error code enum.

template<
    typename ErrorEnum>
error_code(
    ErrorEnum e);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/error_code/000077500000000000000000000000001340672067200224435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/error_code/error_code/overload1.html000066400000000000000000000047331340672067200252340ustar00rootroot00000000000000 error_code::error_code (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

error_code();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/error_code/overload2.html000066400000000000000000000050521340672067200252300ustar00rootroot00000000000000 error_code::error_code (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct with specific error code and category.

error_code(
    int v,
    const error_category & c);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/error_code/overload3.html000066400000000000000000000050251340672067200252310ustar00rootroot00000000000000 error_code::error_code (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct from an error code enum.

template<
    typename ErrorEnum>
error_code(
    ErrorEnum e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/message.html000066400000000000000000000050441340672067200226350ustar00rootroot00000000000000 error_code::message
asio C++ library

PrevUpHomeNext

Get the message associated with the error.

std::string message() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/operator_eq__eq_.html000066400000000000000000000061411340672067200245130ustar00rootroot00000000000000 error_code::operator==
asio C++ library

PrevUpHomeNext

Equality operator to compare two error objects.

friend bool operator==(
    const error_code & e1,
    const error_code & e2);
Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/operator_not_.html000066400000000000000000000050421340672067200240610ustar00rootroot00000000000000 error_code::operator!
asio C++ library

PrevUpHomeNext

Operator to test if the error represents success.

bool operator!() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/operator_not__eq_.html000066400000000000000000000061031340672067200247040ustar00rootroot00000000000000 error_code::operator!=
asio C++ library

PrevUpHomeNext

Inequality operator to compare two error objects.

friend bool operator!=(
    const error_code & e1,
    const error_code & e2);
Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/operator_unspecified_bool_type.html000066400000000000000000000051211340672067200274720ustar00rootroot00000000000000 error_code::operator unspecified_bool_type
asio C++ library

PrevUpHomeNext

Operator returns non-null if there is a non-success error code.

operator unspecified_bool_type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/unspecified_bool_true.html000066400000000000000000000050441340672067200255610ustar00rootroot00000000000000 error_code::unspecified_bool_true
asio C++ library

PrevUpHomeNext

static void unspecified_bool_true(
    unspecified_bool_type_t );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/unspecified_bool_type.html000066400000000000000000000060211340672067200255570ustar00rootroot00000000000000 error_code::unspecified_bool_type
asio C++ library

PrevUpHomeNext

typedef void(*) unspecified_bool_type;
Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code/value.html000066400000000000000000000047721340672067200223340ustar00rootroot00000000000000 error_code::value
asio C++ library

PrevUpHomeNext

Get the error value.

int value() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/error_code__unspecified_bool_type_t.html000066400000000000000000000056311340672067200263270ustar00rootroot00000000000000 error_code::unspecified_bool_type_t
asio C++ library

PrevUpHomeNext
struct unspecified_bool_type_t
Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context.html000066400000000000000000000407641340672067200226450ustar00rootroot00000000000000 execution_context
asio C++ library

PrevUpHomeNext

A context for function object execution.

class execution_context :
  noncopyable
Types

Name

Description

id

Class used to uniquely identify a service.

service

Base class for all io_context services.

fork_event

Fork-related event notifications.

Member Functions

Name

Description

notify_fork

Notify the execution_context of a fork-related event.

Protected Member Functions

Name

Description

destroy

Destroys all services in the context.

execution_context

Constructor.

shutdown

Shuts down all services in the context.

~execution_context

Destructor.

Friends

Name

Description

add_service

(Deprecated: Use make_service().) Add a service object to the execution_context.

has_service

Determine if an execution_context contains a specified service type.

make_service

Creates a service object and adds it to the execution_context.

use_service

Obtain the service object corresponding to the given type.

An execution context represents a place where function objects will be executed. An io_context is an example of an execution context.

The execution_context class and services

Class execution_context implements an extensible, type-safe, polymorphic set of services, indexed by service type.

Services exist to manage the resources that are shared across an execution context. For example, timers may be implemented in terms of a single timer queue, and this queue would be stored in a service.

Access to the services of an execution_context is via three function templates, use_service(), add_service() and has_service().

In a call to use_service<Service>(), the type argument chooses a service, making available all members of the named type. If Service is not present in an execution_context, an object of type Service is created and added to the execution_context. A C++ program can check if an execution_context implements a particular service with the function template has_service<Service>().

Service objects may be explicitly added to an execution_context using the function template add_service<Service>(). If the Service is already present, the service_already_exists exception is thrown. If the owner of the service is not the same object as the execution_context parameter, the invalid_service_owner exception is thrown.

Once a service reference is obtained from an execution_context object by calling use_service(), that reference remains usable as long as the owning execution_context object exists.

All service implementations have execution_context::service as a public base class. Custom services may be implemented by deriving from this class and then added to an execution_context using the facilities described above.

The execution_context as a base class

Class execution_context may be used only as a base class for concrete execution context types. The io_context is an example of such a derived type.

On destruction, a class that is derived from execution_context must perform execution_context::shutdown() followed by execution_context::destroy().

This destruction sequence permits programs to simplify their resource management by using shared_ptr<>. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a shared_ptr to the object would be bound into the handlers for all asynchronous operations associated with it. This works as follows:

  • When a single connection ends, all associated asynchronous operations complete. The corresponding handler objects are destroyed, and all shared_ptr references to the objects are destroyed.
  • To shut down the whole program, the io_context function stop() is called to terminate any run() calls as soon as possible. The io_context destructor calls shutdown() and destroy() to destroy all pending handlers, causing all shared_ptr references to all connection objects to be destroyed.
Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/000077500000000000000000000000001340672067200217445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/execution_context/_execution_context.html000066400000000000000000000051311340672067200265400ustar00rootroot00000000000000 execution_context::~execution_context
asio C++ library

PrevUpHomeNext

Destructor.

~execution_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/add_service.html000066400000000000000000000140501340672067200251020ustar00rootroot00000000000000 execution_context::add_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_service().) Add a service object to the execution_context.

template<
    typename Service>
friend void add_service(
    execution_context & e,
    Service * svc);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

svc

The service object. On success, ownership of the service object is transferred to the execution_context. When the execution_context object is destroyed, it will destroy the service object by performing:

delete static_cast<execution_context::service*>(svc)

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

asio::invalid_service_owner

Thrown if the service's owning execution_context is not the execution_context object specified by the e parameter.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/destroy.html000066400000000000000000000061301340672067200243230ustar00rootroot00000000000000 execution_context::destroy
asio C++ library

PrevUpHomeNext

Destroys all services in the context.

void destroy();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order * of the beginning of service object lifetime, performs delete static_cast<execution_context::service*>(svc).

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/execution_context.html000066400000000000000000000047601340672067200264100ustar00rootroot00000000000000 execution_context::execution_context
asio C++ library

PrevUpHomeNext

Constructor.

execution_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/fork_event.html000066400000000000000000000071421340672067200250000ustar00rootroot00000000000000 execution_context::fork_event
asio C++ library

PrevUpHomeNext

Fork-related event notifications.

enum fork_event

Values

fork_prepare

Notify the context that the process is about to fork.

fork_parent

Notify the context that the process has forked and is the parent.

fork_child

Notify the context that the process has forked and is the child.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/has_service.html000066400000000000000000000113621340672067200251300ustar00rootroot00000000000000 execution_context::has_service
asio C++ library

PrevUpHomeNext

Determine if an execution_context contains a specified service type.

template<
    typename Service>
friend bool has_service(
    execution_context & e);

This function is used to determine whether the execution_context contains a service object corresponding to the given service type.

Parameters

e

The execution_context object that owns the service.

Return Value

A boolean indicating whether the execution_context contains the service.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/make_service.html000066400000000000000000000120331340672067200252660ustar00rootroot00000000000000 execution_context::make_service
asio C++ library

PrevUpHomeNext

Creates a service object and adds it to the execution_context.

template<
    typename Service,
    typename... Args>
friend Service & make_service(
    execution_context & e,
    Args &&... args);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

args

Zero or more arguments to be passed to the service constructor.

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/notify_fork.html000066400000000000000000000150531340672067200251670ustar00rootroot00000000000000 execution_context::notify_fork
asio C++ library

PrevUpHomeNext

Notify the execution_context of a fork-related event.

void notify_fork(
    fork_event event);

This function is used to inform the execution_context that the process is about to fork, or has just forked. This allows the execution_context, and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other execution_context function, or any function associated with the execution_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the execution_context or its derived class.

Parameters

event

A fork-related event.

Exceptions

asio::system_error

Thrown on failure. If the notification fails the execution_context object should no longer be used and should be destroyed.

Example

The following code illustrates how to incorporate the notify_fork() function:

my_execution_context.notify_fork(execution_context::fork_prepare);
if (fork() == 0)
{
  // This is the child process.
  my_execution_context.notify_fork(execution_context::fork_child);
}
else
{
  // This is the parent process.
  my_execution_context.notify_fork(execution_context::fork_parent);
}
Remarks

For each service object svc in the execution_context set, performs svc->notify_fork();. When processing the fork_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/shutdown.html000066400000000000000000000060371340672067200245130ustar00rootroot00000000000000 execution_context::shutdown
asio C++ library

PrevUpHomeNext

Shuts down all services in the context.

void shutdown();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order of the beginning of service object lifetime, performs svc->shutdown().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/use_service.html000066400000000000000000000066641340672067200251620ustar00rootroot00000000000000 execution_context::use_service
asio C++ library

PrevUpHomeNext

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);
  » more...

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/use_service/000077500000000000000000000000001340672067200242605ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/execution_context/use_service/overload1.html000066400000000000000000000115351340672067200270470ustar00rootroot00000000000000 execution_context::use_service (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the execution_context will create a new instance of the service.

Parameters

e

The execution_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context/use_service/overload2.html000066400000000000000000000126221340672067200270460ustar00rootroot00000000000000 execution_context::use_service (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the io_context will create a new instance of the service.

Parameters

ioc

The io_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Remarks

This overload is preserved for backwards compatibility with services that inherit from io_context::service.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__id.html000066400000000000000000000075671340672067200234640ustar00rootroot00000000000000 execution_context::id
asio C++ library

PrevUpHomeNext

Class used to uniquely identify a service.

class id :
  noncopyable
Member Functions

Name

Description

id

Constructor.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__id/000077500000000000000000000000001340672067200225575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/execution_context__id/id.html000066400000000000000000000050171340672067200240440ustar00rootroot00000000000000 execution_context::id::id
asio C++ library

PrevUpHomeNext

Constructor.

id();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__service.html000066400000000000000000000156711340672067200245230ustar00rootroot00000000000000 execution_context::service
asio C++ library

PrevUpHomeNext

Base class for all io_context services.

class service :
  noncopyable
Member Functions

Name

Description

context

Get the context object that owns the service.

Protected Member Functions

Name

Description

service

Constructor.

~service

Destructor.

Private Member Functions

Name

Description

notify_fork

Handle notification of a fork-related event to perform any necessary housekeeping.

shutdown

Destroy all user-defined handler objects owned by the service.

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__service/000077500000000000000000000000001340672067200236235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/execution_context__service/_service.html000066400000000000000000000050371340672067200263150ustar00rootroot00000000000000 execution_context::service::~service
asio C++ library

PrevUpHomeNext

Destructor.

virtual ~service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__service/context.html000066400000000000000000000051751340672067200262050ustar00rootroot00000000000000 execution_context::service::context
asio C++ library

PrevUpHomeNext

Get the context object that owns the service.

execution_context & context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__service/notify_fork.html000066400000000000000000000055251340672067200270510ustar00rootroot00000000000000 execution_context::service::notify_fork
asio C++ library

PrevUpHomeNext

Handle notification of a fork-related event to perform any necessary housekeeping.

virtual void notify_fork(
    execution_context::fork_event event);

This function is not a pure virtual so that services only have to implement it if necessary. The default implementation does nothing.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__service/service.html000066400000000000000000000062521340672067200261560ustar00rootroot00000000000000 execution_context::service::service
asio C++ library

PrevUpHomeNext

Constructor.

service(
    execution_context & owner);
Parameters

owner

The execution_context object that owns the service.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/execution_context__service/shutdown.html000066400000000000000000000051121340672067200263630ustar00rootroot00000000000000 execution_context::service::shutdown
asio C++ library

PrevUpHomeNext

Destroy all user-defined handler objects owned by the service.

void shutdown();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor.html000066400000000000000000000257761340672067200207420ustar00rootroot00000000000000 executor
asio C++ library

PrevUpHomeNext

Polymorphic wrapper for executors.

class executor
Types
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the executor to invoke the given function object.

dispatch

Request the executor to invoke the given function object.

executor

Default constructor.

Construct from nullptr.

Copy constructor.

Move constructor.

Construct a polymorphic wrapper for the specified executor.

Allocator-aware constructor to create a polymorphic wrapper for the specified executor.

on_work_finished

Inform the executor that some work is no longer outstanding.

on_work_started

Inform the executor that it has some outstanding work to do.

operator unspecified_bool_type

Operator to test if the executor contains a valid target.

operator=

Assignment operator.



Assignment operator for nullptr_t.

Assignment operator to create a polymorphic wrapper for the specified executor.

post

Request the executor to invoke the given function object.

target

Obtain a pointer to the target executor object.

target_type

Obtain type information for the target executor object.

unspecified_bool_true

~executor

Destructor.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/000077500000000000000000000000001340672067200200335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor/_executor.html000066400000000000000000000047471340672067200227320ustar00rootroot00000000000000 executor::~executor
asio C++ library

PrevUpHomeNext

Destructor.

~executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/context.html000066400000000000000000000045721340672067200224150ustar00rootroot00000000000000 executor::context
asio C++ library

PrevUpHomeNext

Obtain the underlying execution context.

execution_context & context() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/defer.html000066400000000000000000000070251340672067200220120ustar00rootroot00000000000000 executor::defer
asio C++ library

PrevUpHomeNext

Request the executor to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void defer(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/dispatch.html000066400000000000000000000070561340672067200225300ustar00rootroot00000000000000 executor::dispatch
asio C++ library

PrevUpHomeNext

Request the executor to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor.html000066400000000000000000000115041340672067200225600ustar00rootroot00000000000000 executor::executor
asio C++ library

PrevUpHomeNext

Default constructor.

executor();
  » more...

Construct from nullptr.

executor(
    nullptr_t );
  » more...

Copy constructor.

executor(
    const executor & other);
  » more...

Move constructor.

executor(
    executor && other);
  » more...

Construct a polymorphic wrapper for the specified executor.

template<
    typename Executor>
executor(
    Executor e);
  » more...

Allocator-aware constructor to create a polymorphic wrapper for the specified executor.

template<
    typename Executor,
    typename Allocator>
executor(
    allocator_arg_t ,
    const Allocator & a,
    Executor e);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor/000077500000000000000000000000001340672067200216715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor/executor/overload1.html000066400000000000000000000046611340672067200244620ustar00rootroot00000000000000 executor::executor (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor/overload2.html000066400000000000000000000047201340672067200244570ustar00rootroot00000000000000 executor::executor (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct from nullptr.

executor(
    nullptr_t );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor/overload3.html000066400000000000000000000047321340672067200244630ustar00rootroot00000000000000 executor::executor (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

executor(
    const executor & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor/overload4.html000066400000000000000000000047311340672067200244630ustar00rootroot00000000000000 executor::executor (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

executor(
    executor && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor/overload5.html000066400000000000000000000051511340672067200244610ustar00rootroot00000000000000 executor::executor (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a polymorphic wrapper for the specified executor.

template<
    typename Executor>
executor(
    Executor e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/executor/overload6.html000066400000000000000000000053571340672067200244720ustar00rootroot00000000000000 executor::executor (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Allocator-aware constructor to create a polymorphic wrapper for the specified executor.

template<
    typename Executor,
    typename Allocator>
executor(
    allocator_arg_t ,
    const Allocator & a,
    Executor e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/on_work_finished.html000066400000000000000000000050241340672067200242510ustar00rootroot00000000000000 executor::on_work_finished
asio C++ library

PrevUpHomeNext

Inform the executor that some work is no longer outstanding.

void on_work_finished() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/on_work_started.html000066400000000000000000000050701340672067200241270ustar00rootroot00000000000000 executor::on_work_started
asio C++ library

PrevUpHomeNext

Inform the executor that it has some outstanding work to do.

void on_work_started() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_eq_.html000066400000000000000000000077721340672067200234150ustar00rootroot00000000000000 executor::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

executor & operator=(
    const executor & other);
  » more...



executor & operator=(
    executor && other);
  » more...

Assignment operator for nullptr_t.

executor & operator=(
    nullptr_t );
  » more...

Assignment operator to create a polymorphic wrapper for the specified executor.

template<
    typename Executor>
executor & operator=(
    Executor && e);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_eq_/000077500000000000000000000000001340672067200225125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor/operator_eq_/overload1.html000066400000000000000000000050021340672067200252710ustar00rootroot00000000000000 executor::operator= (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Assignment operator.

executor & operator=(
    const executor & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_eq_/overload2.html000066400000000000000000000047161340672067200253050ustar00rootroot00000000000000 executor::operator= (2 of 4 overloads)
asio C++ library

PrevUpHomeNext
executor & operator=(
    executor && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_eq_/overload3.html000066400000000000000000000050011340672067200252720ustar00rootroot00000000000000 executor::operator= (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Assignment operator for nullptr_t.

executor & operator=(
    nullptr_t );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_eq_/overload4.html000066400000000000000000000053061340672067200253030ustar00rootroot00000000000000 executor::operator= (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Assignment operator to create a polymorphic wrapper for the specified executor.

template<
    typename Executor>
executor & operator=(
    Executor && e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_eq__eq_.html000066400000000000000000000060161340672067200242270ustar00rootroot00000000000000 executor::operator==
asio C++ library

PrevUpHomeNext

Compare two executors for equality.

friend bool operator==(
    const executor & a,
    const executor & b);
Requirements

Header: asio/executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_not__eq_.html000066400000000000000000000061161340672067200244230ustar00rootroot00000000000000 executor::operator!=
asio C++ library

PrevUpHomeNext

Compare two executors for inequality.

friend bool operator!=(
    const executor & a,
    const executor & b);
Requirements

Header: asio/executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/operator_unspecified_bool_type.html000066400000000000000000000051421340672067200272100ustar00rootroot00000000000000 executor::operator unspecified_bool_type
asio C++ library

PrevUpHomeNext

Operator to test if the executor contains a valid target.

operator unspecified_bool_type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/post.html000066400000000000000000000070401340672067200217070ustar00rootroot00000000000000 executor::post
asio C++ library

PrevUpHomeNext

Request the executor to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object is executed according to the rules of the target executor object.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/target.html000066400000000000000000000061671340672067200222210ustar00rootroot00000000000000 executor::target
asio C++ library

PrevUpHomeNext

Obtain a pointer to the target executor object.

template<
    typename Executor>
Executor * target();
  » more...

template<
    typename Executor>
const Executor * target() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/target/000077500000000000000000000000001340672067200213215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor/target/overload1.html000066400000000000000000000060101340672067200241000ustar00rootroot00000000000000 executor::target (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain a pointer to the target executor object.

template<
    typename Executor>
Executor * target();
Return Value

If target_type() == typeid(T), a pointer to the stored executor target; otherwise, a null pointer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/target/overload2.html000066400000000000000000000060501340672067200241050ustar00rootroot00000000000000 executor::target (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain a pointer to the target executor object.

template<
    typename Executor>
const Executor * target() const;
Return Value

If target_type() == typeid(T), a pointer to the stored executor target; otherwise, a null pointer.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/target_type.html000066400000000000000000000060441340672067200232540ustar00rootroot00000000000000 executor::target_type
asio C++ library

PrevUpHomeNext

Obtain type information for the target executor object.

const std::type_info & target_type() const;
Return Value

If *this has a target type of type T, typeid(T); otherwise, typeid(void).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/unspecified_bool_true.html000066400000000000000000000050001340672067200252640ustar00rootroot00000000000000 executor::unspecified_bool_true
asio C++ library

PrevUpHomeNext

static void unspecified_bool_true(
    unspecified_bool_type_t );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor/unspecified_bool_type.html000066400000000000000000000060031340672067200252720ustar00rootroot00000000000000 executor::unspecified_bool_type
asio C++ library

PrevUpHomeNext

typedef void(*) unspecified_bool_type;
Requirements

Header: asio/executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor__unspecified_bool_type_t.html000066400000000000000000000055711340672067200260450ustar00rootroot00000000000000 executor::unspecified_bool_type_t
asio C++ library

PrevUpHomeNext
struct unspecified_bool_type_t
Requirements

Header: asio/executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_arg.html000066400000000000000000000064111340672067200215540ustar00rootroot00000000000000 executor_arg
asio C++ library

PrevUpHomeNext

A special value, similar to std::nothrow, used to disambiguate constructors that accept executor arguments.

constexpr executor_arg_t executor_arg;

See executor_arg_t and uses_executor for more information.

Requirements

Header: asio/uses_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_arg_t.html000066400000000000000000000105671340672067200221060ustar00rootroot00000000000000 executor_arg_t
asio C++ library

PrevUpHomeNext

A special type, similar to std::nothrow_t, used to disambiguate constructors that accept executor arguments.

struct executor_arg_t
Member Functions

Name

Description

executor_arg_t

Constructor.

The executor_arg_t struct is an empty structure type used as a unique type to disambiguate constructor and function overloading. Specifically, some types have constructors with executor_arg_t as the first argument, immediately followed by an argument of a type that satisfies the Executor type requirements.

Requirements

Header: asio/uses_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_arg_t/000077500000000000000000000000001340672067200212075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_arg_t/executor_arg_t.html000066400000000000000000000047461340672067200251220ustar00rootroot00000000000000 executor_arg_t::executor_arg_t
asio C++ library

PrevUpHomeNext

Constructor.

constexpr executor_arg_t();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder.html000066400000000000000000000221741340672067200222520ustar00rootroot00000000000000 executor_binder
asio C++ library

PrevUpHomeNext

A call wrapper type to bind an executor of type Executor to an object of type T.

template<
    typename T,
    typename Executor>
class executor_binder
Types

Name

Description

argument_type

The type of the function's argument.

executor_type

The type of the associated executor.

first_argument_type

The type of the function's first argument.

result_type

The return type if a function.

second_argument_type

The type of the function's second argument.

target_type

The type of the target object.

Member Functions

Name

Description

executor_binder

Construct an executor wrapper for the specified object.

Copy constructor.

Construct a copy, but specify a different executor.

Construct a copy of a different executor wrapper type.

Construct a copy of a different executor wrapper type, but specify a different executor.

Move constructor.

Move construct the target object, but specify a different executor.

Move construct from a different executor wrapper type.

Move construct from a different executor wrapper type, but specify a different executor.

get

Obtain a reference to the target object.

get_executor

Obtain the associated executor.

operator()

~executor_binder

Destructor.

Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/000077500000000000000000000000001340672067200213565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_binder/_executor_binder.html000066400000000000000000000047761340672067200256020ustar00rootroot00000000000000 executor_binder::~executor_binder
asio C++ library

PrevUpHomeNext

Destructor.

~executor_binder();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/argument_type.html000066400000000000000000000100761340672067200251330ustar00rootroot00000000000000 executor_binder::argument_type
asio C++ library

PrevUpHomeNext

The type of the function's argument.

typedef see_below argument_type;

The type of argument_type is based on the type T of the wrapper's target object:

  • if T is a pointer to a function type accepting a single argument, argument_type is a synonym for the return type of T;
  • if T is a class type with a member type argument_type, then argument_type is a synonym for T::argument_type;
  • otherwise argument_type is not defined.
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder.html000066400000000000000000000167531340672067200254410ustar00rootroot00000000000000 executor_binder::executor_binder
asio C++ library

PrevUpHomeNext

Construct an executor wrapper for the specified object.

template<
    typename U>
executor_binder(
    executor_arg_t ,
    const executor_type & e,
    U && u);
  » more...

Copy constructor.

executor_binder(
    const executor_binder & other);
  » more...

Construct a copy, but specify a different executor.

executor_binder(
    executor_arg_t ,
    const executor_type & e,
    const executor_binder & other);
  » more...

Construct a copy of a different executor wrapper type.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    const executor_binder< U, OtherExecutor > & other);
  » more...

Construct a copy of a different executor wrapper type, but specify a different executor.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    executor_arg_t ,
    const executor_type & e,
    const executor_binder< U, OtherExecutor > & other);
  » more...

Move constructor.

executor_binder(
    executor_binder && other);
  » more...

Move construct the target object, but specify a different executor.

executor_binder(
    executor_arg_t ,
    const executor_type & e,
    executor_binder && other);
  » more...

Move construct from a different executor wrapper type.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    executor_binder< U, OtherExecutor > && other);
  » more...

Move construct from a different executor wrapper type, but specify a different executor.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    executor_arg_t ,
    const executor_type & e,
    executor_binder< U, OtherExecutor > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/000077500000000000000000000000001340672067200245375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload1.html000066400000000000000000000056161340672067200273310ustar00rootroot00000000000000 executor_binder::executor_binder (1 of 9 overloads)
asio C++ library

PrevUpHomeNext

Construct an executor wrapper for the specified object.

template<
    typename U>
executor_binder(
    executor_arg_t ,
    const executor_type & e,
    U && u);

This constructor is only valid if the type T is constructible from type U.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload2.html000066400000000000000000000051371340672067200273300ustar00rootroot00000000000000 executor_binder::executor_binder (2 of 9 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

executor_binder(
    const executor_binder & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload3.html000066400000000000000000000052671340672067200273350ustar00rootroot00000000000000 executor_binder::executor_binder (3 of 9 overloads)
asio C++ library

PrevUpHomeNext

Construct a copy, but specify a different executor.

executor_binder(
    executor_arg_t ,
    const executor_type & e,
    const executor_binder & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload4.html000066400000000000000000000061721340672067200273320ustar00rootroot00000000000000 executor_binder::executor_binder (4 of 9 overloads)
asio C++ library

PrevUpHomeNext

Construct a copy of a different executor wrapper type.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    const executor_binder< U, OtherExecutor > & other);

This constructor is only valid if the Executor type is constructible from type OtherExecutor, and the type T is constructible from type U.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload5.html000066400000000000000000000061121340672067200273250ustar00rootroot00000000000000 executor_binder::executor_binder (5 of 9 overloads)
asio C++ library

PrevUpHomeNext

Construct a copy of a different executor wrapper type, but specify a different executor.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    executor_arg_t ,
    const executor_type & e,
    const executor_binder< U, OtherExecutor > & other);

This constructor is only valid if the type T is constructible from type U.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload6.html000066400000000000000000000051361340672067200273330ustar00rootroot00000000000000 executor_binder::executor_binder (6 of 9 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

executor_binder(
    executor_binder && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload7.html000066400000000000000000000053061340672067200273330ustar00rootroot00000000000000 executor_binder::executor_binder (7 of 9 overloads)
asio C++ library

PrevUpHomeNext

Move construct the target object, but specify a different executor.

executor_binder(
    executor_arg_t ,
    const executor_type & e,
    executor_binder && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload8.html000066400000000000000000000054471340672067200273420ustar00rootroot00000000000000 executor_binder::executor_binder (8 of 9 overloads)
asio C++ library

PrevUpHomeNext

Move construct from a different executor wrapper type.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    executor_binder< U, OtherExecutor > && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_binder/overload9.html000066400000000000000000000056131340672067200273360ustar00rootroot00000000000000 executor_binder::executor_binder (9 of 9 overloads)
asio C++ library

PrevUpHomeNext

Move construct from a different executor wrapper type, but specify a different executor.

template<
    typename U,
    typename OtherExecutor>
executor_binder(
    executor_arg_t ,
    const executor_type & e,
    executor_binder< U, OtherExecutor > && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/executor_type.html000066400000000000000000000062041340672067200251450ustar00rootroot00000000000000 executor_binder::executor_type
asio C++ library

PrevUpHomeNext

The type of the associated executor.

typedef Executor executor_type;
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/first_argument_type.html000066400000000000000000000101661340672067200263420ustar00rootroot00000000000000 executor_binder::first_argument_type
asio C++ library

PrevUpHomeNext

The type of the function's first argument.

typedef see_below first_argument_type;

The type of first_argument_type is based on the type T of the wrapper's target object:

  • if T is a pointer to a function type accepting two arguments, first_argument_type is a synonym for the return type of T;
  • if T is a class type with a member type first_argument_type, then first_argument_type is a synonym for T::first_argument_type;
  • otherwise first_argument_type is not defined.
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/get.html000066400000000000000000000060031340672067200230220ustar00rootroot00000000000000 executor_binder::get
asio C++ library

PrevUpHomeNext

Obtain a reference to the target object.

target_type & get();
  » more...

const target_type & get() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/get/000077500000000000000000000000001340672067200221355ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_binder/get/overload1.html000066400000000000000000000047021340672067200247220ustar00rootroot00000000000000 executor_binder::get (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain a reference to the target object.

target_type & get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/get/overload2.html000066400000000000000000000047621340672067200247310ustar00rootroot00000000000000 executor_binder::get (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain a reference to the target object.

const target_type & get() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/get_executor.html000066400000000000000000000050331340672067200247420ustar00rootroot00000000000000 executor_binder::get_executor
asio C++ library

PrevUpHomeNext

Obtain the associated executor.

executor_type get_executor() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/operator_lp__rp_.html000066400000000000000000000063271340672067200256010ustar00rootroot00000000000000 executor_binder::operator()
asio C++ library

PrevUpHomeNext

template<
    typename... Args>
auto operator()(
    Args && ...);
  » more...

template<
    typename... Args>
auto operator()(
    Args && ...) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/operator_lp__rp_/000077500000000000000000000000001340672067200247035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_binder/operator_lp__rp_/overload1.html000066400000000000000000000050671340672067200274750ustar00rootroot00000000000000 executor_binder::operator() (1 of 2 overloads)
asio C++ library

PrevUpHomeNext
template<
    typename... Args>
auto operator()(
    Args && ...);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/operator_lp__rp_/overload2.html000066400000000000000000000050571340672067200274750ustar00rootroot00000000000000 executor_binder::operator() (2 of 2 overloads)
asio C++ library

PrevUpHomeNext
template<
    typename... Args>
auto operator()(
    Args && ...) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/result_type.html000066400000000000000000000100651340672067200246250ustar00rootroot00000000000000 executor_binder::result_type
asio C++ library

PrevUpHomeNext

The return type if a function.

typedef see_below result_type;

The type of result_type is based on the type T of the wrapper's target object:

  • if T is a pointer to function type, result_type is a synonym for the return type of T;
  • if T is a class type with a member type result_type, then result_type is a synonym for T::result_type;
  • otherwise result_type is not defined.
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/second_argument_type.html000066400000000000000000000102371340672067200264650ustar00rootroot00000000000000 executor_binder::second_argument_type
asio C++ library

PrevUpHomeNext

The type of the function's second argument.

typedef see_below second_argument_type;

The type of second_argument_type is based on the type T of the wrapper's target object:

  • if T is a pointer to a function type accepting two arguments, second_argument_type is a synonym for the return type of T;
  • if T is a class type with a member type first_argument_type, then second_argument_type is a synonym for T::second_argument_type;
  • otherwise second_argument_type is not defined.
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_binder/target_type.html000066400000000000000000000060701340672067200245760ustar00rootroot00000000000000 executor_binder::target_type
asio C++ library

PrevUpHomeNext

The type of the target object.

typedef T target_type;
Requirements

Header: asio/bind_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard.html000066400000000000000000000153431340672067200231530ustar00rootroot00000000000000 executor_work_guard
asio C++ library

PrevUpHomeNext

An object of type executor_work_guard controls ownership of executor work within a scope.

template<
    typename Executor>
class executor_work_guard
Types

Name

Description

executor_type

The underlying executor type.

Member Functions

Name

Description

executor_work_guard

Constructs a executor_work_guard object for the specified executor.

Copy constructor.

Move constructor.

get_executor

Obtain the associated executor.

owns_work

Whether the executor_work_guard object owns some outstanding work.

reset

Indicate that the work is no longer outstanding.

~executor_work_guard

Destructor.

Requirements

Header: asio/executor_work_guard.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/000077500000000000000000000000001340672067200222575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_work_guard/_executor_work_guard.html000066400000000000000000000054031340672067200273700ustar00rootroot00000000000000 executor_work_guard::~executor_work_guard
asio C++ library

PrevUpHomeNext

Destructor.

~executor_work_guard();

Unless the object has already been reset, or is in a moved-from state, calls on_work_finished() on the stored executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/executor_type.html000066400000000000000000000062161340672067200260510ustar00rootroot00000000000000 executor_work_guard::executor_type
asio C++ library

PrevUpHomeNext

The underlying executor type.

typedef Executor executor_type;
Requirements

Header: asio/executor_work_guard.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/executor_work_guard.html000066400000000000000000000077441340672067200272430ustar00rootroot00000000000000 executor_work_guard::executor_work_guard
asio C++ library

PrevUpHomeNext

Constructs a executor_work_guard object for the specified executor.

explicit executor_work_guard(
    const executor_type & e);
  » more...

Copy constructor.

executor_work_guard(
    const executor_work_guard & other);
  » more...

Move constructor.

executor_work_guard(
    executor_work_guard && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/executor_work_guard/000077500000000000000000000000001340672067200263415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/executor_work_guard/executor_work_guard/overload1.html000066400000000000000000000057001340672067200311250ustar00rootroot00000000000000 executor_work_guard::executor_work_guard (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Constructs a executor_work_guard object for the specified executor.

executor_work_guard(
    const executor_type & e);

Stores a copy of e and calls on_work_started() on it.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/executor_work_guard/overload2.html000066400000000000000000000052531340672067200311310ustar00rootroot00000000000000 executor_work_guard::executor_work_guard (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

executor_work_guard(
    const executor_work_guard & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/executor_work_guard/overload3.html000066400000000000000000000052421340672067200311300ustar00rootroot00000000000000 executor_work_guard::executor_work_guard (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

executor_work_guard(
    executor_work_guard && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/get_executor.html000066400000000000000000000051611340672067200256450ustar00rootroot00000000000000 executor_work_guard::get_executor
asio C++ library

PrevUpHomeNext

Obtain the associated executor.

executor_type get_executor() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/owns_work.html000066400000000000000000000052321340672067200251770ustar00rootroot00000000000000 executor_work_guard::owns_work
asio C++ library

PrevUpHomeNext

Whether the executor_work_guard object owns some outstanding work.

bool owns_work() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/executor_work_guard/reset.html000066400000000000000000000050251340672067200242710ustar00rootroot00000000000000 executor_work_guard::reset
asio C++ library

PrevUpHomeNext

Indicate that the work is no longer outstanding.

void reset();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__await_token.html000066400000000000000000000147661340672067200243220ustar00rootroot00000000000000 experimental::await_token
asio C++ library

PrevUpHomeNext

A completion token that represents the currently executing coroutine.

template<
    typename Executor>
class await_token
Types

Name

Description

executor_type

The associated executor type.

Member Functions

Name

Description

await_token

Copy constructor.

Move constructor.

get_executor

Get the associated executor.

The experimental::await_token class is used to represent the currently executing coroutine. An experimental::await_token may be passed as a handler to an asynchronous operation. For example:

awaitable<void> my_coroutine()
{
  await_token token = co_await this_coro::token();
  ...
  std::size_t n = co_await my_socket.async_read_some(buffer, token);
  ...
}

The initiating function (async_read_some in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned.

Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__await_token/000077500000000000000000000000001340672067200234165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/experimental__await_token/await_token.html000066400000000000000000000066121340672067200266160ustar00rootroot00000000000000 experimental::await_token::await_token
asio C++ library

PrevUpHomeNext

Copy constructor.

await_token(
    const await_token & other);
  » more...

Move constructor.

await_token(
    await_token && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__await_token/await_token/000077500000000000000000000000001340672067200257235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/experimental__await_token/await_token/overload1.html000066400000000000000000000051611340672067200305100ustar00rootroot00000000000000 experimental::await_token::await_token (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

await_token(
    const await_token & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__await_token/await_token/overload2.html000066400000000000000000000051701340672067200305110ustar00rootroot00000000000000 experimental::await_token::await_token (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

await_token(
    await_token && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__await_token/executor_type.html000066400000000000000000000063621340672067200272120ustar00rootroot00000000000000 experimental::await_token::executor_type
asio C++ library

PrevUpHomeNext

The associated executor type.

typedef Executor executor_type;
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__await_token/get_executor.html000066400000000000000000000052151340672067200270040ustar00rootroot00000000000000 experimental::await_token::get_executor
asio C++ library

PrevUpHomeNext

Get the associated executor.

executor_type get_executor() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__awaitable.html000066400000000000000000000135231340672067200237340ustar00rootroot00000000000000 experimental::awaitable
asio C++ library

PrevUpHomeNext

The return type of a coroutine or asynchronous operation.

template<
    typename T,
    typename Executor = strand<executor>>
class awaitable
Types

Name

Description

executor_type

The executor type that will be used for the coroutine.

value_type

The type of the awaited value.

Member Functions

Name

Description

awaitable

Move constructor.

~awaitable

Destructor.

Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__awaitable/000077500000000000000000000000001340672067200230425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/experimental__awaitable/_awaitable.html000066400000000000000000000050541340672067200260240ustar00rootroot00000000000000 experimental::awaitable::~awaitable
asio C++ library

PrevUpHomeNext

Destructor.

~awaitable();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__awaitable/awaitable.html000066400000000000000000000051441340672067200256650ustar00rootroot00000000000000 experimental::awaitable::awaitable
asio C++ library

PrevUpHomeNext

Move constructor.

awaitable(
    awaitable && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__awaitable/executor_type.html000066400000000000000000000062561340672067200266400ustar00rootroot00000000000000 experimental::awaitable::executor_type
asio C++ library

PrevUpHomeNext

The executor type that will be used for the coroutine.

typedef Executor executor_type;
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__awaitable/value_type.html000066400000000000000000000061761340672067200261170ustar00rootroot00000000000000 experimental::awaitable::value_type
asio C++ library

PrevUpHomeNext

The type of the awaited value.

typedef T value_type;
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__co_spawn.html000066400000000000000000000115141340672067200236120ustar00rootroot00000000000000 experimental::co_spawn
asio C++ library

PrevUpHomeNext

Spawn a new thread of execution.

template<
    typename Executor,
    typename F,
    typename CompletionToken,
    typename  = typename enable_if<is_executor<Executor>::value>::type>
auto co_spawn(
    const Executor & ex,
    F && f,
    CompletionToken && token);
  » more...

template<
    typename ExecutionContext,
    typename F,
    typename CompletionToken,
    typename  = typename enable_if<      is_convertible<ExecutionContext&, execution_context&>::value>::type>
auto co_spawn(
    ExecutionContext & ctx,
    F && f,
    CompletionToken && token);
  » more...

template<
    typename Executor,
    typename F,
    typename CompletionToken>
auto co_spawn(
    const await_token< Executor > & parent,
    F && f,
    CompletionToken && token);
  » more...
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__co_spawn/000077500000000000000000000000001340672067200227225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/experimental__co_spawn/overload1.html000066400000000000000000000055201340672067200255060ustar00rootroot00000000000000 experimental::co_spawn (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Spawn a new thread of execution.

template<
    typename Executor,
    typename F,
    typename CompletionToken,
    typename  = typename enable_if<is_executor<Executor>::value>::type>
auto co_spawn(
    const Executor & ex,
    F && f,
    CompletionToken && token);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__co_spawn/overload2.html000066400000000000000000000054411340672067200255110ustar00rootroot00000000000000 experimental::co_spawn (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Spawn a new thread of execution.

template<
    typename ExecutionContext,
    typename F,
    typename CompletionToken,
    typename  = typename enable_if<      is_convertible<ExecutionContext&, execution_context&>::value>::type>
auto co_spawn(
    ExecutionContext & ctx,
    F && f,
    CompletionToken && token);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__co_spawn/overload3.html000066400000000000000000000054251340672067200255140ustar00rootroot00000000000000 experimental::co_spawn (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Spawn a new thread of execution.

template<
    typename Executor,
    typename F,
    typename CompletionToken>
auto co_spawn(
    const await_token< Executor > & parent,
    F && f,
    CompletionToken && token);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__detached.html000066400000000000000000000064261340672067200235500ustar00rootroot00000000000000 experimental::detached
asio C++ library

PrevUpHomeNext

A special value, similar to std::nothrow.

constexpr detached_t detached;

See the documentation for experimental::detached_t for a usage example.

Requirements

Header: asio/experimental/detached.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__detached_t.html000066400000000000000000000113571340672067200240720ustar00rootroot00000000000000 experimental::detached_t
asio C++ library

PrevUpHomeNext

Class used to specify that an asynchronous operation is detached.

class detached_t
Member Functions

Name

Description

detached_t

Constructor.

The experimental::detached_t class is used to indicate that an asynchronous operation is detached. That is, there is no completion handler waiting for the operation's result. A experimental::detached_t object may be passed as a handler to an asynchronous operation, typically using the special value asio::experimental::detached. For example:

my_socket.async_send(my_buffer, asio::experimental::detached);
Requirements

Header: asio/experimental/detached.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__detached_t/000077500000000000000000000000001340672067200231755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/experimental__detached_t/detached_t.html000066400000000000000000000052001340672067200261440ustar00rootroot00000000000000 experimental::detached_t::detached_t
asio C++ library

PrevUpHomeNext

Constructor.

constexpr detached_t();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__redirect_error.html000066400000000000000000000067151340672067200250220ustar00rootroot00000000000000 experimental::redirect_error
asio C++ library

PrevUpHomeNext

Create a completion token to capture error_code values to a variable.

template<
    typename CompletionToken>
redirect_error_t< typename decay< CompletionToken >::type > redirect_error(
    CompletionToken && completion_token,
    asio::error_code & ec);
Requirements

Header: asio/experimental/redirect_error.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__redirect_error_t.html000066400000000000000000000136531340672067200253440ustar00rootroot00000000000000 experimental::redirect_error_t
asio C++ library

PrevUpHomeNext

Completion token type used to specify that an error produced by an asynchronous operation is captured to an error_code variable.

template<
    typename CompletionToken>
class redirect_error_t
Member Functions

Name

Description

redirect_error_t

Constructor.

Data Members

Name

Description

ec_

token_

The experimental::redirect_error_t class is used to indicate that any error_code produced by an asynchronous operation is captured to a specified variable.

Requirements

Header: asio/experimental/redirect_error.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__redirect_error_t/000077500000000000000000000000001340672067200244465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/experimental__redirect_error_t/ec_.html000066400000000000000000000052011340672067200260600ustar00rootroot00000000000000 experimental::redirect_error_t::ec_
asio C++ library

PrevUpHomeNext

asio::error_code & ec_;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__redirect_error_t/redirect_error_t.html000066400000000000000000000052711340672067200306760ustar00rootroot00000000000000 experimental::redirect_error_t::redirect_error_t
asio C++ library

PrevUpHomeNext

Constructor.

template<
    typename T>
redirect_error_t(
    T && completion_token,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__redirect_error_t/token_.html000066400000000000000000000052331340672067200266160ustar00rootroot00000000000000 experimental::redirect_error_t::token_
asio C++ library

PrevUpHomeNext

CompletionToken token_;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__this_coro__executor.html000066400000000000000000000063641340672067200260560ustar00rootroot00000000000000 experimental::this_coro::executor
asio C++ library

PrevUpHomeNext

Awaitable object that returns the executor of the current coroutine.

constexpr executor_t executor();
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__this_coro__executor_t.html000066400000000000000000000061651340672067200264000ustar00rootroot00000000000000 experimental::this_coro::executor_t
asio C++ library

PrevUpHomeNext

Awaitable type that returns the executor of the current coroutine.

struct executor_t
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__this_coro__token.html000066400000000000000000000063021340672067200253300ustar00rootroot00000000000000 experimental::this_coro::token
asio C++ library

PrevUpHomeNext

Awaitable object that returns a completion token for the current coroutine.

constexpr token_t token();
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/experimental__this_coro__token_t.html000066400000000000000000000060661340672067200256620ustar00rootroot00000000000000 experimental::this_coro::token_t
asio C++ library

PrevUpHomeNext

Awaitable type that returns a completion token for the current coroutine.

struct token_t
Requirements

Header: asio/experimental/co_spawn.hpp

Convenience header: asio/experimental.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint.html000066400000000000000000000301511340672067200236770ustar00rootroot00000000000000 generic::basic_endpoint
asio C++ library

PrevUpHomeNext

Describes an endpoint for any socket type.

template<
    typename Protocol>
class basic_endpoint
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint from the specified socket address.

Construct an endpoint from the specific endpoint type.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

The generic::basic_endpoint class template describes an endpoint that may be associated with any socket type.

Remarks

The socket types sockaddr type must be able to fit into a sockaddr_storage structure.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/000077500000000000000000000000001340672067200230115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__basic_endpoint/basic_endpoint.html000066400000000000000000000107541340672067200266670ustar00rootroot00000000000000 generic::basic_endpoint::basic_endpoint
asio C++ library

PrevUpHomeNext

Default constructor.

basic_endpoint();
  » more...

Construct an endpoint from the specified socket address.

basic_endpoint(
    const void * socket_address,
    std::size_t socket_address_size,
    int socket_protocol = 0);
  » more...

Construct an endpoint from the specific endpoint type.

template<
    typename Endpoint>
basic_endpoint(
    const Endpoint & endpoint);
  » more...

Copy constructor.

basic_endpoint(
    const basic_endpoint & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/basic_endpoint/000077500000000000000000000000001340672067200257725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__basic_endpoint/basic_endpoint/overload1.html000066400000000000000000000051561340672067200305630ustar00rootroot00000000000000 generic::basic_endpoint::basic_endpoint (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

basic_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/basic_endpoint/overload2.html000066400000000000000000000053571340672067200305670ustar00rootroot00000000000000 generic::basic_endpoint::basic_endpoint (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an endpoint from the specified socket address.

basic_endpoint(
    const void * socket_address,
    std::size_t socket_address_size,
    int socket_protocol = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/basic_endpoint/overload3.html000066400000000000000000000054411340672067200305620ustar00rootroot00000000000000 generic::basic_endpoint::basic_endpoint (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an endpoint from the specific endpoint type.

template<
    typename Endpoint>
basic_endpoint(
    const Endpoint & endpoint);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/basic_endpoint/overload4.html000066400000000000000000000051701340672067200305620ustar00rootroot00000000000000 generic::basic_endpoint::basic_endpoint (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_endpoint(
    const basic_endpoint & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/capacity.html000066400000000000000000000051541340672067200255010ustar00rootroot00000000000000 generic::basic_endpoint::capacity
asio C++ library

PrevUpHomeNext

Get the capacity of the endpoint in the native type.

std::size_t capacity() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/data.html000066400000000000000000000061361340672067200246160ustar00rootroot00000000000000 generic::basic_endpoint::data
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

data_type * data();
  » more...

const data_type * data() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/data/000077500000000000000000000000001340672067200237225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__basic_endpoint/data/overload1.html000066400000000000000000000050111340672067200265010ustar00rootroot00000000000000 generic::basic_endpoint::data (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

data_type * data();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/data/overload2.html000066400000000000000000000050511340672067200265060ustar00rootroot00000000000000 generic::basic_endpoint::data (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

const data_type * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/data_type.html000066400000000000000000000063721340672067200256610ustar00rootroot00000000000000 generic::basic_endpoint::data_type
asio C++ library

PrevUpHomeNext

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

typedef implementation_defined data_type;
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_eq_.html000066400000000000000000000052131340672067200263570ustar00rootroot00000000000000 generic::basic_endpoint::operator=
asio C++ library

PrevUpHomeNext

Assign from another endpoint.

basic_endpoint & operator=(
    const basic_endpoint & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_eq__eq_.html000066400000000000000000000064171340672067200272120ustar00rootroot00000000000000 generic::basic_endpoint::operator==
asio C++ library

PrevUpHomeNext

Compare two endpoints for equality.

friend bool operator==(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_gt_.html000066400000000000000000000064211340672067200263660ustar00rootroot00000000000000 generic::basic_endpoint::operator>
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator>(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_gt__eq_.html000066400000000000000000000064121340672067200272120ustar00rootroot00000000000000 generic::basic_endpoint::operator>=
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator>=(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_lt_.html000066400000000000000000000064241340672067200263760ustar00rootroot00000000000000 generic::basic_endpoint::operator<
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator<(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_lt__eq_.html000066400000000000000000000064271340672067200272250ustar00rootroot00000000000000 generic::basic_endpoint::operator<=
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator<=(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/operator_not__eq_.html000066400000000000000000000064171340672067200274050ustar00rootroot00000000000000 generic::basic_endpoint::operator!=
asio C++ library

PrevUpHomeNext

Compare two endpoints for inequality.

friend bool operator!=(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/protocol.html000066400000000000000000000051341340672067200255430ustar00rootroot00000000000000 generic::basic_endpoint::protocol
asio C++ library

PrevUpHomeNext

The protocol associated with the endpoint.

protocol_type protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/protocol_type.html000066400000000000000000000062071340672067200266060ustar00rootroot00000000000000 generic::basic_endpoint::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type associated with the endpoint.

typedef Protocol protocol_type;
Requirements

Header: asio/generic/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/resize.html000066400000000000000000000050741340672067200252060ustar00rootroot00000000000000 generic::basic_endpoint::resize
asio C++ library

PrevUpHomeNext

Set the underlying size of the endpoint in the native type.

void resize(
    std::size_t new_size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__basic_endpoint/size.html000066400000000000000000000051161340672067200246540ustar00rootroot00000000000000 generic::basic_endpoint::size
asio C++ library

PrevUpHomeNext

Get the underlying size of the endpoint in the native type.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol.html000066400000000000000000000227321340672067200244250ustar00rootroot00000000000000 generic::datagram_protocol
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for a generic datagram-oriented socket.

class datagram_protocol
Types

Name

Description

endpoint

The type of an endpoint.

socket

The generic socket type.

Member Functions

Name

Description

datagram_protocol

Construct a protocol object for a specific address family and protocol.

Construct a generic protocol object from a specific protocol.

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

type

Obtain an identifier for the type of the protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The generic::datagram_protocol class contains flags necessary for datagram-oriented sockets of any address family and protocol.

Examples

Constructing using a native address family and socket protocol:

datagram_protocol p(AF_INET, IPPROTO_UDP);

Constructing from a specific protocol type:

datagram_protocol p(asio::ip::udp::v4());
Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/generic/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/000077500000000000000000000000001340672067200235315ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__datagram_protocol/datagram_protocol.html000066400000000000000000000073751340672067200301340ustar00rootroot00000000000000 generic::datagram_protocol::datagram_protocol
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

datagram_protocol(
    int address_family,
    int socket_protocol);
  » more...

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
datagram_protocol(
    const Protocol & source_protocol);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/datagram_protocol/000077500000000000000000000000001340672067200272325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__datagram_protocol/datagram_protocol/overload1.html000066400000000000000000000054201340672067200320150ustar00rootroot00000000000000 generic::datagram_protocol::datagram_protocol (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

datagram_protocol(
    int address_family,
    int socket_protocol);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/datagram_protocol/overload2.html000066400000000000000000000066371340672067200320310ustar00rootroot00000000000000 generic::datagram_protocol::datagram_protocol (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
datagram_protocol(
    const Protocol & source_protocol);
Exceptions

@c

bad_cast Thrown if the source protocol is not datagram-oriented.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/endpoint.html000066400000000000000000000313071340672067200262430ustar00rootroot00000000000000 generic::datagram_protocol::endpoint
asio C++ library

PrevUpHomeNext

The type of an endpoint.

typedef basic_endpoint< datagram_protocol > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint from the specified socket address.

Construct an endpoint from the specific endpoint type.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

The generic::basic_endpoint class template describes an endpoint that may be associated with any socket type.

Remarks

The socket types sockaddr type must be able to fit into a sockaddr_storage structure.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/family.html000066400000000000000000000051241340672067200257020ustar00rootroot00000000000000 generic::datagram_protocol::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/operator_eq__eq_.html000066400000000000000000000064361340672067200277330ustar00rootroot00000000000000 generic::datagram_protocol::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const datagram_protocol & p1,
    const datagram_protocol & p2);
Requirements

Header: asio/generic/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/operator_not__eq_.html000066400000000000000000000064341340672067200301240ustar00rootroot00000000000000 generic::datagram_protocol::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const datagram_protocol & p1,
    const datagram_protocol & p2);
Requirements

Header: asio/generic/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/protocol.html000066400000000000000000000051201340672067200262560ustar00rootroot00000000000000 generic::datagram_protocol::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/socket.html000066400000000000000000001023361340672067200257140ustar00rootroot00000000000000 generic::datagram_protocol::socket
asio C++ library

PrevUpHomeNext

The generic socket type.

typedef basic_datagram_socket< datagram_protocol > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_datagram_socket

Construct a basic_datagram_socket without opening it.

Construct and open a basic_datagram_socket.

Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.

Construct a basic_datagram_socket on an existing native socket.

Move-construct a basic_datagram_socket from another.

Move-construct a basic_datagram_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_datagram_socket from another.

Move-assign a basic_datagram_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive a datagram with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send a datagram to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_datagram_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_datagram_socket class template provides asynchronous and blocking datagram-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__datagram_protocol/type.html000066400000000000000000000051071340672067200254030ustar00rootroot00000000000000 generic::datagram_protocol::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol.html000066400000000000000000000221711340672067200234330ustar00rootroot00000000000000 generic::raw_protocol
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for a generic raw socket.

class raw_protocol
Types

Name

Description

endpoint

The type of an endpoint.

socket

The generic socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

raw_protocol

Construct a protocol object for a specific address family and protocol.

Construct a generic protocol object from a specific protocol.

type

Obtain an identifier for the type of the protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The generic::raw_protocol class contains flags necessary for raw sockets of any address family and protocol.

Examples

Constructing using a native address family and socket protocol:

raw_protocol p(AF_INET, IPPROTO_ICMP);

Constructing from a specific protocol type:

raw_protocol p(asio::ip::icmp::v4());
Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/generic/raw_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/000077500000000000000000000000001340672067200225425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__raw_protocol/endpoint.html000066400000000000000000000307751340672067200252640ustar00rootroot00000000000000 generic::raw_protocol::endpoint
asio C++ library

PrevUpHomeNext

The type of an endpoint.

typedef basic_endpoint< raw_protocol > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint from the specified socket address.

Construct an endpoint from the specific endpoint type.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

The generic::basic_endpoint class template describes an endpoint that may be associated with any socket type.

Remarks

The socket types sockaddr type must be able to fit into a sockaddr_storage structure.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/raw_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/family.html000066400000000000000000000050351340672067200247140ustar00rootroot00000000000000 generic::raw_protocol::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/operator_eq__eq_.html000066400000000000000000000063111340672067200267340ustar00rootroot00000000000000 generic::raw_protocol::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const raw_protocol & p1,
    const raw_protocol & p2);
Requirements

Header: asio/generic/raw_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/operator_not__eq_.html000066400000000000000000000063071340672067200271340ustar00rootroot00000000000000 generic::raw_protocol::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const raw_protocol & p1,
    const raw_protocol & p2);
Requirements

Header: asio/generic/raw_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/protocol.html000066400000000000000000000050611340672067200252730ustar00rootroot00000000000000 generic::raw_protocol::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/raw_protocol.html000066400000000000000000000070311340672067200261430ustar00rootroot00000000000000 generic::raw_protocol::raw_protocol
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

raw_protocol(
    int address_family,
    int socket_protocol);
  » more...

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
raw_protocol(
    const Protocol & source_protocol);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/raw_protocol/000077500000000000000000000000001340672067200252545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__raw_protocol/raw_protocol/overload1.html000066400000000000000000000052471340672067200300460ustar00rootroot00000000000000 generic::raw_protocol::raw_protocol (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

raw_protocol(
    int address_family,
    int socket_protocol);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/raw_protocol/overload2.html000066400000000000000000000064371340672067200300510ustar00rootroot00000000000000 generic::raw_protocol::raw_protocol (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
raw_protocol(
    const Protocol & source_protocol);
Exceptions

@c

bad_cast Thrown if the source protocol is not raw-oriented.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/socket.html000066400000000000000000001006221340672067200247210ustar00rootroot00000000000000 generic::raw_protocol::socket
asio C++ library

PrevUpHomeNext

The generic socket type.

typedef basic_raw_socket< raw_protocol > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_raw_socket

Construct a basic_raw_socket without opening it.

Construct and open a basic_raw_socket.

Construct a basic_raw_socket, opening it and binding it to the given local endpoint.

Construct a basic_raw_socket on an existing native socket.

Move-construct a basic_raw_socket from another.

Move-construct a basic_raw_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_raw_socket from another.

Move-assign a basic_raw_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive raw data with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send raw data to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_raw_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_raw_socket class template provides asynchronous and blocking raw-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/raw_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__raw_protocol/type.html000066400000000000000000000050611340672067200244130ustar00rootroot00000000000000 generic::raw_protocol::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol.html000066400000000000000000000226241340672067200247640ustar00rootroot00000000000000 generic::seq_packet_protocol
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for a generic sequenced packet socket.

class seq_packet_protocol
Types

Name

Description

endpoint

The type of an endpoint.

socket

The generic socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

seq_packet_protocol

Construct a protocol object for a specific address family and protocol.

Construct a generic protocol object from a specific protocol.

type

Obtain an identifier for the type of the protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The generic::seq_packet_protocol class contains flags necessary for seq_packet-oriented sockets of any address family and protocol.

Examples

Constructing using a native address family and socket protocol:

seq_packet_protocol p(AF_INET, IPPROTO_SCTP);
Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/generic/seq_packet_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/000077500000000000000000000000001340672067200240705ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/endpoint.html000066400000000000000000000313531340672067200266030ustar00rootroot00000000000000 generic::seq_packet_protocol::endpoint
asio C++ library

PrevUpHomeNext

The type of an endpoint.

typedef basic_endpoint< seq_packet_protocol > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint from the specified socket address.

Construct an endpoint from the specific endpoint type.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

The generic::basic_endpoint class template describes an endpoint that may be associated with any socket type.

Remarks

The socket types sockaddr type must be able to fit into a sockaddr_storage structure.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/seq_packet_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/family.html000066400000000000000000000051521340672067200262420ustar00rootroot00000000000000 generic::seq_packet_protocol::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/operator_eq__eq_.html000066400000000000000000000065001340672067200302620ustar00rootroot00000000000000 generic::seq_packet_protocol::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const seq_packet_protocol & p1,
    const seq_packet_protocol & p2);
Requirements

Header: asio/generic/seq_packet_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/operator_not__eq_.html000066400000000000000000000064761340672067200304710ustar00rootroot00000000000000 generic::seq_packet_protocol::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const seq_packet_protocol & p1,
    const seq_packet_protocol & p2);
Requirements

Header: asio/generic/seq_packet_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/protocol.html000066400000000000000000000052321340672067200266210ustar00rootroot00000000000000 generic::seq_packet_protocol::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/seq_packet_protocol.html000066400000000000000000000074161340672067200310260ustar00rootroot00000000000000 generic::seq_packet_protocol::seq_packet_protocol
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

seq_packet_protocol(
    int address_family,
    int socket_protocol);
  » more...

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
seq_packet_protocol(
    const Protocol & source_protocol);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/seq_packet_protocol/000077500000000000000000000000001340672067200301305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/seq_packet_protocol/overload1.html000066400000000000000000000054721340672067200327220ustar00rootroot00000000000000 generic::seq_packet_protocol::seq_packet_protocol (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

seq_packet_protocol(
    int address_family,
    int socket_protocol);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/seq_packet_protocol/overload2.html000066400000000000000000000067441340672067200327260ustar00rootroot00000000000000 generic::seq_packet_protocol::seq_packet_protocol (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
seq_packet_protocol(
    const Protocol & source_protocol);
Exceptions

@c

bad_cast Thrown if the source protocol is not based around sequenced packets.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/socket.html000066400000000000000000001001421340672067200262440ustar00rootroot00000000000000 generic::seq_packet_protocol::socket
asio C++ library

PrevUpHomeNext

The generic socket type.

typedef basic_seq_packet_socket< seq_packet_protocol > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive.

async_send

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_seq_packet_socket

Construct a basic_seq_packet_socket without opening it.

Construct and open a basic_seq_packet_socket.

Construct a basic_seq_packet_socket, opening it and binding it to the given local endpoint.

Construct a basic_seq_packet_socket on an existing native socket.

Move-construct a basic_seq_packet_socket from another.

Move-construct a basic_seq_packet_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_seq_packet_socket from another.

Move-assign a basic_seq_packet_socket from a socket of another protocol type.

receive

Receive some data on the socket.

Receive some data on a connected socket.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_seq_packet_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_seq_packet_socket class template provides asynchronous and blocking sequenced packet socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/seq_packet_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__seq_packet_protocol/type.html000066400000000000000000000051471340672067200257460ustar00rootroot00000000000000 generic::seq_packet_protocol::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol.html000066400000000000000000000232761340672067200241440ustar00rootroot00000000000000 generic::stream_protocol
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for a generic stream-oriented socket.

class stream_protocol
Types

Name

Description

endpoint

The type of an endpoint.

iostream

The generic socket iostream type.

socket

The generic socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

stream_protocol

Construct a protocol object for a specific address family and protocol.

Construct a generic protocol object from a specific protocol.

type

Obtain an identifier for the type of the protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The generic::stream_protocol class contains flags necessary for stream-oriented sockets of any address family and protocol.

Examples

Constructing using a native address family and socket protocol:

stream_protocol p(AF_INET, IPPROTO_TCP);

Constructing from a specific protocol type:

stream_protocol p(asio::ip::tcp::v4());
Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/generic/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/000077500000000000000000000000001340672067200232445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__stream_protocol/endpoint.html000066400000000000000000000311431340672067200257540ustar00rootroot00000000000000 generic::stream_protocol::endpoint
asio C++ library

PrevUpHomeNext

The type of an endpoint.

typedef basic_endpoint< stream_protocol > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint from the specified socket address.

Construct an endpoint from the specific endpoint type.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

The generic::basic_endpoint class template describes an endpoint that may be associated with any socket type.

Remarks

The socket types sockaddr type must be able to fit into a sockaddr_storage structure.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/family.html000066400000000000000000000050411340672067200254130ustar00rootroot00000000000000 generic::stream_protocol::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/iostream.html000066400000000000000000000302731340672067200257620ustar00rootroot00000000000000 generic::stream_protocol::iostream
asio C++ library

PrevUpHomeNext

The generic socket iostream type.

typedef basic_socket_iostream< stream_protocol > iostream;
Types

Name

Description

clock_type

The clock type.

duration

The duration type.

duration_type

(Deprecated: Use duration.) The duration type.

endpoint_type

The endpoint type.

protocol_type

The protocol type.

time_point

The time type.

time_type

(Deprecated: Use time_point.) The time type.

Member Functions

Name

Description

basic_socket_iostream

Construct a basic_socket_iostream without establishing a connection.

Construct a basic_socket_iostream from the supplied socket.

Move-construct a basic_socket_iostream from another.

Establish a connection to an endpoint corresponding to a resolver query.

close

Close the connection.

connect

Establish a connection to an endpoint corresponding to a resolver query.

error

Get the last error associated with the stream.

expires_after

Set the stream's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time.

Set the stream's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the stream's expiry time relative to now.

(Deprecated: Use expires_after().) Set the stream's expiry time relative to now.

expiry

Get the stream's expiry time as an absolute time.

operator=

Move-assign a basic_socket_iostream from another.

rdbuf

Return a pointer to the underlying streambuf.

socket

Get a reference to the underlying socket.

Requirements

Header: asio/generic/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/operator_eq__eq_.html000066400000000000000000000063741340672067200274470ustar00rootroot00000000000000 generic::stream_protocol::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const stream_protocol & p1,
    const stream_protocol & p2);
Requirements

Header: asio/generic/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/operator_not__eq_.html000066400000000000000000000064021340672067200276320ustar00rootroot00000000000000 generic::stream_protocol::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const stream_protocol & p1,
    const stream_protocol & p2);
Requirements

Header: asio/generic/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/protocol.html000066400000000000000000000050721340672067200257770ustar00rootroot00000000000000 generic::stream_protocol::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/socket.html000066400000000000000000001016711340672067200254300ustar00rootroot00000000000000 generic::stream_protocol::socket
asio C++ library

PrevUpHomeNext

The generic socket type.

typedef basic_stream_socket< stream_protocol > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_read_some

Start an asynchronous read.

async_receive

Start an asynchronous receive.

async_send

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

async_write_some

Start an asynchronous write.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_stream_socket

Construct a basic_stream_socket without opening it.

Construct and open a basic_stream_socket.

Construct a basic_stream_socket, opening it and binding it to the given local endpoint.

Construct a basic_stream_socket on an existing native socket.

Move-construct a basic_stream_socket from another.

Move-construct a basic_stream_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_stream_socket from another.

Move-assign a basic_stream_socket from a socket of another protocol type.

read_some

Read some data from the socket.

receive

Receive some data on the socket.

Receive some data on a connected socket.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

write_some

Write some data to the socket.

~basic_stream_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_stream_socket class template provides asynchronous and blocking stream-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/generic/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/stream_protocol.html000066400000000000000000000071721340672067200273550ustar00rootroot00000000000000 generic::stream_protocol::stream_protocol
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

stream_protocol(
    int address_family,
    int socket_protocol);
  » more...

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
stream_protocol(
    const Protocol & source_protocol);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/stream_protocol/000077500000000000000000000000001340672067200264605ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/generic__stream_protocol/stream_protocol/overload1.html000066400000000000000000000053461340672067200312520ustar00rootroot00000000000000 generic::stream_protocol::stream_protocol (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a protocol object for a specific address family and protocol.

stream_protocol(
    int address_family,
    int socket_protocol);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/stream_protocol/overload2.html000066400000000000000000000065371340672067200312560ustar00rootroot00000000000000 generic::stream_protocol::stream_protocol (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a generic protocol object from a specific protocol.

template<
    typename Protocol>
stream_protocol(
    const Protocol & source_protocol);
Exceptions

@c

bad_cast Thrown if the source protocol is not stream-oriented.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/generic__stream_protocol/type.html000066400000000000000000000052241340672067200251160ustar00rootroot00000000000000 generic::stream_protocol::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_allocator.html000066400000000000000000000077001340672067200241050ustar00rootroot00000000000000 get_associated_allocator
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated allocator.

template<
    typename T>
associated_allocator< T >::type get_associated_allocator(
    const T & t);
  » more...

template<
    typename T,
    typename Allocator>
associated_allocator< T, Allocator >::type get_associated_allocator(
    const T & t,
    const Allocator & a);
  » more...
Requirements

Header: asio/associated_allocator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_allocator/000077500000000000000000000000001340672067200232135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/get_associated_allocator/overload1.html000066400000000000000000000061001340672067200257720ustar00rootroot00000000000000 get_associated_allocator (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated allocator.

template<
    typename T>
associated_allocator< T >::type get_associated_allocator(
    const T & t);
Return Value

associated_allocator<T>::get(t)


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_allocator/overload2.html000066400000000000000000000062121340672067200257770ustar00rootroot00000000000000 get_associated_allocator (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated allocator.

template<
    typename T,
    typename Allocator>
associated_allocator< T, Allocator >::type get_associated_allocator(
    const T & t,
    const Allocator & a);
Return Value

associated_allocator<T, Allocator>::get(t, a)


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_executor.html000066400000000000000000000113261340672067200237620ustar00rootroot00000000000000 get_associated_executor
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated executor.

template<
    typename T>
associated_executor< T >::type get_associated_executor(
    const T & t);
  » more...

template<
    typename T,
    typename Executor>
associated_executor< T, Executor >::type get_associated_executor(
    const T & t,
    const Executor & ex,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

template<
    typename T,
    typename ExecutionContext>
associated_executor< T, typename ExecutionContext::executor_type >::type get_associated_executor(
    const T & t,
    ExecutionContext & ctx,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...
Requirements

Header: asio/associated_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_executor/000077500000000000000000000000001340672067200230715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/get_associated_executor/overload1.html000066400000000000000000000060541340672067200256600ustar00rootroot00000000000000 get_associated_executor (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated executor.

template<
    typename T>
associated_executor< T >::type get_associated_executor(
    const T & t);
Return Value

associated_executor<T>::get(t)


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_executor/overload2.html000066400000000000000000000063661340672067200256670ustar00rootroot00000000000000 get_associated_executor (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated executor.

template<
    typename T,
    typename Executor>
associated_executor< T, Executor >::type get_associated_executor(
    const T & t,
    const Executor & ex,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
Return Value

associated_executor<T, Executor>::get(t, ex)


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/get_associated_executor/overload3.html000066400000000000000000000064541340672067200256660ustar00rootroot00000000000000 get_associated_executor (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Helper function to obtain an object's associated executor.

template<
    typename T,
    typename ExecutionContext>
associated_executor< T, typename ExecutionContext::executor_type >::type get_associated_executor(
    const T & t,
    ExecutionContext & ctx,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
Return Value

associated_executor<T, typename ExecutionContext::executor_type>get(t, ctx.get_executor())


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/handler_type.html000066400000000000000000000107131340672067200215430ustar00rootroot00000000000000 handler_type
asio C++ library

PrevUpHomeNext

(Deprecated: Use two-parameter version of async_result.) Default handler type traits provided for all completion token types.

template<
    typename CompletionToken,
    typename Signature,
    typename  = void>
struct handler_type
Types

Name

Description

type

The handler type for the specific signature.

The handler_type traits class is used for determining the concrete handler type to be used for an asynchronous operation. It allows the handler type to be determined at the point where the specific completion handler signature is known.

This template may be specialised for user-defined completion token types.

Requirements

Header: asio/handler_type.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/handler_type/000077500000000000000000000000001340672067200206535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/handler_type/type.html000066400000000000000000000061661340672067200225330ustar00rootroot00000000000000 handler_type::type
asio C++ library

PrevUpHomeNext

The handler type for the specific signature.

typedef conditional< is_same< CompletionToken, typename decay< CompletionToken >::type >::value, decay< CompletionToken >, handler_type< typename decay< CompletionToken >::type, Signature > >::type::type type;
Requirements

Header: asio/handler_type.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/has_service.html000066400000000000000000000103001340672067200213500ustar00rootroot00000000000000 has_service
asio C++ library

PrevUpHomeNext

template<
    typename Service>
bool has_service(
    execution_context & e);

This function is used to determine whether the execution_context contains a service object corresponding to the given service type.

Parameters

e

The execution_context object that owns the service.

Return Value

A boolean indicating whether the execution_context contains the service.

Requirements

Header: asio/impl/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/high_resolution_timer.html000066400000000000000000000440231340672067200234700ustar00rootroot00000000000000 high_resolution_timer
asio C++ library

PrevUpHomeNext

Typedef for a timer based on the high resolution clock.

typedef basic_waitable_timer< chrono::high_resolution_clock > high_resolution_timer;
Types

Name

Description

clock_type

The clock type.

duration

The duration type of the clock.

executor_type

The type of the executor associated with the object.

time_point

The time point type of the clock.

traits_type

The wait traits type.

Member Functions

Name

Description

async_wait

Start an asynchronous wait on the timer.

basic_waitable_timer

Constructor.

Constructor to set a particular expiry time as an absolute time.

Constructor to set a particular expiry time relative to now.

Move-construct a basic_waitable_timer from another.

cancel

Cancel any asynchronous operations that are waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer.

cancel_one

Cancels one asynchronous operation that is waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer.

expires_after

Set the timer's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time.

Set the timer's expiry time as an absolute time.

(Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the timer's expiry time relative to now.

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

expiry

Get the timer's expiry time as an absolute time.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_waitable_timer from another.

wait

Perform a blocking wait on the timer.

~basic_waitable_timer

Destroys the timer.

The basic_waitable_timer class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the wait() or async_wait() function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the steady_timer, system_timer or high_resolution_timer typedefs.

Remarks

This waitable timer functionality is for use with the C++11 standard library's <chrono> facility, or with the Boost.Chrono library.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Examples

Performing a blocking wait (C++11):

// Construct a timer without setting an expiry time.
asio::steady_timer timer(io_context);

// Set an expiry time relative to now.
timer.expires_after(std::chrono::seconds(5));

// Wait for the timer to expire.
timer.wait();

Performing an asynchronous wait (C++11):

void handler(const asio::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
asio::steady_timer timer(io_context,
    std::chrono::steady_clock::now() + std::chrono::seconds(60));

// Start an asynchronous wait.
timer.async_wait(handler);
Changing an active waitable timer's expiry time

Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:

void on_some_event()
{
  if (my_timer.expires_after(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const asio::error_code& e)
{
  if (e != asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}
  • The asio::basic_waitable_timer::expires_after() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.
  • If a wait handler is cancelled, the error_code passed to it contains the value asio::error::operation_aborted.

This typedef uses the C++11 <chrono> standard library facility, if available. Otherwise, it may use the Boost.Chrono library. To explicitly utilise Boost.Chrono, use the basic_waitable_timer template directly:

typedef basic_waitable_timer<boost::chrono::high_resolution_clock> timer;
Requirements

Header: asio/high_resolution_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/invalid_service_owner.html000066400000000000000000000100751340672067200234460ustar00rootroot00000000000000 invalid_service_owner
asio C++ library

PrevUpHomeNext

Exception thrown when trying to add a service object to an execution_context where the service has a different owner.

class invalid_service_owner
Member Functions

Name

Description

invalid_service_owner

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/invalid_service_owner/000077500000000000000000000000001340672067200225555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/invalid_service_owner/invalid_service_owner.html000066400000000000000000000051061340672067200300250ustar00rootroot00000000000000 invalid_service_owner::invalid_service_owner
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context.html000066400000000000000000000662631340672067200212530ustar00rootroot00000000000000 io_context
asio C++ library

PrevUpHomeNext

Provides core I/O functionality.

class io_context :
  public execution_context
Types

Name

Description

executor_type

Executor used to submit functions to an io_context.

service

Base class for all io_context services.

strand

Provides serialised handler execution.

work

(Deprecated: Use executor_work_guard.) Class to inform the io_context when it has work to do.

count_type

The type used to count the number of handlers executed by the context.

fork_event

Fork-related event notifications.

Member Functions

Name

Description

dispatch

(Deprecated: Use asio::dispatch().) Request the io_context to invoke the given handler.

get_executor

Obtains the executor associated with the io_context.

io_context

Constructor.

notify_fork

Notify the execution_context of a fork-related event.

poll

Run the io_context object's event processing loop to execute ready handlers.

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute ready handlers.

poll_one

Run the io_context object's event processing loop to execute one ready handler.

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute one ready handler.

post

(Deprecated: Use asio::post().) Request the io_context to invoke the given handler and return immediately.

reset

(Deprecated: Use restart().) Reset the io_context in preparation for a subsequent run() invocation.

restart

Restart the io_context in preparation for a subsequent run() invocation.

run

Run the io_context object's event processing loop.

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop.

run_for

Run the io_context object's event processing loop for a specified duration.

run_one

Run the io_context object's event processing loop to execute at most one handler.

(Deprecated: Use non-error_code overlaod.) Run the io_context object's event processing loop to execute at most one handler.

run_one_for

Run the io_context object's event processing loop for a specified duration to execute at most one handler.

run_one_until

Run the io_context object's event processing loop until a specified time to execute at most one handler.

run_until

Run the io_context object's event processing loop until a specified time.

stop

Stop the io_context object's event processing loop.

stopped

Determine whether the io_context object has been stopped.

wrap

(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the io_context.

~io_context

Destructor.

Protected Member Functions

Name

Description

destroy

Destroys all services in the context.

shutdown

Shuts down all services in the context.

Friends

Name

Description

add_service

(Deprecated: Use make_service().) Add a service object to the execution_context.

has_service

Determine if an execution_context contains a specified service type.

make_service

Creates a service object and adds it to the execution_context.

use_service



Obtain the service object corresponding to the given type.

The io_context class provides the core I/O functionality for users of the asynchronous I/O objects, including:

  • asio::ip::tcp::socket
  • asio::ip::tcp::acceptor
  • asio::ip::udp::socket
  • deadline_timer.

The io_context class also includes facilities intended for developers of custom asynchronous services.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe, with the specific exceptions of the restart() and notify_fork() functions. Calling restart() while there are unfinished run(), run_one(), run_for(), run_until(), poll() or poll_one() calls results in undefined behaviour. The notify_fork() function should not be called while any io_context function, or any function on an I/O object that is associated with the io_context, is being called in another thread.

Synchronous and asynchronous operations

Synchronous operations on I/O objects implicitly run the io_context object for an individual operation. The io_context functions run(), run_one(), run_for(), run_until(), poll() or poll_one() must be called for the io_context to perform asynchronous operations on behalf of a C++ program. Notification that an asynchronous operation has completed is delivered by invocation of the associated handler. Handlers are invoked only by a thread that is currently calling any overload of run(), run_one(), run_for(), run_until(), poll() or poll_one() for the io_context.

Effect of exceptions thrown from handlers

If an exception is thrown from a handler, the exception is allowed to propagate through the throwing thread's invocation of run(), run_one(), run_for(), run_until(), poll() or poll_one(). No other threads that are calling any of these functions are affected. It is then the responsibility of the application to catch the exception.

After the exception has been caught, the run(), run_one(), run_for(), run_until(), poll() or poll_one() call may be restarted without the need for an intervening call to restart(). This allows the thread to rejoin the io_context object's thread pool without impacting any other threads in the pool.

For example:

asio::io_context io_context;
...
for (;;)
{
  try
  {
    io_context.run();
    break; // run() exited normally
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
}
Submitting arbitrary tasks to the io_context

To submit functions to the io_context, use the dispatch , post or defer free functions.

For example:

void my_task()
{
  ...
}

...

asio::io_context io_context;

// Submit a function to the io_context.
asio::post(io_context, my_task);

// Submit a lambda object to the io_context.
asio::post(io_context,
    []()
    {
      ...
    });

// Run the io_context until it runs out of work.
io_context.run();
Stopping the io_context from running out of work

Some applications may need to prevent an io_context object's run() call from returning when there is no more work to do. For example, the io_context may be being run in a background thread that is launched prior to the application's asynchronous operations. The run() call may be kept running by creating an object of type asio::executor_work_guard<io_context::executor_type>:

asio::io_context io_context;
asio::executor_work_guard<asio::io_context::executor_type>
  = asio::make_work_guard(io_context);
...

To effect a shutdown, the application will then need to call the io_context object's stop() member function. This will cause the io_context run() call to return as soon as possible, abandoning unfinished operations and without permitting ready handlers to be dispatched.

Alternatively, if the application requires that all operations and handlers be allowed to finish normally, the work object may be explicitly reset.

asio::io_context io_context;
asio::executor_work_guard<asio::io_context::executor_type>
  = asio::make_work_guard(io_context);
...
work.reset(); // Allow run() to exit.
Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/000077500000000000000000000000001340672067200203505ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/_io_context.html000066400000000000000000000131701340672067200235520ustar00rootroot00000000000000 io_context::~io_context
asio C++ library

PrevUpHomeNext

Destructor.

~io_context();

On destruction, the io_context performs the following sequence of operations:

  • For each service object svc in the io_context set, in reverse order of the beginning of service object lifetime, performs svc->shutdown().
  • Uninvoked handler objects that were scheduled for deferred invocation on the io_context, or any associated strand, are destroyed.
  • For each service object svc in the io_context set, in reverse order of the beginning of service object lifetime, performs delete static_cast<io_context::service*>(svc).
Remarks

The destruction sequence described above permits programs to simplify their resource management by using shared_ptr<>. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a shared_ptr to the object would be bound into the handlers for all asynchronous operations associated with it. This works as follows:

  • When a single connection ends, all associated asynchronous operations complete. The corresponding handler objects are destroyed, and all shared_ptr references to the objects are destroyed.
  • To shut down the whole program, the io_context function stop() is called to terminate any run() calls as soon as possible. The io_context destructor defined above destroys all handlers, causing all shared_ptr references to all connection objects to be destroyed.

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/add_service.html000066400000000000000000000137601340672067200235150ustar00rootroot00000000000000 io_context::add_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

(Deprecated: Use make_service().) Add a service object to the execution_context.

template<
    typename Service>
friend void add_service(
    execution_context & e,
    Service * svc);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

svc

The service object. On success, ownership of the service object is transferred to the execution_context. When the execution_context object is destroyed, it will destroy the service object by performing:

delete static_cast<execution_context::service*>(svc)

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

asio::invalid_service_owner

Thrown if the service's owning execution_context is not the execution_context object specified by the e parameter.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/count_type.html000066400000000000000000000057161340672067200234400ustar00rootroot00000000000000 io_context::count_type
asio C++ library

PrevUpHomeNext

The type used to count the number of handlers executed by the context.

typedef std::size_t count_type;
Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/destroy.html000066400000000000000000000061071340672067200227330ustar00rootroot00000000000000 io_context::destroy
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Destroys all services in the context.

void destroy();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order * of the beginning of service object lifetime, performs delete static_cast<execution_context::service*>(svc).

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/dispatch.html000066400000000000000000000122451340672067200230410ustar00rootroot00000000000000 io_context::dispatch
asio C++ library

PrevUpHomeNext

(Deprecated: Use dispatch.) Request the io_context to invoke the given handler.

template<
    typename LegacyCompletionHandler>
DEDUCED dispatch(
    LegacyCompletionHandler && handler);

This function is used to ask the io_context to execute the given handler.

The io_context guarantees that the handler will only be called in a thread in which the run(), run_one(), poll() or poll_one() member functions is currently being invoked. The handler may be executed inside this function if the guarantee can be met.

Parameters

handler

The handler to be called. The io_context will make a copy of the handler object as required. The function signature of the handler must be:

void handler();

Remarks

This function throws an exception only if:

  • the handler's asio_handler_allocate function; or
  • the handler's copy constructor

throws an exception.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/fork_event.html000066400000000000000000000070571340672067200234110ustar00rootroot00000000000000 io_context::fork_event
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Fork-related event notifications.

enum fork_event

Values

fork_prepare

Notify the context that the process is about to fork.

fork_parent

Notify the context that the process has forked and is the parent.

fork_child

Notify the context that the process has forked and is the child.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/get_executor.html000066400000000000000000000050651340672067200237410ustar00rootroot00000000000000 io_context::get_executor
asio C++ library

PrevUpHomeNext

Obtains the executor associated with the io_context.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/has_service.html000066400000000000000000000112711340672067200235330ustar00rootroot00000000000000 io_context::has_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Determine if an execution_context contains a specified service type.

template<
    typename Service>
friend bool has_service(
    execution_context & e);

This function is used to determine whether the execution_context contains a service object corresponding to the given service type.

Parameters

e

The execution_context object that owns the service.

Return Value

A boolean indicating whether the execution_context contains the service.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/io_context.html000066400000000000000000000057601340672067200234210ustar00rootroot00000000000000 io_context::io_context
asio C++ library

PrevUpHomeNext

Constructor.

io_context();
  » more...

explicit io_context(
    int concurrency_hint);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/io_context/000077500000000000000000000000001340672067200225235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/io_context/overload1.html000066400000000000000000000047231340672067200253130ustar00rootroot00000000000000 io_context::io_context (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructor.

io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/io_context/overload2.html000066400000000000000000000062321340672067200253110ustar00rootroot00000000000000 io_context::io_context (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructor.

io_context(
    int concurrency_hint);

Construct with a hint about the required level of concurrency.

Parameters

concurrency_hint

A suggestion to the implementation on how many threads it should allow to run simultaneously.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/make_service.html000066400000000000000000000120311340672067200236700ustar00rootroot00000000000000 io_context::make_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Creates a service object and adds it to the execution_context.

template<
    typename Service,
    typename... Args>
friend Service & make_service(
    execution_context & e,
    Args &&... args);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

args

Zero or more arguments to be passed to the service constructor.

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/notify_fork.html000066400000000000000000000147241340672067200235770ustar00rootroot00000000000000 io_context::notify_fork
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Notify the execution_context of a fork-related event.

void notify_fork(
    fork_event event);

This function is used to inform the execution_context that the process is about to fork, or has just forked. This allows the execution_context, and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other execution_context function, or any function associated with the execution_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the execution_context or its derived class.

Parameters

event

A fork-related event.

Exceptions

asio::system_error

Thrown on failure. If the notification fails the execution_context object should no longer be used and should be destroyed.

Example

The following code illustrates how to incorporate the notify_fork() function:

my_execution_context.notify_fork(execution_context::fork_prepare);
if (fork() == 0)
{
  // This is the child process.
  my_execution_context.notify_fork(execution_context::fork_child);
}
else
{
  // This is the parent process.
  my_execution_context.notify_fork(execution_context::fork_parent);
}
Remarks

For each service object svc in the execution_context set, performs svc->notify_fork();. When processing the fork_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/poll.html000066400000000000000000000065351340672067200222150ustar00rootroot00000000000000 io_context::poll
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop to execute ready handlers.

count_type poll();
  » more...

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute ready handlers.

count_type poll(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/poll/000077500000000000000000000000001340672067200213165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/poll/overload1.html000066400000000000000000000064071340672067200241070ustar00rootroot00000000000000 io_context::poll (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop to execute ready handlers.

count_type poll();

The poll() function runs handlers that are ready to run, without blocking, until the io_context has been stopped or there are no more ready handlers.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/poll/overload2.html000066400000000000000000000075051340672067200241100ustar00rootroot00000000000000 io_context::poll (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute ready handlers.

count_type poll(
    asio::error_code & ec);

The poll() function runs handlers that are ready to run, without blocking, until the io_context has been stopped or there are no more ready handlers.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/poll_one.html000066400000000000000000000067101340672067200230510ustar00rootroot00000000000000 io_context::poll_one
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop to execute one ready handler.

count_type poll_one();
  » more...

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute one ready handler.

count_type poll_one(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/poll_one/000077500000000000000000000000001340672067200221575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/poll_one/overload1.html000066400000000000000000000062351340672067200247470ustar00rootroot00000000000000 io_context::poll_one (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop to execute one ready handler.

count_type poll_one();

The poll_one() function runs at most one handler that is ready to run, without blocking.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/poll_one/overload2.html000066400000000000000000000073071340672067200247510ustar00rootroot00000000000000 io_context::poll_one (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute one ready handler.

count_type poll_one(
    asio::error_code & ec);

The poll_one() function runs at most one handler that is ready to run, without blocking.

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/post.html000066400000000000000000000123771340672067200222350ustar00rootroot00000000000000 io_context::post
asio C++ library

PrevUpHomeNext

(Deprecated: Use post.) Request the io_context to invoke the given handler and return immediately.

template<
    typename LegacyCompletionHandler>
DEDUCED post(
    LegacyCompletionHandler && handler);

This function is used to ask the io_context to execute the given handler, but without allowing the io_context to call the handler from inside this function.

The io_context guarantees that the handler will only be called in a thread in which the run(), run_one(), poll() or poll_one() member functions is currently being invoked.

Parameters

handler

The handler to be called. The io_context will make a copy of the handler object as required. The function signature of the handler must be:

void handler();

Remarks

This function throws an exception only if:

  • the handler's asio_handler_allocate function; or
  • the handler's copy constructor

throws an exception.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/reset.html000066400000000000000000000074001340672067200223610ustar00rootroot00000000000000 io_context::reset
asio C++ library

PrevUpHomeNext

(Deprecated: Use restart().) Reset the io_context in preparation for a subsequent run() invocation.

void reset();

This function must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_context being stopped or running out of work. After a call to restart(), the io_context object's stopped() function will return false.

This function must not be called while there are any unfinished calls to the run(), run_one(), poll() or poll_one() functions.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/restart.html000066400000000000000000000072711340672067200227310ustar00rootroot00000000000000 io_context::restart
asio C++ library

PrevUpHomeNext

Restart the io_context in preparation for a subsequent run() invocation.

void restart();

This function must be called prior to any second or later set of invocations of the run(), run_one(), poll() or poll_one() functions when a previous invocation of these functions returned due to the io_context being stopped or running out of work. After a call to restart(), the io_context object's stopped() function will return false.

This function must not be called while there are any unfinished calls to the run(), run_one(), poll() or poll_one() functions.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run.html000066400000000000000000000064051340672067200220470ustar00rootroot00000000000000 io_context::run
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop.

count_type run();
  » more...

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop.

count_type run(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run/000077500000000000000000000000001340672067200211545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/run/overload1.html000066400000000000000000000131301340672067200237340ustar00rootroot00000000000000 io_context::run (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop.

count_type run();

The run() function blocks until all work has finished and there are no more handlers to be dispatched, or until the io_context has been stopped.

Multiple threads may call the run() function to set up a pool of threads from which the io_context may execute handlers. All threads that are waiting in the pool are equivalent and the io_context may choose any one of them to invoke a handler.

A normal exit from the run() function implies that the io_context object is stopped (the stopped() function returns true). Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately unless there is a prior call to restart().

Return Value

The number of handlers that were executed.

Remarks

Calling the run() function from a thread that is currently calling one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on the same io_context object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this.

The poll() function may also be used to dispatch ready handlers, but without blocking.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run/overload2.html000066400000000000000000000142231340672067200237410ustar00rootroot00000000000000 io_context::run (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop.

count_type run(
    asio::error_code & ec);

The run() function blocks until all work has finished and there are no more handlers to be dispatched, or until the io_context has been stopped.

Multiple threads may call the run() function to set up a pool of threads from which the io_context may execute handlers. All threads that are waiting in the pool are equivalent and the io_context may choose any one of them to invoke a handler.

A normal exit from the run() function implies that the io_context object is stopped (the stopped() function returns true). Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately unless there is a prior call to restart().

Parameters

ec

Set to indicate what error occurred, if any.

Return Value

The number of handlers that were executed.

Remarks

Calling the run() function from a thread that is currently calling one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on the same io_context object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this.

The poll() function may also be used to dispatch ready handlers, but without blocking.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_for.html000066400000000000000000000074621340672067200227210ustar00rootroot00000000000000 io_context::run_for
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop for a specified duration.

template<
    typename Rep,
    typename Period>
std::size_t run_for(
    const chrono::duration< Rep, Period > & rel_time);

The run_for() function blocks until all work has finished and there are no more handlers to be dispatched, until the io_context has been stopped, or until the specified duration has elapsed.

Parameters

rel_time

The duration for which the call may block.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_one.html000066400000000000000000000066231340672067200227120ustar00rootroot00000000000000 io_context::run_one
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop to execute at most one handler.

count_type run_one();
  » more...

(Deprecated: Use non-error_code overlaod.) Run the io_context object's event processing loop to execute at most one handler.

count_type run_one(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_one/000077500000000000000000000000001340672067200220155ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/run_one/overload1.html000066400000000000000000000115671340672067200246110ustar00rootroot00000000000000 io_context::run_one (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop to execute at most one handler.

count_type run_one();

The run_one() function blocks until one handler has been dispatched, or until the io_context has been stopped.

Return Value

The number of handlers that were executed. A zero return value implies that the io_context object is stopped (the stopped() function returns true). Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately unless there is a prior call to restart().

Remarks

Calling the run_one() function from a thread that is currently calling one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on the same io_context object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_one/overload2.html000066400000000000000000000120321340672067200245760ustar00rootroot00000000000000 io_context::run_one (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use non-error_code overlaod.) Run the io_context object's event processing loop to execute at most one handler.

count_type run_one(
    asio::error_code & ec);

The run_one() function blocks until one handler has been dispatched, or until the io_context has been stopped.

Return Value

The number of handlers that were executed. A zero return value implies that the io_context object is stopped (the stopped() function returns true). Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately unless there is a prior call to restart().

The number of handlers that were executed.

Remarks

Calling the run_one() function from a thread that is currently calling one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on the same io_context object may introduce the potential for deadlock. It is the caller's reponsibility to avoid this.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_one_for.html000066400000000000000000000076111340672067200235560ustar00rootroot00000000000000 io_context::run_one_for
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop for a specified duration to execute at most one handler.

template<
    typename Rep,
    typename Period>
std::size_t run_one_for(
    const chrono::duration< Rep, Period > & rel_time);

The run_one_for() function blocks until one handler has been dispatched, until the io_context has been stopped, or until the specified duration has elapsed.

Parameters

rel_time

The duration for which the call may block.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_one_until.html000066400000000000000000000076311340672067200241250ustar00rootroot00000000000000 io_context::run_one_until
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop until a specified time to execute at most one handler.

template<
    typename Clock,
    typename Duration>
std::size_t run_one_until(
    const chrono::time_point< Clock, Duration > & abs_time);

The run_one_until() function blocks until one handler has been dispatched, until the io_context has been stopped, or until the specified time has been reached.

Parameters

abs_time

The time point until which the call may block.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/run_until.html000066400000000000000000000075321340672067200232640ustar00rootroot00000000000000 io_context::run_until
asio C++ library

PrevUpHomeNext

Run the io_context object's event processing loop until a specified time.

template<
    typename Clock,
    typename Duration>
std::size_t run_until(
    const chrono::time_point< Clock, Duration > & abs_time);

The run_until() function blocks until all work has finished and there are no more handlers to be dispatched, until the io_context has been stopped, or until the specified time has been reached.

Parameters

abs_time

The time point until which the call may block.

Return Value

The number of handlers that were executed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/shutdown.html000066400000000000000000000060221340672067200231110ustar00rootroot00000000000000 io_context::shutdown
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Shuts down all services in the context.

void shutdown();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order of the beginning of service object lifetime, performs svc->shutdown().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/stop.html000066400000000000000000000062341340672067200222300ustar00rootroot00000000000000 io_context::stop
asio C++ library

PrevUpHomeNext

Stop the io_context object's event processing loop.

void stop();

This function does not block, but instead simply signals the io_context to stop. All invocations of its run() or run_one() member functions should return as soon as possible. Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately until restart() is called.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/stopped.html000066400000000000000000000074201340672067200227170ustar00rootroot00000000000000 io_context::stopped
asio C++ library

PrevUpHomeNext

Determine whether the io_context object has been stopped.

bool stopped() const;

This function is used to determine whether an io_context object has been stopped, either through an explicit call to stop(), or due to running out of work. When an io_context object is stopped, calls to run(), run_one(), poll() or poll_one() will return immediately without invoking any handlers.

Return Value

true if the io_context object is stopped, otherwise false.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/use_service.html000066400000000000000000000065711340672067200235630ustar00rootroot00000000000000 io_context::use_service
asio C++ library

PrevUpHomeNext

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);
  » more...

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/use_service/000077500000000000000000000000001340672067200226645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context/use_service/overload1.html000066400000000000000000000122201340672067200254430ustar00rootroot00000000000000 io_context::use_service (1 of 2 overloads)
asio C++ library

PrevUpHomeNext
template<
    typename Service>
friend Service & use_service(
    io_context & ioc);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the io_context will create a new instance of the service.

Parameters

ioc

The io_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Remarks

This overload is preserved for backwards compatibility with services that inherit from io_context::service.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/use_service/overload2.html000066400000000000000000000114621340672067200254530ustar00rootroot00000000000000 io_context::use_service (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the execution_context will create a new instance of the service.

Parameters

e

The execution_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context/wrap.html000066400000000000000000000117011340672067200222070ustar00rootroot00000000000000 io_context::wrap
asio C++ library

PrevUpHomeNext

(Deprecated: Use bind_executor.) Create a new handler that automatically dispatches the wrapped handler on the io_context.

template<
    typename Handler>
unspecified wrap(
    Handler handler);

This function is used to create a new handler function object that, when invoked, will automatically pass the wrapped handler to the io_context object's dispatch function.

Parameters

handler

The handler to be wrapped. The io_context will make a copy of the handler object as required. The function signature of the handler must be:

void handler(A1 a1, ... An an);

Return Value

A function object that, when invoked, passes the wrapped handler to the io_context object's dispatch function. Given a function object with the signature:

R f(A1 a1, ... An an);

If this function object is passed to the wrap function like so:

io_context.wrap(f);

then the return value is a function object with the signature

void g(A1 a1, ... An an);

that, when invoked, executes code equivalent to:

io_context.dispatch(boost::bind(f, a1, ... an));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type.html000066400000000000000000000175271340672067200243700ustar00rootroot00000000000000 io_context::executor_type
asio C++ library

PrevUpHomeNext

Executor used to submit functions to an io_context.

class executor_type
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/000077500000000000000000000000001340672067200234665ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__executor_type/context.html000066400000000000000000000051411340672067200260410ustar00rootroot00000000000000 io_context::executor_type::context
asio C++ library

PrevUpHomeNext

Obtain the underlying execution context.

io_context & context() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/defer.html000066400000000000000000000107341340672067200254460ustar00rootroot00000000000000 io_context::executor_type::defer
asio C++ library

PrevUpHomeNext

Request the io_context to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void defer(
    Function && f,
    const Allocator & a) const;

This function is used to ask the io_context to execute the given function object. The function object will never be executed inside defer(). Instead, it will be scheduled to run on the io_context.

If the current thread belongs to the io_context, defer() will delay scheduling the function object until the current thread returns control to the pool.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/dispatch.html000066400000000000000000000105501340672067200261540ustar00rootroot00000000000000 io_context::executor_type::dispatch
asio C++ library

PrevUpHomeNext

Request the io_context to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;

This function is used to ask the io_context to execute the given function object. If the current thread is running the io_context, dispatch() executes the function before returning. Otherwise, the function will be scheduled to run on the io_context.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/on_work_finished.html000066400000000000000000000064521340672067200277120ustar00rootroot00000000000000 io_context::executor_type::on_work_finished
asio C++ library

PrevUpHomeNext

Inform the io_context that some work is no longer outstanding.

void on_work_finished() const;

This function is used to inform the io_context that some work has finished. Once the count of unfinished work reaches zero, the io_context is stopped and the run() and run_one() functions may exit.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/on_work_started.html000066400000000000000000000062671340672067200275730ustar00rootroot00000000000000 io_context::executor_type::on_work_started
asio C++ library

PrevUpHomeNext

Inform the io_context that it has some outstanding work to do.

void on_work_started() const;

This function is used to inform the io_context that some work has begun. This ensures that the io_context's run() and run_one() functions do not exit while the work is underway.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/operator_eq__eq_.html000066400000000000000000000066601340672067200276670ustar00rootroot00000000000000 io_context::executor_type::operator==
asio C++ library

PrevUpHomeNext

Compare two executors for equality.

friend bool operator==(
    const executor_type & a,
    const executor_type & b);

Two executors are equal if they refer to the same underlying io_context.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/operator_not__eq_.html000066400000000000000000000067421340672067200300630ustar00rootroot00000000000000 io_context::executor_type::operator!=
asio C++ library

PrevUpHomeNext

Compare two executors for inequality.

friend bool operator!=(
    const executor_type & a,
    const executor_type & b);

Two executors are equal if they refer to the same underlying io_context.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/post.html000066400000000000000000000103251340672067200253420ustar00rootroot00000000000000 io_context::executor_type::post
asio C++ library

PrevUpHomeNext

Request the io_context to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;

This function is used to ask the io_context to execute the given function object. The function object will never be executed inside post(). Instead, it will be scheduled to run on the io_context.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__executor_type/running_in_this_thread.html000066400000000000000000000066761340672067200311170ustar00rootroot00000000000000 io_context::executor_type::running_in_this_thread
asio C++ library

PrevUpHomeNext

Determine whether the io_context is running in the current thread.

bool running_in_this_thread() const;
Return Value

true if the current thread is running the io_context. Otherwise returns false.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__service.html000066400000000000000000000134221340672067200231170ustar00rootroot00000000000000 io_context::service
asio C++ library

PrevUpHomeNext

Base class for all io_context services.

class service
Member Functions

Name

Description

get_io_context

Get the io_context object that owns the service.

get_io_service

Get the io_context object that owns the service.

Protected Member Functions

Name

Description

service

Constructor.

~service

Destructor.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__service/000077500000000000000000000000001340672067200222275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__service/_service.html000066400000000000000000000047421340672067200247230ustar00rootroot00000000000000 io_context::service::~service
asio C++ library

PrevUpHomeNext

Destructor.

virtual ~service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__service/get_io_context.html000066400000000000000000000053311340672067200261310ustar00rootroot00000000000000 io_context::service::get_io_context
asio C++ library

PrevUpHomeNext

Get the io_context object that owns the service.

asio::io_context & get_io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__service/get_io_service.html000066400000000000000000000052651340672067200261130ustar00rootroot00000000000000 io_context::service::get_io_service
asio C++ library

PrevUpHomeNext

Get the io_context object that owns the service.

asio::io_context & get_io_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__service/service.html000066400000000000000000000061161340672067200245610ustar00rootroot00000000000000 io_context::service::service
asio C++ library

PrevUpHomeNext

Constructor.

service(
    asio::io_context & owner);
Parameters

owner

The io_context object that owns the service.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand.html000066400000000000000000000336431340672067200227610ustar00rootroot00000000000000 io_context::strand
asio C++ library

PrevUpHomeNext

Provides serialised handler execution.

class strand
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the strand to invoke the given function object.

dispatch

Request the strand to invoke the given function object.

(Deprecated: Use asio::dispatch().) Request the strand to invoke the given handler.

get_io_context

(Deprecated: Use context().) Get the io_context associated with the strand.

get_io_service

(Deprecated: Use context().) Get the io_context associated with the strand.

on_work_finished

Inform the strand that some work is no longer outstanding.

on_work_started

Inform the strand that it has some outstanding work to do.

post

Request the strand to invoke the given function object.

(Deprecated: Use asio::post().) Request the strand to invoke the given handler and return immediately.

running_in_this_thread

Determine whether the strand is running in the current thread.

strand

Constructor.

wrap

(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the strand.

~strand

Destructor.

Friends

Name

Description

operator!=

Compare two strands for inequality.

operator==

Compare two strands for equality.

The io_context::strand class provides the ability to post and dispatch handlers with the guarantee that none of those handlers will execute concurrently.

Order of handler invocation

Given:

  • a strand object s
  • an object a meeting completion handler requirements
  • an object a1 which is an arbitrary copy of a made by the implementation
  • an object b meeting completion handler requirements
  • an object b1 which is an arbitrary copy of b made by the implementation

if any of the following conditions are true:

  • s.post(a) happens-before s.post(b)
  • s.post(a) happens-before s.dispatch(b), where the latter is performed outside the strand
  • s.dispatch(a) happens-before s.post(b), where the former is performed outside the strand
  • s.dispatch(a) happens-before s.dispatch(b), where both are performed outside the strand

then asio_handler_invoke(a1, &a1) happens-before asio_handler_invoke(b1, &b1).

Note that in the following case:

async_op_1(..., s.wrap(a));
async_op_2(..., s.wrap(b));

the completion of the first async operation will perform s.dispatch(a), and the second will perform s.dispatch(b), but the order in which those are performed is unspecified. That is, you cannot state whether one happens-before the other. Therefore none of the above conditions are met and no ordering guarantee is made.

Remarks

The implementation makes no guarantee that handlers posted or dispatched through different strand objects will be invoked concurrently.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/io_context_strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/000077500000000000000000000000001340672067200220625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__strand/_strand.html000066400000000000000000000052311340672067200244030ustar00rootroot00000000000000 io_context::strand::~strand
asio C++ library

PrevUpHomeNext

Destructor.

~strand();

Destroys a strand.

Handlers posted through the strand that have not yet been invoked will still be dispatched in a way that meets the guarantee of non-concurrency.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/context.html000066400000000000000000000050051340672067200244340ustar00rootroot00000000000000 io_context::strand::context
asio C++ library

PrevUpHomeNext

Obtain the underlying execution context.

asio::io_context & context() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/defer.html000066400000000000000000000074621340672067200240460ustar00rootroot00000000000000 io_context::strand::defer
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void defer(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run by the underlying io_context.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/dispatch.html000066400000000000000000000075071340672067200245600ustar00rootroot00000000000000 io_context::strand::dispatch
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;
  » more...

(Deprecated: Use dispatch.) Request the strand to invoke the given handler.

template<
    typename LegacyCompletionHandler>
DEDUCED dispatch(
    LegacyCompletionHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/dispatch/000077500000000000000000000000001340672067200236615ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__strand/dispatch/overload1.html000066400000000000000000000101661340672067200264470ustar00rootroot00000000000000 io_context::strand::dispatch (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;

This function is used to ask the strand to execute the given function object on its underlying io_context. The function object will be executed inside this function if the strand is not otherwise busy and if the underlying io_context's executor's dispatch() function is also able to execute the function before returning.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/dispatch/overload2.html000066400000000000000000000115031340672067200264440ustar00rootroot00000000000000 io_context::strand::dispatch (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use dispatch.) Request the strand to invoke the given handler.

template<
    typename LegacyCompletionHandler>
DEDUCED dispatch(
    LegacyCompletionHandler && handler);

This function is used to ask the strand to execute the given handler.

The strand object guarantees that handlers posted or dispatched through the strand will not be executed concurrently. The handler may be executed inside this function if the guarantee can be met. If this function is called from within a handler that was posted or dispatched through the same strand, then the new handler will be executed immediately.

The strand's guarantee is in addition to the guarantee provided by the underlying io_context. The io_context guarantees that the handler will only be called in a thread in which the io_context's run member function is currently being invoked.

Parameters

handler

The handler to be called. The strand will make a copy of the handler object as required. The function signature of the handler must be:

void handler();


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/get_io_context.html000066400000000000000000000071721340672067200257710ustar00rootroot00000000000000 io_context::strand::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use context().) Get the io_context associated with the strand.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the strand uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the strand will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/get_io_service.html000066400000000000000000000071511340672067200257420ustar00rootroot00000000000000 io_context::strand::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use context().) Get the io_context associated with the strand.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the strand uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the strand will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/on_work_finished.html000066400000000000000000000054441340672067200263060ustar00rootroot00000000000000 io_context::strand::on_work_finished
asio C++ library

PrevUpHomeNext

Inform the strand that some work is no longer outstanding.

void on_work_finished() const;

The strand delegates this call to its underlying io_context.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/on_work_started.html000066400000000000000000000054461340672067200261650ustar00rootroot00000000000000 io_context::strand::on_work_started
asio C++ library

PrevUpHomeNext

Inform the strand that it has some outstanding work to do.

void on_work_started() const;

The strand delegates this call to its underlying io_context.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/operator_eq__eq_.html000066400000000000000000000063601340672067200262600ustar00rootroot00000000000000 io_context::strand::operator==
asio C++ library

PrevUpHomeNext

Compare two strands for equality.

friend bool operator==(
    const strand & a,
    const strand & b);

Two strands are equal if they refer to the same ordered, non-concurrent state.

Requirements

Header: asio/io_context_strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/operator_not__eq_.html000066400000000000000000000064421340672067200264540ustar00rootroot00000000000000 io_context::strand::operator!=
asio C++ library

PrevUpHomeNext

Compare two strands for inequality.

friend bool operator!=(
    const strand & a,
    const strand & b);

Two strands are equal if they refer to the same ordered, non-concurrent state.

Requirements

Header: asio/io_context_strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/post.html000066400000000000000000000074501340672067200237430ustar00rootroot00000000000000 io_context::strand::post
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;
  » more...

(Deprecated: Use post.) Request the strand to invoke the given handler and return immediately.

template<
    typename LegacyCompletionHandler>
DEDUCED post(
    LegacyCompletionHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/post/000077500000000000000000000000001340672067200230475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__strand/post/overload1.html000066400000000000000000000075741340672067200256460ustar00rootroot00000000000000 io_context::strand::post (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run by the underlying io_context.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/post/overload2.html000066400000000000000000000111651340672067200256360ustar00rootroot00000000000000 io_context::strand::post (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use post.) Request the strand to invoke the given handler and return immediately.

template<
    typename LegacyCompletionHandler>
DEDUCED post(
    LegacyCompletionHandler && handler);

This function is used to ask the strand to execute the given handler, but without allowing the strand to call the handler from inside this function.

The strand object guarantees that handlers posted or dispatched through the strand will not be executed concurrently. The strand's guarantee is in addition to the guarantee provided by the underlying io_context. The io_context guarantees that the handler will only be called in a thread in which the io_context's run member function is currently being invoked.

Parameters

handler

The handler to be called. The strand will make a copy of the handler object as required. The function signature of the handler must be:

void handler();


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/running_in_this_thread.html000066400000000000000000000065121340672067200275000ustar00rootroot00000000000000 io_context::strand::running_in_this_thread
asio C++ library

PrevUpHomeNext

Determine whether the strand is running in the current thread.

bool running_in_this_thread() const;
Return Value

true if the current thread is executing a handler that was submitted to the strand using post(), dispatch() or wrap(). Otherwise returns false.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/strand.html000066400000000000000000000063021340672067200242440ustar00rootroot00000000000000 io_context::strand::strand
asio C++ library

PrevUpHomeNext

Constructor.

strand(
    asio::io_context & io_context);

Constructs the strand.

Parameters

io_context

The io_context object that the strand will use to dispatch handlers that are ready to be run.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__strand/wrap.html000066400000000000000000000110401340672067200237150ustar00rootroot00000000000000 io_context::strand::wrap
asio C++ library

PrevUpHomeNext

(Deprecated: Use bind_executor.) Create a new handler that automatically dispatches the wrapped handler on the strand.

template<
    typename Handler>
unspecified wrap(
    Handler handler);

This function is used to create a new handler function object that, when invoked, will automatically pass the wrapped handler to the strand's dispatch function.

Parameters

handler

The handler to be wrapped. The strand will make a copy of the handler object as required. The function signature of the handler must be:

void handler(A1 a1, ... An an);

Return Value

A function object that, when invoked, passes the wrapped handler to the strand's dispatch function. Given a function object with the signature:

R f(A1 a1, ... An an);

If this function object is passed to the wrap function like so:

strand.wrap(f);

then the return value is a function object with the signature

void g(A1 a1, ... An an);

that, when invoked, executes code equivalent to:

strand.dispatch(boost::bind(f, a1, ... an));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work.html000066400000000000000000000140641340672067200224440ustar00rootroot00000000000000 io_context::work
asio C++ library

PrevUpHomeNext

(Deprecated: Use executor_work_guard.) Class to inform the io_context when it has work to do.

class work
Member Functions

Name

Description

get_io_context

Get the io_context associated with the work.

get_io_service

(Deprecated: Use get_io_context().) Get the io_context associated with the work.

work

Constructor notifies the io_context that work is starting.

Copy constructor notifies the io_context that work is starting.

~work

Destructor notifies the io_context that the work is complete.

The work class is used to inform the io_context when work starts and finishes. This ensures that the io_context object's run() function will not exit while work is underway, and that it does exit when there is no unfinished work remaining.

The work class is copy-constructible so that it may be used as a data member in a handler class. It is not assignable.

Requirements

Header: asio/io_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work/000077500000000000000000000000001340672067200215515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__work/_work.html000066400000000000000000000060701340672067200235630ustar00rootroot00000000000000 io_context::work::~work
asio C++ library

PrevUpHomeNext

Destructor notifies the io_context that the work is complete.

~work();

The destructor is used to inform the io_context that some work has finished. Once the count of unfinished work reaches zero, the io_context object's run() function is permitted to exit.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work/get_io_context.html000066400000000000000000000052531340672067200254560ustar00rootroot00000000000000 io_context::work::get_io_context
asio C++ library

PrevUpHomeNext

Get the io_context associated with the work.

asio::io_context & get_io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work/get_io_service.html000066400000000000000000000053141340672067200254300ustar00rootroot00000000000000 io_context::work::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_io_context().) Get the io_context associated with the work.

asio::io_context & get_io_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work/work.html000066400000000000000000000066311340672067200234270ustar00rootroot00000000000000 io_context::work::work
asio C++ library

PrevUpHomeNext

Constructor notifies the io_context that work is starting.

explicit work(
    asio::io_context & io_context);
  » more...

Copy constructor notifies the io_context that work is starting.

work(
    const work & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work/work/000077500000000000000000000000001340672067200225335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/io_context__work/work/overload1.html000066400000000000000000000061261340672067200253220ustar00rootroot00000000000000 io_context::work::work (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructor notifies the io_context that work is starting.

work(
    asio::io_context & io_context);

The constructor is used to inform the io_context that some work has begun. This ensures that the io_context object's run() function will not exit while the work is underway.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_context__work/work/overload2.html000066400000000000000000000061241340672067200253210ustar00rootroot00000000000000 io_context::work::work (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor notifies the io_context that work is starting.

work(
    const work & other);

The constructor is used to inform the io_context that some work has begun. This ensures that the io_context object's run() function will not exit while the work is underway.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/io_service.html000066400000000000000000000661431340672067200212240ustar00rootroot00000000000000 io_service
asio C++ library

PrevUpHomeNext

Typedef for backwards compatibility.

typedef io_context io_service;
Types

Name

Description

executor_type

Executor used to submit functions to an io_context.

service

Base class for all io_context services.

strand

Provides serialised handler execution.

work

(Deprecated: Use executor_work_guard.) Class to inform the io_context when it has work to do.

count_type

The type used to count the number of handlers executed by the context.

fork_event

Fork-related event notifications.

Member Functions

Name

Description

dispatch

(Deprecated: Use asio::dispatch().) Request the io_context to invoke the given handler.

get_executor

Obtains the executor associated with the io_context.

io_context

Constructor.

notify_fork

Notify the execution_context of a fork-related event.

poll

Run the io_context object's event processing loop to execute ready handlers.

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute ready handlers.

poll_one

Run the io_context object's event processing loop to execute one ready handler.

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop to execute one ready handler.

post

(Deprecated: Use asio::post().) Request the io_context to invoke the given handler and return immediately.

reset

(Deprecated: Use restart().) Reset the io_context in preparation for a subsequent run() invocation.

restart

Restart the io_context in preparation for a subsequent run() invocation.

run

Run the io_context object's event processing loop.

(Deprecated: Use non-error_code overload.) Run the io_context object's event processing loop.

run_for

Run the io_context object's event processing loop for a specified duration.

run_one

Run the io_context object's event processing loop to execute at most one handler.

(Deprecated: Use non-error_code overlaod.) Run the io_context object's event processing loop to execute at most one handler.

run_one_for

Run the io_context object's event processing loop for a specified duration to execute at most one handler.

run_one_until

Run the io_context object's event processing loop until a specified time to execute at most one handler.

run_until

Run the io_context object's event processing loop until a specified time.

stop

Stop the io_context object's event processing loop.

stopped

Determine whether the io_context object has been stopped.

wrap

(Deprecated: Use asio::bind_executor().) Create a new handler that automatically dispatches the wrapped handler on the io_context.

~io_context

Destructor.

Protected Member Functions

Name

Description

destroy

Destroys all services in the context.

shutdown

Shuts down all services in the context.

Friends

Name

Description

add_service

(Deprecated: Use make_service().) Add a service object to the execution_context.

has_service

Determine if an execution_context contains a specified service type.

make_service

Creates a service object and adds it to the execution_context.

use_service



Obtain the service object corresponding to the given type.

The io_context class provides the core I/O functionality for users of the asynchronous I/O objects, including:

  • asio::ip::tcp::socket
  • asio::ip::tcp::acceptor
  • asio::ip::udp::socket
  • deadline_timer.

The io_context class also includes facilities intended for developers of custom asynchronous services.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe, with the specific exceptions of the restart() and notify_fork() functions. Calling restart() while there are unfinished run(), run_one(), run_for(), run_until(), poll() or poll_one() calls results in undefined behaviour. The notify_fork() function should not be called while any io_context function, or any function on an I/O object that is associated with the io_context, is being called in another thread.

Synchronous and asynchronous operations

Synchronous operations on I/O objects implicitly run the io_context object for an individual operation. The io_context functions run(), run_one(), run_for(), run_until(), poll() or poll_one() must be called for the io_context to perform asynchronous operations on behalf of a C++ program. Notification that an asynchronous operation has completed is delivered by invocation of the associated handler. Handlers are invoked only by a thread that is currently calling any overload of run(), run_one(), run_for(), run_until(), poll() or poll_one() for the io_context.

Effect of exceptions thrown from handlers

If an exception is thrown from a handler, the exception is allowed to propagate through the throwing thread's invocation of run(), run_one(), run_for(), run_until(), poll() or poll_one(). No other threads that are calling any of these functions are affected. It is then the responsibility of the application to catch the exception.

After the exception has been caught, the run(), run_one(), run_for(), run_until(), poll() or poll_one() call may be restarted without the need for an intervening call to restart(). This allows the thread to rejoin the io_context object's thread pool without impacting any other threads in the pool.

For example:

asio::io_context io_context;
...
for (;;)
{
  try
  {
    io_context.run();
    break; // run() exited normally
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
}
Submitting arbitrary tasks to the io_context

To submit functions to the io_context, use the dispatch , post or defer free functions.

For example:

void my_task()
{
  ...
}

...

asio::io_context io_context;

// Submit a function to the io_context.
asio::post(io_context, my_task);

// Submit a lambda object to the io_context.
asio::post(io_context,
    []()
    {
      ...
    });

// Run the io_context until it runs out of work.
io_context.run();
Stopping the io_context from running out of work

Some applications may need to prevent an io_context object's run() call from returning when there is no more work to do. For example, the io_context may be being run in a background thread that is launched prior to the application's asynchronous operations. The run() call may be kept running by creating an object of type asio::executor_work_guard<io_context::executor_type>:

asio::io_context io_context;
asio::executor_work_guard<asio::io_context::executor_type>
  = asio::make_work_guard(io_context);
...

To effect a shutdown, the application will then need to call the io_context object's stop() member function. This will cause the io_context run() call to return as soon as possible, abandoning unfinished operations and without permitting ready handlers to be dispatched.

Alternatively, if the application requires that all operations and handlers be allowed to finish normally, the work object may be explicitly reset.

asio::io_context io_context;
asio::executor_work_guard<asio::io_context::executor_type>
  = asio::make_work_guard(io_context);
...
work.reset(); // Allow run() to exit.
Requirements

Header: asio/io_service.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address.html000066400000000000000000000311201340672067200213340ustar00rootroot00000000000000 ip::address
asio C++ library

PrevUpHomeNext

Implements version-independent IP addresses.

class address
Member Functions

Name

Description

address

Default constructor.

Construct an address from an IPv4 address.

Construct an address from an IPv6 address.

Copy constructor.

from_string

(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_unspecified

Determine whether the address is unspecified.

is_v4

Get whether the address is an IP version 4 address.

is_v6

Get whether the address is an IP version 6 address.

operator=

Assign from another address.

Assign from an IPv4 address.

Assign from an IPv6 address.

to_string

Get the address as a string.

(Deprecated: Use other overload.) Get the address as a string.

to_v4

Get the address as an IP version 4 address.

to_v6

Get the address as an IP version 6 address.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

operator<<

Output an address as a string.

The ip::address class provides the ability to use either IP version 4 or version 6 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/000077500000000000000000000000001340672067200204515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address/address.html000066400000000000000000000075261340672067200227760ustar00rootroot00000000000000 ip::address::address
asio C++ library

PrevUpHomeNext

Default constructor.

address();
  » more...

Construct an address from an IPv4 address.

address(
    const asio::ip::address_v4 & ipv4_address);
  » more...

Construct an address from an IPv6 address.

address(
    const asio::ip::address_v6 & ipv6_address);
  » more...

Copy constructor.

address(
    const address & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/address/000077500000000000000000000000001340672067200220765ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address/address/overload1.html000066400000000000000000000046701340672067200246670ustar00rootroot00000000000000 ip::address::address (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

address();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/address/overload2.html000066400000000000000000000050201340672067200246560ustar00rootroot00000000000000 ip::address::address (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an address from an IPv4 address.

address(
    const asio::ip::address_v4 & ipv4_address);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/address/overload3.html000066400000000000000000000050201340672067200246570ustar00rootroot00000000000000 ip::address::address (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an address from an IPv6 address.

address(
    const asio::ip::address_v6 & ipv6_address);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/address/overload4.html000066400000000000000000000047431340672067200246730ustar00rootroot00000000000000 ip::address::address (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

address(
    const address & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/from_string.html000066400000000000000000000077621340672067200237040ustar00rootroot00000000000000 ip::address::from_string
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

static address from_string(
    const char * str);
  » more...

static address from_string(
    const char * str,
    asio::error_code & ec);
  » more...

static address from_string(
    const std::string & str);
  » more...

static address from_string(
    const std::string & str,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/from_string/000077500000000000000000000000001340672067200230025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address/from_string/overload1.html000066400000000000000000000053241340672067200255700ustar00rootroot00000000000000 ip::address::from_string (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

static address from_string(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/from_string/overload2.html000066400000000000000000000053671340672067200256000ustar00rootroot00000000000000 ip::address::from_string (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

static address from_string(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/from_string/overload3.html000066400000000000000000000053431340672067200255730ustar00rootroot00000000000000 ip::address::from_string (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

static address from_string(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/from_string/overload4.html000066400000000000000000000053761340672067200256020ustar00rootroot00000000000000 ip::address::from_string (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address().) Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

static address from_string(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/is_loopback.html000066400000000000000000000050121340672067200236220ustar00rootroot00000000000000 ip::address::is_loopback
asio C++ library

PrevUpHomeNext

Determine whether the address is a loopback address.

bool is_loopback() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/is_multicast.html000066400000000000000000000047511340672067200240460ustar00rootroot00000000000000 ip::address::is_multicast
asio C++ library

PrevUpHomeNext

Determine whether the address is a multicast address.

bool is_multicast() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/is_unspecified.html000066400000000000000000000047171340672067200243410ustar00rootroot00000000000000 ip::address::is_unspecified
asio C++ library

PrevUpHomeNext

Determine whether the address is unspecified.

bool is_unspecified() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/is_v4.html000066400000000000000000000046361340672067200223740ustar00rootroot00000000000000 ip::address::is_v4
asio C++ library

PrevUpHomeNext

Get whether the address is an IP version 4 address.

bool is_v4() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/is_v6.html000066400000000000000000000046261340672067200223750ustar00rootroot00000000000000 ip::address::is_v6
asio C++ library

PrevUpHomeNext

Get whether the address is an IP version 6 address.

bool is_v6() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address.html000066400000000000000000000110161340672067200237600ustar00rootroot00000000000000 ip::address::make_address
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    const char * str);
  » more...

address make_address(
    const char * str,
    asio::error_code & ec);
  » more...

address make_address(
    const std::string & str);
  » more...

address make_address(
    const std::string & str,
    asio::error_code & ec);
  » more...

address make_address(
    string_view str);
  » more...

address make_address(
    string_view str,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address/000077500000000000000000000000001340672067200230735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address/make_address/overload1.html000066400000000000000000000052111340672067200256540ustar00rootroot00000000000000 ip::address::make_address (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address/overload2.html000066400000000000000000000052511340672067200256610ustar00rootroot00000000000000 ip::address::make_address (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address/overload3.html000066400000000000000000000052251340672067200256630ustar00rootroot00000000000000 ip::address::make_address (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address/overload4.html000066400000000000000000000052641340672067200256670ustar00rootroot00000000000000 ip::address::make_address (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address/overload5.html000066400000000000000000000052111340672067200256600ustar00rootroot00000000000000 ip::address::make_address (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    string_view str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/make_address/overload6.html000066400000000000000000000052641340672067200256710ustar00rootroot00000000000000 ip::address::make_address (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an address from an IPv4 address string in dotted decimal form, or from an IPv6 address in hexadecimal notation.

address make_address(
    string_view str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_eq_.html000066400000000000000000000072121340672067200240200ustar00rootroot00000000000000 ip::address::operator=
asio C++ library

PrevUpHomeNext

Assign from another address.

address & operator=(
    const address & other);
  » more...

Assign from an IPv4 address.

address & operator=(
    const asio::ip::address_v4 & ipv4_address);
  » more...

Assign from an IPv6 address.

address & operator=(
    const asio::ip::address_v6 & ipv6_address);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_eq_/000077500000000000000000000000001340672067200231305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address/operator_eq_/overload1.html000066400000000000000000000050351340672067200257150ustar00rootroot00000000000000 ip::address::operator= (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Assign from another address.

address & operator=(
    const address & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_eq_/overload2.html000066400000000000000000000050621340672067200257160ustar00rootroot00000000000000 ip::address::operator= (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Assign from an IPv4 address.

address & operator=(
    const asio::ip::address_v4 & ipv4_address);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_eq_/overload3.html000066400000000000000000000050761340672067200257240ustar00rootroot00000000000000 ip::address::operator= (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Assign from an IPv6 address.

address & operator=(
    const asio::ip::address_v6 & ipv6_address);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_eq__eq_.html000066400000000000000000000061321340672067200246440ustar00rootroot00000000000000 ip::address::operator==
asio C++ library

PrevUpHomeNext

Compare two addresses for equality.

friend bool operator==(
    const address & a1,
    const address & a2);
Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_gt_.html000066400000000000000000000060531340672067200240270ustar00rootroot00000000000000 ip::address::operator>
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator>(
    const address & a1,
    const address & a2);
Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_gt__eq_.html000066400000000000000000000060501340672067200246500ustar00rootroot00000000000000 ip::address::operator>=
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator>=(
    const address & a1,
    const address & a2);
Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_lt_.html000066400000000000000000000060611340672067200240330ustar00rootroot00000000000000 ip::address::operator<
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator<(
    const address & a1,
    const address & a2);
Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_lt__eq_.html000066400000000000000000000061011340672067200246520ustar00rootroot00000000000000 ip::address::operator<=
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator<=(
    const address & a1,
    const address & a2);
Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_lt__lt_.html000066400000000000000000000073121340672067200246710ustar00rootroot00000000000000 ip::address::operator<<
asio C++ library

PrevUpHomeNext

Output an address as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const address & addr);

Used to output a human-readable string for a specified address.

Parameters

os

The output stream to which the string will be written.

addr

The address to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/operator_not__eq_.html000066400000000000000000000061461340672067200250440ustar00rootroot00000000000000 ip::address::operator!=
asio C++ library

PrevUpHomeNext

Compare two addresses for inequality.

friend bool operator!=(
    const address & a1,
    const address & a2);
Requirements

Header: asio/ip/address.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/to_string.html000066400000000000000000000062621340672067200233550ustar00rootroot00000000000000 ip::address::to_string
asio C++ library

PrevUpHomeNext

Get the address as a string.

std::string to_string() const;
  » more...

(Deprecated: Use other overload.) Get the address as a string.

std::string to_string(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/to_string/000077500000000000000000000000001340672067200224615ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address/to_string/overload1.html000066400000000000000000000047561340672067200252570ustar00rootroot00000000000000 ip::address::to_string (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the address as a string.

std::string to_string() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/to_string/overload2.html000066400000000000000000000050361340672067200252500ustar00rootroot00000000000000 ip::address::to_string (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use other overload.) Get the address as a string.

std::string to_string(
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/to_v4.html000066400000000000000000000047031340672067200223760ustar00rootroot00000000000000 ip::address::to_v4
asio C++ library

PrevUpHomeNext

Get the address as an IP version 4 address.

asio::ip::address_v4 to_v4() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address/to_v6.html000066400000000000000000000046421340672067200224020ustar00rootroot00000000000000 ip::address::to_v6
asio C++ library

PrevUpHomeNext

Get the address as an IP version 6 address.

asio::ip::address_v6 to_v6() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4.html000066400000000000000000000431751340672067200217620ustar00rootroot00000000000000 ip::address_v4
asio C++ library

PrevUpHomeNext

Implements IP version 4 style addresses.

class address_v4
Types

Name

Description

bytes_type

The type used to represent an address as an array of bytes.

uint_type

The type used to represent an address as an unsigned integer.

Member Functions

Name

Description

address_v4

Default constructor.

Construct an address from raw bytes.

Construct an address from an unsigned integer in host byte order.

Copy constructor.

any

Obtain an address object that represents any address.

broadcast

Obtain an address object that represents the broadcast address.

(Deprecated: Use network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask.

from_string

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

is_class_a

(Deprecated: Use network_v4 class.) Determine whether the address is a class A address.

is_class_b

(Deprecated: Use network_v4 class.) Determine whether the address is a class B address.

is_class_c

(Deprecated: Use network_v4 class.) Determine whether the address is a class C address.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_unspecified

Determine whether the address is unspecified.

loopback

Obtain an address object that represents the loopback address.

netmask

(Deprecated: Use network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class.

operator=

Assign from another address.

to_bytes

Get the address in bytes, in network byte order.

to_string

Get the address as a string in dotted decimal format.

(Deprecated: Use other overload.) Get the address as a string in dotted decimal format.

to_uint

Get the address as an unsigned integer in host byte order.

to_ulong

Get the address as an unsigned long in host byte order.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address_v4

Create an IPv4 address from raw bytes in network order.

Create an IPv4 address from an unsigned integer in host byte order.

Create an IPv4 address from an IP address string in dotted decimal form.

Create an IPv4 address from a IPv4-mapped IPv6 address.

make_network_v4

Create an IPv4 network from an address and prefix length.

Create an IPv4 network from an address and netmask.

operator<<

Output an address as a string.

Output a network as a string.

The ip::address_v4 class provides the ability to use and manipulate IP version 4 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/000077500000000000000000000000001340672067200210625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/address_v4.html000066400000000000000000000077621340672067200240220ustar00rootroot00000000000000 ip::address_v4::address_v4
asio C++ library

PrevUpHomeNext

Default constructor.

address_v4();
  » more...

Construct an address from raw bytes.

explicit address_v4(
    const bytes_type & bytes);
  » more...

Construct an address from an unsigned integer in host byte order.

explicit address_v4(
    uint_type addr);
  » more...

Copy constructor.

address_v4(
    const address_v4 & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/address_v4/000077500000000000000000000000001340672067200231205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/address_v4/overload1.html000066400000000000000000000047671340672067200257200ustar00rootroot00000000000000 ip::address_v4::address_v4 (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

address_v4();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/address_v4/overload2.html000066400000000000000000000050571340672067200257120ustar00rootroot00000000000000 ip::address_v4::address_v4 (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an address from raw bytes.

address_v4(
    const bytes_type & bytes);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/address_v4/overload3.html000066400000000000000000000050761340672067200257140ustar00rootroot00000000000000 ip::address_v4::address_v4 (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an address from an unsigned integer in host byte order.

address_v4(
    uint_type addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/address_v4/overload4.html000066400000000000000000000047711340672067200257160ustar00rootroot00000000000000 ip::address_v4::address_v4 (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

address_v4(
    const address_v4 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/any.html000066400000000000000000000047531340672067200225500ustar00rootroot00000000000000 ip::address_v4::any
asio C++ library

PrevUpHomeNext

Obtain an address object that represents any address.

static address_v4 any();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/broadcast.html000066400000000000000000000067241340672067200237230ustar00rootroot00000000000000 ip::address_v4::broadcast
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the broadcast address.

static address_v4 broadcast();
  » more...

(Deprecated: Use ip::network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask.

static address_v4 broadcast(
    const address_v4 & addr,
    const address_v4 & mask);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/broadcast/000077500000000000000000000000001340672067200230245ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/broadcast/overload1.html000066400000000000000000000050461340672067200256130ustar00rootroot00000000000000 ip::address_v4::broadcast (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the broadcast address.

static address_v4 broadcast();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/broadcast/overload2.html000066400000000000000000000055211340672067200256120ustar00rootroot00000000000000 ip::address_v4::broadcast (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use ip::network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask.

static address_v4 broadcast(
    const address_v4 & addr,
    const address_v4 & mask);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/bytes_type.html000066400000000000000000000070651340672067200241470ustar00rootroot00000000000000 ip::address_v4::bytes_type
asio C++ library

PrevUpHomeNext

The type used to represent an address as an array of bytes.

typedef array< unsigned char, 4 > bytes_type;
Remarks

This type is defined in terms of the C++0x template std::array when it is available. Otherwise, it uses boost:array.

Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/from_string.html000066400000000000000000000077421340672067200243130ustar00rootroot00000000000000 ip::address_v4::from_string
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

static address_v4 from_string(
    const char * str);
  » more...

static address_v4 from_string(
    const char * str,
    asio::error_code & ec);
  » more...

static address_v4 from_string(
    const std::string & str);
  » more...

static address_v4 from_string(
    const std::string & str,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/from_string/000077500000000000000000000000001340672067200234135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/from_string/overload1.html000066400000000000000000000052601340672067200262000ustar00rootroot00000000000000 ip::address_v4::from_string (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

static address_v4 from_string(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/from_string/overload2.html000066400000000000000000000053231340672067200262010ustar00rootroot00000000000000 ip::address_v4::from_string (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

static address_v4 from_string(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/from_string/overload3.html000066400000000000000000000052771340672067200262120ustar00rootroot00000000000000 ip::address_v4::from_string (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

static address_v4 from_string(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/from_string/overload4.html000066400000000000000000000053261340672067200262060ustar00rootroot00000000000000 ip::address_v4::from_string (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

static address_v4 from_string(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/is_class_a.html000066400000000000000000000052721340672067200240560ustar00rootroot00000000000000 ip::address_v4::is_class_a
asio C++ library

PrevUpHomeNext

(Deprecated: Use ip::network_v4 class.) Determine whether the address is a class A address.

bool is_class_a() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/is_class_b.html000066400000000000000000000052051340672067200240530ustar00rootroot00000000000000 ip::address_v4::is_class_b
asio C++ library

PrevUpHomeNext

(Deprecated: Use ip::network_v4 class.) Determine whether the address is a class B address.

bool is_class_b() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/is_class_c.html000066400000000000000000000052111340672067200240510ustar00rootroot00000000000000 ip::address_v4::is_class_c
asio C++ library

PrevUpHomeNext

(Deprecated: Use ip::network_v4 class.) Determine whether the address is a class C address.

bool is_class_c() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/is_loopback.html000066400000000000000000000047661340672067200242520ustar00rootroot00000000000000 ip::address_v4::is_loopback
asio C++ library

PrevUpHomeNext

Determine whether the address is a loopback address.

bool is_loopback() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/is_multicast.html000066400000000000000000000050121340672067200244460ustar00rootroot00000000000000 ip::address_v4::is_multicast
asio C++ library

PrevUpHomeNext

Determine whether the address is a multicast address.

bool is_multicast() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/is_unspecified.html000066400000000000000000000047741340672067200247550ustar00rootroot00000000000000 ip::address_v4::is_unspecified
asio C++ library

PrevUpHomeNext

Determine whether the address is unspecified.

bool is_unspecified() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/loopback.html000066400000000000000000000050161340672067200235440ustar00rootroot00000000000000 ip::address_v4::loopback
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the loopback address.

static address_v4 loopback();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4.html000066400000000000000000000141401340672067200250030ustar00rootroot00000000000000 ip::address_v4::make_address_v4
asio C++ library

PrevUpHomeNext

Create an IPv4 address from raw bytes in network order.

address_v4 make_address_v4(
    const address_v4::bytes_type & bytes);
  » more...

Create an IPv4 address from an unsigned integer in host byte order.

address_v4 make_address_v4(
    address_v4::uint_type addr);
  » more...

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    const char * str);
  » more...

address_v4 make_address_v4(
    const char * str,
    asio::error_code & ec);
  » more...

address_v4 make_address_v4(
    const std::string & str);
  » more...

address_v4 make_address_v4(
    const std::string & str,
    asio::error_code & ec);
  » more...

address_v4 make_address_v4(
    string_view str);
  » more...

address_v4 make_address_v4(
    string_view str,
    asio::error_code & ec);
  » more...

Create an IPv4 address from a IPv4-mapped IPv6 address.

address_v4 make_address_v4(
    v4_mapped_t ,
    const address_v6 & v6_addr);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/000077500000000000000000000000001340672067200241155ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload1.html000066400000000000000000000052301340672067200266770ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (1 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from raw bytes in network order.

address_v4 make_address_v4(
    const address_v4::bytes_type & bytes);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload2.html000066400000000000000000000052161340672067200267040ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (2 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an unsigned integer in host byte order.

address_v4 make_address_v4(
    address_v4::uint_type addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload3.html000066400000000000000000000052111340672067200267000ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (3 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload4.html000066400000000000000000000052501340672067200267040ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (4 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload5.html000066400000000000000000000052241340672067200267060ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (5 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload6.html000066400000000000000000000052631340672067200267120ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (6 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload7.html000066400000000000000000000052101340672067200267030ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (7 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    string_view str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload8.html000066400000000000000000000052471340672067200267160ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (8 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from an IP address string in dotted decimal form.

address_v4 make_address_v4(
    string_view str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_address_v4/overload9.html000066400000000000000000000052401340672067200267100ustar00rootroot00000000000000 ip::address_v4::make_address_v4 (9 of 9 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 address from a IPv4-mapped IPv6 address.

address_v4 make_address_v4(
    v4_mapped_t ,
    const address_v6 & v6_addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_network_v4.html000066400000000000000000000067551340672067200250640ustar00rootroot00000000000000 ip::address_v4::make_network_v4
asio C++ library

PrevUpHomeNext

Create an IPv4 network from an address and prefix length.

network_v4 make_network_v4(
    const address_v4 & addr,
    unsigned short prefix_len);
  » more...

Create an IPv4 network from an address and netmask.

network_v4 make_network_v4(
    const address_v4 & addr,
    const address_v4 & mask);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_network_v4/000077500000000000000000000000001340672067200241615ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/make_network_v4/overload1.html000066400000000000000000000052541340672067200267510ustar00rootroot00000000000000 ip::address_v4::make_network_v4 (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from an address and prefix length.

network_v4 make_network_v4(
    const address_v4 & addr,
    unsigned short prefix_len);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/make_network_v4/overload2.html000066400000000000000000000052101340672067200267420ustar00rootroot00000000000000 ip::address_v4::make_network_v4 (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from an address and netmask.

network_v4 make_network_v4(
    const address_v4 & addr,
    const address_v4 & mask);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/netmask.html000066400000000000000000000054271340672067200234220ustar00rootroot00000000000000 ip::address_v4::netmask
asio C++ library

PrevUpHomeNext

(Deprecated: Use ip::network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class.

static address_v4 netmask(
    const address_v4 & addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_eq_.html000066400000000000000000000050371340672067200244340ustar00rootroot00000000000000 ip::address_v4::operator=
asio C++ library

PrevUpHomeNext

Assign from another address.

address_v4 & operator=(
    const address_v4 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_eq__eq_.html000066400000000000000000000061341340672067200252570ustar00rootroot00000000000000 ip::address_v4::operator==
asio C++ library

PrevUpHomeNext

Compare two addresses for equality.

friend bool operator==(
    const address_v4 & a1,
    const address_v4 & a2);
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_gt_.html000066400000000000000000000061361340672067200244420ustar00rootroot00000000000000 ip::address_v4::operator>
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator>(
    const address_v4 & a1,
    const address_v4 & a2);
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_gt__eq_.html000066400000000000000000000061271340672067200252660ustar00rootroot00000000000000 ip::address_v4::operator>=
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator>=(
    const address_v4 & a1,
    const address_v4 & a2);
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_lt_.html000066400000000000000000000061441340672067200244460ustar00rootroot00000000000000 ip::address_v4::operator<
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator<(
    const address_v4 & a1,
    const address_v4 & a2);
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_lt__eq_.html000066400000000000000000000062451340672067200252740ustar00rootroot00000000000000 ip::address_v4::operator<=
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator<=(
    const address_v4 & a1,
    const address_v4 & a2);
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_lt__lt_.html000066400000000000000000000071701340672067200253040ustar00rootroot00000000000000 ip::address_v4::operator<<
asio C++ library

PrevUpHomeNext

Output an address as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const address_v4 & addr);
  » more...

Output a network as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const network_v4 & net);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_lt__lt_/000077500000000000000000000000001340672067200244115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/operator_lt__lt_/overload1.html000066400000000000000000000076201340672067200272000ustar00rootroot00000000000000 ip::address_v4::operator<< (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Output an address as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const address_v4 & addr);

Used to output a human-readable string for a specified address.

Parameters

os

The output stream to which the string will be written.

addr

The address to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_lt__lt_/overload2.html000066400000000000000000000076121340672067200272020ustar00rootroot00000000000000 ip::address_v4::operator<< (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Output a network as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const network_v4 & net);

Used to output a human-readable string for a specified network.

Parameters

os

The output stream to which the string will be written.

net

The network to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/operator_not__eq_.html000066400000000000000000000061241340672067200254510ustar00rootroot00000000000000 ip::address_v4::operator!=
asio C++ library

PrevUpHomeNext

Compare two addresses for inequality.

friend bool operator!=(
    const address_v4 & a1,
    const address_v4 & a2);
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/to_bytes.html000066400000000000000000000047541340672067200236120ustar00rootroot00000000000000 ip::address_v4::to_bytes
asio C++ library

PrevUpHomeNext

Get the address in bytes, in network byte order.

bytes_type to_bytes() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/to_string.html000066400000000000000000000063761340672067200237740ustar00rootroot00000000000000 ip::address_v4::to_string
asio C++ library

PrevUpHomeNext

Get the address as a string in dotted decimal format.

std::string to_string() const;
  » more...

(Deprecated: Use other overload.) Get the address as a string in dotted decimal format.

std::string to_string(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/to_string/000077500000000000000000000000001340672067200230725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v4/to_string/overload1.html000066400000000000000000000050341340672067200256560ustar00rootroot00000000000000 ip::address_v4::to_string (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the address as a string in dotted decimal format.

std::string to_string() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/to_string/overload2.html000066400000000000000000000051401340672067200256550ustar00rootroot00000000000000 ip::address_v4::to_string (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use other overload.) Get the address as a string in dotted decimal format.

std::string to_string(
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/to_uint.html000066400000000000000000000050021340672067200234260ustar00rootroot00000000000000 ip::address_v4::to_uint
asio C++ library

PrevUpHomeNext

Get the address as an unsigned integer in host byte order.

uint_type to_uint() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/to_ulong.html000066400000000000000000000047251340672067200236060ustar00rootroot00000000000000 ip::address_v4::to_ulong
asio C++ library

PrevUpHomeNext

Get the address as an unsigned long in host byte order.

unsigned long to_ulong() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4/uint_type.html000066400000000000000000000060451340672067200237750ustar00rootroot00000000000000 ip::address_v4::uint_type
asio C++ library

PrevUpHomeNext

The type used to represent an address as an unsigned integer.

typedef uint_least32_t uint_type;
Requirements

Header: asio/ip/address_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4_iterator.html000066400000000000000000000264331340672067200236710ustar00rootroot00000000000000 ip::address_v4_iterator
asio C++ library

PrevUpHomeNext

An input iterator that can be used for traversing IPv4 addresses.

typedef basic_address_iterator< address_v4 > address_v4_iterator;
Types

Name

Description

difference_type

Distance between two iterators.

iterator_category

Denotes that the iterator satisfies the input iterator requirements.

pointer

The type of a pointer to an element pointed to by the iterator.

reference

The type of a reference to an element pointed to by the iterator.

value_type

The type of the elements pointed to by the iterator.

Member Functions

Name

Description

basic_address_iterator

Construct an iterator that points to the specified address.

Copy constructor.

operator *

Dereference the iterator.

operator++

Pre-increment operator.

Post-increment operator.

operator--

Pre-decrement operator.

Post-decrement operator.

operator->

Dereference the iterator.

operator=

Assignment operator.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator==

Compare two addresses for equality.

In addition to satisfying the input iterator requirements, this iterator also supports decrement.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v4_range.html000066400000000000000000000201001340672067200231150ustar00rootroot00000000000000 ip::address_v4_range
asio C++ library

PrevUpHomeNext

Represents a range of IPv4 addresses.

typedef basic_address_range< address_v4 > address_v4_range;
Types

Name

Description

iterator

The type of an iterator that points into the range.

Member Functions

Name

Description

basic_address_range

Construct an empty range.

Construct an range that represents the given range of addresses.

Copy constructor.

begin

Obtain an iterator that points to the start of the range.

empty

Determine whether the range is empty.

end

Obtain an iterator that points to the end of the range.

find

Find an address in the range.

operator=

Assignment operator.

size

Return the size of the range.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_range.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6.html000066400000000000000000000460401340672067200217560ustar00rootroot00000000000000 ip::address_v6
asio C++ library

PrevUpHomeNext

Implements IP version 6 style addresses.

class address_v6
Types

Name

Description

bytes_type

The type used to represent an address as an array of bytes.

Member Functions

Name

Description

address_v6

Default constructor.

Construct an address from raw bytes and scope ID.

Copy constructor.

any

Obtain an address object that represents any address.

from_string

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

is_link_local

Determine whether the address is link local.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_multicast_global

Determine whether the address is a global multicast address.

is_multicast_link_local

Determine whether the address is a link-local multicast address.

is_multicast_node_local

Determine whether the address is a node-local multicast address.

is_multicast_org_local

Determine whether the address is a org-local multicast address.

is_multicast_site_local

Determine whether the address is a site-local multicast address.

is_site_local

Determine whether the address is site local.

is_unspecified

Determine whether the address is unspecified.

is_v4_compatible

(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address.

is_v4_mapped

Determine whether the address is a mapped IPv4 address.

loopback

Obtain an address object that represents the loopback address.

operator=

Assign from another address.

scope_id

The scope ID of the address.

to_bytes

Get the address in bytes, in network byte order.

to_string

Get the address as a string.

(Deprecated: Use other overload.) Get the address as a string.

to_v4

(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address.

v4_compatible

(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address.

v4_mapped

(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address_v6

Create an IPv6 address from raw bytes and scope ID.

Create an IPv6 address from an IP address string.

Createan IPv6 address from an IP address string.

Create an IPv4-mapped IPv6 address from an IPv4 address.

make_network_v6

Create an IPv6 network from an address and prefix length.

operator<<

Output an address as a string.

Output a network as a string.

The ip::address_v6 class provides the ability to use and manipulate IP version 6 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/000077500000000000000000000000001340672067200210645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/address_v6.html000066400000000000000000000071471340672067200240230ustar00rootroot00000000000000 ip::address_v6::address_v6
asio C++ library

PrevUpHomeNext

Default constructor.

address_v6();
  » more...

Construct an address from raw bytes and scope ID.

explicit address_v6(
    const bytes_type & bytes,
    unsigned long scope_id = 0);
  » more...

Copy constructor.

address_v6(
    const address_v6 & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/address_v6/000077500000000000000000000000001340672067200231245ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/address_v6/overload1.html000066400000000000000000000047671340672067200257240ustar00rootroot00000000000000 ip::address_v6::address_v6 (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

address_v6();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/address_v6/overload2.html000066400000000000000000000051341340672067200257120ustar00rootroot00000000000000 ip::address_v6::address_v6 (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an address from raw bytes and scope ID.

address_v6(
    const bytes_type & bytes,
    unsigned long scope_id = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/address_v6/overload3.html000066400000000000000000000047711340672067200257210ustar00rootroot00000000000000 ip::address_v6::address_v6 (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

address_v6(
    const address_v6 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/any.html000066400000000000000000000047571340672067200225560ustar00rootroot00000000000000 ip::address_v6::any
asio C++ library

PrevUpHomeNext

Obtain an address object that represents any address.

static address_v6 any();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/bytes_type.html000066400000000000000000000067551340672067200241560ustar00rootroot00000000000000 ip::address_v6::bytes_type
asio C++ library

PrevUpHomeNext

The type used to represent an address as an array of bytes.

typedef array< unsigned char, 16 > bytes_type;
Remarks

This type is defined in terms of the C++0x template std::array when it is available. Otherwise, it uses boost:array.

Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/from_string.html000066400000000000000000000077201340672067200243110ustar00rootroot00000000000000 ip::address_v6::from_string
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

static address_v6 from_string(
    const char * str);
  » more...

static address_v6 from_string(
    const char * str,
    asio::error_code & ec);
  » more...

static address_v6 from_string(
    const std::string & str);
  » more...

static address_v6 from_string(
    const std::string & str,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/from_string/000077500000000000000000000000001340672067200234155ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/from_string/overload1.html000066400000000000000000000052361340672067200262050ustar00rootroot00000000000000 ip::address_v6::from_string (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

static address_v6 from_string(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/from_string/overload2.html000066400000000000000000000053011340672067200261770ustar00rootroot00000000000000 ip::address_v6::from_string (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

static address_v6 from_string(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/from_string/overload3.html000066400000000000000000000052551340672067200262100ustar00rootroot00000000000000 ip::address_v6::from_string (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

static address_v6 from_string(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/from_string/overload4.html000066400000000000000000000053201340672067200262020ustar00rootroot00000000000000 ip::address_v6::from_string (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

static address_v6 from_string(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_link_local.html000066400000000000000000000050551340672067200245610ustar00rootroot00000000000000 ip::address_v6::is_link_local
asio C++ library

PrevUpHomeNext

Determine whether the address is link local.

bool is_link_local() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_loopback.html000066400000000000000000000050021340672067200242340ustar00rootroot00000000000000 ip::address_v6::is_loopback
asio C++ library

PrevUpHomeNext

Determine whether the address is a loopback address.

bool is_loopback() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_multicast.html000066400000000000000000000050361340672067200244560ustar00rootroot00000000000000 ip::address_v6::is_multicast
asio C++ library

PrevUpHomeNext

Determine whether the address is a multicast address.

bool is_multicast() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_multicast_global.html000066400000000000000000000051521340672067200257750ustar00rootroot00000000000000 ip::address_v6::is_multicast_global
asio C++ library

PrevUpHomeNext

Determine whether the address is a global multicast address.

bool is_multicast_global() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_multicast_link_local.html000066400000000000000000000052461340672067200266500ustar00rootroot00000000000000 ip::address_v6::is_multicast_link_local
asio C++ library

PrevUpHomeNext

Determine whether the address is a link-local multicast address.

bool is_multicast_link_local() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_multicast_node_local.html000066400000000000000000000052621340672067200266360ustar00rootroot00000000000000 ip::address_v6::is_multicast_node_local
asio C++ library

PrevUpHomeNext

Determine whether the address is a node-local multicast address.

bool is_multicast_node_local() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_multicast_org_local.html000066400000000000000000000052561340672067200265030ustar00rootroot00000000000000 ip::address_v6::is_multicast_org_local
asio C++ library

PrevUpHomeNext

Determine whether the address is a org-local multicast address.

bool is_multicast_org_local() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_multicast_site_local.html000066400000000000000000000052121340672067200266500ustar00rootroot00000000000000 ip::address_v6::is_multicast_site_local
asio C++ library

PrevUpHomeNext

Determine whether the address is a site-local multicast address.

bool is_multicast_site_local() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_site_local.html000066400000000000000000000050701340672067200245650ustar00rootroot00000000000000 ip::address_v6::is_site_local
asio C++ library

PrevUpHomeNext

Determine whether the address is site local.

bool is_site_local() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_unspecified.html000066400000000000000000000050401340672067200247420ustar00rootroot00000000000000 ip::address_v6::is_unspecified
asio C++ library

PrevUpHomeNext

Determine whether the address is unspecified.

bool is_unspecified() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_v4_compatible.html000066400000000000000000000051171340672067200252010ustar00rootroot00000000000000 ip::address_v6::is_v4_compatible
asio C++ library

PrevUpHomeNext

(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address.

bool is_v4_compatible() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/is_v4_mapped.html000066400000000000000000000050101340672067200243200ustar00rootroot00000000000000 ip::address_v6::is_v4_mapped
asio C++ library

PrevUpHomeNext

Determine whether the address is a mapped IPv4 address.

bool is_v4_mapped() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/loopback.html000066400000000000000000000050061340672067200235450ustar00rootroot00000000000000 ip::address_v6::loopback
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the loopback address.

static address_v6 loopback();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6.html000066400000000000000000000133631340672067200250150ustar00rootroot00000000000000 ip::address_v6::make_address_v6
asio C++ library

PrevUpHomeNext

Create an IPv6 address from raw bytes and scope ID.

address_v6 make_address_v6(
    const address_v6::bytes_type & bytes,
    unsigned long scope_id = 0);
  » more...

Create an IPv6 address from an IP address string.

address_v6 make_address_v6(
    const char * str);
  » more...

address_v6 make_address_v6(
    const char * str,
    asio::error_code & ec);
  » more...

Createan IPv6 address from an IP address string.

address_v6 make_address_v6(
    const std::string & str);
  » more...

address_v6 make_address_v6(
    const std::string & str,
    asio::error_code & ec);
  » more...

address_v6 make_address_v6(
    string_view str);
  » more...

address_v6 make_address_v6(
    string_view str,
    asio::error_code & ec);
  » more...

Create an IPv4-mapped IPv6 address from an IPv4 address.

address_v6 make_address_v6(
    v4_mapped_t ,
    const address_v4 & v4_addr);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/000077500000000000000000000000001340672067200241215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload1.html000066400000000000000000000052641340672067200267120ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (1 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 address from raw bytes and scope ID.

address_v6 make_address_v6(
    const address_v6::bytes_type & bytes,
    unsigned long scope_id = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload2.html000066400000000000000000000051621340672067200267100ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (2 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 address from an IP address string.

address_v6 make_address_v6(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload3.html000066400000000000000000000052211340672067200267050ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (3 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 address from an IP address string.

address_v6 make_address_v6(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload4.html000066400000000000000000000051741340672067200267150ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (4 of 8 overloads)
asio C++ library

PrevUpHomeNext

Createan IPv6 address from an IP address string.

address_v6 make_address_v6(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload5.html000066400000000000000000000052341340672067200267130ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (5 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 address from an IP address string.

address_v6 make_address_v6(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload6.html000066400000000000000000000051611340672067200267130ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (6 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 address from an IP address string.

address_v6 make_address_v6(
    string_view str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload7.html000066400000000000000000000052201340672067200267100ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (7 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 address from an IP address string.

address_v6 make_address_v6(
    string_view str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_address_v6/overload8.html000066400000000000000000000052411340672067200267140ustar00rootroot00000000000000 ip::address_v6::make_address_v6 (8 of 8 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4-mapped IPv6 address from an IPv4 address.

address_v6 make_address_v6(
    v4_mapped_t ,
    const address_v4 & v4_addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/make_network_v6.html000066400000000000000000000052501340672067200250550ustar00rootroot00000000000000 ip::address_v6::make_network_v6
asio C++ library

PrevUpHomeNext

Create an IPv6 network from an address and prefix length.

network_v6 make_network_v6(
    const address_v6 & addr,
    unsigned short prefix_len);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_eq_.html000066400000000000000000000050371340672067200244360ustar00rootroot00000000000000 ip::address_v6::operator=
asio C++ library

PrevUpHomeNext

Assign from another address.

address_v6 & operator=(
    const address_v6 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_eq__eq_.html000066400000000000000000000061341340672067200252610ustar00rootroot00000000000000 ip::address_v6::operator==
asio C++ library

PrevUpHomeNext

Compare two addresses for equality.

friend bool operator==(
    const address_v6 & a1,
    const address_v6 & a2);
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_gt_.html000066400000000000000000000061361340672067200244440ustar00rootroot00000000000000 ip::address_v6::operator>
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator>(
    const address_v6 & a1,
    const address_v6 & a2);
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_gt__eq_.html000066400000000000000000000061271340672067200252700ustar00rootroot00000000000000 ip::address_v6::operator>=
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator>=(
    const address_v6 & a1,
    const address_v6 & a2);
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_lt_.html000066400000000000000000000061441340672067200244500ustar00rootroot00000000000000 ip::address_v6::operator<
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator<(
    const address_v6 & a1,
    const address_v6 & a2);
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_lt__eq_.html000066400000000000000000000062451340672067200252760ustar00rootroot00000000000000 ip::address_v6::operator<=
asio C++ library

PrevUpHomeNext

Compare addresses for ordering.

friend bool operator<=(
    const address_v6 & a1,
    const address_v6 & a2);
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_lt__lt_.html000066400000000000000000000071701340672067200253060ustar00rootroot00000000000000 ip::address_v6::operator<<
asio C++ library

PrevUpHomeNext

Output an address as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const address_v6 & addr);
  » more...

Output a network as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const network_v6 & net);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_lt__lt_/000077500000000000000000000000001340672067200244135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/operator_lt__lt_/overload1.html000066400000000000000000000076201340672067200272020ustar00rootroot00000000000000 ip::address_v6::operator<< (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Output an address as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const address_v6 & addr);

Used to output a human-readable string for a specified address.

Parameters

os

The output stream to which the string will be written.

addr

The address to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_lt__lt_/overload2.html000066400000000000000000000076121340672067200272040ustar00rootroot00000000000000 ip::address_v6::operator<< (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Output a network as a string.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const network_v6 & net);

Used to output a human-readable string for a specified network.

Parameters

os

The output stream to which the string will be written.

net

The network to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/operator_not__eq_.html000066400000000000000000000061641340672067200254570ustar00rootroot00000000000000 ip::address_v6::operator!=
asio C++ library

PrevUpHomeNext

Compare two addresses for inequality.

friend bool operator!=(
    const address_v6 & a1,
    const address_v6 & a2);
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/scope_id.html000066400000000000000000000060731340672067200235450ustar00rootroot00000000000000 ip::address_v6::scope_id
asio C++ library

PrevUpHomeNext

The scope ID of the address.

unsigned long scope_id() const;
  » more...

void scope_id(
    unsigned long id);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/scope_id/000077500000000000000000000000001340672067200226515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/scope_id/overload1.html000066400000000000000000000051151340672067200254350ustar00rootroot00000000000000 ip::address_v6::scope_id (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

The scope ID of the address.

unsigned long scope_id() const;

Returns the scope ID associated with the IPv6 address.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/scope_id/overload2.html000066400000000000000000000051241340672067200254360ustar00rootroot00000000000000 ip::address_v6::scope_id (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

The scope ID of the address.

void scope_id(
    unsigned long id);

Modifies the scope ID associated with the IPv6 address.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/to_bytes.html000066400000000000000000000050001340672067200235750ustar00rootroot00000000000000 ip::address_v6::to_bytes
asio C++ library

PrevUpHomeNext

Get the address in bytes, in network byte order.

bytes_type to_bytes() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/to_string.html000066400000000000000000000063021340672067200237630ustar00rootroot00000000000000 ip::address_v6::to_string
asio C++ library

PrevUpHomeNext

Get the address as a string.

std::string to_string() const;
  » more...

(Deprecated: Use other overload.) Get the address as a string.

std::string to_string(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/to_string/000077500000000000000000000000001340672067200230745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__address_v6/to_string/overload1.html000066400000000000000000000050031340672067200256540ustar00rootroot00000000000000 ip::address_v6::to_string (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the address as a string.

std::string to_string() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/to_string/overload2.html000066400000000000000000000050631340672067200256630ustar00rootroot00000000000000 ip::address_v6::to_string (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use other overload.) Get the address as a string.

std::string to_string(
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/to_v4.html000066400000000000000000000051501340672067200230060ustar00rootroot00000000000000 ip::address_v6::to_v4
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address.

address_v4 to_v4() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/v4_compatible.html000066400000000000000000000050341340672067200245040ustar00rootroot00000000000000 ip::address_v6::v4_compatible
asio C++ library

PrevUpHomeNext

(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address.

static address_v6 v4_compatible(
    const address_v4 & addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6/v4_mapped.html000066400000000000000000000051701340672067200236340ustar00rootroot00000000000000 ip::address_v6::v4_mapped
asio C++ library

PrevUpHomeNext

(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address.

static address_v6 v4_mapped(
    const address_v4 & addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6_iterator.html000066400000000000000000000264331340672067200236730ustar00rootroot00000000000000 ip::address_v6_iterator
asio C++ library

PrevUpHomeNext

An input iterator that can be used for traversing IPv6 addresses.

typedef basic_address_iterator< address_v6 > address_v6_iterator;
Types

Name

Description

difference_type

Distance between two iterators.

iterator_category

Denotes that the iterator satisfies the input iterator requirements.

pointer

The type of a pointer to an element pointed to by the iterator.

reference

The type of a reference to an element pointed to by the iterator.

value_type

The type of the elements pointed to by the iterator.

Member Functions

Name

Description

basic_address_iterator

Construct an iterator that points to the specified address.

Copy constructor.

operator *

Dereference the iterator.

operator++

Pre-increment operator.

Post-increment operator.

operator--

Pre-decrement operator.

Post-decrement operator.

operator->

Dereference the iterator.

operator=

Assignment operator.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator==

Compare two addresses for equality.

In addition to satisfying the input iterator requirements, this iterator also supports decrement.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__address_v6_range.html000066400000000000000000000173141340672067200231340ustar00rootroot00000000000000 ip::address_v6_range
asio C++ library

PrevUpHomeNext

Represents a range of IPv6 addresses.

typedef basic_address_range< address_v6 > address_v6_range;
Types

Name

Description

iterator

The type of an iterator that points into the range.

Member Functions

Name

Description

basic_address_range

Construct an empty range.

Construct an range that represents the given range of addresses.

Copy constructor.

begin

Obtain an iterator that points to the start of the range.

empty

Determine whether the range is empty.

end

Obtain an iterator that points to the end of the range.

find

Find an address in the range.

operator=

Assignment operator.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_range.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__bad_address_cast.html000066400000000000000000000111661340672067200231640ustar00rootroot00000000000000 ip::bad_address_cast
asio C++ library

PrevUpHomeNext

Thrown to indicate a failed address conversion.

class bad_address_cast
Member Functions

Name

Description

bad_address_cast

Default constructor.

what

Get the message associated with the exception.

~bad_address_cast

Destructor.

Requirements

Header: asio/ip/bad_address_cast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__bad_address_cast/000077500000000000000000000000001340672067200222715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__bad_address_cast/_bad_address_cast.html000066400000000000000000000052171340672067200265700ustar00rootroot00000000000000 ip::bad_address_cast::~bad_address_cast
asio C++ library

PrevUpHomeNext

Destructor.

virtual ~bad_address_cast();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__bad_address_cast/bad_address_cast.html000066400000000000000000000050531340672067200264270ustar00rootroot00000000000000 ip::bad_address_cast::bad_address_cast
asio C++ library

PrevUpHomeNext

Default constructor.

bad_address_cast();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__bad_address_cast/what.html000066400000000000000000000050751340672067200241310ustar00rootroot00000000000000 ip::bad_address_cast::what
asio C++ library

PrevUpHomeNext

Get the message associated with the exception.

virtual const char * what() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_.html000066400000000000000000000300161340672067200303550ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >
asio C++ library

PrevUpHomeNext

An input iterator that can be used for traversing IPv4 addresses.

template<>
class basic_address_iterator< address_v4 >
Types

Name

Description

difference_type

Distance between two iterators.

iterator_category

Denotes that the iterator satisfies the input iterator requirements.

pointer

The type of a pointer to an element pointed to by the iterator.

reference

The type of a reference to an element pointed to by the iterator.

value_type

The type of the elements pointed to by the iterator.

Member Functions

Name

Description

basic_address_iterator

Construct an iterator that points to the specified address.

Copy constructor.

operator *

Dereference the iterator.

operator++

Pre-increment operator.

Post-increment operator.

operator--

Pre-decrement operator.

Post-decrement operator.

operator->

Dereference the iterator.

operator=

Assignment operator.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator==

Compare two addresses for equality.

In addition to satisfying the input iterator requirements, this iterator also supports decrement.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/000077500000000000000000000000001340672067200274675ustar00rootroot00000000000000basic_address_iterator.html000066400000000000000000000100221340672067200347700ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_ ip::basic_address_iterator< address_v4 >::basic_address_iterator
asio C++ library

PrevUpHomeNext

Construct an iterator that points to the specified address.

basic_address_iterator(
    const address_v4 & addr);
  » more...

Copy constructor.

basic_address_iterator(
    const basic_address_iterator & other);
  » more...

PrevUpHomeNext
basic_address_iterator/000077500000000000000000000000001340672067200341075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_overload1.html000066400000000000000000000057061340672067200367010ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/basic_address_iterator ip::basic_address_iterator< address_v4 >::basic_address_iterator (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct an iterator that points to the specified address.

basic_address_iterator(
    const address_v4 & addr);

PrevUpHomeNext
overload2.html000066400000000000000000000056151340672067200367010ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/basic_address_iterator ip::basic_address_iterator< address_v4 >::basic_address_iterator (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_address_iterator(
    const basic_address_iterator & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/difference_type.html000066400000000000000000000071501340672067200335130ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::difference_type
asio C++ library

PrevUpHomeNext

Distance between two iterators.

typedef std::ptrdiff_t difference_type;
Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/iterator_category.html000066400000000000000000000071221340672067200341050ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::iterator_category
asio C++ library

PrevUpHomeNext

Denotes that the iterator satisfies the input iterator requirements.

typedef std::input_iterator_tag iterator_category;
Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator__star_.html000066400000000000000000000055741340672067200335520ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::operator *
asio C++ library

PrevUpHomeNext

Dereference the iterator.

const address_v4 & operator *() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_arrow_.html000066400000000000000000000056551340672067200335740ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::operator->
asio C++ library

PrevUpHomeNext

Dereference the iterator.

const address_v4 * operator->() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_eq_.html000066400000000000000000000056121340672067200330400ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_address_iterator & operator=(
    const basic_address_iterator & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_eq__eq_.html000066400000000000000000000070451340672067200336660ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::operator==
asio C++ library

PrevUpHomeNext

Compare two addresses for equality.

friend bool operator==(
    const basic_address_iterator & a,
    const basic_address_iterator & b);
Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
operator_minus__minus_.html000066400000000000000000000075231340672067200350640ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_ ip::basic_address_iterator< address_v4 >::operator--
asio C++ library

PrevUpHomeNext

Pre-decrement operator.

basic_address_iterator & operator--();
  » more...

Post-decrement operator.

basic_address_iterator operator--(
    int );
  » more...

PrevUpHomeNext
operator_minus__minus_/000077500000000000000000000000001340672067200341675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_overload1.html000066400000000000000000000055131340672067200367550ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_minus__minus_ ip::basic_address_iterator< address_v4 >::operator-- (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Pre-decrement operator.

basic_address_iterator & operator--();

PrevUpHomeNext
overload2.html000066400000000000000000000054751340672067200367650ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_minus__minus_ ip::basic_address_iterator< address_v4 >::operator-- (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Post-decrement operator.

basic_address_iterator operator--(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_not__eq_.html000066400000000000000000000071421340672067200340570ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::operator!=
asio C++ library

PrevUpHomeNext

Compare two addresses for inequality.

friend bool operator!=(
    const basic_address_iterator & a,
    const basic_address_iterator & b);
Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
operator_plus__plus_.html000066400000000000000000000074051340672067200345430ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_ ip::basic_address_iterator< address_v4 >::operator++
asio C++ library

PrevUpHomeNext

Pre-increment operator.

basic_address_iterator & operator++();
  » more...

Post-increment operator.

basic_address_iterator operator++(
    int );
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_plus__plus_/000077500000000000000000000000001340672067200337265ustar00rootroot00000000000000overload1.html000066400000000000000000000054751340672067200364440ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_plus__plus_ ip::basic_address_iterator< address_v4 >::operator++ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Pre-increment operator.

basic_address_iterator & operator++();

PrevUpHomeNext
overload2.html000066400000000000000000000055071340672067200364410ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_plus__plus_ ip::basic_address_iterator< address_v4 >::operator++ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Post-increment operator.

basic_address_iterator operator++(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/pointer.html000066400000000000000000000067051340672067200320450ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::pointer
asio C++ library

PrevUpHomeNext

The type of a pointer to an element pointed to by the iterator.

typedef const address_v4 * pointer;
Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/reference.html000066400000000000000000000471001340672067200323150ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::reference
asio C++ library

PrevUpHomeNext

The type of a reference to an element pointed to by the iterator.

typedef const address_v4 & reference;
Types

Name

Description

bytes_type

The type used to represent an address as an array of bytes.

uint_type

The type used to represent an address as an unsigned integer.

Member Functions

Name

Description

address_v4

Default constructor.

Construct an address from raw bytes.

Construct an address from an unsigned integer in host byte order.

Copy constructor.

any

Obtain an address object that represents any address.

broadcast

Obtain an address object that represents the broadcast address.

(Deprecated: Use network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask.

from_string

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

is_class_a

(Deprecated: Use network_v4 class.) Determine whether the address is a class A address.

is_class_b

(Deprecated: Use network_v4 class.) Determine whether the address is a class B address.

is_class_c

(Deprecated: Use network_v4 class.) Determine whether the address is a class C address.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_unspecified

Determine whether the address is unspecified.

loopback

Obtain an address object that represents the loopback address.

netmask

(Deprecated: Use network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class.

operator=

Assign from another address.

to_bytes

Get the address in bytes, in network byte order.

to_string

Get the address as a string in dotted decimal format.

(Deprecated: Use other overload.) Get the address as a string in dotted decimal format.

to_uint

Get the address as an unsigned integer in host byte order.

to_ulong

Get the address as an unsigned long in host byte order.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address_v4

Create an IPv4 address from raw bytes in network order.

Create an IPv4 address from an unsigned integer in host byte order.

Create an IPv4 address from an IP address string in dotted decimal form.

Create an IPv4 address from a IPv4-mapped IPv6 address.

make_network_v4

Create an IPv4 network from an address and prefix length.

Create an IPv4 network from an address and netmask.

operator<<

Output an address as a string.

Output a network as a string.

The ip::address_v4 class provides the ability to use and manipulate IP version 4 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/value_type.html000066400000000000000000000472551340672067200325470ustar00rootroot00000000000000 ip::basic_address_iterator< address_v4 >::value_type
asio C++ library

PrevUpHomeNext

The type of the elements pointed to by the iterator.

typedef address_v4 value_type;
Types

Name

Description

bytes_type

The type used to represent an address as an array of bytes.

uint_type

The type used to represent an address as an unsigned integer.

Member Functions

Name

Description

address_v4

Default constructor.

Construct an address from raw bytes.

Construct an address from an unsigned integer in host byte order.

Copy constructor.

any

Obtain an address object that represents any address.

broadcast

Obtain an address object that represents the broadcast address.

(Deprecated: Use network_v4 class.) Obtain an address object that represents the broadcast address that corresponds to the specified address and netmask.

from_string

(Deprecated: Use make_address_v4().) Create an address from an IP address string in dotted decimal form.

is_class_a

(Deprecated: Use network_v4 class.) Determine whether the address is a class A address.

is_class_b

(Deprecated: Use network_v4 class.) Determine whether the address is a class B address.

is_class_c

(Deprecated: Use network_v4 class.) Determine whether the address is a class C address.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_unspecified

Determine whether the address is unspecified.

loopback

Obtain an address object that represents the loopback address.

netmask

(Deprecated: Use network_v4 class.) Obtain the netmask that corresponds to the address, based on its address class.

operator=

Assign from another address.

to_bytes

Get the address in bytes, in network byte order.

to_string

Get the address as a string in dotted decimal format.

(Deprecated: Use other overload.) Get the address as a string in dotted decimal format.

to_uint

Get the address as an unsigned integer in host byte order.

to_ulong

Get the address as an unsigned long in host byte order.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address_v4

Create an IPv4 address from raw bytes in network order.

Create an IPv4 address from an unsigned integer in host byte order.

Create an IPv4 address from an IP address string in dotted decimal form.

Create an IPv4 address from a IPv4-mapped IPv6 address.

make_network_v4

Create an IPv4 network from an address and prefix length.

Create an IPv4 network from an address and netmask.

operator<<

Output an address as a string.

Output a network as a string.

The ip::address_v4 class provides the ability to use and manipulate IP version 4 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_.html000066400000000000000000000301321340672067200303560ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >
asio C++ library

PrevUpHomeNext

An input iterator that can be used for traversing IPv6 addresses.

template<>
class basic_address_iterator< address_v6 >
Types

Name

Description

difference_type

Distance between two iterators.

iterator_category

Denotes that the iterator satisfies the input iterator requirements.

pointer

The type of a pointer to an element pointed to by the iterator.

reference

The type of a reference to an element pointed to by the iterator.

value_type

The type of the elements pointed to by the iterator.

Member Functions

Name

Description

basic_address_iterator

Construct an iterator that points to the specified address.

Copy constructor.

operator *

Dereference the iterator.

operator++

Pre-increment operator.

Post-increment operator.

operator--

Pre-decrement operator.

Post-decrement operator.

operator->

Dereference the iterator.

operator=

Assignment operator.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator==

Compare two addresses for equality.

In addition to satisfying the input iterator requirements, this iterator also supports decrement.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/000077500000000000000000000000001340672067200274715ustar00rootroot00000000000000basic_address_iterator.html000066400000000000000000000100221340672067200347720ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_ ip::basic_address_iterator< address_v6 >::basic_address_iterator
asio C++ library

PrevUpHomeNext

Construct an iterator that points to the specified address.

basic_address_iterator(
    const address_v6 & addr);
  » more...

Copy constructor.

basic_address_iterator(
    const basic_address_iterator & other);
  » more...

PrevUpHomeNext
basic_address_iterator/000077500000000000000000000000001340672067200341115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_overload1.html000066400000000000000000000057061340672067200367030ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/basic_address_iterator ip::basic_address_iterator< address_v6 >::basic_address_iterator (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct an iterator that points to the specified address.

basic_address_iterator(
    const address_v6 & addr);

PrevUpHomeNext
overload2.html000066400000000000000000000056151340672067200367030ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/basic_address_iterator ip::basic_address_iterator< address_v6 >::basic_address_iterator (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_address_iterator(
    const basic_address_iterator & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/difference_type.html000066400000000000000000000071501340672067200335150ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::difference_type
asio C++ library

PrevUpHomeNext

Distance between two iterators.

typedef std::ptrdiff_t difference_type;
Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/iterator_category.html000066400000000000000000000071221340672067200341070ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::iterator_category
asio C++ library

PrevUpHomeNext

Denotes that the iterator satisfies the input iterator requirements.

typedef std::input_iterator_tag iterator_category;
Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator__star_.html000066400000000000000000000055741340672067200335540ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::operator *
asio C++ library

PrevUpHomeNext

Dereference the iterator.

const address_v6 & operator *() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_arrow_.html000066400000000000000000000056551340672067200335760ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::operator->
asio C++ library

PrevUpHomeNext

Dereference the iterator.

const address_v6 * operator->() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_eq_.html000066400000000000000000000056121340672067200330420ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_address_iterator & operator=(
    const basic_address_iterator & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_eq__eq_.html000066400000000000000000000070451340672067200336700ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::operator==
asio C++ library

PrevUpHomeNext

Compare two addresses for equality.

friend bool operator==(
    const basic_address_iterator & a,
    const basic_address_iterator & b);
Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
operator_minus__minus_.html000066400000000000000000000075231340672067200350660ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_ ip::basic_address_iterator< address_v6 >::operator--
asio C++ library

PrevUpHomeNext

Pre-decrement operator.

basic_address_iterator & operator--();
  » more...

Post-decrement operator.

basic_address_iterator operator--(
    int );
  » more...

PrevUpHomeNext
operator_minus__minus_/000077500000000000000000000000001340672067200341715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_overload1.html000066400000000000000000000055131340672067200367570ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_minus__minus_ ip::basic_address_iterator< address_v6 >::operator-- (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Pre-decrement operator.

basic_address_iterator & operator--();

PrevUpHomeNext
overload2.html000066400000000000000000000054751340672067200367670ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_minus__minus_ ip::basic_address_iterator< address_v6 >::operator-- (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Post-decrement operator.

basic_address_iterator operator--(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_not__eq_.html000066400000000000000000000071421340672067200340610ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::operator!=
asio C++ library

PrevUpHomeNext

Compare two addresses for inequality.

friend bool operator!=(
    const basic_address_iterator & a,
    const basic_address_iterator & b);
Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
operator_plus__plus_.html000066400000000000000000000074051340672067200345450ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_ ip::basic_address_iterator< address_v6 >::operator++
asio C++ library

PrevUpHomeNext

Pre-increment operator.

basic_address_iterator & operator++();
  » more...

Post-increment operator.

basic_address_iterator operator++(
    int );
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_plus__plus_/000077500000000000000000000000001340672067200337305ustar00rootroot00000000000000overload1.html000066400000000000000000000054751340672067200364460ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_plus__plus_ ip::basic_address_iterator< address_v6 >::operator++ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Pre-increment operator.

basic_address_iterator & operator++();

PrevUpHomeNext
overload2.html000066400000000000000000000055071340672067200364430ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_plus__plus_ ip::basic_address_iterator< address_v6 >::operator++ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Post-increment operator.

basic_address_iterator operator++(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/pointer.html000066400000000000000000000067051340672067200320470ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::pointer
asio C++ library

PrevUpHomeNext

The type of a pointer to an element pointed to by the iterator.

typedef const address_v6 * pointer;
Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/reference.html000066400000000000000000000520431340672067200323210ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::reference
asio C++ library

PrevUpHomeNext

The type of a reference to an element pointed to by the iterator.

typedef const address_v6 & reference;
Types

Name

Description

bytes_type

The type used to represent an address as an array of bytes.

Member Functions

Name

Description

address_v6

Default constructor.

Construct an address from raw bytes and scope ID.

Copy constructor.

any

Obtain an address object that represents any address.

from_string

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

is_link_local

Determine whether the address is link local.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_multicast_global

Determine whether the address is a global multicast address.

is_multicast_link_local

Determine whether the address is a link-local multicast address.

is_multicast_node_local

Determine whether the address is a node-local multicast address.

is_multicast_org_local

Determine whether the address is a org-local multicast address.

is_multicast_site_local

Determine whether the address is a site-local multicast address.

is_site_local

Determine whether the address is site local.

is_unspecified

Determine whether the address is unspecified.

is_v4_compatible

(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address.

is_v4_mapped

Determine whether the address is a mapped IPv4 address.

loopback

Obtain an address object that represents the loopback address.

operator=

Assign from another address.

scope_id

The scope ID of the address.

to_bytes

Get the address in bytes, in network byte order.

to_string

Get the address as a string.

(Deprecated: Use other overload.) Get the address as a string.

to_v4

(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address.

v4_compatible

(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address.

v4_mapped

(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address_v6

Create an IPv6 address from raw bytes and scope ID.

Create an IPv6 address from an IP address string.

Createan IPv6 address from an IP address string.

Create an IPv4-mapped IPv6 address from an IPv4 address.

make_network_v6

Create an IPv6 network from an address and prefix length.

operator<<

Output an address as a string.

Output a network as a string.

The ip::address_v6 class provides the ability to use and manipulate IP version 6 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/value_type.html000066400000000000000000000522041340672067200325370ustar00rootroot00000000000000 ip::basic_address_iterator< address_v6 >::value_type
asio C++ library

PrevUpHomeNext

The type of the elements pointed to by the iterator.

typedef address_v6 value_type;
Types

Name

Description

bytes_type

The type used to represent an address as an array of bytes.

Member Functions

Name

Description

address_v6

Default constructor.

Construct an address from raw bytes and scope ID.

Copy constructor.

any

Obtain an address object that represents any address.

from_string

(Deprecated: Use make_address_v6().) Create an IPv6 address from an IP address string.

is_link_local

Determine whether the address is link local.

is_loopback

Determine whether the address is a loopback address.

is_multicast

Determine whether the address is a multicast address.

is_multicast_global

Determine whether the address is a global multicast address.

is_multicast_link_local

Determine whether the address is a link-local multicast address.

is_multicast_node_local

Determine whether the address is a node-local multicast address.

is_multicast_org_local

Determine whether the address is a org-local multicast address.

is_multicast_site_local

Determine whether the address is a site-local multicast address.

is_site_local

Determine whether the address is site local.

is_unspecified

Determine whether the address is unspecified.

is_v4_compatible

(Deprecated: No replacement.) Determine whether the address is an IPv4-compatible address.

is_v4_mapped

Determine whether the address is a mapped IPv4 address.

loopback

Obtain an address object that represents the loopback address.

operator=

Assign from another address.

scope_id

The scope ID of the address.

to_bytes

Get the address in bytes, in network byte order.

to_string

Get the address as a string.

(Deprecated: Use other overload.) Get the address as a string.

to_v4

(Deprecated: Use make_address_v4().) Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address.

v4_compatible

(Deprecated: No replacement.) Create an IPv4-compatible IPv6 address.

v4_mapped

(Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator<

Compare addresses for ordering.

operator<=

Compare addresses for ordering.

operator==

Compare two addresses for equality.

operator>

Compare addresses for ordering.

operator>=

Compare addresses for ordering.

Related Functions

Name

Description

make_address_v6

Create an IPv6 address from raw bytes and scope ID.

Create an IPv6 address from an IP address string.

Createan IPv6 address from an IP address string.

Create an IPv4-mapped IPv6 address from an IPv4 address.

make_network_v6

Create an IPv6 network from an address and prefix length.

operator<<

Output an address as a string.

Output a network as a string.

The ip::address_v6 class provides the ability to use and manipulate IP version 6 addresses.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_.html000066400000000000000000000214561340672067200276300ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >
asio C++ library

PrevUpHomeNext

Represents a range of IPv4 addresses.

template<>
class basic_address_range< address_v4 >
Types

Name

Description

iterator

The type of an iterator that points into the range.

Member Functions

Name

Description

basic_address_range

Construct an empty range.

Construct an range that represents the given range of addresses.

Copy constructor.

begin

Obtain an iterator that points to the start of the range.

empty

Determine whether the range is empty.

end

Obtain an iterator that points to the end of the range.

find

Find an address in the range.

operator=

Assignment operator.

size

Return the size of the range.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_range.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/000077500000000000000000000000001340672067200267325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range.html000066400000000000000000000106441340672067200335670ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::basic_address_range
asio C++ library

PrevUpHomeNext

Construct an empty range.

basic_address_range();
  » more...

Construct an range that represents the given range of addresses.

explicit basic_address_range(
    const iterator & first,
    const iterator & last);
  » more...

Copy constructor.

basic_address_range(
    const basic_address_range & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range/000077500000000000000000000000001340672067200326745ustar00rootroot00000000000000overload1.html000066400000000000000000000055051340672067200354040ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range ip::basic_address_range< address_v4 >::basic_address_range (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
overload2.html000066400000000000000000000056261340672067200354110ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range ip::basic_address_range< address_v4 >::basic_address_range (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an range that represents the given range of addresses.

basic_address_range(
    const iterator & first,
    const iterator & last);

PrevUpHomeNext
overload3.html000066400000000000000000000054571340672067200354140ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range ip::basic_address_range< address_v4 >::basic_address_range (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_address_range(
    const basic_address_range & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/begin.html000066400000000000000000000055131340672067200307100ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::begin
asio C++ library

PrevUpHomeNext

Obtain an iterator that points to the start of the range.

iterator begin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/empty.html000066400000000000000000000053021340672067200307560ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::empty
asio C++ library

PrevUpHomeNext

Determine whether the range is empty.

bool empty() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/end.html000066400000000000000000000053161340672067200303730ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::end
asio C++ library

PrevUpHomeNext

Obtain an iterator that points to the end of the range.

iterator end() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/find.html000066400000000000000000000053431340672067200305450ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::find
asio C++ library

PrevUpHomeNext

Find an address in the range.

iterator find(
    const address_v4 & addr) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/iterator.html000066400000000000000000000303441340672067200314550ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::iterator
asio C++ library

PrevUpHomeNext

The type of an iterator that points into the range.

typedef basic_address_iterator< address_v4 > iterator;
Types

Name

Description

difference_type

Distance between two iterators.

iterator_category

Denotes that the iterator satisfies the input iterator requirements.

pointer

The type of a pointer to an element pointed to by the iterator.

reference

The type of a reference to an element pointed to by the iterator.

value_type

The type of the elements pointed to by the iterator.

Member Functions

Name

Description

basic_address_iterator

Construct an iterator that points to the specified address.

Copy constructor.

operator *

Dereference the iterator.

operator++

Pre-increment operator.

Post-increment operator.

operator--

Pre-decrement operator.

Post-decrement operator.

operator->

Dereference the iterator.

operator=

Assignment operator.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator==

Compare two addresses for equality.

In addition to satisfying the input iterator requirements, this iterator also supports decrement.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v4_range.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/operator_eq_.html000066400000000000000000000054371340672067200323100ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_address_range & operator=(
    const basic_address_range & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v4__gt_/size.html000066400000000000000000000055171340672067200306020ustar00rootroot00000000000000 ip::basic_address_range< address_v4 >::size
asio C++ library

PrevUpHomeNext

Return the size of the range.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_.html000066400000000000000000000205761340672067200276340ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >
asio C++ library

PrevUpHomeNext

Represents a range of IPv6 addresses.

template<>
class basic_address_range< address_v6 >
Types

Name

Description

iterator

The type of an iterator that points into the range.

Member Functions

Name

Description

basic_address_range

Construct an empty range.

Construct an range that represents the given range of addresses.

Copy constructor.

begin

Obtain an iterator that points to the start of the range.

empty

Determine whether the range is empty.

end

Obtain an iterator that points to the end of the range.

find

Find an address in the range.

operator=

Assignment operator.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_range.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/000077500000000000000000000000001340672067200267345ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range.html000066400000000000000000000106441340672067200335710ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::basic_address_range
asio C++ library

PrevUpHomeNext

Construct an empty range.

basic_address_range();
  » more...

Construct an range that represents the given range of addresses.

explicit basic_address_range(
    const iterator & first,
    const iterator & last);
  » more...

Copy constructor.

basic_address_range(
    const basic_address_range & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range/000077500000000000000000000000001340672067200326765ustar00rootroot00000000000000overload1.html000066400000000000000000000055051340672067200354060ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range ip::basic_address_range< address_v6 >::basic_address_range (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
overload2.html000066400000000000000000000056261340672067200354130ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range ip::basic_address_range< address_v6 >::basic_address_range (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an range that represents the given range of addresses.

basic_address_range(
    const iterator & first,
    const iterator & last);

PrevUpHomeNext
overload3.html000066400000000000000000000054571340672067200354160ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range ip::basic_address_range< address_v6 >::basic_address_range (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_address_range(
    const basic_address_range & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/begin.html000066400000000000000000000055131340672067200307120ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::begin
asio C++ library

PrevUpHomeNext

Obtain an iterator that points to the start of the range.

iterator begin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/empty.html000066400000000000000000000053021340672067200307600ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::empty
asio C++ library

PrevUpHomeNext

Determine whether the range is empty.

bool empty() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/end.html000066400000000000000000000053161340672067200303750ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::end
asio C++ library

PrevUpHomeNext

Obtain an iterator that points to the end of the range.

iterator end() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/find.html000066400000000000000000000053431340672067200305470ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::find
asio C++ library

PrevUpHomeNext

Find an address in the range.

iterator find(
    const address_v6 & addr) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/iterator.html000066400000000000000000000303441340672067200314570ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::iterator
asio C++ library

PrevUpHomeNext

The type of an iterator that points into the range.

typedef basic_address_iterator< address_v6 > iterator;
Types

Name

Description

difference_type

Distance between two iterators.

iterator_category

Denotes that the iterator satisfies the input iterator requirements.

pointer

The type of a pointer to an element pointed to by the iterator.

reference

The type of a reference to an element pointed to by the iterator.

value_type

The type of the elements pointed to by the iterator.

Member Functions

Name

Description

basic_address_iterator

Construct an iterator that points to the specified address.

Copy constructor.

operator *

Dereference the iterator.

operator++

Pre-increment operator.

Post-increment operator.

operator--

Pre-decrement operator.

Post-decrement operator.

operator->

Dereference the iterator.

operator=

Assignment operator.

Friends

Name

Description

operator!=

Compare two addresses for inequality.

operator==

Compare two addresses for equality.

In addition to satisfying the input iterator requirements, this iterator also supports decrement.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/address_v6_range.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_address_range_lt__address_v6__gt_/operator_eq_.html000066400000000000000000000054631340672067200323110ustar00rootroot00000000000000 ip::basic_address_range< address_v6 >::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_address_range & operator=(
    const basic_address_range & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint.html000066400000000000000000000341221340672067200226750ustar00rootroot00000000000000 ip::basic_endpoint
asio C++ library

PrevUpHomeNext

Describes an endpoint for a version-independent IP socket.

template<
    typename InternetProtocol>
class basic_endpoint
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

address

Get the IP address associated with the endpoint.

Set the IP address associated with the endpoint.

basic_endpoint

Default constructor.

Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections.

Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint.

Copy constructor.

Move constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

Move-assign from another endpoint.

port

Get the port associated with the endpoint. The port number is always in the host's byte order.

Set the port associated with the endpoint. The port number is always in the host's byte order.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The ip::basic_endpoint class template describes an endpoint that may be associated with a particular socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/000077500000000000000000000000001340672067200220055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_endpoint/address.html000066400000000000000000000063731340672067200243310ustar00rootroot00000000000000 ip::basic_endpoint::address
asio C++ library

PrevUpHomeNext

Get the IP address associated with the endpoint.

asio::ip::address address() const;
  » more...

Set the IP address associated with the endpoint.

void address(
    const asio::ip::address & addr);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/address/000077500000000000000000000000001340672067200234325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_endpoint/address/overload1.html000066400000000000000000000050351340672067200262170ustar00rootroot00000000000000 ip::basic_endpoint::address (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the IP address associated with the endpoint.

asio::ip::address address() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/address/overload2.html000066400000000000000000000051151340672067200262170ustar00rootroot00000000000000 ip::basic_endpoint::address (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the IP address associated with the endpoint.

void address(
    const asio::ip::address & addr);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint.html000066400000000000000000000120561340672067200256600ustar00rootroot00000000000000 ip::basic_endpoint::basic_endpoint
asio C++ library

PrevUpHomeNext

Default constructor.

basic_endpoint();
  » more...

Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections.

basic_endpoint(
    const InternetProtocol & internet_protocol,
    unsigned short port_num);
  » more...

Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint.

basic_endpoint(
    const asio::ip::address & addr,
    unsigned short port_num);
  » more...

Copy constructor.

basic_endpoint(
    const basic_endpoint & other);
  » more...

Move constructor.

basic_endpoint(
    basic_endpoint && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint/000077500000000000000000000000001340672067200247665ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint/overload1.html000066400000000000000000000051131340672067200275500ustar00rootroot00000000000000 ip::basic_endpoint::basic_endpoint (1 of 5 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

basic_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint/overload2.html000066400000000000000000000070321340672067200275530ustar00rootroot00000000000000 ip::basic_endpoint::basic_endpoint (2 of 5 overloads)
asio C++ library

PrevUpHomeNext

Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections.

basic_endpoint(
    const InternetProtocol & internet_protocol,
    unsigned short port_num);
Examples

To initialise an IPv4 TCP endpoint for port 1234, use:

asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234);

To specify an IPv6 UDP endpoint for port 9876, use:

asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint/overload3.html000066400000000000000000000055121340672067200275550ustar00rootroot00000000000000 ip::basic_endpoint::basic_endpoint (3 of 5 overloads)
asio C++ library

PrevUpHomeNext

Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint.

basic_endpoint(
    const asio::ip::address & addr,
    unsigned short port_num);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint/overload4.html000066400000000000000000000051501340672067200275540ustar00rootroot00000000000000 ip::basic_endpoint::basic_endpoint (4 of 5 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_endpoint(
    const basic_endpoint & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/basic_endpoint/overload5.html000066400000000000000000000051241340672067200275560ustar00rootroot00000000000000 ip::basic_endpoint::basic_endpoint (5 of 5 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

basic_endpoint(
    basic_endpoint && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/capacity.html000066400000000000000000000050651340672067200244760ustar00rootroot00000000000000 ip::basic_endpoint::capacity
asio C++ library

PrevUpHomeNext

Get the capacity of the endpoint in the native type.

std::size_t capacity() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/data.html000066400000000000000000000060231340672067200236050ustar00rootroot00000000000000 ip::basic_endpoint::data
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

data_type * data();
  » more...

const data_type * data() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/data/000077500000000000000000000000001340672067200227165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_endpoint/data/overload1.html000066400000000000000000000047461340672067200255130ustar00rootroot00000000000000 ip::basic_endpoint::data (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

data_type * data();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/data/overload2.html000066400000000000000000000050061340672067200255020ustar00rootroot00000000000000 ip::basic_endpoint::data (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

const data_type * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/data_type.html000066400000000000000000000062571340672067200246570ustar00rootroot00000000000000 ip::basic_endpoint::data_type
asio C++ library

PrevUpHomeNext

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

typedef implementation_defined data_type;
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_eq_.html000066400000000000000000000065171340672067200253630ustar00rootroot00000000000000 ip::basic_endpoint::operator=
asio C++ library

PrevUpHomeNext

Assign from another endpoint.

basic_endpoint & operator=(
    const basic_endpoint & other);
  » more...

Move-assign from another endpoint.

basic_endpoint & operator=(
    basic_endpoint && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_eq_/000077500000000000000000000000001340672067200244645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_eq_/overload1.html000066400000000000000000000051351340672067200272520ustar00rootroot00000000000000 ip::basic_endpoint::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign from another endpoint.

basic_endpoint & operator=(
    const basic_endpoint & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_eq_/overload2.html000066400000000000000000000051561340672067200272560ustar00rootroot00000000000000 ip::basic_endpoint::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assign from another endpoint.

basic_endpoint & operator=(
    basic_endpoint && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_eq__eq_.html000066400000000000000000000064051340672067200262030ustar00rootroot00000000000000 ip::basic_endpoint::operator==
asio C++ library

PrevUpHomeNext

Compare two endpoints for equality.

friend bool operator==(
    const basic_endpoint< InternetProtocol > & e1,
    const basic_endpoint< InternetProtocol > & e2);
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_gt_.html000066400000000000000000000063261340672067200253660ustar00rootroot00000000000000 ip::basic_endpoint::operator>
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator>(
    const basic_endpoint< InternetProtocol > & e1,
    const basic_endpoint< InternetProtocol > & e2);
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_gt__eq_.html000066400000000000000000000062771340672067200262170ustar00rootroot00000000000000 ip::basic_endpoint::operator>=
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator>=(
    const basic_endpoint< InternetProtocol > & e1,
    const basic_endpoint< InternetProtocol > & e2);
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_lt_.html000066400000000000000000000063341340672067200253720ustar00rootroot00000000000000 ip::basic_endpoint::operator<
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator<(
    const basic_endpoint< InternetProtocol > & e1,
    const basic_endpoint< InternetProtocol > & e2);
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_lt__eq_.html000066400000000000000000000063541340672067200262200ustar00rootroot00000000000000 ip::basic_endpoint::operator<=
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator<=(
    const basic_endpoint< InternetProtocol > & e1,
    const basic_endpoint< InternetProtocol > & e2);
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_lt__lt_.html000066400000000000000000000074651340672067200262360ustar00rootroot00000000000000 ip::basic_endpoint::operator<<
asio C++ library

PrevUpHomeNext

Output an endpoint as a string.

std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const basic_endpoint< InternetProtocol > & endpoint);

Used to output a human-readable string for a specified endpoint.

Parameters

os

The output stream to which the string will be written.

endpoint

The endpoint to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/operator_not__eq_.html000066400000000000000000000063241340672067200263760ustar00rootroot00000000000000 ip::basic_endpoint::operator!=
asio C++ library

PrevUpHomeNext

Compare two endpoints for inequality.

friend bool operator!=(
    const basic_endpoint< InternetProtocol > & e1,
    const basic_endpoint< InternetProtocol > & e2);
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/port.html000066400000000000000000000064411340672067200236640ustar00rootroot00000000000000 ip::basic_endpoint::port
asio C++ library

PrevUpHomeNext

Get the port associated with the endpoint. The port number is always in the host's byte order.

unsigned short port() const;
  » more...

Set the port associated with the endpoint. The port number is always in the host's byte order.

void port(
    unsigned short port_num);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/port/000077500000000000000000000000001340672067200227715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_endpoint/port/overload1.html000066400000000000000000000050521340672067200255550ustar00rootroot00000000000000 ip::basic_endpoint::port (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the port associated with the endpoint. The port number is always in the host's byte order.

unsigned short port() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/port/overload2.html000066400000000000000000000051061340672067200255560ustar00rootroot00000000000000 ip::basic_endpoint::port (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the port associated with the endpoint. The port number is always in the host's byte order.

void port(
    unsigned short port_num);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/protocol.html000066400000000000000000000050511340672067200245350ustar00rootroot00000000000000 ip::basic_endpoint::protocol
asio C++ library

PrevUpHomeNext

The protocol associated with the endpoint.

protocol_type protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/protocol_type.html000066400000000000000000000061041340672067200255760ustar00rootroot00000000000000 ip::basic_endpoint::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type associated with the endpoint.

typedef InternetProtocol protocol_type;
Requirements

Header: asio/ip/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/resize.html000066400000000000000000000050051340672067200241740ustar00rootroot00000000000000 ip::basic_endpoint::resize
asio C++ library

PrevUpHomeNext

Set the underlying size of the endpoint in the native type.

void resize(
    std::size_t new_size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_endpoint/size.html000066400000000000000000000047741340672067200236610ustar00rootroot00000000000000 ip::basic_endpoint::size
asio C++ library

PrevUpHomeNext

Get the underlying size of the endpoint in the native type.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver.html000066400000000000000000000371001340672067200227150ustar00rootroot00000000000000 ip::basic_resolver
asio C++ library

PrevUpHomeNext

Provides endpoint resolution functionality.

template<
    typename InternetProtocol>
class basic_resolver :
  public ip::resolver_base
Types

Name

Description

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

flags

A bitmask type (C++ Std [lib.bitmask.types]).

iterator

(Deprecated.) The iterator type.

protocol_type

The protocol type.

query

(Deprecated.) The query type.

results_type

The results type.

Member Functions

Name

Description

async_resolve

(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform reverse resolution of an endpoint to a list of entries.

basic_resolver

Constructor.

Move-construct a basic_resolver from another.

cancel

Cancel any asynchronous operations that are waiting on the resolver.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_resolver from another.

resolve

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

Perform forward resolution of a query to a list of entries.

Perform reverse resolution of an endpoint to a list of entries.

~basic_resolver

Destroys the resolver.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

The ip::basic_resolver class template provides the ability to resolve a query to a list of endpoints.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/000077500000000000000000000000001340672067200220265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver/_basic_resolver.html000066400000000000000000000054221340672067200260600ustar00rootroot00000000000000 ip::basic_resolver::~basic_resolver
asio C++ library

PrevUpHomeNext

Destroys the resolver.

~basic_resolver();

This function destroys the resolver, cancelling any outstanding asynchronous wait operations associated with the resolver as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/address_configured.html000066400000000000000000000055721340672067200265570ustar00rootroot00000000000000 ip::basic_resolver::address_configured
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

static const flags address_configured = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/all_matching.html000066400000000000000000000053401340672067200253400ustar00rootroot00000000000000 ip::basic_resolver::all_matching
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

static const flags all_matching = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve.html000066400000000000000000000165041340672067200255760ustar00rootroot00000000000000 ip::basic_resolver::async_resolve
asio C++ library

PrevUpHomeNext

(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const query & q,
    ResolveHandler && handler);
  » more...

Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    string_view host,
    string_view service,
    ResolveHandler && handler);
  » more...

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    ResolveHandler && handler);
  » more...

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    ResolveHandler && handler);
  » more...

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    ResolveHandler && handler);
  » more...

Asynchronously perform reverse resolution of an endpoint to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const endpoint_type & e,
    ResolveHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/000077500000000000000000000000001340672067200247025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/overload1.html000066400000000000000000000113021340672067200274610ustar00rootroot00000000000000 ip::basic_resolver::async_resolve (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const query & q,
    ResolveHandler && handler);

This function is used to asynchronously resolve a query into a list of endpoint entries.

Parameters

q

A query object that determines what endpoints will be returned.

handler

The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  resolver::results_type results // Resolved endpoints as a range.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

A successful resolve operation is guaranteed to pass a non-empty range to the handler.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/overload2.html000066400000000000000000000147311340672067200274730ustar00rootroot00000000000000 ip::basic_resolver::async_resolve (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    string_view host,
    string_view service,
    ResolveHandler && handler);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

handler

The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  resolver::results_type results // Resolved endpoints as a range.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

A successful resolve operation is guaranteed to pass a non-empty range to the handler.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/overload3.html000066400000000000000000000154031340672067200274710ustar00rootroot00000000000000 ip::basic_resolver::async_resolve (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    ResolveHandler && handler);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

handler

The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  resolver::results_type results // Resolved endpoints as a range.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

A successful resolve operation is guaranteed to pass a non-empty range to the handler.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/overload4.html000066400000000000000000000153251340672067200274750ustar00rootroot00000000000000 ip::basic_resolver::async_resolve (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    ResolveHandler && handler);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

handler

The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  resolver::results_type results // Resolved endpoints as a range.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

A successful resolve operation is guaranteed to pass a non-empty range to the handler.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/overload5.html000066400000000000000000000157771340672067200275110ustar00rootroot00000000000000 ip::basic_resolver::async_resolve (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously perform forward resolution of a query to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    ResolveHandler && handler);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

handler

The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  resolver::results_type results // Resolved endpoints as a range.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

A successful resolve operation is guaranteed to pass a non-empty range to the handler.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/async_resolve/overload6.html000066400000000000000000000112241340672067200274710ustar00rootroot00000000000000 ip::basic_resolver::async_resolve (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Asynchronously perform reverse resolution of an endpoint to a list of entries.

template<
    typename ResolveHandler>
DEDUCED async_resolve(
    const endpoint_type & e,
    ResolveHandler && handler);

This function is used to asynchronously resolve an endpoint into a list of endpoint entries.

Parameters

e

An endpoint object that determines what endpoints will be returned.

handler

The handler to be called when the resolve operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  resolver::results_type results // Resolved endpoints as a range.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

A successful resolve operation is guaranteed to pass a non-empty range to the handler.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/basic_resolver.html000066400000000000000000000070201340672067200257150ustar00rootroot00000000000000 ip::basic_resolver::basic_resolver
asio C++ library

PrevUpHomeNext

Constructor.

explicit basic_resolver(
    asio::io_context & io_context);
  » more...

Move-construct a ip::basic_resolver from another.

basic_resolver(
    basic_resolver && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/basic_resolver/000077500000000000000000000000001340672067200250305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver/basic_resolver/overload1.html000066400000000000000000000070621340672067200276170ustar00rootroot00000000000000 ip::basic_resolver::basic_resolver (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructor.

basic_resolver(
    asio::io_context & io_context);

This constructor creates a ip::basic_resolver.

Parameters

io_context

The io_context object that the resolver will use to dispatch handlers for any asynchronous operations performed on the resolver.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/basic_resolver/overload2.html000066400000000000000000000100441340672067200276120ustar00rootroot00000000000000 ip::basic_resolver::basic_resolver (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a ip::basic_resolver from another.

basic_resolver(
    basic_resolver && other);

This constructor moves a resolver from one object to another.

Parameters

other

The other ip::basic_resolver object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_resolver(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/cancel.html000066400000000000000000000055631340672067200241520ustar00rootroot00000000000000 ip::basic_resolver::cancel
asio C++ library

PrevUpHomeNext

Cancel any asynchronous operations that are waiting on the resolver.

void cancel();

This function forces the completion of any pending asynchronous operations on the host resolver. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/canonical_name.html000066400000000000000000000052721340672067200256510ustar00rootroot00000000000000 ip::basic_resolver::canonical_name
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Determine the canonical name of the host specified in the query.

static const flags canonical_name = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/endpoint_type.html000066400000000000000000000061451340672067200256030ustar00rootroot00000000000000 ip::basic_resolver::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type.

typedef InternetProtocol::endpoint endpoint_type;
Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/executor_type.html000066400000000000000000000201461340672067200256160ustar00rootroot00000000000000 ip::basic_resolver::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/flags.html000066400000000000000000000061651340672067200240200ustar00rootroot00000000000000 ip::basic_resolver::flags
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

A bitmask type (C++ Std [lib.bitmask.types]).

typedef unspecified flags;
Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/get_executor.html000066400000000000000000000050301340672067200254070ustar00rootroot00000000000000 ip::basic_resolver::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/get_io_context.html000066400000000000000000000071461340672067200257360ustar00rootroot00000000000000 ip::basic_resolver::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/get_io_service.html000066400000000000000000000071261340672067200257100ustar00rootroot00000000000000 ip::basic_resolver::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/iterator.html000066400000000000000000000336451340672067200245600ustar00rootroot00000000000000 ip::basic_resolver::iterator
asio C++ library

PrevUpHomeNext

(Deprecated.) The iterator type.

typedef basic_resolver_iterator< InternetProtocol > iterator;
Types

Name

Description

difference_type

The type used for the distance between two iterators.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

reference

The type of the result of applying operator*() to the iterator.

value_type

The type of the value pointed to by the iterator.

Member Functions

Name

Description

basic_resolver_iterator

Default constructor creates an end iterator.

Copy constructor.

Move constructor.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator->

Dereference an iterator.

operator=

Assignment operator.

Move-assignment operator.

Protected Member Functions

Name

Description

dereference

equal

increment

Protected Data Members

Name

Description

index_

values_

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator==

Test two iterators for equality.

The ip::basic_resolver_iterator class template is used to define iterators over the results returned by a resolver.

The iterator's value_type, obtained when the iterator is dereferenced, is:

const basic_resolver_entry<InternetProtocol>
Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/numeric_host.html000066400000000000000000000054021340672067200254140ustar00rootroot00000000000000 ip::basic_resolver::numeric_host
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

static const flags numeric_host = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/numeric_service.html000066400000000000000000000054211340672067200261000ustar00rootroot00000000000000 ip::basic_resolver::numeric_service
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

static const flags numeric_service = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/operator_eq_.html000066400000000000000000000100001340672067200253620ustar00rootroot00000000000000 ip::basic_resolver::operator=
asio C++ library

PrevUpHomeNext

Move-assign a ip::basic_resolver from another.

basic_resolver & operator=(
    basic_resolver && other);

This assignment operator moves a resolver from one object to another. Cancels any outstanding asynchronous operations associated with the target object.

Parameters

other

The other ip::basic_resolver object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the basic_resolver(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/passive.html000066400000000000000000000052651340672067200243760ustar00rootroot00000000000000 ip::basic_resolver::passive
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

static const flags passive = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/protocol_type.html000066400000000000000000000060371340672067200256240ustar00rootroot00000000000000 ip::basic_resolver::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type.

typedef InternetProtocol protocol_type;
Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/query.html000066400000000000000000000275431340672067200240740ustar00rootroot00000000000000 ip::basic_resolver::query
asio C++ library

PrevUpHomeNext

(Deprecated.) The query type.

typedef basic_resolver_query< InternetProtocol > query;
Types

Name

Description

flags

A bitmask type (C++ Std [lib.bitmask.types]).

protocol_type

The protocol type associated with the endpoint query.

Member Functions

Name

Description

basic_resolver_query

Construct with specified service name for any protocol.

Construct with specified service name for a given protocol.

Construct with specified host name and service name for any protocol.

Construct with specified host name and service name for a given protocol.

hints

Get the hints associated with the query.

host_name

Get the host name associated with the query.

service_name

Get the service name associated with the query.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

The ip::basic_resolver_query class template describes a query that can be passed to a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve.html000066400000000000000000000163501340672067200244000ustar00rootroot00000000000000 ip::basic_resolver::resolve
asio C++ library

PrevUpHomeNext

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

results_type resolve(
    const query & q);
  » more...

results_type resolve(
    const query & q,
    asio::error_code & ec);
  » more...

Perform forward resolution of a query to a list of entries.

results_type resolve(
    string_view host,
    string_view service);
  » more...

results_type resolve(
    string_view host,
    string_view service,
    asio::error_code & ec);
  » more...

results_type resolve(
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags);
  » more...

results_type resolve(
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    asio::error_code & ec);
  » more...

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service);
  » more...

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    asio::error_code & ec);
  » more...

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags);
  » more...

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    asio::error_code & ec);
  » more...

Perform reverse resolution of an endpoint to a list of entries.

results_type resolve(
    const endpoint_type & e);
  » more...

results_type resolve(
    const endpoint_type & e,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/000077500000000000000000000000001340672067200235055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload1.html000066400000000000000000000104021340672067200262640ustar00rootroot00000000000000 ip::basic_resolver::resolve (1 of 12 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

results_type resolve(
    const query & q);

This function is used to resolve a query into a list of endpoint entries.

Parameters

q

A query object that determines what endpoints will be returned.

Return Value

A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload10.html000066400000000000000000000145251340672067200263560ustar00rootroot00000000000000 ip::basic_resolver::resolve (10 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    asio::error_code & ec);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

ec

Set to indicate what error occurred, if any.

Return Value

A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload11.html000066400000000000000000000103721340672067200263530ustar00rootroot00000000000000 ip::basic_resolver::resolve (11 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform reverse resolution of an endpoint to a list of entries.

results_type resolve(
    const endpoint_type & e);

This function is used to resolve an endpoint into a list of endpoint entries.

Parameters

e

An endpoint object that determines what endpoints will be returned.

Return Value

A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload12.html000066400000000000000000000077321340672067200263620ustar00rootroot00000000000000 ip::basic_resolver::resolve (12 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform reverse resolution of an endpoint to a list of entries.

results_type resolve(
    const endpoint_type & e,
    asio::error_code & ec);

This function is used to resolve an endpoint into a list of endpoint entries.

Parameters

e

An endpoint object that determines what endpoints will be returned.

ec

Set to indicate what error occurred, if any.

Return Value

A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload2.html000066400000000000000000000077701340672067200263030ustar00rootroot00000000000000 ip::basic_resolver::resolve (2 of 12 overloads)
asio C++ library

PrevUpHomeNext

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

results_type resolve(
    const query & q,
    asio::error_code & ec);

This function is used to resolve a query into a list of endpoint entries.

Parameters

q

A query object that determines what endpoints will be returned.

ec

Set to indicate what error occurred, if any.

Return Value

A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload3.html000066400000000000000000000140651340672067200262770ustar00rootroot00000000000000 ip::basic_resolver::resolve (3 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    string_view host,
    string_view service);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

Return Value

A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.

Exceptions

asio::system_error

Thrown on failure.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload4.html000066400000000000000000000134321340672067200262750ustar00rootroot00000000000000 ip::basic_resolver::resolve (4 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    string_view host,
    string_view service,
    asio::error_code & ec);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

ec

Set to indicate what error occurred, if any.

Return Value

A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload5.html000066400000000000000000000145371340672067200263050ustar00rootroot00000000000000 ip::basic_resolver::resolve (5 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

Return Value

A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.

Exceptions

asio::system_error

Thrown on failure.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload6.html000066400000000000000000000141041340672067200262740ustar00rootroot00000000000000 ip::basic_resolver::resolve (6 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags,
    asio::error_code & ec);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

ec

Set to indicate what error occurred, if any.

Return Value

A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload7.html000066400000000000000000000144611340672067200263030ustar00rootroot00000000000000 ip::basic_resolver::resolve (7 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

Return Value

A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.

Exceptions

asio::system_error

Thrown on failure.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload8.html000066400000000000000000000140261340672067200263010ustar00rootroot00000000000000 ip::basic_resolver::resolve (8 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    asio::error_code & ec);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

ec

Set to indicate what error occurred, if any.

Return Value

A range object representing the list of endpoint entries. An empty range is returned if an error occurs. A successful call to this function is guaranteed to return a non-empty range.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/resolve/overload9.html000066400000000000000000000151371340672067200263060ustar00rootroot00000000000000 ip::basic_resolver::resolve (9 of 12 overloads)
asio C++ library

PrevUpHomeNext

Perform forward resolution of a query to a list of entries.

results_type resolve(
    const protocol_type & protocol,
    string_view host,
    string_view service,
    resolver_base::flags resolve_flags);

This function is used to resolve host and service names into a list of endpoint entries.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

Return Value

A range object representing the list of endpoint entries. A successful call to this function is guaranteed to return a non-empty range.

Exceptions

asio::system_error

Thrown on failure.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/results_type.html000066400000000000000000000505631340672067200254670ustar00rootroot00000000000000 ip::basic_resolver::results_type
asio C++ library

PrevUpHomeNext

The results type.

typedef basic_resolver_results< InternetProtocol > results_type;
Types

Name

Description

const_iterator

The type of an iterator into the range.

const_reference

The type of a const reference to a value in the range.

difference_type

Type used to represent the distance between two iterators in the range.

endpoint_type

The endpoint type associated with the results.

iterator

The type of an iterator into the range.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

protocol_type

The protocol type associated with the results.

reference

The type of a non-const reference to a value in the range.

size_type

Type used to represent a count of the elements in the range.

value_type

The type of a value in the results range.

Member Functions

Name

Description

basic_resolver_results

Default constructor creates an empty range.

Copy constructor.

Move constructor.

begin

Obtain a begin iterator for the results range.

cbegin

Obtain a begin iterator for the results range.

cend

Obtain an end iterator for the results range.

empty

Determine whether the results range is empty.

end

Obtain an end iterator for the results range.

max_size

Get the maximum number of entries permitted in a results range.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator->

Dereference an iterator.

operator=

Assignment operator.

Move-assignment operator.

size

Get the number of entries in the results range.

swap

Swap the results range with another.

Protected Member Functions

Name

Description

dereference

equal

increment

Protected Data Members

Name

Description

index_

values_

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator==

Test two iterators for equality.

The ip::basic_resolver_results class template is used to define a range over the results returned by a resolver.

The iterator's value_type, obtained when a results iterator is dereferenced, is:

const basic_resolver_entry<InternetProtocol>
Remarks

For backward compatibility, ip::basic_resolver_results is derived from ip::basic_resolver_iterator. This derivation is deprecated.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver/v4_mapped.html000066400000000000000000000053631340672067200246020ustar00rootroot00000000000000 ip::basic_resolver::v4_mapped
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

static const flags v4_mapped = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry.html000066400000000000000000000200251340672067200241340ustar00rootroot00000000000000 ip::basic_resolver_entry
asio C++ library

PrevUpHomeNext

An entry produced by a resolver.

template<
    typename InternetProtocol>
class basic_resolver_entry
Types

Name

Description

endpoint_type

The endpoint type associated with the endpoint entry.

protocol_type

The protocol type associated with the endpoint entry.

Member Functions

Name

Description

basic_resolver_entry

Default constructor.

Construct with specified endpoint, host name and service name.

endpoint

Get the endpoint associated with the entry.

host_name

Get the host name associated with the entry.

operator endpoint_type

Convert to the endpoint associated with the entry.

service_name

Get the service name associated with the entry.

The ip::basic_resolver_entry class template describes an entry as returned by a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_entry.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/000077500000000000000000000000001340672067200232475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/basic_resolver_entry.html000066400000000000000000000071511340672067200303640ustar00rootroot00000000000000 ip::basic_resolver_entry::basic_resolver_entry
asio C++ library

PrevUpHomeNext

Default constructor.

basic_resolver_entry();
  » more...

Construct with specified endpoint, host name and service name.

basic_resolver_entry(
    const endpoint_type & ep,
    string_view host,
    string_view service);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/basic_resolver_entry/000077500000000000000000000000001340672067200274725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/basic_resolver_entry/overload1.html000066400000000000000000000053111340672067200322540ustar00rootroot00000000000000 ip::basic_resolver_entry::basic_resolver_entry (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

basic_resolver_entry();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/basic_resolver_entry/overload2.html000066400000000000000000000054231340672067200322610ustar00rootroot00000000000000 ip::basic_resolver_entry::basic_resolver_entry (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct with specified endpoint, host name and service name.

basic_resolver_entry(
    const endpoint_type & ep,
    string_view host,
    string_view service);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/endpoint.html000066400000000000000000000052541340672067200257630ustar00rootroot00000000000000 ip::basic_resolver_entry::endpoint
asio C++ library

PrevUpHomeNext

Get the endpoint associated with the entry.

endpoint_type endpoint() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/endpoint_type.html000066400000000000000000000062721340672067200270250ustar00rootroot00000000000000 ip::basic_resolver_entry::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type associated with the endpoint entry.

typedef InternetProtocol::endpoint endpoint_type;
Requirements

Header: asio/ip/basic_resolver_entry.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/host_name.html000066400000000000000000000065641340672067200261250ustar00rootroot00000000000000 ip::basic_resolver_entry::host_name
asio C++ library

PrevUpHomeNext

Get the host name associated with the entry.

std::string host_name() const;
  » more...

template<
    class Allocator>
std::basic_string< char, std::char_traits< char >, Allocator > host_name(
    const Allocator & alloc = Allocator()) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/host_name/000077500000000000000000000000001340672067200252245ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/host_name/overload1.html000066400000000000000000000051311340672067200300060ustar00rootroot00000000000000 ip::basic_resolver_entry::host_name (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the host name associated with the entry.

std::string host_name() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/host_name/overload2.html000066400000000000000000000054371340672067200300200ustar00rootroot00000000000000 ip::basic_resolver_entry::host_name (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the host name associated with the entry.

template<
    class Allocator>
std::basic_string< char, std::char_traits< char >, Allocator > host_name(
    const Allocator & alloc = Allocator()) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/operator_endpoint_type.html000066400000000000000000000053431340672067200307360ustar00rootroot00000000000000 ip::basic_resolver_entry::operator endpoint_type
asio C++ library

PrevUpHomeNext

Convert to the endpoint associated with the entry.

operator endpoint_type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/protocol_type.html000066400000000000000000000063641340672067200270500ustar00rootroot00000000000000 ip::basic_resolver_entry::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type associated with the endpoint entry.

typedef InternetProtocol protocol_type;
Requirements

Header: asio/ip/basic_resolver_entry.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/service_name.html000066400000000000000000000066631340672067200266100ustar00rootroot00000000000000 ip::basic_resolver_entry::service_name
asio C++ library

PrevUpHomeNext

Get the service name associated with the entry.

std::string service_name() const;
  » more...

template<
    class Allocator>
std::basic_string< char, std::char_traits< char >, Allocator > service_name(
    const Allocator & alloc = Allocator()) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/service_name/000077500000000000000000000000001340672067200257075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/service_name/overload1.html000066400000000000000000000052061340672067200304740ustar00rootroot00000000000000 ip::basic_resolver_entry::service_name (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the service name associated with the entry.

std::string service_name() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_entry/service_name/overload2.html000066400000000000000000000055031340672067200304750ustar00rootroot00000000000000 ip::basic_resolver_entry::service_name (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the service name associated with the entry.

template<
    class Allocator>
std::basic_string< char, std::char_traits< char >, Allocator > service_name(
    const Allocator & alloc = Allocator()) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator.html000066400000000000000000000334751340672067200246410ustar00rootroot00000000000000 ip::basic_resolver_iterator
asio C++ library

PrevUpHomeNext

An iterator over the entries produced by a resolver.

template<
    typename InternetProtocol>
class basic_resolver_iterator
Types

Name

Description

difference_type

The type used for the distance between two iterators.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

reference

The type of the result of applying operator*() to the iterator.

value_type

The type of the value pointed to by the iterator.

Member Functions

Name

Description

basic_resolver_iterator

Default constructor creates an end iterator.

Copy constructor.

Move constructor.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator->

Dereference an iterator.

operator=

Assignment operator.

Move-assignment operator.

Protected Member Functions

Name

Description

dereference

equal

increment

Protected Data Members

Name

Description

index_

values_

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator==

Test two iterators for equality.

The ip::basic_resolver_iterator class template is used to define iterators over the results returned by a resolver.

The iterator's value_type, obtained when the iterator is dereferenced, is:

const basic_resolver_entry<InternetProtocol>
Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/000077500000000000000000000000001340672067200237375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator.html000066400000000000000000000102301340672067200315340ustar00rootroot00000000000000 ip::basic_resolver_iterator::basic_resolver_iterator
asio C++ library

PrevUpHomeNext

Default constructor creates an end iterator.

basic_resolver_iterator();
  » more...

Copy constructor.

basic_resolver_iterator(
    const basic_resolver_iterator & other);
  » more...

Move constructor.

basic_resolver_iterator(
    basic_resolver_iterator && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/000077500000000000000000000000001340672067200306525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/overload1.html000066400000000000000000000054401340672067200334370ustar00rootroot00000000000000 ip::basic_resolver_iterator::basic_resolver_iterator (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Default constructor creates an end iterator.

basic_resolver_iterator();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/overload2.html000066400000000000000000000054231340672067200334410ustar00rootroot00000000000000 ip::basic_resolver_iterator::basic_resolver_iterator (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_resolver_iterator(
    const basic_resolver_iterator & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/overload3.html000066400000000000000000000054021340672067200334370ustar00rootroot00000000000000 ip::basic_resolver_iterator::basic_resolver_iterator (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

basic_resolver_iterator(
    basic_resolver_iterator && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/dereference.html000066400000000000000000000053541340672067200271030ustar00rootroot00000000000000 ip::basic_resolver_iterator::dereference
asio C++ library

PrevUpHomeNext

const basic_resolver_entry< InternetProtocol > & dereference() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/difference_type.html000066400000000000000000000063551340672067200277710ustar00rootroot00000000000000 ip::basic_resolver_iterator::difference_type
asio C++ library

PrevUpHomeNext

The type used for the distance between two iterators.

typedef std::ptrdiff_t difference_type;
Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/equal.html000066400000000000000000000051211340672067200257330ustar00rootroot00000000000000 ip::basic_resolver_iterator::equal
asio C++ library

PrevUpHomeNext

bool equal(
    const basic_resolver_iterator & other) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/increment.html000066400000000000000000000050051340672067200266110ustar00rootroot00000000000000 ip::basic_resolver_iterator::increment
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/index_.html000066400000000000000000000050611340672067200260750ustar00rootroot00000000000000 ip::basic_resolver_iterator::index_
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/iterator_category.html000066400000000000000000000063761340672067200303670ustar00rootroot00000000000000 ip::basic_resolver_iterator::iterator_category
asio C++ library

PrevUpHomeNext

The iterator category.

typedef std::forward_iterator_tag iterator_category;
Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator__star_.html000066400000000000000000000053301340672067200300100ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator *
asio C++ library

PrevUpHomeNext

Dereference an iterator.

const basic_resolver_entry< InternetProtocol > & operator *() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_arrow_.html000066400000000000000000000053731340672067200300410ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator->
asio C++ library

PrevUpHomeNext

Dereference an iterator.

const basic_resolver_entry< InternetProtocol > * operator->() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_eq_.html000066400000000000000000000067451340672067200273200ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_resolver_iterator & operator=(
    const basic_resolver_iterator & other);
  » more...

Move-assignment operator.

basic_resolver_iterator & operator=(
    basic_resolver_iterator && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_eq_/000077500000000000000000000000001340672067200264165ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_eq_/overload1.html000066400000000000000000000052451340672067200312060ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_resolver_iterator & operator=(
    const basic_resolver_iterator & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_eq_/overload2.html000066400000000000000000000052661340672067200312120ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assignment operator.

basic_resolver_iterator & operator=(
    basic_resolver_iterator && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_eq__eq_.html000066400000000000000000000065211340672067200301340ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator==
asio C++ library

PrevUpHomeNext

Test two iterators for equality.

friend bool operator==(
    const basic_resolver_iterator & a,
    const basic_resolver_iterator & b);
Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_not__eq_.html000066400000000000000000000065351340672067200303340ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator!=
asio C++ library

PrevUpHomeNext

Test two iterators for inequality.

friend bool operator!=(
    const basic_resolver_iterator & a,
    const basic_resolver_iterator & b);
Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_plus__plus_.html000066400000000000000000000067661340672067200311030ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator++
asio C++ library

PrevUpHomeNext

Increment operator (prefix).

basic_resolver_iterator & operator++();
  » more...

Increment operator (postfix).

basic_resolver_iterator operator++(
    int );
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_plus__plus_/000077500000000000000000000000001340672067200301765ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_plus__plus_/overload1.html000066400000000000000000000052761340672067200327720ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator++ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Increment operator (prefix).

basic_resolver_iterator & operator++();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/operator_plus__plus_/overload2.html000066400000000000000000000052661340672067200327720ustar00rootroot00000000000000 ip::basic_resolver_iterator::operator++ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Increment operator (postfix).

basic_resolver_iterator operator++(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/pointer.html000066400000000000000000000064151340672067200263130ustar00rootroot00000000000000 ip::basic_resolver_iterator::pointer
asio C++ library

PrevUpHomeNext

The type of the result of applying operator->() to the iterator.

typedef const basic_resolver_entry< InternetProtocol > * pointer;
Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/reference.html000066400000000000000000000205771340672067200265760ustar00rootroot00000000000000 ip::basic_resolver_iterator::reference
asio C++ library

PrevUpHomeNext

The type of the result of applying operator*() to the iterator.

typedef const basic_resolver_entry< InternetProtocol > & reference;
Types

Name

Description

endpoint_type

The endpoint type associated with the endpoint entry.

protocol_type

The protocol type associated with the endpoint entry.

Member Functions

Name

Description

basic_resolver_entry

Default constructor.

Construct with specified endpoint, host name and service name.

endpoint

Get the endpoint associated with the entry.

host_name

Get the host name associated with the entry.

operator endpoint_type

Convert to the endpoint associated with the entry.

service_name

Get the service name associated with the entry.

The ip::basic_resolver_entry class template describes an entry as returned by a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/value_type.html000066400000000000000000000205241340672067200270050ustar00rootroot00000000000000 ip::basic_resolver_iterator::value_type
asio C++ library

PrevUpHomeNext

The type of the value pointed to by the iterator.

typedef basic_resolver_entry< InternetProtocol > value_type;
Types

Name

Description

endpoint_type

The endpoint type associated with the endpoint entry.

protocol_type

The protocol type associated with the endpoint entry.

Member Functions

Name

Description

basic_resolver_entry

Default constructor.

Construct with specified endpoint, host name and service name.

endpoint

Get the endpoint associated with the entry.

host_name

Get the host name associated with the entry.

operator endpoint_type

Convert to the endpoint associated with the entry.

service_name

Get the service name associated with the entry.

The ip::basic_resolver_entry class template describes an entry as returned by a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_iterator.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_iterator/values_.html000066400000000000000000000051101340672067200262600ustar00rootroot00000000000000 ip::basic_resolver_iterator::values_
asio C++ library

PrevUpHomeNext

values_ptr_type values_;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query.html000066400000000000000000000274211340672067200241470ustar00rootroot00000000000000 ip::basic_resolver_query
asio C++ library

PrevUpHomeNext

An query to be passed to a resolver.

template<
    typename InternetProtocol>
class basic_resolver_query :
  public ip::resolver_query_base
Types

Name

Description

flags

A bitmask type (C++ Std [lib.bitmask.types]).

protocol_type

The protocol type associated with the endpoint query.

Member Functions

Name

Description

basic_resolver_query

Construct with specified service name for any protocol.

Construct with specified service name for a given protocol.

Construct with specified host name and service name for any protocol.

Construct with specified host name and service name for a given protocol.

hints

Get the hints associated with the query.

host_name

Get the host name associated with the query.

service_name

Get the service name associated with the query.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

The ip::basic_resolver_query class template describes a query that can be passed to a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_query.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/000077500000000000000000000000001340672067200232535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/address_configured.html000066400000000000000000000057161340672067200300040ustar00rootroot00000000000000 ip::basic_resolver_query::address_configured
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

static const flags address_configured = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/all_matching.html000066400000000000000000000054761340672067200265770ustar00rootroot00000000000000 ip::basic_resolver_query::all_matching
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

static const flags all_matching = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/basic_resolver_query.html000066400000000000000000000120521340672067200303700ustar00rootroot00000000000000 ip::basic_resolver_query::basic_resolver_query
asio C++ library

PrevUpHomeNext

Construct with specified service name for any protocol.

basic_resolver_query(
    const std::string & service,
    resolver_query_base::flags resolve_flags = passive|address_configured);
  » more...

Construct with specified service name for a given protocol.

basic_resolver_query(
    const protocol_type & protocol,
    const std::string & service,
    resolver_query_base::flags resolve_flags = passive|address_configured);
  » more...

Construct with specified host name and service name for any protocol.

basic_resolver_query(
    const std::string & host,
    const std::string & service,
    resolver_query_base::flags resolve_flags = address_configured);
  » more...

Construct with specified host name and service name for a given protocol.

basic_resolver_query(
    const protocol_type & protocol,
    const std::string & host,
    const std::string & service,
    resolver_query_base::flags resolve_flags = address_configured);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/basic_resolver_query/000077500000000000000000000000001340672067200275025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/basic_resolver_query/overload1.html000066400000000000000000000111521340672067200322640ustar00rootroot00000000000000 ip::basic_resolver_query::basic_resolver_query (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct with specified service name for any protocol.

basic_resolver_query(
    const std::string & service,
    resolver_query_base::flags resolve_flags = passive|address_configured);

This constructor is typically used to perform name resolution for local service binding.

Parameters

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for local service binding.

Remarks

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/basic_resolver_query/overload2.html000066400000000000000000000115641340672067200322740ustar00rootroot00000000000000 ip::basic_resolver_query::basic_resolver_query (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct with specified service name for a given protocol.

basic_resolver_query(
    const protocol_type & protocol,
    const std::string & service,
    resolver_query_base::flags resolve_flags = passive|address_configured);

This constructor is typically used to perform name resolution for local service binding with a specific protocol version.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for local service binding.

Remarks

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/basic_resolver_query/overload3.html000066400000000000000000000133111340672067200322650ustar00rootroot00000000000000 ip::basic_resolver_query::basic_resolver_query (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct with specified host name and service name for any protocol.

basic_resolver_query(
    const std::string & host,
    const std::string & service,
    resolver_query_base::flags resolve_flags = address_configured);

This constructor is typically used to perform name resolution for communication with remote hosts.

Parameters

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/basic_resolver_query/overload4.html000066400000000000000000000137101340672067200322710ustar00rootroot00000000000000 ip::basic_resolver_query::basic_resolver_query (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct with specified host name and service name for a given protocol.

basic_resolver_query(
    const protocol_type & protocol,
    const std::string & host,
    const std::string & service,
    resolver_query_base::flags resolve_flags = address_configured);

This constructor is typically used to perform name resolution for communication with remote hosts.

Parameters

protocol

A protocol object, normally representing either the IPv4 or IPv6 version of an internet protocol.

host

A string identifying a location. May be a descriptive name or a numeric address string. If an empty string and the passive flag has been specified, the resolved endpoints are suitable for local service binding. If an empty string and passive is not specified, the resolved endpoints will use the loopback address.

service

A string identifying the requested service. This may be a descriptive name or a numeric string corresponding to a port number. May be an empty string, in which case all resolved endpoints will have a port number of 0.

resolve_flags

A set of flags that determine how name resolution should be performed. The default flags are suitable for communication with remote hosts.

Remarks

On POSIX systems, host names may be locally defined in the file /etc/hosts. On Windows, host names may be defined in the file c:\windows\system32\drivers\etc\hosts. Remote host name resolution is performed using DNS. Operating systems may use additional locations when resolving host names (such as NETBIOS names on Windows).

On POSIX systems, service names are typically defined in the file /etc/services. On Windows, service names may be found in the file c:\windows\system32\drivers\etc\services. Operating systems may use additional locations when resolving service names.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/canonical_name.html000066400000000000000000000055051340672067200270750ustar00rootroot00000000000000 ip::basic_resolver_query::canonical_name
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Determine the canonical name of the host specified in the query.

static const flags canonical_name = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/flags.html000066400000000000000000000062671340672067200252500ustar00rootroot00000000000000 ip::basic_resolver_query::flags
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

A bitmask type (C++ Std [lib.bitmask.types]).

typedef unspecified flags;
Requirements

Header: asio/ip/basic_resolver_query.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/hints.html000066400000000000000000000050611340672067200252700ustar00rootroot00000000000000 ip::basic_resolver_query::hints
asio C++ library

PrevUpHomeNext

Get the hints associated with the query.

const asio::detail::addrinfo_type & hints() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/host_name.html000066400000000000000000000051011340672067200261130ustar00rootroot00000000000000 ip::basic_resolver_query::host_name
asio C++ library

PrevUpHomeNext

Get the host name associated with the query.

std::string host_name() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/numeric_host.html000066400000000000000000000055101340672067200266410ustar00rootroot00000000000000 ip::basic_resolver_query::numeric_host
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

static const flags numeric_host = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/numeric_service.html000066400000000000000000000055021340672067200273250ustar00rootroot00000000000000 ip::basic_resolver_query::numeric_service
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

static const flags numeric_service = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/passive.html000066400000000000000000000054061340672067200256200ustar00rootroot00000000000000 ip::basic_resolver_query::passive
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

static const flags passive = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/protocol_type.html000066400000000000000000000062701340672067200270500ustar00rootroot00000000000000 ip::basic_resolver_query::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type associated with the endpoint query.

typedef InternetProtocol protocol_type;
Requirements

Header: asio/ip/basic_resolver_query.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/service_name.html000066400000000000000000000051551340672067200266070ustar00rootroot00000000000000 ip::basic_resolver_query::service_name
asio C++ library

PrevUpHomeNext

Get the service name associated with the query.

std::string service_name() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_query/v4_mapped.html000066400000000000000000000055201340672067200260220ustar00rootroot00000000000000 ip::basic_resolver_query::v4_mapped
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

static const flags v4_mapped = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results.html000066400000000000000000000474611340672067200245110ustar00rootroot00000000000000 ip::basic_resolver_results
asio C++ library

PrevUpHomeNext

A range of entries produced by a resolver.

template<
    typename InternetProtocol>
class basic_resolver_results :
  public ip::basic_resolver_iterator< InternetProtocol >
Types

Name

Description

const_iterator

The type of an iterator into the range.

const_reference

The type of a const reference to a value in the range.

difference_type

Type used to represent the distance between two iterators in the range.

endpoint_type

The endpoint type associated with the results.

iterator

The type of an iterator into the range.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

protocol_type

The protocol type associated with the results.

reference

The type of a non-const reference to a value in the range.

size_type

Type used to represent a count of the elements in the range.

value_type

The type of a value in the results range.

Member Functions

Name

Description

basic_resolver_results

Default constructor creates an empty range.

Copy constructor.

Move constructor.

begin

Obtain a begin iterator for the results range.

cbegin

Obtain a begin iterator for the results range.

cend

Obtain an end iterator for the results range.

empty

Determine whether the results range is empty.

end

Obtain an end iterator for the results range.

max_size

Get the maximum number of entries permitted in a results range.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator->

Dereference an iterator.

operator=

Assignment operator.

Move-assignment operator.

size

Get the number of entries in the results range.

swap

Swap the results range with another.

Protected Member Functions

Name

Description

dereference

equal

increment

Protected Data Members

Name

Description

index_

values_

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator==

Test two iterators for equality.

The ip::basic_resolver_results class template is used to define a range over the results returned by a resolver.

The iterator's value_type, obtained when a results iterator is dereferenced, is:

const basic_resolver_entry<InternetProtocol>
Remarks

For backward compatibility, ip::basic_resolver_results is derived from ip::basic_resolver_iterator. This derivation is deprecated.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/000077500000000000000000000000001340672067200236075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/basic_resolver_results.html000066400000000000000000000101501340672067200312550ustar00rootroot00000000000000 ip::basic_resolver_results::basic_resolver_results
asio C++ library

PrevUpHomeNext

Default constructor creates an empty range.

basic_resolver_results();
  » more...

Copy constructor.

basic_resolver_results(
    const basic_resolver_results & other);
  » more...

Move constructor.

basic_resolver_results(
    basic_resolver_results && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/basic_resolver_results/000077500000000000000000000000001340672067200303725ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/basic_resolver_results/overload1.html000066400000000000000000000054121340672067200331560ustar00rootroot00000000000000 ip::basic_resolver_results::basic_resolver_results (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Default constructor creates an empty range.

basic_resolver_results();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/basic_resolver_results/overload2.html000066400000000000000000000054001340672067200331540ustar00rootroot00000000000000 ip::basic_resolver_results::basic_resolver_results (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_resolver_results(
    const basic_resolver_results & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/basic_resolver_results/overload3.html000066400000000000000000000053301340672067200331570ustar00rootroot00000000000000 ip::basic_resolver_results::basic_resolver_results (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

basic_resolver_results(
    basic_resolver_results && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/begin.html000066400000000000000000000052351340672067200255660ustar00rootroot00000000000000 ip::basic_resolver_results::begin
asio C++ library

PrevUpHomeNext

Obtain a begin iterator for the results range.

const_iterator begin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/cbegin.html000066400000000000000000000050471340672067200257320ustar00rootroot00000000000000 ip::basic_resolver_results::cbegin
asio C++ library

PrevUpHomeNext

Obtain a begin iterator for the results range.

const_iterator cbegin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/cend.html000066400000000000000000000051041340672067200254060ustar00rootroot00000000000000 ip::basic_resolver_results::cend
asio C++ library

PrevUpHomeNext

Obtain an end iterator for the results range.

const_iterator cend() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/const_iterator.html000066400000000000000000000345471340672067200275510ustar00rootroot00000000000000 ip::basic_resolver_results::const_iterator
asio C++ library

PrevUpHomeNext

The type of an iterator into the range.

typedef basic_resolver_iterator< protocol_type > const_iterator;
Types

Name

Description

difference_type

The type used for the distance between two iterators.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

reference

The type of the result of applying operator*() to the iterator.

value_type

The type of the value pointed to by the iterator.

Member Functions

Name

Description

basic_resolver_iterator

Default constructor creates an end iterator.

Copy constructor.

Move constructor.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator->

Dereference an iterator.

operator=

Assignment operator.

Move-assignment operator.

Protected Member Functions

Name

Description

dereference

equal

increment

Protected Data Members

Name

Description

index_

values_

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator==

Test two iterators for equality.

The ip::basic_resolver_iterator class template is used to define iterators over the results returned by a resolver.

The iterator's value_type, obtained when the iterator is dereferenced, is:

const basic_resolver_entry<InternetProtocol>
Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/const_reference.html000066400000000000000000000207001340672067200276400ustar00rootroot00000000000000 ip::basic_resolver_results::const_reference
asio C++ library

PrevUpHomeNext

The type of a const reference to a value in the range.

typedef const value_type & const_reference;
Types

Name

Description

endpoint_type

The endpoint type associated with the endpoint entry.

protocol_type

The protocol type associated with the endpoint entry.

Member Functions

Name

Description

basic_resolver_entry

Default constructor.

Construct with specified endpoint, host name and service name.

endpoint

Get the endpoint associated with the entry.

host_name

Get the host name associated with the entry.

operator endpoint_type

Convert to the endpoint associated with the entry.

service_name

Get the service name associated with the entry.

The ip::basic_resolver_entry class template describes an entry as returned by a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/dereference.html000066400000000000000000000053651340672067200267550ustar00rootroot00000000000000 ip::basic_resolver_results::dereference
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

const basic_resolver_entry< InternetProtocol > & dereference() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/difference_type.html000066400000000000000000000063601340672067200276350ustar00rootroot00000000000000 ip::basic_resolver_results::difference_type
asio C++ library

PrevUpHomeNext

Type used to represent the distance between two iterators in the range.

typedef std::ptrdiff_t difference_type;
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/empty.html000066400000000000000000000050711340672067200256360ustar00rootroot00000000000000 ip::basic_resolver_results::empty
asio C++ library

PrevUpHomeNext

Determine whether the results range is empty.

bool empty() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/end.html000066400000000000000000000050651340672067200252510ustar00rootroot00000000000000 ip::basic_resolver_results::end
asio C++ library

PrevUpHomeNext

Obtain an end iterator for the results range.

const_iterator end() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/endpoint_type.html000066400000000000000000000062521340672067200273630ustar00rootroot00000000000000 ip::basic_resolver_results::endpoint_type
asio C++ library

PrevUpHomeNext

The endpoint type associated with the results.

typedef protocol_type::endpoint endpoint_type;
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/equal.html000066400000000000000000000052431340672067200256100ustar00rootroot00000000000000 ip::basic_resolver_results::equal
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

bool equal(
    const basic_resolver_iterator & other) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/increment.html000066400000000000000000000051371340672067200264670ustar00rootroot00000000000000 ip::basic_resolver_results::increment
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

void increment();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/index_.html000066400000000000000000000051471340672067200257520ustar00rootroot00000000000000 ip::basic_resolver_results::index_
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

std::size_t index_;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/iterator.html000066400000000000000000000342051340672067200263320ustar00rootroot00000000000000 ip::basic_resolver_results::iterator
asio C++ library

PrevUpHomeNext

The type of an iterator into the range.

typedef const_iterator iterator;
Types

Name

Description

difference_type

The type used for the distance between two iterators.

iterator_category

The iterator category.

pointer

The type of the result of applying operator->() to the iterator.

reference

The type of the result of applying operator*() to the iterator.

value_type

The type of the value pointed to by the iterator.

Member Functions

Name

Description

basic_resolver_iterator

Default constructor creates an end iterator.

Copy constructor.

Move constructor.

operator *

Dereference an iterator.

operator++

Increment operator (prefix).

Increment operator (postfix).

operator->

Dereference an iterator.

operator=

Assignment operator.

Move-assignment operator.

Protected Member Functions

Name

Description

dereference

equal

increment

Protected Data Members

Name

Description

index_

values_

Friends

Name

Description

operator!=

Test two iterators for inequality.

operator==

Test two iterators for equality.

The ip::basic_resolver_iterator class template is used to define iterators over the results returned by a resolver.

The iterator's value_type, obtained when the iterator is dereferenced, is:

const basic_resolver_entry<InternetProtocol>
Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/iterator_category.html000066400000000000000000000065051340672067200302310ustar00rootroot00000000000000 ip::basic_resolver_results::iterator_category
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

The iterator category.

typedef std::forward_iterator_tag iterator_category;
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/max_size.html000066400000000000000000000052301340672067200263140ustar00rootroot00000000000000 ip::basic_resolver_results::max_size
asio C++ library

PrevUpHomeNext

Get the maximum number of entries permitted in a results range.

size_type max_size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator__star_.html000066400000000000000000000054161340672067200276650ustar00rootroot00000000000000 ip::basic_resolver_results::operator *
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

Dereference an iterator.

const basic_resolver_entry< InternetProtocol > & operator *() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_arrow_.html000066400000000000000000000055251340672067200277100ustar00rootroot00000000000000 ip::basic_resolver_results::operator->
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

Dereference an iterator.

const basic_resolver_entry< InternetProtocol > * operator->() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq_.html000066400000000000000000000067221340672067200271630ustar00rootroot00000000000000 ip::basic_resolver_results::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_resolver_results & operator=(
    const basic_resolver_results & other);
  » more...

Move-assignment operator.

basic_resolver_results & operator=(
    basic_resolver_results && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq_/000077500000000000000000000000001340672067200262665ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq_/overload1.html000066400000000000000000000052341340672067200310540ustar00rootroot00000000000000 ip::basic_resolver_results::operator= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assignment operator.

basic_resolver_results & operator=(
    const basic_resolver_results & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq_/overload2.html000066400000000000000000000052551340672067200310600ustar00rootroot00000000000000 ip::basic_resolver_results::operator= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-assignment operator.

basic_resolver_results & operator=(
    basic_resolver_results && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq__eq_.html000066400000000000000000000070121340672067200300000ustar00rootroot00000000000000 ip::basic_resolver_results::operator==
asio C++ library

PrevUpHomeNext

Test two iterators for equality.

friend bool operator==(
    const basic_resolver_results & a,
    const basic_resolver_results & b);
  » more...

friend bool operator==(
    const basic_resolver_iterator & a,
    const basic_resolver_iterator & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq__eq_/000077500000000000000000000000001340672067200271125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq__eq_/overload1.html000066400000000000000000000065341340672067200317040ustar00rootroot00000000000000 ip::basic_resolver_results::operator== (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Test two iterators for equality.

friend bool operator==(
    const basic_resolver_results & a,
    const basic_resolver_results & b);
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_eq__eq_/overload2.html000066400000000000000000000066511340672067200317050ustar00rootroot00000000000000 ip::basic_resolver_results::operator== (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

Test two iterators for equality.

friend bool operator==(
    const basic_resolver_iterator & a,
    const basic_resolver_iterator & b);
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_not__eq_.html000066400000000000000000000067571340672067200302120ustar00rootroot00000000000000 ip::basic_resolver_results::operator!=
asio C++ library

PrevUpHomeNext

Test two iterators for inequality.

friend bool operator!=(
    const basic_resolver_results & a,
    const basic_resolver_results & b);
  » more...

friend bool operator!=(
    const basic_resolver_iterator & a,
    const basic_resolver_iterator & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_not__eq_/000077500000000000000000000000001340672067200273055ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_not__eq_/overload1.html000066400000000000000000000065501340672067200320750ustar00rootroot00000000000000 ip::basic_resolver_results::operator!= (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Test two iterators for inequality.

friend bool operator!=(
    const basic_resolver_results & a,
    const basic_resolver_results & b);
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_not__eq_/overload2.html000066400000000000000000000067341340672067200321020ustar00rootroot00000000000000 ip::basic_resolver_results::operator!= (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

Test two iterators for inequality.

friend bool operator!=(
    const basic_resolver_iterator & a,
    const basic_resolver_iterator & b);
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_plus__plus_.html000066400000000000000000000070301340672067200307340ustar00rootroot00000000000000 ip::basic_resolver_results::operator++
asio C++ library

PrevUpHomeNext

Increment operator (prefix).

basic_resolver_iterator & operator++();
  » more...

Increment operator (postfix).

basic_resolver_iterator operator++(
    int );
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_plus__plus_/000077500000000000000000000000001340672067200300465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_plus__plus_/overload1.html000066400000000000000000000054401340672067200326330ustar00rootroot00000000000000 ip::basic_resolver_results::operator++ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

Increment operator (prefix).

basic_resolver_iterator & operator++();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/operator_plus__plus_/overload2.html000066400000000000000000000054301340672067200326330ustar00rootroot00000000000000 ip::basic_resolver_results::operator++ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

Increment operator (postfix).

basic_resolver_iterator operator++(
    int );

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/pointer.html000066400000000000000000000066441340672067200261670ustar00rootroot00000000000000 ip::basic_resolver_results::pointer
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

The type of the result of applying operator->() to the iterator.

typedef const basic_resolver_entry< InternetProtocol > * pointer;
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/protocol_type.html000066400000000000000000000063031340672067200274010ustar00rootroot00000000000000 ip::basic_resolver_results::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type associated with the results.

typedef InternetProtocol protocol_type;
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/reference.html000066400000000000000000000204241340672067200264350ustar00rootroot00000000000000 ip::basic_resolver_results::reference
asio C++ library

PrevUpHomeNext

The type of a non-const reference to a value in the range.

typedef value_type & reference;
Types

Name

Description

endpoint_type

The endpoint type associated with the endpoint entry.

protocol_type

The protocol type associated with the endpoint entry.

Member Functions

Name

Description

basic_resolver_entry

Default constructor.

Construct with specified endpoint, host name and service name.

endpoint

Get the endpoint associated with the entry.

host_name

Get the host name associated with the entry.

operator endpoint_type

Convert to the endpoint associated with the entry.

service_name

Get the service name associated with the entry.

The ip::basic_resolver_entry class template describes an entry as returned by a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/size.html000066400000000000000000000050711340672067200254520ustar00rootroot00000000000000 ip::basic_resolver_results::size
asio C++ library

PrevUpHomeNext

Get the number of entries in the results range.

size_type size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/size_type.html000066400000000000000000000062001340672067200265060ustar00rootroot00000000000000 ip::basic_resolver_results::size_type
asio C++ library

PrevUpHomeNext

Type used to represent a count of the elements in the range.

typedef std::size_t size_type;
Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/swap.html000066400000000000000000000051151340672067200254510ustar00rootroot00000000000000 ip::basic_resolver_results::swap
asio C++ library

PrevUpHomeNext

Swap the results range with another.

void swap(
    basic_resolver_results & that);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/value_type.html000066400000000000000000000204351340672067200266560ustar00rootroot00000000000000 ip::basic_resolver_results::value_type
asio C++ library

PrevUpHomeNext

The type of a value in the results range.

typedef basic_resolver_entry< protocol_type > value_type;
Types

Name

Description

endpoint_type

The endpoint type associated with the endpoint entry.

protocol_type

The protocol type associated with the endpoint entry.

Member Functions

Name

Description

basic_resolver_entry

Default constructor.

Construct with specified endpoint, host name and service name.

endpoint

Get the endpoint associated with the entry.

host_name

Get the host name associated with the entry.

operator endpoint_type

Convert to the endpoint associated with the entry.

service_name

Get the service name associated with the entry.

The ip::basic_resolver_entry class template describes an entry as returned by a resolver.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/basic_resolver_results.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__basic_resolver_results/values_.html000066400000000000000000000051671340672067200261440ustar00rootroot00000000000000 ip::basic_resolver_results::values_
asio C++ library

PrevUpHomeNext

Inherited from ip::basic_resolver.

values_ptr_type values_;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__host_name.html000066400000000000000000000067251340672067200217010ustar00rootroot00000000000000 ip::host_name
asio C++ library

PrevUpHomeNext

Get the current host name.

std::string host_name();
  » more...

std::string host_name(
    asio::error_code & ec);
  » more...
Requirements

Header: asio/ip/host_name.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__host_name/000077500000000000000000000000001340672067200210015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__host_name/overload1.html000066400000000000000000000046231340672067200235700ustar00rootroot00000000000000 ip::host_name (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the current host name.

std::string host_name();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__host_name/overload2.html000066400000000000000000000046351340672067200235740ustar00rootroot00000000000000 ip::host_name (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the current host name.

std::string host_name(
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp.html000066400000000000000000000205161340672067200206460ustar00rootroot00000000000000 ip::icmp
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for ICMP.

class icmp
Types

Name

Description

endpoint

The type of a ICMP endpoint.

resolver

The ICMP resolver type.

socket

The ICMP socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

type

Obtain an identifier for the type of the protocol.

v4

Construct to represent the IPv4 ICMP protocol.

v6

Construct to represent the IPv6 ICMP protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The ip::icmp class contains flags necessary for ICMP sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/ip/icmp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/000077500000000000000000000000001340672067200177545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__icmp/endpoint.html000066400000000000000000000343051340672067200224670ustar00rootroot00000000000000 ip::icmp::endpoint
asio C++ library

PrevUpHomeNext

The type of a ICMP endpoint.

typedef basic_endpoint< icmp > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

address

Get the IP address associated with the endpoint.

Set the IP address associated with the endpoint.

basic_endpoint

Default constructor.

Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections.

Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint.

Copy constructor.

Move constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

Move-assign from another endpoint.

port

Get the port associated with the endpoint. The port number is always in the host's byte order.

Set the port associated with the endpoint. The port number is always in the host's byte order.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The ip::basic_endpoint class template describes an endpoint that may be associated with a particular socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/icmp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/family.html000066400000000000000000000046161340672067200221320ustar00rootroot00000000000000 ip::icmp::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/operator_eq__eq_.html000066400000000000000000000057661340672067200241630ustar00rootroot00000000000000 ip::icmp::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const icmp & p1,
    const icmp & p2);
Requirements

Header: asio/ip/icmp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/operator_not__eq_.html000066400000000000000000000057641340672067200243540ustar00rootroot00000000000000 ip::icmp::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const icmp & p1,
    const icmp & p2);
Requirements

Header: asio/ip/icmp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/protocol.html000066400000000000000000000046221340672067200225070ustar00rootroot00000000000000 ip::icmp::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/resolver.html000066400000000000000000000375121340672067200225130ustar00rootroot00000000000000 ip::icmp::resolver
asio C++ library

PrevUpHomeNext

The ICMP resolver type.

typedef basic_resolver< icmp > resolver;
Types

Name

Description

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

flags

A bitmask type (C++ Std [lib.bitmask.types]).

iterator

(Deprecated.) The iterator type.

protocol_type

The protocol type.

query

(Deprecated.) The query type.

results_type

The results type.

Member Functions

Name

Description

async_resolve

(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform reverse resolution of an endpoint to a list of entries.

basic_resolver

Constructor.

Move-construct a basic_resolver from another.

cancel

Cancel any asynchronous operations that are waiting on the resolver.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_resolver from another.

resolve

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

Perform forward resolution of a query to a list of entries.

Perform reverse resolution of an endpoint to a list of entries.

~basic_resolver

Destroys the resolver.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

The ip::basic_resolver class template provides the ability to resolve a query to a list of endpoints.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/icmp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/socket.html000066400000000000000000000777351340672067200221550ustar00rootroot00000000000000 ip::icmp::socket
asio C++ library

PrevUpHomeNext

The ICMP socket type.

typedef basic_raw_socket< icmp > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_raw_socket

Construct a basic_raw_socket without opening it.

Construct and open a basic_raw_socket.

Construct a basic_raw_socket, opening it and binding it to the given local endpoint.

Construct a basic_raw_socket on an existing native socket.

Move-construct a basic_raw_socket from another.

Move-construct a basic_raw_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_raw_socket from another.

Move-assign a basic_raw_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive raw data with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send raw data to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_raw_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_raw_socket class template provides asynchronous and blocking raw-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/icmp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/type.html000066400000000000000000000045101340672067200216230ustar00rootroot00000000000000 ip::icmp::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/v4.html000066400000000000000000000044601340672067200211770ustar00rootroot00000000000000 ip::icmp::v4
asio C++ library

PrevUpHomeNext

Construct to represent the IPv4 ICMP protocol.

static icmp v4();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__icmp/v6.html000066400000000000000000000046271340672067200212060ustar00rootroot00000000000000 ip::icmp::v6
asio C++ library

PrevUpHomeNext

Construct to represent the IPv6 ICMP protocol.

static icmp v6();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__multicast__enable_loopback.html000066400000000000000000000076531340672067200252510ustar00rootroot00000000000000 ip::multicast::enable_loopback
asio C++ library

PrevUpHomeNext

Socket option determining whether outgoing multicast packets will be received on the same socket if it is a member of the multicast group.

typedef implementation_defined enable_loopback;

Implements the IPPROTO_IP/IP_MULTICAST_LOOP socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::ip::multicast::enable_loopback option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::ip::multicast::enable_loopback option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/ip/multicast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__multicast__hops.html000066400000000000000000000074031340672067200231130ustar00rootroot00000000000000 ip::multicast::hops
asio C++ library

PrevUpHomeNext

Socket option for time-to-live associated with outgoing multicast packets.

typedef implementation_defined hops;

Implements the IPPROTO_IP/IP_MULTICAST_TTL socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::ip::multicast::hops option(4);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::ip::multicast::hops option;
socket.get_option(option);
int ttl = option.value();
Requirements

Header: asio/ip/multicast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__multicast__join_group.html000066400000000000000000000073211340672067200243140ustar00rootroot00000000000000 ip::multicast::join_group
asio C++ library

PrevUpHomeNext

Socket option to join a multicast group on a specified interface.

typedef implementation_defined join_group;

Implements the IPPROTO_IP/IP_ADD_MEMBERSHIP socket option.

Examples

Setting the option to join a multicast group:

asio::ip::udp::socket socket(io_context);
...
asio::ip::address multicast_address =
  asio::ip::address::from_string("225.0.0.1");
asio::ip::multicast::join_group option(multicast_address);
socket.set_option(option);
Requirements

Header: asio/ip/multicast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__multicast__leave_group.html000066400000000000000000000074301340672067200244520ustar00rootroot00000000000000 ip::multicast::leave_group
asio C++ library

PrevUpHomeNext

Socket option to leave a multicast group on a specified interface.

typedef implementation_defined leave_group;

Implements the IPPROTO_IP/IP_DROP_MEMBERSHIP socket option.

Examples

Setting the option to leave a multicast group:

asio::ip::udp::socket socket(io_context);
...
asio::ip::address multicast_address =
  asio::ip::address::from_string("225.0.0.1");
asio::ip::multicast::leave_group option(multicast_address);
socket.set_option(option);
Requirements

Header: asio/ip/multicast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__multicast__outbound_interface.html000066400000000000000000000074501340672067200260230ustar00rootroot00000000000000 ip::multicast::outbound_interface
asio C++ library

PrevUpHomeNext

Socket option for local interface to use for outgoing multicast packets.

typedef implementation_defined outbound_interface;

Implements the IPPROTO_IP/IP_MULTICAST_IF socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::ip::address_v4 local_interface =
  asio::ip::address_v4::from_string("1.2.3.4");
asio::ip::multicast::outbound_interface option(local_interface);
socket.set_option(option);
Requirements

Header: asio/ip/multicast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4.html000066400000000000000000000264161340672067200220250ustar00rootroot00000000000000 ip::network_v4
asio C++ library

PrevUpHomeNext

Represents an IPv4 network.

class network_v4
Member Functions

Name

Description

address

Obtain the address object specified when the network object was created.

broadcast

Obtain an address object that represents the network's broadcast address.

canonical

Obtain the true network address, omitting any host bits.

hosts

Obtain an address range corresponding to the hosts in the network.

is_host

Test if network is a valid host address.

is_subnet_of

Test if a network is a real subnet of another network.

netmask

Obtain the netmask that was specified when the network object was created.

network

Obtain an address object that represents the network address.

network_v4

Default constructor.

Construct a network based on the specified address and prefix length.

Construct network based on the specified address and netmask.

Copy constructor.

operator=

Assign from another network.

prefix_length

Obtain the prefix length that was specified when the network object was created.

to_string

Get the network as an address in dotted decimal format.

Friends

Name

Description

operator!=

Compare two networks for inequality.

operator==

Compare two networks for equality.

Related Functions

Name

Description

make_network_v4

Create an IPv4 network from a string containing IP address and prefix length.

The ip::network_v4 class provides the ability to use and manipulate IP version 4 networks.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/network_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/000077500000000000000000000000001340672067200211265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v4/address.html000066400000000000000000000047611340672067200234510ustar00rootroot00000000000000 ip::network_v4::address
asio C++ library

PrevUpHomeNext

Obtain the address object specified when the network object was created.

address_v4 address() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/broadcast.html000066400000000000000000000047531340672067200237670ustar00rootroot00000000000000 ip::network_v4::broadcast
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the network's broadcast address.

address_v4 broadcast() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/canonical.html000066400000000000000000000047221340672067200237500ustar00rootroot00000000000000 ip::network_v4::canonical
asio C++ library

PrevUpHomeNext

Obtain the true network address, omitting any host bits.

network_v4 canonical() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/hosts.html000066400000000000000000000047161340672067200231640ustar00rootroot00000000000000 ip::network_v4::hosts
asio C++ library

PrevUpHomeNext

Obtain an address range corresponding to the hosts in the network.

address_v4_range hosts() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/is_host.html000066400000000000000000000046721340672067200234750ustar00rootroot00000000000000 ip::network_v4::is_host
asio C++ library

PrevUpHomeNext

Test if network is a valid host address.

bool is_host() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/is_subnet_of.html000066400000000000000000000050401340672067200244720ustar00rootroot00000000000000 ip::network_v4::is_subnet_of
asio C++ library

PrevUpHomeNext

Test if a network is a real subnet of another network.

bool is_subnet_of(
    const network_v4 & other) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4.html000066400000000000000000000113061340672067200251140ustar00rootroot00000000000000 ip::network_v4::make_network_v4
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    const char * str);
  » more...

network_v4 make_network_v4(
    const char * str,
    asio::error_code & ec);
  » more...

network_v4 make_network_v4(
    const std::string & str);
  » more...

network_v4 make_network_v4(
    const std::string & str,
    asio::error_code & ec);
  » more...

network_v4 make_network_v4(
    string_view str);
  » more...

network_v4 make_network_v4(
    string_view str,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/000077500000000000000000000000001340672067200242255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/overload1.html000066400000000000000000000052421340672067200270120ustar00rootroot00000000000000 ip::network_v4::make_network_v4 (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/overload2.html000066400000000000000000000052711340672067200270150ustar00rootroot00000000000000 ip::network_v4::make_network_v4 (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/overload3.html000066400000000000000000000052451340672067200270170ustar00rootroot00000000000000 ip::network_v4::make_network_v4 (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/overload4.html000066400000000000000000000053041340672067200270140ustar00rootroot00000000000000 ip::network_v4::make_network_v4 (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/overload5.html000066400000000000000000000052311340672067200270140ustar00rootroot00000000000000 ip::network_v4::make_network_v4 (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    string_view str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/make_network_v4/overload6.html000066400000000000000000000052401340672067200270150ustar00rootroot00000000000000 ip::network_v4::make_network_v4 (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv4 network from a string containing IP address and prefix length.

network_v4 make_network_v4(
    string_view str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/netmask.html000066400000000000000000000050471340672067200234640ustar00rootroot00000000000000 ip::network_v4::netmask
asio C++ library

PrevUpHomeNext

Obtain the netmask that was specified when the network object was created.

address_v4 netmask() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/network.html000066400000000000000000000047251340672067200235150ustar00rootroot00000000000000 ip::network_v4::network
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the network address.

address_v4 network() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/network_v4.html000066400000000000000000000100641340672067200241170ustar00rootroot00000000000000 ip::network_v4::network_v4
asio C++ library

PrevUpHomeNext

Default constructor.

network_v4();
  » more...

Construct a network based on the specified address and prefix length.

network_v4(
    const address_v4 & addr,
    unsigned short prefix_len);
  » more...

Construct network based on the specified address and netmask.

network_v4(
    const address_v4 & addr,
    const address_v4 & mask);
  » more...

Copy constructor.

network_v4(
    const network_v4 & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/network_v4/000077500000000000000000000000001340672067200232305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v4/network_v4/overload1.html000066400000000000000000000047671340672067200260300ustar00rootroot00000000000000 ip::network_v4::network_v4 (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

network_v4();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/network_v4/overload2.html000066400000000000000000000051561340672067200260220ustar00rootroot00000000000000 ip::network_v4::network_v4 (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a network based on the specified address and prefix length.

network_v4(
    const address_v4 & addr,
    unsigned short prefix_len);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/network_v4/overload3.html000066400000000000000000000051501340672067200260150ustar00rootroot00000000000000 ip::network_v4::network_v4 (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct network based on the specified address and netmask.

network_v4(
    const address_v4 & addr,
    const address_v4 & mask);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/network_v4/overload4.html000066400000000000000000000050521340672067200260170ustar00rootroot00000000000000 ip::network_v4::network_v4 (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

network_v4(
    const network_v4 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/operator_eq_.html000066400000000000000000000050371340672067200245000ustar00rootroot00000000000000 ip::network_v4::operator=
asio C++ library

PrevUpHomeNext

Assign from another network.

network_v4 & operator=(
    const network_v4 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/operator_eq__eq_.html000066400000000000000000000061351340672067200253240ustar00rootroot00000000000000 ip::network_v4::operator==
asio C++ library

PrevUpHomeNext

Compare two networks for equality.

friend bool operator==(
    const network_v4 & a,
    const network_v4 & b);
Requirements

Header: asio/ip/network_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/operator_not__eq_.html000066400000000000000000000062131340672067200255140ustar00rootroot00000000000000 ip::network_v4::operator!=
asio C++ library

PrevUpHomeNext

Compare two networks for inequality.

friend bool operator!=(
    const network_v4 & a,
    const network_v4 & b);
Requirements

Header: asio/ip/network_v4.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/prefix_length.html000066400000000000000000000050601340672067200246530ustar00rootroot00000000000000 ip::network_v4::prefix_length
asio C++ library

PrevUpHomeNext

Obtain the prefix length that was specified when the network object was created.

unsigned short prefix_length() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/to_string.html000066400000000000000000000061651340672067200240340ustar00rootroot00000000000000 ip::network_v4::to_string
asio C++ library

PrevUpHomeNext

Get the network as an address in dotted decimal format.

std::string to_string() const;
  » more...

std::string to_string(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/to_string/000077500000000000000000000000001340672067200231365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v4/to_string/overload1.html000066400000000000000000000050361340672067200257240ustar00rootroot00000000000000 ip::network_v4::to_string (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the network as an address in dotted decimal format.

std::string to_string() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v4/to_string/overload2.html000066400000000000000000000051111340672067200257170ustar00rootroot00000000000000 ip::network_v4::to_string (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the network as an address in dotted decimal format.

std::string to_string(
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6.html000066400000000000000000000245231340672067200220240ustar00rootroot00000000000000 ip::network_v6
asio C++ library

PrevUpHomeNext

Represents an IPv6 network.

class network_v6
Member Functions

Name

Description

address

Obtain the address object specified when the network object was created.

canonical

Obtain the true network address, omitting any host bits.

hosts

Obtain an address range corresponding to the hosts in the network.

is_host

Test if network is a valid host address.

is_subnet_of

Test if a network is a real subnet of another network.

network

Obtain an address object that represents the network address.

network_v6

Default constructor.

Construct a network based on the specified address and prefix length.

Copy constructor.

operator=

Assign from another network.

prefix_length

Obtain the prefix length that was specified when the network object was created.

to_string

Get the network as an address in dotted decimal format.

Friends

Name

Description

operator!=

Compare two networks for inequality.

operator==

Compare two networks for equality.

Related Functions

Name

Description

make_network_v6

Create an IPv6 network from a string containing IP address and prefix length.

The ip::network_v6 class provides the ability to use and manipulate IP version 6 networks.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/network_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/000077500000000000000000000000001340672067200211305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v6/address.html000066400000000000000000000047611340672067200234530ustar00rootroot00000000000000 ip::network_v6::address
asio C++ library

PrevUpHomeNext

Obtain the address object specified when the network object was created.

address_v6 address() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/canonical.html000066400000000000000000000047121340672067200237510ustar00rootroot00000000000000 ip::network_v6::canonical
asio C++ library

PrevUpHomeNext

Obtain the true network address, omitting any host bits.

network_v6 canonical() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/hosts.html000066400000000000000000000047161340672067200231660ustar00rootroot00000000000000 ip::network_v6::hosts
asio C++ library

PrevUpHomeNext

Obtain an address range corresponding to the hosts in the network.

address_v6_range hosts() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/is_host.html000066400000000000000000000046721340672067200234770ustar00rootroot00000000000000 ip::network_v6::is_host
asio C++ library

PrevUpHomeNext

Test if network is a valid host address.

bool is_host() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/is_subnet_of.html000066400000000000000000000050401340672067200244740ustar00rootroot00000000000000 ip::network_v6::is_subnet_of
asio C++ library

PrevUpHomeNext

Test if a network is a real subnet of another network.

bool is_subnet_of(
    const network_v6 & other) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6.html000066400000000000000000000113061340672067200251200ustar00rootroot00000000000000 ip::network_v6::make_network_v6
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    const char * str);
  » more...

network_v6 make_network_v6(
    const char * str,
    asio::error_code & ec);
  » more...

network_v6 make_network_v6(
    const std::string & str);
  » more...

network_v6 make_network_v6(
    const std::string & str,
    asio::error_code & ec);
  » more...

network_v6 make_network_v6(
    string_view str);
  » more...

network_v6 make_network_v6(
    string_view str,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/000077500000000000000000000000001340672067200242315ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/overload1.html000066400000000000000000000052421340672067200270160ustar00rootroot00000000000000 ip::network_v6::make_network_v6 (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    const char * str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/overload2.html000066400000000000000000000052711340672067200270210ustar00rootroot00000000000000 ip::network_v6::make_network_v6 (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    const char * str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/overload3.html000066400000000000000000000052451340672067200270230ustar00rootroot00000000000000 ip::network_v6::make_network_v6 (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    const std::string & str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/overload4.html000066400000000000000000000053041340672067200270200ustar00rootroot00000000000000 ip::network_v6::make_network_v6 (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    const std::string & str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/overload5.html000066400000000000000000000052311340672067200270200ustar00rootroot00000000000000 ip::network_v6::make_network_v6 (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    string_view str);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/make_network_v6/overload6.html000066400000000000000000000052401340672067200270210ustar00rootroot00000000000000 ip::network_v6::make_network_v6 (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Create an IPv6 network from a string containing IP address and prefix length.

network_v6 make_network_v6(
    string_view str,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/network.html000066400000000000000000000050461340672067200235140ustar00rootroot00000000000000 ip::network_v6::network
asio C++ library

PrevUpHomeNext

Obtain an address object that represents the network address.

address_v6 network() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/network_v6.html000066400000000000000000000071331340672067200241260ustar00rootroot00000000000000 ip::network_v6::network_v6
asio C++ library

PrevUpHomeNext

Default constructor.

network_v6();
  » more...

Construct a network based on the specified address and prefix length.

network_v6(
    const address_v6 & addr,
    unsigned short prefix_len);
  » more...

Copy constructor.

network_v6(
    const network_v6 & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/network_v6/000077500000000000000000000000001340672067200232345ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v6/network_v6/overload1.html000066400000000000000000000047671340672067200260340ustar00rootroot00000000000000 ip::network_v6::network_v6 (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

network_v6();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/network_v6/overload2.html000066400000000000000000000051561340672067200260260ustar00rootroot00000000000000 ip::network_v6::network_v6 (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a network based on the specified address and prefix length.

network_v6(
    const address_v6 & addr,
    unsigned short prefix_len);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/network_v6/overload3.html000066400000000000000000000050521340672067200260220ustar00rootroot00000000000000 ip::network_v6::network_v6 (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

network_v6(
    const network_v6 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/operator_eq_.html000066400000000000000000000050371340672067200245020ustar00rootroot00000000000000 ip::network_v6::operator=
asio C++ library

PrevUpHomeNext

Assign from another network.

network_v6 & operator=(
    const network_v6 & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/operator_eq__eq_.html000066400000000000000000000061351340672067200253260ustar00rootroot00000000000000 ip::network_v6::operator==
asio C++ library

PrevUpHomeNext

Compare two networks for equality.

friend bool operator==(
    const network_v6 & a,
    const network_v6 & b);
Requirements

Header: asio/ip/network_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/operator_not__eq_.html000066400000000000000000000062131340672067200255160ustar00rootroot00000000000000 ip::network_v6::operator!=
asio C++ library

PrevUpHomeNext

Compare two networks for inequality.

friend bool operator!=(
    const network_v6 & a,
    const network_v6 & b);
Requirements

Header: asio/ip/network_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/prefix_length.html000066400000000000000000000050601340672067200246550ustar00rootroot00000000000000 ip::network_v6::prefix_length
asio C++ library

PrevUpHomeNext

Obtain the prefix length that was specified when the network object was created.

unsigned short prefix_length() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/to_string.html000066400000000000000000000061651340672067200240360ustar00rootroot00000000000000 ip::network_v6::to_string
asio C++ library

PrevUpHomeNext

Get the network as an address in dotted decimal format.

std::string to_string() const;
  » more...

std::string to_string(
    asio::error_code & ec) const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/to_string/000077500000000000000000000000001340672067200231405ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__network_v6/to_string/overload1.html000066400000000000000000000050361340672067200257260ustar00rootroot00000000000000 ip::network_v6::to_string (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the network as an address in dotted decimal format.

std::string to_string() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__network_v6/to_string/overload2.html000066400000000000000000000051251340672067200257260ustar00rootroot00000000000000 ip::network_v6::to_string (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the network as an address in dotted decimal format.

std::string to_string(
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base.html000066400000000000000000000217141340672067200225520ustar00rootroot00000000000000 ip::resolver_base
asio C++ library

PrevUpHomeNext

The ip::resolver_base class is used as a base for the ip::basic_resolver class templates to provide a common place to define the flag constants.

class resolver_base
Types

Name

Description

flags

A bitmask type (C++ Std [lib.bitmask.types]).

Protected Member Functions

Name

Description

~resolver_base

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

Requirements

Header: asio/ip/resolver_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/000077500000000000000000000000001340672067200216575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__resolver_base/_resolver_base.html000066400000000000000000000051061340672067200255410ustar00rootroot00000000000000 ip::resolver_base::~resolver_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~resolver_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/address_configured.html000066400000000000000000000054101340672067200263770ustar00rootroot00000000000000 ip::resolver_base::address_configured
asio C++ library

PrevUpHomeNext

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

static const flags address_configured = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/all_matching.html000066400000000000000000000051651340672067200251760ustar00rootroot00000000000000 ip::resolver_base::all_matching
asio C++ library

PrevUpHomeNext

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

static const flags all_matching = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/canonical_name.html000066400000000000000000000051031340672067200254730ustar00rootroot00000000000000 ip::resolver_base::canonical_name
asio C++ library

PrevUpHomeNext

Determine the canonical name of the host specified in the query.

static const flags canonical_name = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/flags.html000066400000000000000000000060061340672067200236430ustar00rootroot00000000000000 ip::resolver_base::flags
asio C++ library

PrevUpHomeNext

A bitmask type (C++ Std [lib.bitmask.types]).

typedef unspecified flags;
Requirements

Header: asio/ip/resolver_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/numeric_host.html000066400000000000000000000052071340672067200252500ustar00rootroot00000000000000 ip::resolver_base::numeric_host
asio C++ library

PrevUpHomeNext

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

static const flags numeric_host = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/numeric_service.html000066400000000000000000000052211340672067200257270ustar00rootroot00000000000000 ip::resolver_base::numeric_service
asio C++ library

PrevUpHomeNext

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

static const flags numeric_service = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/passive.html000066400000000000000000000051051340672067200242200ustar00rootroot00000000000000 ip::resolver_base::passive
asio C++ library

PrevUpHomeNext

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

static const flags passive = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_base/v4_mapped.html000066400000000000000000000051541340672067200244310ustar00rootroot00000000000000 ip::resolver_base::v4_mapped
asio C++ library

PrevUpHomeNext

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

static const flags v4_mapped = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base.html000066400000000000000000000224341340672067200237770ustar00rootroot00000000000000 ip::resolver_query_base
asio C++ library

PrevUpHomeNext

The ip::resolver_query_base class is used as a base for the ip::basic_resolver_query class templates to provide a common place to define the flag constants.

class resolver_query_base :
  public ip::resolver_base
Types

Name

Description

flags

A bitmask type (C++ Std [lib.bitmask.types]).

Protected Member Functions

Name

Description

~resolver_query_base

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

Requirements

Header: asio/ip/resolver_query_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/000077500000000000000000000000001340672067200231045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__resolver_query_base/_resolver_query_base.html000066400000000000000000000051541340672067200302160ustar00rootroot00000000000000 ip::resolver_query_base::~resolver_query_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~resolver_query_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/address_configured.html000066400000000000000000000057001340672067200276260ustar00rootroot00000000000000 ip::resolver_query_base::address_configured
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

static const flags address_configured = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/all_matching.html000066400000000000000000000054331340672067200264210ustar00rootroot00000000000000 ip::resolver_query_base::all_matching
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

static const flags all_matching = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/canonical_name.html000066400000000000000000000053511340672067200267250ustar00rootroot00000000000000 ip::resolver_query_base::canonical_name
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Determine the canonical name of the host specified in the query.

static const flags canonical_name = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/flags.html000066400000000000000000000063041340672067200250710ustar00rootroot00000000000000 ip::resolver_query_base::flags
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

A bitmask type (C++ Std [lib.bitmask.types]).

typedef unspecified flags;
Requirements

Header: asio/ip/resolver_query_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/numeric_host.html000066400000000000000000000054551340672067200265020ustar00rootroot00000000000000 ip::resolver_query_base::numeric_host
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

static const flags numeric_host = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/numeric_service.html000066400000000000000000000054671340672067200271700ustar00rootroot00000000000000 ip::resolver_query_base::numeric_service
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

static const flags numeric_service = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/passive.html000066400000000000000000000053531340672067200254520ustar00rootroot00000000000000 ip::resolver_query_base::passive
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

static const flags passive = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__resolver_query_base/v4_mapped.html000066400000000000000000000054521340672067200256570ustar00rootroot00000000000000 ip::resolver_query_base::v4_mapped
asio C++ library

PrevUpHomeNext

Inherited from ip::resolver_base.

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

static const flags v4_mapped = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp.html000066400000000000000000000225221340672067200205030ustar00rootroot00000000000000 ip::tcp
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for TCP.

class tcp
Types

Name

Description

acceptor

The TCP acceptor type.

endpoint

The type of a TCP endpoint.

iostream

The TCP iostream type.

no_delay

Socket option for disabling the Nagle algorithm.

resolver

The TCP resolver type.

socket

The TCP socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

type

Obtain an identifier for the type of the protocol.

v4

Construct to represent the IPv4 TCP protocol.

v6

Construct to represent the IPv6 TCP protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The ip::tcp class contains flags necessary for TCP sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/000077500000000000000000000000001340672067200176125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__tcp/acceptor.html000066400000000000000000000702771340672067200223150ustar00rootroot00000000000000 ip::tcp::acceptor
asio C++ library

PrevUpHomeNext

The TCP acceptor type.

typedef basic_socket_acceptor< tcp > acceptor;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of an acceptor.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

accept

Accept a new connection.

Accept a new connection and obtain the endpoint of the peer.

assign

Assigns an existing native acceptor to the acceptor.

async_accept

Start an asynchronous accept.

async_wait

Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

basic_socket_acceptor

Construct an acceptor without opening it.

Construct an open acceptor.

Construct an acceptor opened on the given endpoint.

Construct a basic_socket_acceptor on an existing native acceptor.

Move-construct a basic_socket_acceptor from another.

Move-construct a basic_socket_acceptor from an acceptor of another protocol type.

bind

Bind the acceptor to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the acceptor.

close

Close the acceptor.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the acceptor.

io_control

Perform an IO control command on the acceptor.

is_open

Determine whether the acceptor is open.

listen

Place the acceptor into the state where it will listen for new connections.

local_endpoint

Get the local endpoint of the acceptor.

native_handle

Get the native acceptor representation.

native_non_blocking

Gets the non-blocking mode of the native acceptor implementation.

Sets the non-blocking mode of the native acceptor implementation.

non_blocking

Gets the non-blocking mode of the acceptor.

Sets the non-blocking mode of the acceptor.

open

Open the acceptor using the specified protocol.

operator=

Move-assign a basic_socket_acceptor from another.

Move-assign a basic_socket_acceptor from an acceptor of another protocol type.

release

Release ownership of the underlying native acceptor.

set_option

Set an option on the acceptor.

wait

Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

~basic_socket_acceptor

Destroys the acceptor.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket_acceptor class template is used for accepting new socket connections.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Example

Opening a socket acceptor with the SO_REUSEADDR option enabled:

asio::ip::tcp::acceptor acceptor(io_context);
asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
acceptor.open(endpoint.protocol());
acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();
Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/endpoint.html000066400000000000000000000342601340672067200223250ustar00rootroot00000000000000 ip::tcp::endpoint
asio C++ library

PrevUpHomeNext

The type of a TCP endpoint.

typedef basic_endpoint< tcp > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

address

Get the IP address associated with the endpoint.

Set the IP address associated with the endpoint.

basic_endpoint

Default constructor.

Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections.

Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint.

Copy constructor.

Move constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

Move-assign from another endpoint.

port

Get the port associated with the endpoint. The port number is always in the host's byte order.

Set the port associated with the endpoint. The port number is always in the host's byte order.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The ip::basic_endpoint class template describes an endpoint that may be associated with a particular socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/family.html000066400000000000000000000045461340672067200217720ustar00rootroot00000000000000 ip::tcp::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/iostream.html000066400000000000000000000274301340672067200223310ustar00rootroot00000000000000 ip::tcp::iostream
asio C++ library

PrevUpHomeNext

The TCP iostream type.

typedef basic_socket_iostream< tcp > iostream;
Types

Name

Description

clock_type

The clock type.

duration

The duration type.

duration_type

(Deprecated: Use duration.) The duration type.

endpoint_type

The endpoint type.

protocol_type

The protocol type.

time_point

The time type.

time_type

(Deprecated: Use time_point.) The time type.

Member Functions

Name

Description

basic_socket_iostream

Construct a basic_socket_iostream without establishing a connection.

Construct a basic_socket_iostream from the supplied socket.

Move-construct a basic_socket_iostream from another.

Establish a connection to an endpoint corresponding to a resolver query.

close

Close the connection.

connect

Establish a connection to an endpoint corresponding to a resolver query.

error

Get the last error associated with the stream.

expires_after

Set the stream's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time.

Set the stream's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the stream's expiry time relative to now.

(Deprecated: Use expires_after().) Set the stream's expiry time relative to now.

expiry

Get the stream's expiry time as an absolute time.

operator=

Move-assign a basic_socket_iostream from another.

rdbuf

Return a pointer to the underlying streambuf.

socket

Get a reference to the underlying socket.

Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/no_delay.html000066400000000000000000000071731340672067200223020ustar00rootroot00000000000000 ip::tcp::no_delay
asio C++ library

PrevUpHomeNext

Socket option for disabling the Nagle algorithm.

typedef implementation_defined no_delay;

Implements the IPPROTO_TCP/TCP_NODELAY socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::tcp::no_delay option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/operator_eq__eq_.html000066400000000000000000000057451340672067200240160ustar00rootroot00000000000000 ip::tcp::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const tcp & p1,
    const tcp & p2);
Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/operator_not__eq_.html000066400000000000000000000057531340672067200242100ustar00rootroot00000000000000 ip::tcp::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const tcp & p1,
    const tcp & p2);
Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/protocol.html000066400000000000000000000046071340672067200223500ustar00rootroot00000000000000 ip::tcp::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/resolver.html000066400000000000000000000374551340672067200223570ustar00rootroot00000000000000 ip::tcp::resolver
asio C++ library

PrevUpHomeNext

The TCP resolver type.

typedef basic_resolver< tcp > resolver;
Types

Name

Description

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

flags

A bitmask type (C++ Std [lib.bitmask.types]).

iterator

(Deprecated.) The iterator type.

protocol_type

The protocol type.

query

(Deprecated.) The query type.

results_type

The results type.

Member Functions

Name

Description

async_resolve

(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform reverse resolution of an endpoint to a list of entries.

basic_resolver

Constructor.

Move-construct a basic_resolver from another.

cancel

Cancel any asynchronous operations that are waiting on the resolver.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_resolver from another.

resolve

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

Perform forward resolution of a query to a list of entries.

Perform reverse resolution of an endpoint to a list of entries.

~basic_resolver

Destroys the resolver.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

The ip::basic_resolver class template provides the ability to resolve a query to a list of endpoints.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/socket.html000066400000000000000000001006501340672067200217720ustar00rootroot00000000000000 ip::tcp::socket
asio C++ library

PrevUpHomeNext

The TCP socket type.

typedef basic_stream_socket< tcp > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_read_some

Start an asynchronous read.

async_receive

Start an asynchronous receive.

async_send

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

async_write_some

Start an asynchronous write.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_stream_socket

Construct a basic_stream_socket without opening it.

Construct and open a basic_stream_socket.

Construct a basic_stream_socket, opening it and binding it to the given local endpoint.

Construct a basic_stream_socket on an existing native socket.

Move-construct a basic_stream_socket from another.

Move-construct a basic_stream_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_stream_socket from another.

Move-assign a basic_stream_socket from a socket of another protocol type.

read_some

Read some data from the socket.

receive

Receive some data on the socket.

Receive some data on a connected socket.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

write_some

Write some data to the socket.

~basic_stream_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_stream_socket class template provides asynchronous and blocking stream-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/tcp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/type.html000066400000000000000000000044751340672067200214730ustar00rootroot00000000000000 ip::tcp::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/v4.html000066400000000000000000000044311340672067200210330ustar00rootroot00000000000000 ip::tcp::v4
asio C++ library

PrevUpHomeNext

Construct to represent the IPv4 TCP protocol.

static tcp v4();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__tcp/v6.html000066400000000000000000000044451340672067200210420ustar00rootroot00000000000000 ip::tcp::v6
asio C++ library

PrevUpHomeNext

Construct to represent the IPv6 TCP protocol.

static tcp v6();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp.html000066400000000000000000000203251340672067200205040ustar00rootroot00000000000000 ip::udp
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for UDP.

class udp
Types

Name

Description

endpoint

The type of a UDP endpoint.

resolver

The UDP resolver type.

socket

The UDP socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

type

Obtain an identifier for the type of the protocol.

v4

Construct to represent the IPv4 UDP protocol.

v6

Construct to represent the IPv6 UDP protocol.

Friends

Name

Description

operator!=

Compare two protocols for inequality.

operator==

Compare two protocols for equality.

The ip::udp class contains flags necessary for UDP sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/ip/udp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/000077500000000000000000000000001340672067200176145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ip__udp/endpoint.html000066400000000000000000000342541340672067200223320ustar00rootroot00000000000000 ip::udp::endpoint
asio C++ library

PrevUpHomeNext

The type of a UDP endpoint.

typedef basic_endpoint< udp > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

address

Get the IP address associated with the endpoint.

Set the IP address associated with the endpoint.

basic_endpoint

Default constructor.

Construct an endpoint using a port number, specified in the host's byte order. The IP address will be the any address (i.e. INADDR_ANY or in6addr_any). This constructor would typically be used for accepting new connections.

Construct an endpoint using a port number and an IP address. This constructor may be used for accepting connections on a specific interface or for making a connection to a remote endpoint.

Copy constructor.

Move constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

Move-assign from another endpoint.

port

Get the port associated with the endpoint. The port number is always in the host's byte order.

Set the port associated with the endpoint. The port number is always in the host's byte order.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The ip::basic_endpoint class template describes an endpoint that may be associated with a particular socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/udp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/family.html000066400000000000000000000046031340672067200217660ustar00rootroot00000000000000 ip::udp::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/operator_eq__eq_.html000066400000000000000000000057451340672067200240200ustar00rootroot00000000000000 ip::udp::operator==
asio C++ library

PrevUpHomeNext

Compare two protocols for equality.

friend bool operator==(
    const udp & p1,
    const udp & p2);
Requirements

Header: asio/ip/udp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/operator_not__eq_.html000066400000000000000000000057431340672067200242110ustar00rootroot00000000000000 ip::udp::operator!=
asio C++ library

PrevUpHomeNext

Compare two protocols for inequality.

friend bool operator!=(
    const udp & p1,
    const udp & p2);
Requirements

Header: asio/ip/udp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/protocol.html000066400000000000000000000046071340672067200223520ustar00rootroot00000000000000 ip::udp::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/resolver.html000066400000000000000000000374551340672067200223610ustar00rootroot00000000000000 ip::udp::resolver
asio C++ library

PrevUpHomeNext

The UDP resolver type.

typedef basic_resolver< udp > resolver;
Types

Name

Description

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

flags

A bitmask type (C++ Std [lib.bitmask.types]).

iterator

(Deprecated.) The iterator type.

protocol_type

The protocol type.

query

(Deprecated.) The query type.

results_type

The results type.

Member Functions

Name

Description

async_resolve

(Deprecated: Use overload with separate host and service parameters.) Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform forward resolution of a query to a list of entries.

Asynchronously perform reverse resolution of an endpoint to a list of entries.

basic_resolver

Constructor.

Move-construct a basic_resolver from another.

cancel

Cancel any asynchronous operations that are waiting on the resolver.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_resolver from another.

resolve

(Deprecated: Use overload with separate host and service parameters.) Perform forward resolution of a query to a list of entries.

Perform forward resolution of a query to a list of entries.

Perform reverse resolution of an endpoint to a list of entries.

~basic_resolver

Destroys the resolver.

Data Members

Name

Description

address_configured

Only return IPv4 addresses if a non-loopback IPv4 address is configured for the system. Only return IPv6 addresses if a non-loopback IPv6 address is configured for the system.

all_matching

If used with v4_mapped, return all matching IPv6 and IPv4 addresses.

canonical_name

Determine the canonical name of the host specified in the query.

numeric_host

Host name should be treated as a numeric string defining an IPv4 or IPv6 address and no name resolution should be attempted.

numeric_service

Service name should be treated as a numeric string defining a port number and no name resolution should be attempted.

passive

Indicate that returned endpoint is intended for use as a locally bound socket endpoint.

v4_mapped

If the query protocol family is specified as IPv6, return IPv4-mapped IPv6 addresses on finding no IPv6 addresses.

The ip::basic_resolver class template provides the ability to resolve a query to a list of endpoints.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/udp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/socket.html000066400000000000000000001013011340672067200217660ustar00rootroot00000000000000 ip::udp::socket
asio C++ library

PrevUpHomeNext

The UDP socket type.

typedef basic_datagram_socket< udp > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_datagram_socket

Construct a basic_datagram_socket without opening it.

Construct and open a basic_datagram_socket.

Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.

Construct a basic_datagram_socket on an existing native socket.

Move-construct a basic_datagram_socket from another.

Move-construct a basic_datagram_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_datagram_socket from another.

Move-assign a basic_datagram_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive a datagram with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send a datagram to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_datagram_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_datagram_socket class template provides asynchronous and blocking datagram-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/ip/udp.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/type.html000066400000000000000000000044751340672067200214750ustar00rootroot00000000000000 ip::udp::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/v4.html000066400000000000000000000044311340672067200210350ustar00rootroot00000000000000 ip::udp::v4
asio C++ library

PrevUpHomeNext

Construct to represent the IPv4 UDP protocol.

static udp v4();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__udp/v6.html000066400000000000000000000045151340672067200210420ustar00rootroot00000000000000 ip::udp::v6
asio C++ library

PrevUpHomeNext

Construct to represent the IPv6 UDP protocol.

static udp v6();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__unicast__hops.html000066400000000000000000000071461340672067200225600ustar00rootroot00000000000000 ip::unicast::hops
asio C++ library

PrevUpHomeNext

Socket option for time-to-live associated with outgoing unicast packets.

typedef implementation_defined hops;

Implements the IPPROTO_IP/IP_UNICAST_TTL socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::ip::unicast::hops option(4);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::ip::unicast::hops option;
socket.get_option(option);
int ttl = option.value();
Requirements

Header: asio/ip/unicast.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__v4_mapped_t.html000066400000000000000000000065031340672067200221200ustar00rootroot00000000000000 ip::v4_mapped_t
asio C++ library

PrevUpHomeNext

Tag type used for distinguishing overloads that deal in IPv4-mapped IPv6 addresses.

enum v4_mapped_t

Values

v4_mapped
Requirements

Header: asio/ip/address_v6.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ip__v6_only.html000066400000000000000000000071231340672067200213110ustar00rootroot00000000000000 ip::v6_only
asio C++ library

PrevUpHomeNext

Socket option for determining whether an IPv6 socket supports IPv6 communication only.

typedef implementation_defined v6_only;

Implements the IPPROTO_IPV6/IP_V6ONLY socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::v6_only option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::ip::v6_only option;
socket.get_option(option);
bool v6_only = option.value();
Requirements

Header: asio/ip/v6_only.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_const_buffer_sequence.html000066400000000000000000000056471340672067200241410ustar00rootroot00000000000000 is_const_buffer_sequence
asio C++ library

PrevUpHomeNext

Trait to determine whether a type satisfies the ConstBufferSequence requirements.

template<
    typename T>
struct is_const_buffer_sequence
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_dynamic_buffer.html000066400000000000000000000056331340672067200225420ustar00rootroot00000000000000 is_dynamic_buffer
asio C++ library

PrevUpHomeNext

Trait to determine whether a type satisfies the DynamicBuffer requirements.

template<
    typename T>
struct is_dynamic_buffer
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_endpoint_sequence.html000066400000000000000000000100571340672067200232710ustar00rootroot00000000000000 is_endpoint_sequence
asio C++ library

PrevUpHomeNext

Type trait used to determine whether a type is an endpoint sequence that can be used with with connect and async_connect.

template<
    typename T>
struct is_endpoint_sequence
Data Members

Name

Description

value

The value member is true if the type may be used as an endpoint sequence.

Requirements

Header: asio/connect.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_endpoint_sequence/000077500000000000000000000000001340672067200224005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/is_endpoint_sequence/value.html000066400000000000000000000050621340672067200244050ustar00rootroot00000000000000 is_endpoint_sequence::value
asio C++ library

PrevUpHomeNext

The value member is true if the type may be used as an endpoint sequence.

static const bool value;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_executor.html000066400000000000000000000064621340672067200214240ustar00rootroot00000000000000 is_executor
asio C++ library

PrevUpHomeNext

The is_executor trait detects whether a type T meets the Executor type requirements.

template<
    typename T>
struct is_executor

Class template is_executor is a UnaryTypeTrait that is derived from true_type if the type T meets the syntactic requirements for Executor, otherwise false_type.

Requirements

Header: asio/is_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_match_condition.html000066400000000000000000000076271340672067200227340ustar00rootroot00000000000000 is_match_condition
asio C++ library

PrevUpHomeNext

Type trait used to determine whether a type can be used as a match condition function with read_until and async_read_until.

template<
    typename T>
struct is_match_condition
Data Members

Name

Description

value

The value member is true if the type may be used as a match condition.

Requirements

Header: asio/read_until.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_match_condition/000077500000000000000000000000001340672067200220325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/is_match_condition/value.html000066400000000000000000000051211340672067200240330ustar00rootroot00000000000000 is_match_condition::value
asio C++ library

PrevUpHomeNext

The value member is true if the type may be used as a match condition.

static const bool value;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_mutable_buffer_sequence.html000066400000000000000000000057561340672067200244450ustar00rootroot00000000000000 is_mutable_buffer_sequence
asio C++ library

PrevUpHomeNext

Trait to determine whether a type satisfies the MutableBufferSequence requirements.

template<
    typename T>
struct is_mutable_buffer_sequence
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_read_buffered.html000066400000000000000000000101161340672067200223320ustar00rootroot00000000000000 is_read_buffered
asio C++ library

PrevUpHomeNext

The is_read_buffered class is a traits class that may be used to determine whether a stream type supports buffering of read data.

template<
    typename Stream>
class is_read_buffered
Data Members

Name

Description

value

The value member is true only if the Stream type supports buffering of read data.

Requirements

Header: asio/is_read_buffered.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_read_buffered/000077500000000000000000000000001340672067200214455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/is_read_buffered/value.html000066400000000000000000000050361340672067200234530ustar00rootroot00000000000000 is_read_buffered::value
asio C++ library

PrevUpHomeNext

The value member is true only if the Stream type supports buffering of read data.

static const bool value;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_write_buffered.html000066400000000000000000000101351340672067200225520ustar00rootroot00000000000000 is_write_buffered
asio C++ library

PrevUpHomeNext

The is_write_buffered class is a traits class that may be used to determine whether a stream type supports buffering of written data.

template<
    typename Stream>
class is_write_buffered
Data Members

Name

Description

value

The value member is true only if the Stream type supports buffering of written data.

Requirements

Header: asio/is_write_buffered.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/is_write_buffered/000077500000000000000000000000001340672067200216645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/is_write_buffered/value.html000066400000000000000000000050761340672067200236760ustar00rootroot00000000000000 is_write_buffered::value
asio C++ library

PrevUpHomeNext

The value member is true only if the Stream type supports buffering of written data.

static const bool value;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint.html000066400000000000000000000315741340672067200233670ustar00rootroot00000000000000 local::basic_endpoint
asio C++ library

PrevUpHomeNext

Describes an endpoint for a UNIX socket.

template<
    typename Protocol>
class basic_endpoint
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint using the specified path name.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

path

Get the path associated with the endpoint.

Set the path associated with the endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The local::basic_endpoint class template describes an endpoint that may be associated with a particular UNIX socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/000077500000000000000000000000001340672067200224675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__basic_endpoint/basic_endpoint.html000066400000000000000000000102241340672067200263350ustar00rootroot00000000000000 local::basic_endpoint::basic_endpoint
asio C++ library

PrevUpHomeNext

Default constructor.

basic_endpoint();
  » more...

Construct an endpoint using the specified path name.

basic_endpoint(
    const char * path_name);
  » more...

basic_endpoint(
    const std::string & path_name);
  » more...

Copy constructor.

basic_endpoint(
    const basic_endpoint & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/basic_endpoint/000077500000000000000000000000001340672067200254505ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__basic_endpoint/basic_endpoint/overload1.html000066400000000000000000000051401340672067200302320ustar00rootroot00000000000000 local::basic_endpoint::basic_endpoint (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

basic_endpoint();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/basic_endpoint/overload2.html000066400000000000000000000052261340672067200302400ustar00rootroot00000000000000 local::basic_endpoint::basic_endpoint (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an endpoint using the specified path name.

basic_endpoint(
    const char * path_name);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/basic_endpoint/overload3.html000066400000000000000000000052411340672067200302360ustar00rootroot00000000000000 local::basic_endpoint::basic_endpoint (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct an endpoint using the specified path name.

basic_endpoint(
    const std::string & path_name);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/basic_endpoint/overload4.html000066400000000000000000000051521340672067200302400ustar00rootroot00000000000000 local::basic_endpoint::basic_endpoint (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

basic_endpoint(
    const basic_endpoint & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/capacity.html000066400000000000000000000051261340672067200251560ustar00rootroot00000000000000 local::basic_endpoint::capacity
asio C++ library

PrevUpHomeNext

Get the capacity of the endpoint in the native type.

std::size_t capacity() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/data.html000066400000000000000000000061001340672067200242630ustar00rootroot00000000000000 local::basic_endpoint::data
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

data_type * data();
  » more...

const data_type * data() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/data/000077500000000000000000000000001340672067200234005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__basic_endpoint/data/overload1.html000066400000000000000000000047731340672067200261750ustar00rootroot00000000000000 local::basic_endpoint::data (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

data_type * data();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/data/overload2.html000066400000000000000000000050331340672067200261640ustar00rootroot00000000000000 local::basic_endpoint::data (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the underlying endpoint in the native type.

const data_type * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/data_type.html000066400000000000000000000063341340672067200253350ustar00rootroot00000000000000 local::basic_endpoint::data_type
asio C++ library

PrevUpHomeNext

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

typedef implementation_defined data_type;
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_eq_.html000066400000000000000000000051651340672067200260430ustar00rootroot00000000000000 local::basic_endpoint::operator=
asio C++ library

PrevUpHomeNext

Assign from another endpoint.

basic_endpoint & operator=(
    const basic_endpoint & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_eq__eq_.html000066400000000000000000000063611340672067200266660ustar00rootroot00000000000000 local::basic_endpoint::operator==
asio C++ library

PrevUpHomeNext

Compare two endpoints for equality.

friend bool operator==(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_gt_.html000066400000000000000000000063631340672067200260510ustar00rootroot00000000000000 local::basic_endpoint::operator>
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator>(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_gt__eq_.html000066400000000000000000000063341340672067200266730ustar00rootroot00000000000000 local::basic_endpoint::operator>=
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator>=(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_lt_.html000066400000000000000000000063711340672067200260550ustar00rootroot00000000000000 local::basic_endpoint::operator<
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator<(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_lt__eq_.html000066400000000000000000000064111340672067200266740ustar00rootroot00000000000000 local::basic_endpoint::operator<=
asio C++ library

PrevUpHomeNext

Compare endpoints for ordering.

friend bool operator<=(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_lt__lt_.html000066400000000000000000000075401340672067200267120ustar00rootroot00000000000000 local::basic_endpoint::operator<<
asio C++ library

PrevUpHomeNext

Output an endpoint as a string.

std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const basic_endpoint< Protocol > & endpoint);

Used to output a human-readable string for a specified endpoint.

Parameters

os

The output stream to which the string will be written.

endpoint

The endpoint to be written.

Return Value

The output stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/operator_not__eq_.html000066400000000000000000000063611340672067200270610ustar00rootroot00000000000000 local::basic_endpoint::operator!=
asio C++ library

PrevUpHomeNext

Compare two endpoints for inequality.

friend bool operator!=(
    const basic_endpoint< Protocol > & e1,
    const basic_endpoint< Protocol > & e2);
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/path.html000066400000000000000000000067661340672067200243300ustar00rootroot00000000000000 local::basic_endpoint::path
asio C++ library

PrevUpHomeNext

Get the path associated with the endpoint.

std::string path() const;
  » more...

Set the path associated with the endpoint.

void path(
    const char * p);
  » more...

void path(
    const std::string & p);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/path/000077500000000000000000000000001340672067200234235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__basic_endpoint/path/overload1.html000066400000000000000000000047741340672067200262210ustar00rootroot00000000000000 local::basic_endpoint::path (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Get the path associated with the endpoint.

std::string path() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/path/overload2.html000066400000000000000000000050331340672067200262070ustar00rootroot00000000000000 local::basic_endpoint::path (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the path associated with the endpoint.

void path(
    const char * p);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/path/overload3.html000066400000000000000000000050351340672067200262120ustar00rootroot00000000000000 local::basic_endpoint::path (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Set the path associated with the endpoint.

void path(
    const std::string & p);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/protocol.html000066400000000000000000000051121340672067200252150ustar00rootroot00000000000000 local::basic_endpoint::protocol
asio C++ library

PrevUpHomeNext

The protocol associated with the endpoint.

protocol_type protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/protocol_type.html000066400000000000000000000061511340672067200262620ustar00rootroot00000000000000 local::basic_endpoint::protocol_type
asio C++ library

PrevUpHomeNext

The protocol type associated with the endpoint.

typedef Protocol protocol_type;
Requirements

Header: asio/local/basic_endpoint.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/resize.html000066400000000000000000000050461340672067200246630ustar00rootroot00000000000000 local::basic_endpoint::resize
asio C++ library

PrevUpHomeNext

Set the underlying size of the endpoint in the native type.

void resize(
    std::size_t new_size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__basic_endpoint/size.html000066400000000000000000000050361340672067200243330ustar00rootroot00000000000000 local::basic_endpoint::size
asio C++ library

PrevUpHomeNext

Get the underlying size of the endpoint in the native type.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__connect_pair.html000066400000000000000000000077531340672067200230540ustar00rootroot00000000000000 local::connect_pair
asio C++ library

PrevUpHomeNext

Create a pair of connected sockets.

template<
    typename Protocol>
void connect_pair(
    basic_socket< Protocol > & socket1,
    basic_socket< Protocol > & socket2);
  » more...

template<
    typename Protocol>
void connect_pair(
    basic_socket< Protocol > & socket1,
    basic_socket< Protocol > & socket2,
    asio::error_code & ec);
  » more...
Requirements

Header: asio/local/connect_pair.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__connect_pair/000077500000000000000000000000001340672067200221525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__connect_pair/overload1.html000066400000000000000000000052721340672067200247420ustar00rootroot00000000000000 local::connect_pair (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create a pair of connected sockets.

template<
    typename Protocol>
void connect_pair(
    basic_socket< Protocol > & socket1,
    basic_socket< Protocol > & socket2);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__connect_pair/overload2.html000066400000000000000000000053551340672067200247450ustar00rootroot00000000000000 local::connect_pair (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create a pair of connected sockets.

template<
    typename Protocol>
void connect_pair(
    basic_socket< Protocol > & socket1,
    basic_socket< Protocol > & socket2,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__datagram_protocol.html000066400000000000000000000155151340672067200241040ustar00rootroot00000000000000 local::datagram_protocol
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for datagram-oriented UNIX sockets.

class datagram_protocol
Types

Name

Description

endpoint

The type of a UNIX domain endpoint.

socket

The UNIX domain socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

type

Obtain an identifier for the type of the protocol.

The local::datagram_protocol class contains flags necessary for datagram-oriented UNIX domain sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/local/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__datagram_protocol/000077500000000000000000000000001340672067200232075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__datagram_protocol/endpoint.html000066400000000000000000000330361340672067200257220ustar00rootroot00000000000000 local::datagram_protocol::endpoint
asio C++ library

PrevUpHomeNext

The type of a UNIX domain endpoint.

typedef basic_endpoint< datagram_protocol > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint using the specified path name.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

path

Get the path associated with the endpoint.

Set the path associated with the endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The local::basic_endpoint class template describes an endpoint that may be associated with a particular UNIX socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/local/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__datagram_protocol/family.html000066400000000000000000000050411340672067200253560ustar00rootroot00000000000000 local::datagram_protocol::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__datagram_protocol/protocol.html000066400000000000000000000050301340672067200257340ustar00rootroot00000000000000 local::datagram_protocol::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__datagram_protocol/socket.html000066400000000000000000001022541340672067200253710ustar00rootroot00000000000000 local::datagram_protocol::socket
asio C++ library

PrevUpHomeNext

The UNIX domain socket type.

typedef basic_datagram_socket< datagram_protocol > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_receive

Start an asynchronous receive on a connected socket.

async_receive_from

Start an asynchronous receive.

async_send

Start an asynchronous send on a connected socket.

async_send_to

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_datagram_socket

Construct a basic_datagram_socket without opening it.

Construct and open a basic_datagram_socket.

Construct a basic_datagram_socket, opening it and binding it to the given local endpoint.

Construct a basic_datagram_socket on an existing native socket.

Move-construct a basic_datagram_socket from another.

Move-construct a basic_datagram_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_datagram_socket from another.

Move-assign a basic_datagram_socket from a socket of another protocol type.

receive

Receive some data on a connected socket.

receive_from

Receive a datagram with the endpoint of the sender.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on a connected socket.

send_to

Send a datagram to the specified endpoint.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

~basic_datagram_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_datagram_socket class template provides asynchronous and blocking datagram-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/local/datagram_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__datagram_protocol/type.html000066400000000000000000000050671340672067200250660ustar00rootroot00000000000000 local::datagram_protocol::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol.html000066400000000000000000000167171340672067200236240ustar00rootroot00000000000000 local::stream_protocol
asio C++ library

PrevUpHomeNext

Encapsulates the flags needed for stream-oriented UNIX sockets.

class stream_protocol
Types

Name

Description

acceptor

The UNIX domain acceptor type.

endpoint

The type of a UNIX domain endpoint.

iostream

The UNIX domain iostream type.

socket

The UNIX domain socket type.

Member Functions

Name

Description

family

Obtain an identifier for the protocol family.

protocol

Obtain an identifier for the protocol.

type

Obtain an identifier for the type of the protocol.

The local::stream_protocol class contains flags necessary for stream-oriented UNIX domain sockets.

Thread Safety

Distinct objects: Safe.

Shared objects: Safe.

Requirements

Header: asio/local/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/000077500000000000000000000000001340672067200227225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/local__stream_protocol/acceptor.html000066400000000000000000000713141340672067200254160ustar00rootroot00000000000000 local::stream_protocol::acceptor
asio C++ library

PrevUpHomeNext

The UNIX domain acceptor type.

typedef basic_socket_acceptor< stream_protocol > acceptor;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of an acceptor.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

accept

Accept a new connection.

Accept a new connection and obtain the endpoint of the peer.

assign

Assigns an existing native acceptor to the acceptor.

async_accept

Start an asynchronous accept.

async_wait

Asynchronously wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

basic_socket_acceptor

Construct an acceptor without opening it.

Construct an open acceptor.

Construct an acceptor opened on the given endpoint.

Construct a basic_socket_acceptor on an existing native acceptor.

Move-construct a basic_socket_acceptor from another.

Move-construct a basic_socket_acceptor from an acceptor of another protocol type.

bind

Bind the acceptor to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the acceptor.

close

Close the acceptor.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the acceptor.

io_control

Perform an IO control command on the acceptor.

is_open

Determine whether the acceptor is open.

listen

Place the acceptor into the state where it will listen for new connections.

local_endpoint

Get the local endpoint of the acceptor.

native_handle

Get the native acceptor representation.

native_non_blocking

Gets the non-blocking mode of the native acceptor implementation.

Sets the non-blocking mode of the native acceptor implementation.

non_blocking

Gets the non-blocking mode of the acceptor.

Sets the non-blocking mode of the acceptor.

open

Open the acceptor using the specified protocol.

operator=

Move-assign a basic_socket_acceptor from another.

Move-assign a basic_socket_acceptor from an acceptor of another protocol type.

release

Release ownership of the underlying native acceptor.

set_option

Set an option on the acceptor.

wait

Wait for the acceptor to become ready to read, ready to write, or to have pending error conditions.

~basic_socket_acceptor

Destroys the acceptor.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_socket_acceptor class template is used for accepting new socket connections.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Example

Opening a socket acceptor with the SO_REUSEADDR option enabled:

asio::ip::tcp::acceptor acceptor(io_context);
asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port);
acceptor.open(endpoint.protocol());
acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();
Requirements

Header: asio/local/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/endpoint.html000066400000000000000000000326611340672067200254400ustar00rootroot00000000000000 local::stream_protocol::endpoint
asio C++ library

PrevUpHomeNext

The type of a UNIX domain endpoint.

typedef basic_endpoint< stream_protocol > endpoint;
Types

Name

Description

data_type

The type of the endpoint structure. This type is dependent on the underlying implementation of the socket layer.

protocol_type

The protocol type associated with the endpoint.

Member Functions

Name

Description

basic_endpoint

Default constructor.

Construct an endpoint using the specified path name.

Copy constructor.

capacity

Get the capacity of the endpoint in the native type.

data

Get the underlying endpoint in the native type.

operator=

Assign from another endpoint.

path

Get the path associated with the endpoint.

Set the path associated with the endpoint.

protocol

The protocol associated with the endpoint.

resize

Set the underlying size of the endpoint in the native type.

size

Get the underlying size of the endpoint in the native type.

Friends

Name

Description

operator!=

Compare two endpoints for inequality.

operator<

Compare endpoints for ordering.

operator<=

Compare endpoints for ordering.

operator==

Compare two endpoints for equality.

operator>

Compare endpoints for ordering.

operator>=

Compare endpoints for ordering.

Related Functions

Name

Description

operator<<

Output an endpoint as a string.

The local::basic_endpoint class template describes an endpoint that may be associated with a particular UNIX socket.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/local/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/family.html000066400000000000000000000050131340672067200250700ustar00rootroot00000000000000 local::stream_protocol::family
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol family.

int family() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/iostream.html000066400000000000000000000301611340672067200254340ustar00rootroot00000000000000 local::stream_protocol::iostream
asio C++ library

PrevUpHomeNext

The UNIX domain iostream type.

typedef basic_socket_iostream< stream_protocol > iostream;
Types

Name

Description

clock_type

The clock type.

duration

The duration type.

duration_type

(Deprecated: Use duration.) The duration type.

endpoint_type

The endpoint type.

protocol_type

The protocol type.

time_point

The time type.

time_type

(Deprecated: Use time_point.) The time type.

Member Functions

Name

Description

basic_socket_iostream

Construct a basic_socket_iostream without establishing a connection.

Construct a basic_socket_iostream from the supplied socket.

Move-construct a basic_socket_iostream from another.

Establish a connection to an endpoint corresponding to a resolver query.

close

Close the connection.

connect

Establish a connection to an endpoint corresponding to a resolver query.

error

Get the last error associated with the stream.

expires_after

Set the stream's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the stream's expiry time as an absolute time.

Set the stream's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the stream's expiry time relative to now.

(Deprecated: Use expires_after().) Set the stream's expiry time relative to now.

expiry

Get the stream's expiry time as an absolute time.

operator=

Move-assign a basic_socket_iostream from another.

rdbuf

Return a pointer to the underlying streambuf.

socket

Get a reference to the underlying socket.

Requirements

Header: asio/local/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/protocol.html000066400000000000000000000050121340672067200254470ustar00rootroot00000000000000 local::stream_protocol::protocol
asio C++ library

PrevUpHomeNext

Obtain an identifier for the protocol.

int protocol() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/socket.html000066400000000000000000001015331340672067200251030ustar00rootroot00000000000000 local::stream_protocol::socket
asio C++ library

PrevUpHomeNext

The UNIX domain socket type.

typedef basic_stream_socket< stream_protocol > socket;
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

endpoint_type

The endpoint type.

executor_type

The type of the executor associated with the object.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

lowest_layer_type

A basic_socket is always the lowest layer.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

native_handle_type

The native representation of a socket.

out_of_band_inline

Socket option for putting received out-of-band data inline.

protocol_type

The protocol type.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native socket to the socket.

async_connect

Start an asynchronous connect.

async_read_some

Start an asynchronous read.

async_receive

Start an asynchronous receive.

async_send

Start an asynchronous send.

async_wait

Asynchronously wait for the socket to become ready to read, ready to write, or to have pending error conditions.

async_write_some

Start an asynchronous write.

at_mark

Determine whether the socket is at the out-of-band data mark.

available

Determine the number of bytes available for reading.

basic_stream_socket

Construct a basic_stream_socket without opening it.

Construct and open a basic_stream_socket.

Construct a basic_stream_socket, opening it and binding it to the given local endpoint.

Construct a basic_stream_socket on an existing native socket.

Move-construct a basic_stream_socket from another.

Move-construct a basic_stream_socket from a socket of another protocol type.

bind

Bind the socket to the given local endpoint.

cancel

Cancel all asynchronous operations associated with the socket.

close

Close the socket.

connect

Connect the socket to the specified endpoint.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the socket.

io_control

Perform an IO control command on the socket.

is_open

Determine whether the socket is open.

local_endpoint

Get the local endpoint of the socket.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native socket representation.

native_non_blocking

Gets the non-blocking mode of the native socket implementation.

Sets the non-blocking mode of the native socket implementation.

non_blocking

Gets the non-blocking mode of the socket.

Sets the non-blocking mode of the socket.

open

Open the socket using the specified protocol.

operator=

Move-assign a basic_stream_socket from another.

Move-assign a basic_stream_socket from a socket of another protocol type.

read_some

Read some data from the socket.

receive

Receive some data on the socket.

Receive some data on a connected socket.

release

Release ownership of the underlying native socket.

remote_endpoint

Get the remote endpoint of the socket.

send

Send some data on the socket.

set_option

Set an option on the socket.

shutdown

Disable sends or receives on the socket.

wait

Wait for the socket to become ready to read, ready to write, or to have pending error conditions.

write_some

Write some data to the socket.

~basic_stream_socket

Destroys the socket.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

The basic_stream_socket class template provides asynchronous and blocking stream-oriented socket functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/local/stream_protocol.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/local__stream_protocol/type.html000066400000000000000000000050071340672067200245730ustar00rootroot00000000000000 local::stream_protocol::type
asio C++ library

PrevUpHomeNext

Obtain an identifier for the type of the protocol.

int type() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/make_work_guard.html000066400000000000000000000137461340672067200222370ustar00rootroot00000000000000 make_work_guard
asio C++ library

PrevUpHomeNext

Create an executor_work_guard object.

template<
    typename Executor>
executor_work_guard< Executor > make_work_guard(
    const Executor & ex,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

template<
    typename ExecutionContext>
executor_work_guard< typename ExecutionContext::executor_type > make_work_guard(
    ExecutionContext & ctx,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...

template<
    typename T>
executor_work_guard< typename associated_executor< T >::type > make_work_guard(
    const T & t,
    typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);
  » more...

template<
    typename T,
    typename Executor>
executor_work_guard< typename associated_executor< T, Executor >::type > make_work_guard(
    const T & t,
    const Executor & ex,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

template<
    typename T,
    typename ExecutionContext>
executor_work_guard< typename associated_executor< T, typename ExecutionContext::executor_type >::type > make_work_guard(
    const T & t,
    ExecutionContext & ctx,
    typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value &&is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...
Requirements

Header: asio/executor_work_guard.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/make_work_guard/000077500000000000000000000000001340672067200213365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/make_work_guard/overload1.html000066400000000000000000000054721340672067200241300ustar00rootroot00000000000000 make_work_guard (1 of 5 overloads)
asio C++ library

PrevUpHomeNext

Create an executor_work_guard object.

template<
    typename Executor>
executor_work_guard< Executor > make_work_guard(
    const Executor & ex,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/make_work_guard/overload2.html000066400000000000000000000054741340672067200241330ustar00rootroot00000000000000 make_work_guard (2 of 5 overloads)
asio C++ library

PrevUpHomeNext

Create an executor_work_guard object.

template<
    typename ExecutionContext>
executor_work_guard< typename ExecutionContext::executor_type > make_work_guard(
    ExecutionContext & ctx,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/make_work_guard/overload3.html000066400000000000000000000055011340672067200241230ustar00rootroot00000000000000 make_work_guard (3 of 5 overloads)
asio C++ library

PrevUpHomeNext

Create an executor_work_guard object.

template<
    typename T>
executor_work_guard< typename associated_executor< T >::type > make_work_guard(
    const T & t,
    typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/make_work_guard/overload4.html000066400000000000000000000056061340672067200241320ustar00rootroot00000000000000 make_work_guard (4 of 5 overloads)
asio C++ library

PrevUpHomeNext

Create an executor_work_guard object.

template<
    typename T,
    typename Executor>
executor_work_guard< typename associated_executor< T, Executor >::type > make_work_guard(
    const T & t,
    const Executor & ex,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/make_work_guard/overload5.html000066400000000000000000000060071340672067200241270ustar00rootroot00000000000000 make_work_guard (5 of 5 overloads)
asio C++ library

PrevUpHomeNext

Create an executor_work_guard object.

template<
    typename T,
    typename ExecutionContext>
executor_work_guard< typename associated_executor< T, typename ExecutionContext::executor_type >::type > make_work_guard(
    const T & t,
    ExecutionContext & ctx,
    typename enable_if<!is_executor< T >::value &&!is_convertible< T &, execution_context & >::value &&is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer.html000066400000000000000000000160541340672067200220530ustar00rootroot00000000000000 mutable_buffer
asio C++ library

PrevUpHomeNext

Holds a buffer that can be modified.

class mutable_buffer
Member Functions

Name

Description

data

Get a pointer to the beginning of the memory range.

mutable_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new modifiable buffer that is offset from the start of another.

The mutable_buffer class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/000077500000000000000000000000001340672067200211575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/mutable_buffer/data.html000066400000000000000000000047271340672067200227700ustar00rootroot00000000000000 mutable_buffer::data
asio C++ library

PrevUpHomeNext

Get a pointer to the beginning of the memory range.

void * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/mutable_buffer.html000066400000000000000000000063571340672067200250420ustar00rootroot00000000000000 mutable_buffer::mutable_buffer
asio C++ library

PrevUpHomeNext

Construct an empty buffer.

mutable_buffer();
  » more...

Construct a buffer to represent a given memory range.

mutable_buffer(
    void * data,
    std::size_t size);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/mutable_buffer/000077500000000000000000000000001340672067200241415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/mutable_buffer/mutable_buffer/overload1.html000066400000000000000000000050651340672067200267310ustar00rootroot00000000000000 mutable_buffer::mutable_buffer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct an empty buffer.

mutable_buffer();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/mutable_buffer/overload2.html000066400000000000000000000051611340672067200267270ustar00rootroot00000000000000 mutable_buffer::mutable_buffer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct a buffer to represent a given memory range.

mutable_buffer(
    void * data,
    std::size_t size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/operator_plus_.html000066400000000000000000000064611340672067200251110ustar00rootroot00000000000000 mutable_buffer::operator+
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that is offset from the start of another.

mutable_buffer operator+(
    const mutable_buffer & b,
    std::size_t n);
  » more...

mutable_buffer operator+(
    std::size_t n,
    const mutable_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/operator_plus_/000077500000000000000000000000001340672067200242145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/mutable_buffer/operator_plus_/overload1.html000066400000000000000000000052031340672067200267760ustar00rootroot00000000000000 mutable_buffer::operator+ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that is offset from the start of another.

mutable_buffer operator+(
    const mutable_buffer & b,
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/operator_plus_/overload2.html000066400000000000000000000052201340672067200267760ustar00rootroot00000000000000 mutable_buffer::operator+ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that is offset from the start of another.

mutable_buffer operator+(
    std::size_t n,
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/operator_plus__eq_.html000066400000000000000000000051111340672067200257240ustar00rootroot00000000000000 mutable_buffer::operator+=
asio C++ library

PrevUpHomeNext

Move the start of the buffer by the specified number of bytes.

mutable_buffer & operator+=(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffer/size.html000066400000000000000000000047361340672067200230310ustar00rootroot00000000000000 mutable_buffer::size
asio C++ library

PrevUpHomeNext

Get the size of the memory range.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1.html000066400000000000000000000204701340672067200224530ustar00rootroot00000000000000 mutable_buffers_1
asio C++ library

PrevUpHomeNext

(Deprecated: Use mutable_buffer.) Adapts a single modifiable buffer so that it meets the requirements of the MutableBufferSequence concept.

class mutable_buffers_1 :
  public mutable_buffer
Types

Name

Description

const_iterator

A random-access iterator type that may be used to read elements.

value_type

The type for each element in the list of buffers.

Member Functions

Name

Description

begin

Get a random-access iterator to the first element.

data

Get a pointer to the beginning of the memory range.

end

Get a random-access iterator for one past the last element.

mutable_buffers_1

Construct to represent a given memory range.

Construct to represent a single modifiable buffer.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new modifiable buffer that is offset from the start of another.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/000077500000000000000000000000001340672067200215625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/mutable_buffers_1/begin.html000066400000000000000000000050171340672067200235370ustar00rootroot00000000000000 mutable_buffers_1::begin
asio C++ library

PrevUpHomeNext

Get a random-access iterator to the first element.

const_iterator begin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/const_iterator.html000066400000000000000000000060711340672067200255130ustar00rootroot00000000000000 mutable_buffers_1::const_iterator
asio C++ library

PrevUpHomeNext

A random-access iterator type that may be used to read elements.

typedef const mutable_buffer * const_iterator;
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/data.html000066400000000000000000000050641340672067200233660ustar00rootroot00000000000000 mutable_buffers_1::data
asio C++ library

PrevUpHomeNext

Inherited from mutable_buffer.

Get a pointer to the beginning of the memory range.

void * data() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/end.html000066400000000000000000000047541340672067200232300ustar00rootroot00000000000000 mutable_buffers_1::end
asio C++ library

PrevUpHomeNext

Get a random-access iterator for one past the last element.

const_iterator end() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/mutable_buffers_1.html000066400000000000000000000066151340672067200260450ustar00rootroot00000000000000 mutable_buffers_1::mutable_buffers_1
asio C++ library

PrevUpHomeNext

Construct to represent a given memory range.

mutable_buffers_1(
    void * data,
    std::size_t size);
  » more...

Construct to represent a single modifiable buffer.

explicit mutable_buffers_1(
    const mutable_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/mutable_buffers_1/000077500000000000000000000000001340672067200251475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/mutable_buffers_1/mutable_buffers_1/overload1.html000066400000000000000000000052541340672067200277370ustar00rootroot00000000000000 mutable_buffers_1::mutable_buffers_1 (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct to represent a given memory range.

mutable_buffers_1(
    void * data,
    std::size_t size);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/mutable_buffers_1/overload2.html000066400000000000000000000052341340672067200277360ustar00rootroot00000000000000 mutable_buffers_1::mutable_buffers_1 (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct to represent a single modifiable buffer.

mutable_buffers_1(
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/operator_plus_.html000066400000000000000000000065521340672067200255150ustar00rootroot00000000000000 mutable_buffers_1::operator+
asio C++ library

PrevUpHomeNext

Create a new modifiable buffer that is offset from the start of another.

mutable_buffer operator+(
    const mutable_buffer & b,
    std::size_t n);
  » more...

mutable_buffer operator+(
    std::size_t n,
    const mutable_buffer & b);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/operator_plus_/000077500000000000000000000000001340672067200246175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/mutable_buffers_1/operator_plus_/overload1.html000066400000000000000000000053751340672067200274130ustar00rootroot00000000000000 mutable_buffers_1::operator+ (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from mutable_buffer.

Create a new modifiable buffer that is offset from the start of another.

mutable_buffer operator+(
    const mutable_buffer & b,
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/operator_plus_/overload2.html000066400000000000000000000054121340672067200274040ustar00rootroot00000000000000 mutable_buffers_1::operator+ (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from mutable_buffer.

Create a new modifiable buffer that is offset from the start of another.

mutable_buffer operator+(
    std::size_t n,
    const mutable_buffer & b);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/operator_plus__eq_.html000066400000000000000000000053131340672067200263330ustar00rootroot00000000000000 mutable_buffers_1::operator+=
asio C++ library

PrevUpHomeNext

Inherited from mutable_buffer.

Move the start of the buffer by the specified number of bytes.

mutable_buffer & operator+=(
    std::size_t n);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/size.html000066400000000000000000000051131340672067200234220ustar00rootroot00000000000000 mutable_buffers_1::size
asio C++ library

PrevUpHomeNext

Inherited from mutable_buffer.

Get the size of the memory range.

std::size_t size() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/mutable_buffers_1/value_type.html000066400000000000000000000170231340672067200246300ustar00rootroot00000000000000 mutable_buffers_1::value_type
asio C++ library

PrevUpHomeNext

The type for each element in the list of buffers.

typedef mutable_buffer value_type;
Member Functions

Name

Description

data

Get a pointer to the beginning of the memory range.

mutable_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new modifiable buffer that is offset from the start of another.

The mutable_buffer class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/null_buffers.html000066400000000000000000000130351340672067200215530ustar00rootroot00000000000000 null_buffers
asio C++ library

PrevUpHomeNext

(Deprecated: Use the socket/descriptor wait() and async_wait() member functions.) An implementation of both the ConstBufferSequence and MutableBufferSequence concepts to represent a null buffer sequence.

class null_buffers
Types

Name

Description

const_iterator

A random-access iterator type that may be used to read elements.

value_type

The type for each element in the list of buffers.

Member Functions

Name

Description

begin

Get a random-access iterator to the first element.

end

Get a random-access iterator for one past the last element.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/null_buffers/000077500000000000000000000000001340672067200206635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/null_buffers/begin.html000066400000000000000000000047111340672067200226400ustar00rootroot00000000000000 null_buffers::begin
asio C++ library

PrevUpHomeNext

Get a random-access iterator to the first element.

const_iterator begin() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/null_buffers/const_iterator.html000066400000000000000000000057571340672067200246260ustar00rootroot00000000000000 null_buffers::const_iterator
asio C++ library

PrevUpHomeNext

A random-access iterator type that may be used to read elements.

typedef const mutable_buffer * const_iterator;
Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/null_buffers/end.html000066400000000000000000000047011340672067200223210ustar00rootroot00000000000000 null_buffers::end
asio C++ library

PrevUpHomeNext

Get a random-access iterator for one past the last element.

const_iterator end() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/null_buffers/value_type.html000066400000000000000000000166611340672067200237400ustar00rootroot00000000000000 null_buffers::value_type
asio C++ library

PrevUpHomeNext

The type for each element in the list of buffers.

typedef mutable_buffer value_type;
Member Functions

Name

Description

data

Get a pointer to the beginning of the memory range.

mutable_buffer

Construct an empty buffer.

Construct a buffer to represent a given memory range.

operator+=

Move the start of the buffer by the specified number of bytes.

size

Get the size of the memory range.

Related Functions

Name

Description

operator+

Create a new modifiable buffer that is offset from the start of another.

The mutable_buffer class provides a safe representation of a buffer that can be modified. It does not own the underlying data, and so is cheap to copy or assign.

Accessing Buffer Contents

The contents of a buffer may be accessed using the data() and size() member functions:

asio::mutable_buffer b1 = ...;
std::size_t s1 = b1.size();
unsigned char* p1 = static_cast<unsigned char*>(b1.data());

The data() member function permits violations of type safety, so uses of it in application code should be carefully considered.

Requirements

Header: asio/buffer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/operator_lt__lt_.html000066400000000000000000000061421340672067200224150ustar00rootroot00000000000000 operator<<
asio C++ library

PrevUpHomeNext

Output an error code.

template<
    typename Elem,
    typename Traits>
std::basic_ostream< Elem, Traits > & operator<<(
    std::basic_ostream< Elem, Traits > & os,
    const error_code & ec);
Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/placeholders__bytes_transferred.html000066400000000000000000000064541340672067200255050ustar00rootroot00000000000000 placeholders::bytes_transferred
asio C++ library

PrevUpHomeNext

An argument placeholder, for use with boost::bind(), that corresponds to the bytes_transferred argument of a handler for asynchronous functions such as asio::basic_stream_socket::async_write_some or asio::async_write.

unspecified bytes_transferred;
Requirements

Header: asio/placeholders.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/placeholders__endpoint.html000066400000000000000000000062261340672067200235750ustar00rootroot00000000000000 placeholders::endpoint
asio C++ library

PrevUpHomeNext

An argument placeholder, for use with boost::bind(), that corresponds to the results argument of a handler for asynchronous functions such as asio::async_connect.

unspecified endpoint;
Requirements

Header: asio/placeholders.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/placeholders__error.html000066400000000000000000000060461340672067200231060ustar00rootroot00000000000000 placeholders::error
asio C++ library

PrevUpHomeNext

An argument placeholder, for use with boost::bind(), that corresponds to the error argument of a handler for any of the asynchronous functions.

unspecified error;
Requirements

Header: asio/placeholders.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/placeholders__iterator.html000066400000000000000000000061571340672067200236110ustar00rootroot00000000000000 placeholders::iterator
asio C++ library

PrevUpHomeNext

An argument placeholder, for use with boost::bind(), that corresponds to the iterator argument of a handler for asynchronous functions such as asio::async_connect.

unspecified iterator;
Requirements

Header: asio/placeholders.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/placeholders__results.html000066400000000000000000000061631340672067200234560ustar00rootroot00000000000000 placeholders::results
asio C++ library

PrevUpHomeNext

An argument placeholder, for use with boost::bind(), that corresponds to the results argument of a handler for asynchronous functions such as asio::basic_resolver::async_resolve.

unspecified results;
Requirements

Header: asio/placeholders.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/placeholders__signal_number.html000066400000000000000000000062541340672067200246030ustar00rootroot00000000000000 placeholders::signal_number
asio C++ library

PrevUpHomeNext

An argument placeholder, for use with boost::bind(), that corresponds to the signal_number argument of a handler for asynchronous functions such as asio::signal_set::async_wait.

unspecified signal_number;
Requirements

Header: asio/placeholders.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor.html000066400000000000000000000355311340672067200226310ustar00rootroot00000000000000 posix::descriptor
asio C++ library

PrevUpHomeNext

Provides POSIX descriptor functionality.

class descriptor :
  public posix::descriptor_base
Types

Name

Description

bytes_readable

IO control command to get the amount of data that can be read without blocking.

executor_type

The type of the executor associated with the object.

lowest_layer_type

A descriptor is always the lowest layer.

native_handle_type

The native representation of a descriptor.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native descriptor to the descriptor.

async_wait

Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

cancel

Cancel all asynchronous operations associated with the descriptor.

close

Close the descriptor.

descriptor

Construct a descriptor without opening it.

Construct a descriptor on an existing native descriptor.

Move-construct a descriptor from another.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

io_control

Perform an IO control command on the descriptor.

is_open

Determine whether the descriptor is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native descriptor representation.

native_non_blocking

Gets the non-blocking mode of the native descriptor implementation.

Sets the non-blocking mode of the native descriptor implementation.

non_blocking

Gets the non-blocking mode of the descriptor.

Sets the non-blocking mode of the descriptor.

operator=

Move-assign a descriptor from another.

release

Release ownership of the native descriptor implementation.

wait

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~descriptor

Protected destructor to prevent deletion through this type.

The posix::descriptor class template provides the ability to wrap a POSIX descriptor.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/posix/descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/000077500000000000000000000000001340672067200217345ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/_descriptor.html000066400000000000000000000054151340672067200251440ustar00rootroot00000000000000 posix::descriptor::~descriptor
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~descriptor();

This function destroys the descriptor, cancelling any outstanding asynchronous wait operations associated with the descriptor as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/assign.html000066400000000000000000000062751340672067200241200ustar00rootroot00000000000000 posix::descriptor::assign
asio C++ library

PrevUpHomeNext

Assign an existing native descriptor to the descriptor.

void assign(
    const native_handle_type & native_descriptor);
  » more...

void assign(
    const native_handle_type & native_descriptor,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/assign/000077500000000000000000000000001340672067200232205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/assign/overload1.html000066400000000000000000000050611340672067200260040ustar00rootroot00000000000000 posix::descriptor::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native descriptor to the descriptor.

void assign(
    const native_handle_type & native_descriptor);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/assign/overload2.html000066400000000000000000000051401340672067200260030ustar00rootroot00000000000000 posix::descriptor::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native descriptor to the descriptor.

void assign(
    const native_handle_type & native_descriptor,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/async_wait.html000066400000000000000000000116161340672067200247700ustar00rootroot00000000000000 posix::descriptor::async_wait
asio C++ library

PrevUpHomeNext

Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a descriptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired descriptor state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::posix::stream_descriptor descriptor(io_context);
...
descriptor.async_wait(
    asio::posix::stream_descriptor::wait_read,
    wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/bytes_readable.html000066400000000000000000000072651340672067200256010ustar00rootroot00000000000000 posix::descriptor::bytes_readable
asio C++ library

PrevUpHomeNext

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::posix::stream_descriptor descriptor(io_context);
...
asio::descriptor_base::bytes_readable command(true);
descriptor.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/posix/descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/cancel.html000066400000000000000000000061331340672067200240520ustar00rootroot00000000000000 posix::descriptor::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the descriptor.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/cancel/000077500000000000000000000000001340672067200231615ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/cancel/overload1.html000066400000000000000000000064351340672067200257530ustar00rootroot00000000000000 posix::descriptor::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the descriptor.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/cancel/overload2.html000066400000000000000000000065011340672067200257460ustar00rootroot00000000000000 posix::descriptor::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the descriptor.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/close.html000066400000000000000000000060411340672067200237300ustar00rootroot00000000000000 posix::descriptor::close
asio C++ library

PrevUpHomeNext

Close the descriptor.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/close/000077500000000000000000000000001340672067200230415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/close/overload1.html000066400000000000000000000064761340672067200256400ustar00rootroot00000000000000 posix::descriptor::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the descriptor.

void close();

This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/close/overload2.html000066400000000000000000000065721340672067200256360ustar00rootroot00000000000000 posix::descriptor::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the descriptor.

void close(
    asio::error_code & ec);

This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/descriptor.html000066400000000000000000000074431340672067200250100ustar00rootroot00000000000000 posix::descriptor::descriptor
asio C++ library

PrevUpHomeNext

Construct a descriptor without opening it.

explicit descriptor(
    asio::io_context & io_context);
  » more...

Construct a descriptor on an existing native descriptor.

descriptor(
    asio::io_context & io_context,
    const native_handle_type & native_descriptor);
  » more...

Move-construct a descriptor from another.

descriptor(
    descriptor && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/descriptor/000077500000000000000000000000001340672067200241125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/descriptor/overload1.html000066400000000000000000000066311340672067200267020ustar00rootroot00000000000000 posix::descriptor::descriptor (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a descriptor without opening it.

descriptor(
    asio::io_context & io_context);

This constructor creates a descriptor without opening it.

Parameters

io_context

The io_context object that the descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/descriptor/overload2.html000066400000000000000000000102121340672067200266710ustar00rootroot00000000000000 posix::descriptor::descriptor (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a descriptor on an existing native descriptor.

descriptor(
    asio::io_context & io_context,
    const native_handle_type & native_descriptor);

This constructor creates a descriptor object to hold an existing native descriptor.

Parameters

io_context

The io_context object that the descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor.

native_descriptor

A native descriptor.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/descriptor/overload3.html000066400000000000000000000073171340672067200267060ustar00rootroot00000000000000 posix::descriptor::descriptor (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a descriptor from another.

descriptor(
    descriptor && other);

This constructor moves a descriptor from one object to another.

Parameters

other

The other descriptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the descriptor(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/executor_type.html000066400000000000000000000202221340672067200255170ustar00rootroot00000000000000 posix::descriptor::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/posix/descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/get_executor.html000066400000000000000000000050551340672067200253240ustar00rootroot00000000000000 posix::descriptor::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/get_io_context.html000066400000000000000000000071301340672067200256350ustar00rootroot00000000000000 posix::descriptor::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/get_io_service.html000066400000000000000000000071201340672067200256100ustar00rootroot00000000000000 posix::descriptor::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/io_control.html000066400000000000000000000067701340672067200250030ustar00rootroot00000000000000 posix::descriptor::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the descriptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/io_control/000077500000000000000000000000001340672067200241035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/io_control/overload1.html000066400000000000000000000107061340672067200266710ustar00rootroot00000000000000 posix::descriptor::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform an IO control command on the descriptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the descriptor.

Parameters

command

The IO control command to be performed on the descriptor.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::posix::stream_descriptor descriptor(io_context);
...
asio::posix::stream_descriptor::bytes_readable command;
descriptor.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/io_control/overload2.html000066400000000000000000000102331340672067200266650ustar00rootroot00000000000000 posix::descriptor::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform an IO control command on the descriptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the descriptor.

Parameters

command

The IO control command to be performed on the descriptor.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::posix::stream_descriptor descriptor(io_context);
...
asio::posix::stream_descriptor::bytes_readable command;
asio::error_code ec;
descriptor.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/is_open.html000066400000000000000000000050411340672067200242560ustar00rootroot00000000000000 posix::descriptor::is_open
asio C++ library

PrevUpHomeNext

Determine whether the descriptor is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/lowest_layer.html000066400000000000000000000064251340672067200253420ustar00rootroot00000000000000 posix::descriptor::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/lowest_layer/000077500000000000000000000000001340672067200244455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/lowest_layer/overload1.html000066400000000000000000000064241340672067200272350ustar00rootroot00000000000000 posix::descriptor::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/lowest_layer/overload2.html000066400000000000000000000065061340672067200272370ustar00rootroot00000000000000 posix::descriptor::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/lowest_layer_type.html000066400000000000000000000366101340672067200264020ustar00rootroot00000000000000 posix::descriptor::lowest_layer_type
asio C++ library

PrevUpHomeNext

A descriptor is always the lowest layer.

typedef descriptor lowest_layer_type;
Types

Name

Description

bytes_readable

IO control command to get the amount of data that can be read without blocking.

executor_type

The type of the executor associated with the object.

lowest_layer_type

A descriptor is always the lowest layer.

native_handle_type

The native representation of a descriptor.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native descriptor to the descriptor.

async_wait

Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

cancel

Cancel all asynchronous operations associated with the descriptor.

close

Close the descriptor.

descriptor

Construct a descriptor without opening it.

Construct a descriptor on an existing native descriptor.

Move-construct a descriptor from another.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

io_control

Perform an IO control command on the descriptor.

is_open

Determine whether the descriptor is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native descriptor representation.

native_non_blocking

Gets the non-blocking mode of the native descriptor implementation.

Sets the non-blocking mode of the native descriptor implementation.

non_blocking

Gets the non-blocking mode of the descriptor.

Sets the non-blocking mode of the descriptor.

operator=

Move-assign a descriptor from another.

release

Release ownership of the native descriptor implementation.

wait

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~descriptor

Protected destructor to prevent deletion through this type.

The posix::descriptor class template provides the ability to wrap a POSIX descriptor.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/posix/descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/native_handle.html000066400000000000000000000054761340672067200254370ustar00rootroot00000000000000 posix::descriptor::native_handle
asio C++ library

PrevUpHomeNext

Get the native descriptor representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the descriptor. This is intended to allow access to native descriptor functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/native_handle_type.html000066400000000000000000000062651340672067200264750ustar00rootroot00000000000000 posix::descriptor::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a descriptor.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/posix/descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/native_non_blocking.html000066400000000000000000000075511340672067200266420ustar00rootroot00000000000000 posix::descriptor::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native descriptor implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native descriptor implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/native_non_blocking/000077500000000000000000000000001340672067200257445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/native_non_blocking/overload1.html000066400000000000000000000101601340672067200305240ustar00rootroot00000000000000 posix::descriptor::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native descriptor implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native descriptor. This mode has no effect on the behaviour of the descriptor object's synchronous operations.

Return Value

true if the underlying descriptor is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the descriptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native descriptor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/native_non_blocking/overload2.html000066400000000000000000000111271340672067200305310ustar00rootroot00000000000000 posix::descriptor::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the native descriptor implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.

Parameters

mode

If true, the underlying descriptor is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/native_non_blocking/overload3.html000066400000000000000000000103301340672067200305250ustar00rootroot00000000000000 posix::descriptor::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the native descriptor implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.

Parameters

mode

If true, the underlying descriptor is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/non_blocking.html000066400000000000000000000073031340672067200252670ustar00rootroot00000000000000 posix::descriptor::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the descriptor.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the descriptor.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/non_blocking/000077500000000000000000000000001340672067200243765ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/non_blocking/overload1.html000066400000000000000000000075161340672067200271710ustar00rootroot00000000000000 posix::descriptor::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the descriptor.

bool non_blocking() const;
Return Value

true if the descriptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/non_blocking/overload2.html000066400000000000000000000107471340672067200271720ustar00rootroot00000000000000 posix::descriptor::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the descriptor.

void non_blocking(
    bool mode);
Parameters

mode

If true, the descriptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/non_blocking/overload3.html000066400000000000000000000102011340672067200271540ustar00rootroot00000000000000 posix::descriptor::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Sets the non-blocking mode of the descriptor.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the descriptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/operator_eq_.html000066400000000000000000000072311340672067200253040ustar00rootroot00000000000000 posix::descriptor::operator=
asio C++ library

PrevUpHomeNext

Move-assign a descriptor from another.

descriptor & operator=(
    descriptor && other);

This assignment operator moves a descriptor from one object to another.

Parameters

other

The other descriptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the descriptor(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/release.html000066400000000000000000000060071340672067200242450ustar00rootroot00000000000000 posix::descriptor::release
asio C++ library

PrevUpHomeNext

Release ownership of the native descriptor implementation.

native_handle_type release();

This function may be used to obtain the underlying representation of the descriptor. After calling this function, is_open() returns false. The caller is responsible for closing the descriptor.

All outstanding asynchronous read or write operations will finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/wait.html000066400000000000000000000061451340672067200235740ustar00rootroot00000000000000 posix::descriptor::wait
asio C++ library

PrevUpHomeNext

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/wait/000077500000000000000000000000001340672067200227005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor/wait/overload1.html000066400000000000000000000073131340672067200254660ustar00rootroot00000000000000 posix::descriptor::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired descriptor state.

Example

Waiting for a descriptor to become readable.

asio::posix::stream_descriptor descriptor(io_context);
...
descriptor.wait(asio::posix::stream_descriptor::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/wait/overload2.html000066400000000000000000000076361340672067200254770ustar00rootroot00000000000000 posix::descriptor::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired descriptor state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a descriptor to become readable.

asio::posix::stream_descriptor descriptor(io_context);
...
asio::error_code ec;
descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor/wait_type.html000066400000000000000000000072621340672067200246360ustar00rootroot00000000000000 posix::descriptor::wait_type
asio C++ library

PrevUpHomeNext

Wait types.

enum wait_type

Values

wait_read

Wait for a descriptor to become ready to read.

wait_write

Wait for a descriptor to become ready to write.

wait_error

Wait for a descriptor to have error conditions pending.

For use with descriptor::wait() and descriptor::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor_base.html000066400000000000000000000131551340672067200236210ustar00rootroot00000000000000 posix::descriptor_base
asio C++ library

PrevUpHomeNext

The posix::descriptor_base class is used as a base for the descriptor class as a place to define the associated IO control commands.

class descriptor_base
Types

Name

Description

bytes_readable

IO control command to get the amount of data that can be read without blocking.

wait_type

Wait types.

Protected Member Functions

Name

Description

~descriptor_base

Protected destructor to prevent deletion through this type.

Requirements

Header: asio/posix/descriptor_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor_base/000077500000000000000000000000001340672067200227265ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__descriptor_base/_descriptor_base.html000066400000000000000000000052121340672067200271230ustar00rootroot00000000000000 posix::descriptor_base::~descriptor_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~descriptor_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor_base/bytes_readable.html000066400000000000000000000074741340672067200265750ustar00rootroot00000000000000 posix::descriptor_base::bytes_readable
asio C++ library

PrevUpHomeNext

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::posix::stream_descriptor descriptor(io_context);
...
asio::descriptor_base::bytes_readable command(true);
descriptor.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/posix/descriptor_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__descriptor_base/wait_type.html000066400000000000000000000074221340672067200256260ustar00rootroot00000000000000 posix::descriptor_base::wait_type
asio C++ library

PrevUpHomeNext

Wait types.

enum wait_type

Values

wait_read

Wait for a descriptor to become ready to read.

wait_write

Wait for a descriptor to become ready to write.

wait_error

Wait for a descriptor to have error conditions pending.

For use with descriptor::wait() and descriptor::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor.html000066400000000000000000000377441340672067200242140ustar00rootroot00000000000000 posix::stream_descriptor
asio C++ library

PrevUpHomeNext

Provides stream-oriented descriptor functionality.

class stream_descriptor :
  public posix::descriptor
Types

Name

Description

bytes_readable

IO control command to get the amount of data that can be read without blocking.

executor_type

The type of the executor associated with the object.

lowest_layer_type

A descriptor is always the lowest layer.

native_handle_type

The native representation of a descriptor.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native descriptor to the descriptor.

async_read_some

Start an asynchronous read.

async_wait

Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

async_write_some

Start an asynchronous write.

cancel

Cancel all asynchronous operations associated with the descriptor.

close

Close the descriptor.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

io_control

Perform an IO control command on the descriptor.

is_open

Determine whether the descriptor is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native descriptor representation.

native_non_blocking

Gets the non-blocking mode of the native descriptor implementation.

Sets the non-blocking mode of the native descriptor implementation.

non_blocking

Gets the non-blocking mode of the descriptor.

Sets the non-blocking mode of the descriptor.

operator=

Move-assign a stream_descriptor from another.

read_some

Read some data from the descriptor.

release

Release ownership of the native descriptor implementation.

stream_descriptor

Construct a stream_descriptor without opening it.

Construct a stream_descriptor on an existing native descriptor.

Move-construct a stream_descriptor from another.

wait

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

write_some

Write some data to the descriptor.

The posix::stream_descriptor class template provides asynchronous and blocking stream-oriented descriptor functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/posix/stream_descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/000077500000000000000000000000001340672067200233075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/assign.html000066400000000000000000000064731340672067200254730ustar00rootroot00000000000000 posix::stream_descriptor::assign
asio C++ library

PrevUpHomeNext

Assign an existing native descriptor to the descriptor.

void assign(
    const native_handle_type & native_descriptor);
  » more...

void assign(
    const native_handle_type & native_descriptor,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/assign/000077500000000000000000000000001340672067200245735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/assign/overload1.html000066400000000000000000000053121340672067200273560ustar00rootroot00000000000000 posix::stream_descriptor::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Assign an existing native descriptor to the descriptor.

void assign(
    const native_handle_type & native_descriptor);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/assign/overload2.html000066400000000000000000000054151340672067200273630ustar00rootroot00000000000000 posix::stream_descriptor::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Assign an existing native descriptor to the descriptor.

void assign(
    const native_handle_type & native_descriptor,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/async_read_some.html000066400000000000000000000146511340672067200273370ustar00rootroot00000000000000 posix::stream_descriptor::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read data from the stream descriptor. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes read.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The read operation may not read all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.

Example

To read into a single data buffer use the buffer function as follows:

descriptor.async_read_some(asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/async_wait.html000066400000000000000000000121441340672067200263400ustar00rootroot00000000000000 posix::stream_descriptor::async_wait
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

template<
    typename WaitHandler>
DEDUCED async_wait(
    wait_type w,
    WaitHandler && handler);

This function is used to perform an asynchronous wait for a descriptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired descriptor state.

handler

The handler to be called when the wait operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Example
void wait_handler(const asio::error_code& error)
{
  if (!error)
  {
    // Wait succeeded.
  }
}

...

asio::posix::stream_descriptor descriptor(io_context);
...
descriptor.async_wait(
    asio::posix::stream_descriptor::wait_read,
    wait_handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/async_write_some.html000066400000000000000000000146301340672067200275530ustar00rootroot00000000000000 posix::stream_descriptor::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write data to the stream descriptor. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be written to the descriptor. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes written.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The write operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To write a single data buffer use the buffer function as follows:

descriptor.async_write_some(asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/bytes_readable.html000066400000000000000000000076571340672067200271610ustar00rootroot00000000000000 posix::stream_descriptor::bytes_readable
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::posix::stream_descriptor descriptor(io_context);
...
asio::descriptor_base::bytes_readable command(true);
descriptor.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/posix/stream_descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/cancel.html000066400000000000000000000063041340672067200254250ustar00rootroot00000000000000 posix::stream_descriptor::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the descriptor.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/cancel/000077500000000000000000000000001340672067200245345ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/cancel/overload1.html000066400000000000000000000067131340672067200273250ustar00rootroot00000000000000 posix::stream_descriptor::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Cancel all asynchronous operations associated with the descriptor.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/cancel/overload2.html000066400000000000000000000067571340672067200273360ustar00rootroot00000000000000 posix::stream_descriptor::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Cancel all asynchronous operations associated with the descriptor.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/close.html000066400000000000000000000062241340672067200253060ustar00rootroot00000000000000 posix::stream_descriptor::close
asio C++ library

PrevUpHomeNext

Close the descriptor.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/close/000077500000000000000000000000001340672067200244145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/close/overload1.html000066400000000000000000000067541340672067200272120ustar00rootroot00000000000000 posix::stream_descriptor::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Close the descriptor.

void close();

This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure. Note that, even if the function indicates an error, the underlying descriptor is closed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/close/overload2.html000066400000000000000000000070641340672067200272060ustar00rootroot00000000000000 posix::stream_descriptor::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Close the descriptor.

void close(
    asio::error_code & ec);

This function is used to close the descriptor. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any. Note that, even if the function indicates an error, the underlying descriptor is closed.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/executor_type.html000066400000000000000000000205651340672067200271040ustar00rootroot00000000000000 posix::stream_descriptor::executor_type
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/posix/stream_descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/get_executor.html000066400000000000000000000053361340672067200267010ustar00rootroot00000000000000 posix::stream_descriptor::get_executor
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/get_io_context.html000066400000000000000000000074361340672067200272210ustar00rootroot00000000000000 posix::stream_descriptor::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/get_io_service.html000066400000000000000000000074261340672067200271740ustar00rootroot00000000000000 posix::stream_descriptor::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/io_control.html000066400000000000000000000071411340672067200263470ustar00rootroot00000000000000 posix::stream_descriptor::io_control
asio C++ library

PrevUpHomeNext

Perform an IO control command on the descriptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);
  » more...

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/io_control/000077500000000000000000000000001340672067200254565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/io_control/overload1.html000066400000000000000000000112361340672067200302430ustar00rootroot00000000000000 posix::stream_descriptor::io_control (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Perform an IO control command on the descriptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command);

This function is used to execute an IO control command on the descriptor.

Parameters

command

The IO control command to be performed on the descriptor.

Exceptions

asio::system_error

Thrown on failure.

Example

Getting the number of bytes ready to read:

asio::posix::stream_descriptor descriptor(io_context);
...
asio::posix::stream_descriptor::bytes_readable command;
descriptor.io_control(command);
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/io_control/overload2.html000066400000000000000000000105361340672067200302460ustar00rootroot00000000000000 posix::stream_descriptor::io_control (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Perform an IO control command on the descriptor.

template<
    typename IoControlCommand>
void io_control(
    IoControlCommand & command,
    asio::error_code & ec);

This function is used to execute an IO control command on the descriptor.

Parameters

command

The IO control command to be performed on the descriptor.

ec

Set to indicate what error occurred, if any.

Example

Getting the number of bytes ready to read:

asio::posix::stream_descriptor descriptor(io_context);
...
asio::posix::stream_descriptor::bytes_readable command;
asio::error_code ec;
descriptor.io_control(command, ec);
if (ec)
{
  // An error occurred.
}
std::size_t bytes_readable = command.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/is_open.html000066400000000000000000000053221340672067200256330ustar00rootroot00000000000000 posix::stream_descriptor::is_open
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Determine whether the descriptor is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/lowest_layer.html000066400000000000000000000065761340672067200267240ustar00rootroot00000000000000 posix::stream_descriptor::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/lowest_layer/000077500000000000000000000000001340672067200260205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/lowest_layer/overload1.html000066400000000000000000000067021340672067200306070ustar00rootroot00000000000000 posix::stream_descriptor::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/lowest_layer/overload2.html000066400000000000000000000067641340672067200306200ustar00rootroot00000000000000 posix::stream_descriptor::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a descriptor cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/lowest_layer_type.html000066400000000000000000000402141340672067200277500ustar00rootroot00000000000000 posix::stream_descriptor::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

A descriptor is always the lowest layer.

typedef descriptor lowest_layer_type;
Types

Name

Description

bytes_readable

IO control command to get the amount of data that can be read without blocking.

executor_type

The type of the executor associated with the object.

lowest_layer_type

A descriptor is always the lowest layer.

native_handle_type

The native representation of a descriptor.

wait_type

Wait types.

Member Functions

Name

Description

assign

Assign an existing native descriptor to the descriptor.

async_wait

Asynchronously wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

cancel

Cancel all asynchronous operations associated with the descriptor.

close

Close the descriptor.

descriptor

Construct a descriptor without opening it.

Construct a descriptor on an existing native descriptor.

Move-construct a descriptor from another.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

io_control

Perform an IO control command on the descriptor.

is_open

Determine whether the descriptor is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native descriptor representation.

native_non_blocking

Gets the non-blocking mode of the native descriptor implementation.

Sets the non-blocking mode of the native descriptor implementation.

non_blocking

Gets the non-blocking mode of the descriptor.

Sets the non-blocking mode of the descriptor.

operator=

Move-assign a descriptor from another.

release

Release ownership of the native descriptor implementation.

wait

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

Protected Member Functions

Name

Description

~descriptor

Protected destructor to prevent deletion through this type.

The posix::descriptor class template provides the ability to wrap a POSIX descriptor.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/posix/stream_descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_handle.html000066400000000000000000000057571340672067200270140ustar00rootroot00000000000000 posix::stream_descriptor::native_handle
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Get the native descriptor representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the descriptor. This is intended to allow access to native descriptor functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_handle_type.html000066400000000000000000000066021340672067200300430ustar00rootroot00000000000000 posix::stream_descriptor::native_handle_type
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

The native representation of a descriptor.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/posix/stream_descriptor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_non_blocking.html000066400000000000000000000077401340672067200302150ustar00rootroot00000000000000 posix::stream_descriptor::native_non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the native descriptor implementation.

bool native_non_blocking() const;
  » more...

Sets the non-blocking mode of the native descriptor implementation.

void native_non_blocking(
    bool mode);
  » more...

void native_non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_non_blocking/000077500000000000000000000000001340672067200273175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_non_blocking/overload1.html000066400000000000000000000104631340672067200321050ustar00rootroot00000000000000 posix::stream_descriptor::native_non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Gets the non-blocking mode of the native descriptor implementation.

bool native_non_blocking() const;

This function is used to retrieve the non-blocking mode of the underlying native descriptor. This mode has no effect on the behaviour of the descriptor object's synchronous operations.

Return Value

true if the underlying descriptor is in non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Remarks

The current non-blocking mode is cached by the descriptor object. Consequently, the return value may be incorrect if the non-blocking mode was set directly on the native descriptor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_non_blocking/overload2.html000066400000000000000000000114321340672067200321030ustar00rootroot00000000000000 posix::stream_descriptor::native_non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Sets the non-blocking mode of the native descriptor implementation.

void native_non_blocking(
    bool mode);

This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.

Parameters

mode

If true, the underlying descriptor is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

Exceptions

asio::system_error

Thrown on failure. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/native_non_blocking/overload3.html000066400000000000000000000106061340672067200321060ustar00rootroot00000000000000 posix::stream_descriptor::native_non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Sets the non-blocking mode of the native descriptor implementation.

void native_non_blocking(
    bool mode,
    asio::error_code & ec);

This function is used to modify the non-blocking mode of the underlying native descriptor. It has no effect on the behaviour of the descriptor object's synchronous operations.

Parameters

mode

If true, the underlying descriptor is put into non-blocking mode and direct system calls may fail with asio::error::would_block (or the equivalent system error).

ec

Set to indicate what error occurred, if any. If the mode is false, but the current value of non_blocking() is true, this function fails with asio::error::invalid_argument, as the combination does not make sense.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/non_blocking.html000066400000000000000000000074721340672067200266510ustar00rootroot00000000000000 posix::stream_descriptor::non_blocking
asio C++ library

PrevUpHomeNext

Gets the non-blocking mode of the descriptor.

bool non_blocking() const;
  » more...

Sets the non-blocking mode of the descriptor.

void non_blocking(
    bool mode);
  » more...

void non_blocking(
    bool mode,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/non_blocking/000077500000000000000000000000001340672067200257515ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/non_blocking/overload1.html000066400000000000000000000100211340672067200305250ustar00rootroot00000000000000 posix::stream_descriptor::non_blocking (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Gets the non-blocking mode of the descriptor.

bool non_blocking() const;
Return Value

true if the descriptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/non_blocking/overload2.html000066400000000000000000000112771340672067200305440ustar00rootroot00000000000000 posix::stream_descriptor::non_blocking (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Sets the non-blocking mode of the descriptor.

void non_blocking(
    bool mode);
Parameters

mode

If true, the descriptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/non_blocking/overload3.html000066400000000000000000000105041340672067200305350ustar00rootroot00000000000000 posix::stream_descriptor::non_blocking (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Sets the non-blocking mode of the descriptor.

void non_blocking(
    bool mode,
    asio::error_code & ec);
Parameters

mode

If true, the descriptor's synchronous operations will fail with asio::error::would_block if they are unable to perform the requested operation immediately. If false, synchronous operations will block until complete.

ec

Set to indicate what error occurred, if any.

Remarks

The non-blocking mode has no effect on the behaviour of asynchronous operations. Asynchronous operations will never fail with the error asio::error::would_block.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/operator_eq_.html000066400000000000000000000101541340672067200266550ustar00rootroot00000000000000 posix::stream_descriptor::operator=
asio C++ library

PrevUpHomeNext

Move-assign a posix::stream_descriptor from another.

stream_descriptor & operator=(
    stream_descriptor && other);

This assignment operator moves a stream descriptor from one object to another.

Parameters

other

The other posix::stream_descriptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the stream_descriptor(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/read_some.html000066400000000000000000000071651340672067200261440ustar00rootroot00000000000000 posix::stream_descriptor::read_some
asio C++ library

PrevUpHomeNext

Read some data from the descriptor.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/read_some/000077500000000000000000000000001340672067200252455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/read_some/overload1.html000066400000000000000000000142601340672067200300320ustar00rootroot00000000000000 posix::stream_descriptor::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the descriptor.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

Return Value

The number of bytes read.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To read into a single data buffer use the buffer function as follows:

descriptor.read_some(asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/read_some/overload2.html000066400000000000000000000114701340672067200300330ustar00rootroot00000000000000 posix::stream_descriptor::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the descriptor.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read data from the stream descriptor. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. Returns 0 if an error occurred.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/release.html000066400000000000000000000064241340672067200256230ustar00rootroot00000000000000 posix::stream_descriptor::release
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Release ownership of the native descriptor implementation.

native_handle_type release();

This function may be used to obtain the underlying representation of the descriptor. After calling this function, is_open() returns false. The caller is responsible for closing the descriptor.

All outstanding asynchronous read or write operations will finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/stream_descriptor.html000066400000000000000000000107621340672067200277340ustar00rootroot00000000000000 posix::stream_descriptor::stream_descriptor
asio C++ library

PrevUpHomeNext

Construct a posix::stream_descriptor without opening it.

explicit stream_descriptor(
    asio::io_context & io_context);
  » more...

Construct a posix::stream_descriptor on an existing native descriptor.

stream_descriptor(
    asio::io_context & io_context,
    const native_handle_type & native_descriptor);
  » more...

Move-construct a posix::stream_descriptor from another.

stream_descriptor(
    stream_descriptor && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/stream_descriptor/000077500000000000000000000000001340672067200270405ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/stream_descriptor/overload1.html000066400000000000000000000076061340672067200316330ustar00rootroot00000000000000 posix::stream_descriptor::stream_descriptor (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a posix::stream_descriptor without opening it.

stream_descriptor(
    asio::io_context & io_context);

This constructor creates a stream descriptor without opening it. The descriptor needs to be opened and then connected or accepted before data can be sent or received on it.

Parameters

io_context

The io_context object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/stream_descriptor/overload2.html000066400000000000000000000110411340672067200316200ustar00rootroot00000000000000 posix::stream_descriptor::stream_descriptor (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a posix::stream_descriptor on an existing native descriptor.

stream_descriptor(
    asio::io_context & io_context,
    const native_handle_type & native_descriptor);

This constructor creates a stream descriptor object to hold an existing native descriptor.

Parameters

io_context

The io_context object that the stream descriptor will use to dispatch handlers for any asynchronous operations performed on the descriptor.

native_descriptor

The new underlying descriptor implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/stream_descriptor/overload3.html000066400000000000000000000103151340672067200316240ustar00rootroot00000000000000 posix::stream_descriptor::stream_descriptor (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a posix::stream_descriptor from another.

stream_descriptor(
    stream_descriptor && other);

This constructor moves a stream descriptor from one object to another.

Parameters

other

The other posix::stream_descriptor object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the stream_descriptor(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/wait.html000066400000000000000000000064471340672067200251540ustar00rootroot00000000000000 posix::stream_descriptor::wait
asio C++ library

PrevUpHomeNext

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);
  » more...

void wait(
    wait_type w,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/wait/000077500000000000000000000000001340672067200242535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/wait/overload1.html000066400000000000000000000076161340672067200270470ustar00rootroot00000000000000 posix::stream_descriptor::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w);

This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired descriptor state.

Example

Waiting for a descriptor to become readable.

asio::posix::stream_descriptor descriptor(io_context);
...
descriptor.wait(asio::posix::stream_descriptor::wait_read);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/wait/overload2.html000066400000000000000000000101411340672067200270330ustar00rootroot00000000000000 posix::stream_descriptor::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Wait for the descriptor to become ready to read, ready to write, or to have pending error conditions.

void wait(
    wait_type w,
    asio::error_code & ec);

This function is used to perform a blocking wait for a descriptor to enter a ready to read, write or error condition state.

Parameters

w

Specifies the desired descriptor state.

ec

Set to indicate what error occurred, if any.

Example

Waiting for a descriptor to become readable.

asio::posix::stream_descriptor descriptor(io_context);
...
asio::error_code ec;
descriptor.wait(asio::posix::stream_descriptor::wait_read, ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/wait_type.html000066400000000000000000000076111340672067200262070ustar00rootroot00000000000000 posix::stream_descriptor::wait_type
asio C++ library

PrevUpHomeNext

Inherited from posix::descriptor.

Wait types.

enum wait_type

Values

wait_read

Wait for a descriptor to become ready to read.

wait_write

Wait for a descriptor to become ready to write.

wait_error

Wait for a descriptor to have error conditions pending.

For use with descriptor::wait() and descriptor::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/write_some.html000066400000000000000000000071651340672067200263630ustar00rootroot00000000000000 posix::stream_descriptor::write_some
asio C++ library

PrevUpHomeNext

Write some data to the descriptor.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/write_some/000077500000000000000000000000001340672067200254645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/posix__stream_descriptor/write_some/overload1.html000066400000000000000000000142721340672067200302540ustar00rootroot00000000000000 posix::stream_descriptor::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the descriptor.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the descriptor.

Return Value

The number of bytes written.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.

Example

To write a single data buffer use the buffer function as follows:

descriptor.write_some(asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/posix__stream_descriptor/write_some/overload2.html000066400000000000000000000114431340672067200302520ustar00rootroot00000000000000 posix::stream_descriptor::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the descriptor.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write data to the stream descriptor. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the descriptor.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. Returns 0 if an error occurred.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/post.html000066400000000000000000000113301340672067200200460ustar00rootroot00000000000000 post
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename CompletionToken>
DEDUCED post(
    CompletionToken && token);
  » more...

template<
    typename Executor,
    typename CompletionToken>
DEDUCED post(
    const Executor & ex,
    CompletionToken && token,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

template<
    typename ExecutionContext,
    typename CompletionToken>
DEDUCED post(
    ExecutionContext & ctx,
    CompletionToken && token,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...
Requirements

Header: asio/post.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/post/000077500000000000000000000000001340672067200171625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/post/overload1.html000066400000000000000000000103601340672067200217440ustar00rootroot00000000000000 post (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename CompletionToken>
DEDUCED post(
    CompletionToken && token);

This function submits an object for execution using the object's associated executor. The function object is queued for execution, and is never called from the current thread prior to returning from post().

This function has the following effects:

  • Constructs a function object handler of type Handler, initialized with handler(forward<CompletionToken>(token)).
  • Constructs an object result of type async_result<Handler>, initializing the object as result(handler).
  • Obtains the handler's associated executor object ex by performing get_associated_executor(handler).
  • Obtains the handler's associated allocator object alloc by performing get_associated_allocator(handler).
  • Performs ex.post(std::move(handler), alloc).
  • Returns result.get().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/post/overload2.html000066400000000000000000000117221340672067200217500ustar00rootroot00000000000000 post (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename Executor,
    typename CompletionToken>
DEDUCED post(
    const Executor & ex,
    CompletionToken && token,
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

This function submits an object for execution using the specified executor. The function object is queued for execution, and is never called from the current thread prior to returning from post().

This function has the following effects:

  • Constructs a function object handler of type Handler, initialized with handler(forward<CompletionToken>(token)).
  • Constructs an object result of type async_result<Handler>, initializing the object as result(handler).
  • Obtains the handler's associated executor object ex1 by performing get_associated_executor(handler).
  • Creates a work object w by performing make_work(ex1).
  • Obtains the handler's associated allocator object alloc by performing get_associated_allocator(handler).
  • Constructs a function object f with a function call operator that performs ex1.dispatch(std::move(handler), alloc) followed by w.reset().
  • Performs Executor(ex).post(std::move(f), alloc).
  • Returns result.get().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/post/overload3.html000066400000000000000000000061751340672067200217570ustar00rootroot00000000000000 post (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Submits a completion token or function object for execution.

template<
    typename ExecutionContext,
    typename CompletionToken>
DEDUCED post(
    ExecutionContext & ctx,
    CompletionToken && token,
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
Return Value

post(ctx.get_executor(), forward<CompletionToken>(token)).


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read.html000066400000000000000000000267731340672067200200150ustar00rootroot00000000000000 read
asio C++ library

PrevUpHomeNext

The read function is a composed operation that reads a certain amount of data from a stream before returning.

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename MutableBufferSequence>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename MutableBufferSequence>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    asio::error_code & ec,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b);
  » more...

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);
  » more...

template<
    typename SyncReadStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);
  » more...

template<
    typename SyncReadStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);
  » more...
Requirements

Header: asio/read.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/000077500000000000000000000000001340672067200171105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/read/overload1.html000066400000000000000000000140641340672067200216770ustar00rootroot00000000000000 read (1 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename MutableBufferSequence>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To read into a single data buffer use the buffer function as follows:

asio::read(s, asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::read(
    s, buffers,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload10.html000066400000000000000000000114521340672067200217550ustar00rootroot00000000000000 read (10 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

The basic_streambuf object into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Remarks

This overload is equivalent to calling:

asio::read(
    s, b,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload11.html000066400000000000000000000131511340672067200217540ustar00rootroot00000000000000 read (11 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

The basic_streambuf object into which the data will be read.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload12.html000066400000000000000000000126511340672067200217610ustar00rootroot00000000000000 read (12 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

The basic_streambuf object into which the data will be read.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload2.html000066400000000000000000000135061340672067200217000ustar00rootroot00000000000000 read (2 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename MutableBufferSequence>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    asio::error_code & ec,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Example

To read into a single data buffer use the buffer function as follows:

asio::read(s, asio::buffer(data, size), ec);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::read(
    s, buffers,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload3.html000066400000000000000000000152301340672067200216750ustar00rootroot00000000000000 read (3 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To read into a single data buffer use the buffer function as follows:

asio::read(s, asio::buffer(data, size),
    asio::transfer_at_least(32));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload4.html000066400000000000000000000132621340672067200217010ustar00rootroot00000000000000 read (4 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_mutable_buffer_sequence< MutableBufferSequence >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the stream.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload5.html000066400000000000000000000122321340672067200216760ustar00rootroot00000000000000 read (5 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The specified dynamic buffer sequence is full (that is, it has reached maximum size).
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This overload is equivalent to calling:

asio::read(
    s, buffers,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload6.html000066400000000000000000000115561340672067200217070ustar00rootroot00000000000000 read (6 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Remarks

This overload is equivalent to calling:

asio::read(
    s, buffers,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload7.html000066400000000000000000000133031340672067200217000ustar00rootroot00000000000000 read (7 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The specified dynamic buffer sequence is full (that is, it has reached maximum size).
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload8.html000066400000000000000000000130311340672067200216770ustar00rootroot00000000000000 read (8 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t read(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The specified dynamic buffer sequence is full (that is, it has reached maximum size).
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the stream's read_some function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read/overload9.html000066400000000000000000000120451340672067200217040ustar00rootroot00000000000000 read (9 of 12 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data from a stream before returning.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read(
    SyncReadStream & s,
    basic_streambuf< Allocator > & b);

This function is used to read a certain number of bytes of data from a stream. The call will block until one of the following conditions is true:

  • The supplied buffer is full (that is, it has reached maximum size).
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

The basic_streambuf object into which the data will be read.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This overload is equivalent to calling:

asio::read(
    s, b,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at.html000066400000000000000000000213051340672067200204630ustar00rootroot00000000000000 read_at
asio C++ library

PrevUpHomeNext

The read_at function is a composed operation that reads a certain amount of data at the specified offset before returning.

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);
  » more...

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);
  » more...
Requirements

Header: asio/read_at.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/000077500000000000000000000000001340672067200175745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/read_at/overload1.html000066400000000000000000000145051340672067200223630ustar00rootroot00000000000000 read_at (1 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To read into a single data buffer use the buffer function as follows:

asio::read_at(d, 42, asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::read_at(
    d, 42, buffers,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload2.html000066400000000000000000000141101340672067200223540ustar00rootroot00000000000000 read_at (2 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Example

To read into a single data buffer use the buffer function as follows:

asio::read_at(d, 42,
    asio::buffer(data, size), ec);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::read_at(
    d, 42, buffers,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload3.html000066400000000000000000000156251340672067200223710ustar00rootroot00000000000000 read_at (3 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read_some_at function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To read into a single data buffer use the buffer function as follows:

asio::read_at(d, 42, asio::buffer(data, size),
    asio::transfer_at_least(32));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload4.html000066400000000000000000000136261340672067200223710ustar00rootroot00000000000000 read_at (4 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    const MutableBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • The supplied buffers are full. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. The sum of the buffer sizes indicates the maximum number of bytes to read from the device.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read_some_at function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload5.html000066400000000000000000000124131340672067200223630ustar00rootroot00000000000000 read_at (5 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

b

The basic_streambuf object into which the data will be read.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This overload is equivalent to calling:

asio::read_at(
    d, 42, b,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload6.html000066400000000000000000000117661340672067200223760ustar00rootroot00000000000000 read_at (6 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

b

The basic_streambuf object into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Remarks

This overload is equivalent to calling:

asio::read_at(
    d, 42, b,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload7.html000066400000000000000000000134601340672067200223700ustar00rootroot00000000000000 read_at (7 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

b

The basic_streambuf object into which the data will be read.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read_some_at function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_at/overload8.html000066400000000000000000000131711340672067200223700ustar00rootroot00000000000000 read_at (8 of 8 overloads)
asio C++ library

PrevUpHomeNext

Attempt to read a certain amount of data at the specified offset before returning.

template<
    typename SyncRandomAccessReadDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t read_at(
    SyncRandomAccessReadDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);

This function is used to read a certain number of bytes of data from a random access device at the specified offset. The call will block until one of the following conditions is true:

  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's read_some_at function.

Parameters

d

The device from which the data is to be read. The type must support the SyncRandomAccessReadDevice concept.

offset

The offset at which the data will be read.

b

The basic_streambuf object into which the data will be read.

completion_condition

The function object to be called to determine whether the read operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest read_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the read operation is complete. A non-zero return value indicates the maximum number of bytes to be read on the next call to the device's read_some_at function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until.html000066400000000000000000000334571340672067200212250ustar00rootroot00000000000000 read_until
asio C++ library

PrevUpHomeNext

The read_until function is a composed operation that reads data into a dynamic buffer sequence, or into a streambuf, until it contains a delimiter, matches a regular expression, or a function object indicates a match.

Read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    char delim);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    char delim,
    asio::error_code & ec);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    string_view delim);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    string_view delim,
    asio::error_code & ec);
  » more...

Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    const boost::regex & expr);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    const boost::regex & expr,
    asio::error_code & ec);
  » more...

Read data into a dynamic buffer sequence until a function object indicates a match.

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    MatchCondition match_condition,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    MatchCondition match_condition,
    asio::error_code & ec,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  » more...

Read data into a streambuf until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    char delim);
  » more...

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    char delim,
    asio::error_code & ec);
  » more...

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    string_view delim);
  » more...

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    string_view delim,
    asio::error_code & ec);
  » more...

Read data into a streambuf until some part of the data it contains matches a regular expression.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr);
  » more...

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr,
    asio::error_code & ec);
  » more...

Read data into a streambuf until a function object indicates a match.

template<
    typename SyncReadStream,
    typename Allocator,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  » more...

template<
    typename SyncReadStream,
    typename Allocator,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    asio::error_code & ec,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);
  » more...
Requirements

Header: asio/read_until.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/000077500000000000000000000000001340672067200203235ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/read_until/overload1.html000066400000000000000000000163401340672067200231110ustar00rootroot00000000000000 read_until (1 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    char delim);

This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the dynamic buffer sequence contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

delim

The delimiter character.

Return Value

The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.

Example

To read data into a std::string until a newline is encountered:

std::string data;
std::string n = asio::read_until(s,
    asio::dynamic_buffer(data), '\n');
std::string line = data.substr(0, n);
data.erase(0, n);

After the read_until operation completes successfully, the string data contains the delimiter:

{ 'a', 'b', ..., 'c', '\n', 'd', 'e', ... }

The call to substr then extracts the data up to and including the delimiter, so that the string line contains:

{ 'a', 'b', ..., 'c', '\n' }

After the call to erase, the remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload10.html000066400000000000000000000124201340672067200231640ustar00rootroot00000000000000 read_until (10 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    char delim,
    asio::error_code & ec);

This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the streambuf contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

delim

The delimiter character.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the streambuf's get area up to and including the delimiter. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload11.html000066400000000000000000000156751340672067200232040ustar00rootroot00000000000000 read_until (11 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    string_view delim);

This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the streambuf contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

delim

The delimiter string.

Return Value

The number of bytes in the streambuf's get area up to and including the delimiter.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.

Example

To read data into a streambuf until a newline is encountered:

asio::streambuf b;
asio::read_until(s, b, "\r\n");
std::istream is(&b);
std::string line;
std::getline(is, line);

After the read_until operation completes successfully, the buffer b contains the delimiter:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to std::getline then extracts the data up to and including the newline (which is discarded), so that the string line contains:

{ 'a', 'b', ..., 'c', '\r' }

The remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload12.html000066400000000000000000000124301340672067200231670ustar00rootroot00000000000000 read_until (12 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    string_view delim,
    asio::error_code & ec);

This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the streambuf contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

delim

The delimiter string.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the streambuf's get area up to and including the delimiter. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload13.html000066400000000000000000000162471340672067200232020ustar00rootroot00000000000000 read_until (13 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until some part of the data it contains matches a regular expression.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr);

This function is used to read data into the specified streambuf until the streambuf's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:

  • A substring of the streambuf's get area matches the regular expression.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the streambuf's get area already contains data that matches the regular expression, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

expr

The regular expression.

Return Value

The number of bytes in the streambuf's get area up to and including the substring that matches the regular expression.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.

Example

To read data into a streambuf until a CR-LF sequence is encountered:

asio::streambuf b;
asio::read_until(s, b, boost::regex("\r\n"));
std::istream is(&b);
std::string line;
std::getline(is, line);

After the read_until operation completes successfully, the buffer b contains the data which matched the regular expression:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to std::getline then extracts the data up to and including the newline (which is discarded), so that the string line contains:

{ 'a', 'b', ..., 'c', '\r' }

The remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload14.html000066400000000000000000000127151340672067200231770ustar00rootroot00000000000000 read_until (14 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until some part of the data it contains matches a regular expression.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr,
    asio::error_code & ec);

This function is used to read data into the specified streambuf until the streambuf's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:

  • A substring of the streambuf's get area matches the regular expression.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the streambuf's get area already contains data that matches the regular expression, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

expr

The regular expression.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the streambuf's get area up to and including the substring that matches the regular expression. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload15.html000066400000000000000000000214601340672067200231750ustar00rootroot00000000000000 read_until (15 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until a function object indicates a match.

template<
    typename SyncReadStream,
    typename Allocator,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);

This function is used to read data into the specified streambuf until a user-defined match condition function object, when applied to the data contained in the streambuf, indicates a successful match. The call will block until one of the following conditions is true:

  • The match condition function object returns a std::pair where the second element evaluates to true.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the match condition function object already indicates a match, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

match_condition

The function object to be called to determine whether a match exists. The signature of the function object must be:

pair<iterator, bool> match_condition(iterator begin, iterator end);

where iterator represents the type:

buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>

The iterator parameters begin and end define the range of bytes to be scanned to determine whether there is a match. The first member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the begin parameter for any subsequent invocation of the match condition. The second member of the return value is true if a match has been found, false otherwise.

Return Value

The number of bytes in the streambuf's get area that have been fully consumed by the match function.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond that which matched the function object. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.

The default implementation of the is_match_condition type trait evaluates to true for function pointers and function objects with a result_type typedef. It must be specialised for other user-defined function objects.

Examples

To read data into a streambuf until whitespace is encountered:

typedef asio::buffers_iterator<
    asio::streambuf::const_buffers_type> iterator;

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
asio::streambuf b;
asio::read_until(s, b, match_whitespace);

To read data into a streambuf until a matching character is found:

class match_char
{
public:
  explicit match_char(char c) : c_(c) {}

  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }

private:
  char c_;
};

namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} // namespace asio
...
asio::streambuf b;
asio::read_until(s, b, match_char('a'));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload16.html000066400000000000000000000162431340672067200232010ustar00rootroot00000000000000 read_until (16 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until a function object indicates a match.

template<
    typename SyncReadStream,
    typename Allocator,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    MatchCondition match_condition,
    asio::error_code & ec,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);

This function is used to read data into the specified streambuf until a user-defined match condition function object, when applied to the data contained in the streambuf, indicates a successful match. The call will block until one of the following conditions is true:

  • The match condition function object returns a std::pair where the second element evaluates to true.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the match condition function object already indicates a match, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

match_condition

The function object to be called to determine whether a match exists. The signature of the function object must be:

pair<iterator, bool> match_condition(iterator begin, iterator end);

where iterator represents the type:

buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>

The iterator parameters begin and end define the range of bytes to be scanned to determine whether there is a match. The first member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the begin parameter for any subsequent invocation of the match condition. The second member of the return value is true if a match has been found, false otherwise.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the streambuf's get area that have been fully consumed by the match function. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond that which matched the function object. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.

The default implementation of the is_match_condition type trait evaluates to true for function pointers and function objects with a result_type typedef. It must be specialised for other user-defined function objects.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload2.html000066400000000000000000000127451340672067200231170ustar00rootroot00000000000000 read_until (2 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    char delim,
    asio::error_code & ec);

This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the dynamic buffer sequence contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

delim

The delimiter character.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload3.html000066400000000000000000000155071340672067200231170ustar00rootroot00000000000000 read_until (3 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    string_view delim);

This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the dynamic buffer sequence contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

delim

The delimiter string.

Return Value

The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.

Example

To read data into a std::string until a CR-LF sequence is encountered:

std::string data;
std::string n = asio::read_until(s,
    asio::dynamic_buffer(data), "\r\n");
std::string line = data.substr(0, n);
data.erase(0, n);

After the read_until operation completes successfully, the string data contains the delimiter:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to substr then extracts the data up to and including the delimiter, so that the string line contains:

{ 'a', 'b', ..., 'c', '\r', '\n' }

After the call to erase, the remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload4.html000066400000000000000000000127511340672067200231160ustar00rootroot00000000000000 read_until (4 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    string_view delim,
    asio::error_code & ec);

This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the dynamic buffer sequence contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the dynamic buffer sequence's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

The dynamic buffer sequence into which the data will be read.

delim

The delimiter string.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the dynamic buffer sequence's get area up to and including the delimiter. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond the delimiter. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload5.html000066400000000000000000000167021340672067200231170ustar00rootroot00000000000000 read_until (5 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    const boost::regex & expr);

This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:

  • A substring of the dynamic buffer sequence's get area matches the regular expression.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the dynamic buffer sequence's get area already contains data that matches the regular expression, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

A dynamic buffer sequence into which the data will be read.

expr

The regular expression.

Return Value

The number of bytes in the dynamic buffer sequence's get area up to and including the substring that matches the regular expression.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.

Example

To read data into a std::string until a CR-LF sequence is encountered:

std::string data;
std::string n = asio::read_until(s,
    asio::dynamic_buffer(data), boost::regex("\r\n"));
std::string line = data.substr(0, n);
data.erase(0, n);

After the read_until operation completes successfully, the string data contains the delimiter:

{ 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... }

The call to substr then extracts the data up to and including the delimiter, so that the string line contains:

{ 'a', 'b', ..., 'c', '\r', '\n' }

After the call to erase, the remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload6.html000066400000000000000000000132341340672067200231150ustar00rootroot00000000000000 read_until (6 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until some part of the data it contains matches a regular expression.

template<
    typename SyncReadStream,
    typename DynamicBuffer>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    const boost::regex & expr,
    asio::error_code & ec);

This function is used to read data into the specified dynamic buffer sequence until the dynamic buffer sequence's get area contains some data that matches a regular expression. The call will block until one of the following conditions is true:

  • A substring of the dynamic buffer sequence's get area matches the regular expression.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the dynamic buffer sequence's get area already contains data that matches the regular expression, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

A dynamic buffer sequence into which the data will be read.

expr

The regular expression.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the dynamic buffer sequence's get area up to and including the substring that matches the regular expression. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the regular expression. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload7.html000066400000000000000000000217441340672067200231230ustar00rootroot00000000000000 read_until (7 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until a function object indicates a match.

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    MatchCondition match_condition,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);

This function is used to read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The call will block until one of the following conditions is true:

  • The match condition function object returns a std::pair where the second element evaluates to true.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the match condition function object already indicates a match, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

A dynamic buffer sequence into which the data will be read.

match_condition

The function object to be called to determine whether a match exists. The signature of the function object must be:

pair<iterator, bool> match_condition(iterator begin, iterator end);

where iterator represents the type:

buffers_iterator<typename DynamicBuffer::const_buffers_type>

The iterator parameters begin and end define the range of bytes to be scanned to determine whether there is a match. The first member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the begin parameter for any subsequent invocation of the match condition. The second member of the return value is true if a match has been found, false otherwise.

Return Value

The number of bytes in the dynamic_buffer's get area that have been fully consumed by the match function.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.

The default implementation of the is_match_condition type trait evaluates to true for function pointers and function objects with a result_type typedef. It must be specialised for other user-defined function objects.

Examples

To read data into a dynamic buffer sequence until whitespace is encountered:

typedef asio::buffers_iterator<
    asio::const_buffers_1> iterator;

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}
...
std::string data;
asio::read_until(s, data, match_whitespace);

To read data into a std::string until a matching character is found:

class match_char
{
public:
  explicit match_char(char c) : c_(c) {}

  template <typename Iterator>
  std::pair<Iterator, bool> operator()(
      Iterator begin, Iterator end) const
  {
    Iterator i = begin;
    while (i != end)
      if (c_ == *i++)
        return std::make_pair(i, true);
    return std::make_pair(i, false);
  }

private:
  char c_;
};

namespace asio {
  template <> struct is_match_condition<match_char>
    : public boost::true_type {};
} // namespace asio
...
std::string data;
asio::read_until(s, data, match_char('a'));

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload8.html000066400000000000000000000163771340672067200231320ustar00rootroot00000000000000 read_until (8 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a dynamic buffer sequence until a function object indicates a match.

template<
    typename SyncReadStream,
    typename DynamicBuffer,
    typename MatchCondition>
std::size_t read_until(
    SyncReadStream & s,
    DynamicBuffer && buffers,
    MatchCondition match_condition,
    asio::error_code & ec,
    typename enable_if< is_match_condition< MatchCondition >::value >::type *  = 0);

This function is used to read data into the specified dynamic buffer sequence until a user-defined match condition function object, when applied to the data contained in the dynamic buffer sequence, indicates a successful match. The call will block until one of the following conditions is true:

  • The match condition function object returns a std::pair where the second element evaluates to true.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the match condition function object already indicates a match, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

buffers

A dynamic buffer sequence into which the data will be read.

match_condition

The function object to be called to determine whether a match exists. The signature of the function object must be:

pair<iterator, bool> match_condition(iterator begin, iterator end);

where iterator represents the type:

buffers_iterator<DynamicBuffer::const_buffers_type>

The iterator parameters begin and end define the range of bytes to be scanned to determine whether there is a match. The first member of the return value is an iterator marking one-past-the-end of the bytes that have been consumed by the match function. This iterator is used to calculate the begin parameter for any subsequent invocation of the match condition. The second member of the return value is true if a match has been found, false otherwise.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes in the dynamic buffer sequence's get area that have been fully consumed by the match function. Returns 0 if an error occurred.

Remarks

After a successful read_until operation, the dynamic buffer sequence may contain additional data beyond that which matched the function object. An application will typically leave that data in the dynamic buffer sequence for a subsequent read_until operation to examine.

The default implementation of the is_match_condition type trait evaluates to true for function pointers and function objects with a result_type typedef. It must be specialised for other user-defined function objects.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_until/overload9.html000066400000000000000000000156161340672067200231260ustar00rootroot00000000000000 read_until (9 of 16 overloads)
asio C++ library

PrevUpHomeNext

Read data into a streambuf until it contains a specified delimiter.

template<
    typename SyncReadStream,
    typename Allocator>
std::size_t read_until(
    SyncReadStream & s,
    asio::basic_streambuf< Allocator > & b,
    char delim);

This function is used to read data into the specified streambuf until the streambuf's get area contains the specified delimiter. The call will block until one of the following conditions is true:

  • The get area of the streambuf contains the specified delimiter.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's read_some function. If the streambuf's get area already contains the delimiter, the function returns immediately.

Parameters

s

The stream from which the data is to be read. The type must support the SyncReadStream concept.

b

A streambuf object into which the data will be read.

delim

The delimiter character.

Return Value

The number of bytes in the streambuf's get area up to and including the delimiter.

Exceptions

asio::system_error

Thrown on failure.

Remarks

After a successful read_until operation, the streambuf may contain additional data beyond the delimiter. An application will typically leave that data in the streambuf for a subsequent read_until operation to examine.

Example

To read data into a streambuf until a newline is encountered:

asio::streambuf b;
asio::read_until(s, b, '\n');
std::istream is(&b);
std::string line;
std::getline(is, line);

After the read_until operation completes successfully, the buffer b contains the delimiter:

{ 'a', 'b', ..., 'c', '\n', 'd', 'e', ... }

The call to std::getline then extracts the data up to and including the newline (which is discarded), so that the string line contains:

{ 'a', 'b', ..., 'c' }

The remaining data is left in the buffer b as follows:

{ 'd', 'e', ... }

This data may be the start of a new line, to be extracted by a subsequent read_until operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/read_write_operations.html000066400000000000000000000102261340672067200234540ustar00rootroot00000000000000 Requirements on read and write operations
asio C++ library

PrevUpHomeNext

A read operation is an operation that reads data into a mutable buffer sequence argument of a type meeting MutableBufferSequence requirements. The mutable buffer sequence specifies memory where the data should be placed. A read operation shall always fill a buffer in the sequence completely before proceeding to the next.

A write operation is an operation that writes data from a constant buffer sequence argument of a type meeting ConstBufferSequence requirements. The constant buffer sequence specifies memory where the data to be written is located. A write operation shall always write a buffer in the sequence completely before proceeding to the next.

If a read or write operation is also an asynchronous operation, the operation shall maintain one or more copies of the buffer sequence until such time as the operation no longer requires access to the memory specified by the buffers in the sequence. The program shall ensure the memory remains valid until:

— the last copy of the buffer sequence is destroyed, or

— the completion handler for the asynchronous operation is invoked,

whichever comes first.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/resolver_errc__try_again.html000066400000000000000000000056761340672067200241510ustar00rootroot00000000000000 resolver_errc::try_again
asio C++ library

PrevUpHomeNext

const error::netdb_errors try_again = error::host_not_found_try_again;
Requirements

Header: asio/error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port.html000066400000000000000000000324611340672067200214140ustar00rootroot00000000000000 serial_port
asio C++ library

PrevUpHomeNext

Provides serial port functionality.

class serial_port :
  public serial_port_base
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

A basic_serial_port is always the lowest layer.

native_handle_type

The native representation of a serial port.

Member Functions

Name

Description

assign

Assign an existing native serial port to the serial port.

async_read_some

Start an asynchronous read.

async_write_some

Start an asynchronous write.

cancel

Cancel all asynchronous operations associated with the serial port.

close

Close the serial port.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the serial port.

is_open

Determine whether the serial port is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native serial port representation.

open

Open the serial port using the specified device name.

operator=

Move-assign a serial_port from another.

read_some

Read some data from the serial port.

send_break

Send a break sequence to the serial port.

serial_port

Construct a serial_port without opening it.

Construct and open a serial_port.

Construct a serial_port on an existing native serial port.

Move-construct a serial_port from another.

set_option

Set an option on the serial port.

write_some

Write some data to the serial port.

~serial_port

Destroys the serial port.

The serial_port class provides a wrapper over serial port functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/serial_port.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/000077500000000000000000000000001340672067200205205ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/_serial_port.html000066400000000000000000000053251340672067200240750ustar00rootroot00000000000000 serial_port::~serial_port
asio C++ library

PrevUpHomeNext

Destroys the serial port.

~serial_port();

This function destroys the serial port, cancelling any outstanding asynchronous wait operations associated with the serial port as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/assign.html000066400000000000000000000061251340672067200226760ustar00rootroot00000000000000 serial_port::assign
asio C++ library

PrevUpHomeNext

Assign an existing native serial port to the serial port.

void assign(
    const native_handle_type & native_serial_port);
  » more...

void assign(
    const native_handle_type & native_serial_port,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/assign/000077500000000000000000000000001340672067200220045ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/assign/overload1.html000066400000000000000000000050121340672067200245640ustar00rootroot00000000000000 serial_port::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native serial port to the serial port.

void assign(
    const native_handle_type & native_serial_port);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/assign/overload2.html000066400000000000000000000051151340672067200245710ustar00rootroot00000000000000 serial_port::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native serial port to the serial port.

void assign(
    const native_handle_type & native_serial_port,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/async_read_some.html000066400000000000000000000142701340672067200245450ustar00rootroot00000000000000 serial_port::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read data from the serial port. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes read.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The read operation may not read all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.

Example

To read into a single data buffer use the buffer function as follows:

serial_port.async_read_some(asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/async_write_some.html000066400000000000000000000142041340672067200247610ustar00rootroot00000000000000 serial_port::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write data to the serial port. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be written to the serial port. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes written.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The write operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To write a single data buffer use the buffer function as follows:

serial_port.async_write_some(asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/cancel.html000066400000000000000000000060121340672067200226320ustar00rootroot00000000000000 serial_port::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the serial port.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/cancel/000077500000000000000000000000001340672067200217455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/cancel/overload1.html000066400000000000000000000063421340672067200245340ustar00rootroot00000000000000 serial_port::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the serial port.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/cancel/overload2.html000066400000000000000000000064061340672067200245360ustar00rootroot00000000000000 serial_port::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the serial port.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/close.html000066400000000000000000000057101340672067200225160ustar00rootroot00000000000000 serial_port::close
asio C++ library

PrevUpHomeNext

Close the serial port.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/close/000077500000000000000000000000001340672067200216255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/close/overload1.html000066400000000000000000000062311340672067200244110ustar00rootroot00000000000000 serial_port::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the serial port.

void close();

This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/close/overload2.html000066400000000000000000000063411340672067200244140ustar00rootroot00000000000000 serial_port::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the serial port.

void close(
    asio::error_code & ec);

This function is used to close the serial port. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/executor_type.html000066400000000000000000000200011340672067200242760ustar00rootroot00000000000000 serial_port::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/serial_port.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/get_executor.html000066400000000000000000000047531340672067200241140ustar00rootroot00000000000000 serial_port::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/get_io_context.html000066400000000000000000000070041340672067200244210ustar00rootroot00000000000000 serial_port::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/get_io_service.html000066400000000000000000000067741340672067200244120ustar00rootroot00000000000000 serial_port::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/get_option.html000066400000000000000000000067171340672067200235700ustar00rootroot00000000000000 serial_port::get_option
asio C++ library

PrevUpHomeNext

Get an option from the serial port.

template<
    typename GettableSerialPortOption>
void get_option(
    GettableSerialPortOption & option);
  » more...

template<
    typename GettableSerialPortOption>
void get_option(
    GettableSerialPortOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/get_option/000077500000000000000000000000001340672067200226675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/get_option/overload1.html000066400000000000000000000074711340672067200254620ustar00rootroot00000000000000 serial_port::get_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get an option from the serial port.

template<
    typename GettableSerialPortOption>
void get_option(
    GettableSerialPortOption & option);

This function is used to get the current value of an option on the serial port.

Parameters

option

The option value to be obtained from the serial port.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/get_option/overload2.html000066400000000000000000000067431340672067200254640ustar00rootroot00000000000000 serial_port::get_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get an option from the serial port.

template<
    typename GettableSerialPortOption>
void get_option(
    GettableSerialPortOption & option,
    asio::error_code & ec);

This function is used to get the current value of an option on the serial port.

Parameters

option

The option value to be obtained from the serial port.

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/is_open.html000066400000000000000000000047401340672067200230470ustar00rootroot00000000000000 serial_port::is_open
asio C++ library

PrevUpHomeNext

Determine whether the serial port is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/lowest_layer.html000066400000000000000000000062731340672067200241270ustar00rootroot00000000000000 serial_port::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/lowest_layer/000077500000000000000000000000001340672067200232315ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/lowest_layer/overload1.html000066400000000000000000000065031340672067200260170ustar00rootroot00000000000000 serial_port::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since a serial_port cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/lowest_layer/overload2.html000066400000000000000000000065651340672067200260300ustar00rootroot00000000000000 serial_port::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since a serial_port cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/lowest_layer_type.html000066400000000000000000000337221340672067200251670ustar00rootroot00000000000000 serial_port::lowest_layer_type
asio C++ library

PrevUpHomeNext

A basic_serial_port is always the lowest layer.

typedef serial_port lowest_layer_type;
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

A basic_serial_port is always the lowest layer.

native_handle_type

The native representation of a serial port.

Member Functions

Name

Description

assign

Assign an existing native serial port to the serial port.

async_read_some

Start an asynchronous read.

async_write_some

Start an asynchronous write.

cancel

Cancel all asynchronous operations associated with the serial port.

close

Close the serial port.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_option

Get an option from the serial port.

is_open

Determine whether the serial port is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native serial port representation.

open

Open the serial port using the specified device name.

operator=

Move-assign a serial_port from another.

read_some

Read some data from the serial port.

send_break

Send a break sequence to the serial port.

serial_port

Construct a serial_port without opening it.

Construct and open a serial_port.

Construct a serial_port on an existing native serial port.

Move-construct a serial_port from another.

set_option

Set an option on the serial port.

write_some

Write some data to the serial port.

~serial_port

Destroys the serial port.

The serial_port class provides a wrapper over serial port functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/serial_port.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/native_handle.html000066400000000000000000000053771340672067200242230ustar00rootroot00000000000000 serial_port::native_handle
asio C++ library

PrevUpHomeNext

Get the native serial port representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/native_handle_type.html000066400000000000000000000060411340672067200252510ustar00rootroot00000000000000 serial_port::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a serial port.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/serial_port.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/open.html000066400000000000000000000060431340672067200223520ustar00rootroot00000000000000 serial_port::open
asio C++ library

PrevUpHomeNext

Open the serial port using the specified device name.

void open(
    const std::string & device);
  » more...

void open(
    const std::string & device,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/open/000077500000000000000000000000001340672067200214615ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/open/overload1.html000066400000000000000000000067711340672067200242560ustar00rootroot00000000000000 serial_port::open (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Open the serial port using the specified device name.

void open(
    const std::string & device);

This function opens the serial port for the specified device name.

Parameters

device

The platform-specific device name.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/open/overload2.html000066400000000000000000000063731340672067200242550ustar00rootroot00000000000000 serial_port::open (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Open the serial port using the specified device name.

void open(
    const std::string & device,
    asio::error_code & ec);

This function opens the serial port using the given platform-specific device name.

Parameters

device

The platform-specific device name.

ec

Set the indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/operator_eq_.html000066400000000000000000000074111340672067200240700ustar00rootroot00000000000000 serial_port::operator=
asio C++ library

PrevUpHomeNext

Move-assign a serial_port from another.

serial_port & operator=(
    serial_port && other);

This assignment operator moves a serial port from one object to another.

Parameters

other

The other serial_port object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the serial_port(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/read_some.html000066400000000000000000000066631340672067200233570ustar00rootroot00000000000000 serial_port::read_some
asio C++ library

PrevUpHomeNext

Read some data from the serial port.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/read_some/000077500000000000000000000000001340672067200224565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/read_some/overload1.html000066400000000000000000000136161340672067200252470ustar00rootroot00000000000000 serial_port::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the serial port.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

Return Value

The number of bytes read.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To read into a single data buffer use the buffer function as follows:

serial_port.read_some(asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/read_some/overload2.html000066400000000000000000000111571340672067200252460ustar00rootroot00000000000000 serial_port::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the serial port.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read data from the serial port. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. Returns 0 if an error occurred.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/send_break.html000066400000000000000000000061251340672067200235070ustar00rootroot00000000000000 serial_port::send_break
asio C++ library

PrevUpHomeNext

Send a break sequence to the serial port.

void send_break();
  » more...

void send_break(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/send_break/000077500000000000000000000000001340672067200226155ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/send_break/overload1.html000066400000000000000000000061731340672067200254060ustar00rootroot00000000000000 serial_port::send_break (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Send a break sequence to the serial port.

void send_break();

This function causes a break sequence of platform-specific duration to be sent out the serial port.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/send_break/overload2.html000066400000000000000000000062471340672067200254110ustar00rootroot00000000000000 serial_port::send_break (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Send a break sequence to the serial port.

void send_break(
    asio::error_code & ec);

This function causes a break sequence of platform-specific duration to be sent out the serial port.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/serial_port.html000066400000000000000000000117341340672067200237370ustar00rootroot00000000000000 serial_port::serial_port
asio C++ library

PrevUpHomeNext

Construct a serial_port without opening it.

explicit serial_port(
    asio::io_context & io_context);
  » more...

Construct and open a serial_port.

explicit serial_port(
    asio::io_context & io_context,
    const char * device);
  » more...

explicit serial_port(
    asio::io_context & io_context,
    const std::string & device);
  » more...

Construct a serial_port on an existing native serial port.

serial_port(
    asio::io_context & io_context,
    const native_handle_type & native_serial_port);
  » more...

Move-construct a serial_port from another.

serial_port(
    serial_port && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/serial_port/000077500000000000000000000000001340672067200230435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/serial_port/overload1.html000066400000000000000000000067411340672067200256350ustar00rootroot00000000000000 serial_port::serial_port (1 of 5 overloads)
asio C++ library

PrevUpHomeNext

Construct a serial_port without opening it.

serial_port(
    asio::io_context & io_context);

This constructor creates a serial port without opening it.

Parameters

io_context

The io_context object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/serial_port/overload2.html000066400000000000000000000072371340672067200256370ustar00rootroot00000000000000 serial_port::serial_port (2 of 5 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a serial_port.

serial_port(
    asio::io_context & io_context,
    const char * device);

This constructor creates and opens a serial port for the specified device name.

Parameters

io_context

The io_context object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.

device

The platform-specific device name for this serial port.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/serial_port/overload3.html000066400000000000000000000072521340672067200256350ustar00rootroot00000000000000 serial_port::serial_port (3 of 5 overloads)
asio C++ library

PrevUpHomeNext

Construct and open a serial_port.

serial_port(
    asio::io_context & io_context,
    const std::string & device);

This constructor creates and opens a serial port for the specified device name.

Parameters

io_context

The io_context object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.

device

The platform-specific device name for this serial port.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/serial_port/overload4.html000066400000000000000000000103051340672067200256270ustar00rootroot00000000000000 serial_port::serial_port (4 of 5 overloads)
asio C++ library

PrevUpHomeNext

Construct a serial_port on an existing native serial port.

serial_port(
    asio::io_context & io_context,
    const native_handle_type & native_serial_port);

This constructor creates a serial port object to hold an existing native serial port.

Parameters

io_context

The io_context object that the serial port will use to dispatch handlers for any asynchronous operations performed on the port.

native_serial_port

A native serial port.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/serial_port/overload5.html000066400000000000000000000075741340672067200256460ustar00rootroot00000000000000 serial_port::serial_port (5 of 5 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a serial_port from another.

serial_port(
    serial_port && other);

This constructor moves a serial port from one object to another.

Parameters

other

The other serial_port object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the serial_port(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/set_option.html000066400000000000000000000067761340672067200236110ustar00rootroot00000000000000 serial_port::set_option
asio C++ library

PrevUpHomeNext

Set an option on the serial port.

template<
    typename SettableSerialPortOption>
void set_option(
    const SettableSerialPortOption & option);
  » more...

template<
    typename SettableSerialPortOption>
void set_option(
    const SettableSerialPortOption & option,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/set_option/000077500000000000000000000000001340672067200227035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/set_option/overload1.html000066400000000000000000000074251340672067200254750ustar00rootroot00000000000000 serial_port::set_option (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set an option on the serial port.

template<
    typename SettableSerialPortOption>
void set_option(
    const SettableSerialPortOption & option);

This function is used to set an option on the serial port.

Parameters

option

The option value to be set on the serial port.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/set_option/overload2.html000066400000000000000000000067131340672067200254750ustar00rootroot00000000000000 serial_port::set_option (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set an option on the serial port.

template<
    typename SettableSerialPortOption>
void set_option(
    const SettableSerialPortOption & option,
    asio::error_code & ec);

This function is used to set an option on the serial port.

Parameters

option

The option value to be set on the serial port.

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/write_some.html000066400000000000000000000067501340672067200235730ustar00rootroot00000000000000 serial_port::write_some
asio C++ library

PrevUpHomeNext

Write some data to the serial port.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/write_some/000077500000000000000000000000001340672067200226755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port/write_some/overload1.html000066400000000000000000000136311340672067200254630ustar00rootroot00000000000000 serial_port::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the serial port.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the serial port.

Return Value

The number of bytes written.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.

Example

To write a single data buffer use the buffer function as follows:

serial_port.write_some(asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port/write_some/overload2.html000066400000000000000000000112001340672067200254520ustar00rootroot00000000000000 serial_port::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the serial port.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write data to the serial port. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the serial port.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. Returns 0 if an error occurred.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base.html000066400000000000000000000151151340672067200224030ustar00rootroot00000000000000 serial_port_base
asio C++ library

PrevUpHomeNext

The serial_port_base class is used as a base for the basic_serial_port class template so that we have a common place to define the serial port options.

class serial_port_base
Types

Name

Description

baud_rate

Serial port option to permit changing the baud rate.

character_size

Serial port option to permit changing the character size.

flow_control

Serial port option to permit changing the flow control.

parity

Serial port option to permit changing the parity.

stop_bits

Serial port option to permit changing the number of stop bits.

Protected Member Functions

Name

Description

~serial_port_base

Protected destructor to prevent deletion through this type.

Requirements

Header: asio/serial_port_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base/000077500000000000000000000000001340672067200215125ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port_base/_serial_port_base.html000066400000000000000000000051641340672067200260620ustar00rootroot00000000000000 serial_port_base::~serial_port_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~serial_port_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__baud_rate.html000066400000000000000000000115451340672067200245530ustar00rootroot00000000000000 serial_port_base::baud_rate
asio C++ library

PrevUpHomeNext

Serial port option to permit changing the baud rate.

class baud_rate
Member Functions

Name

Description

baud_rate

load

store

value

Implements changing the baud rate for a given serial port.

Requirements

Header: asio/serial_port_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__baud_rate/000077500000000000000000000000001340672067200236575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port_base__baud_rate/baud_rate.html000066400000000000000000000051261340672067200264770ustar00rootroot00000000000000 serial_port_base::baud_rate::baud_rate
asio C++ library

PrevUpHomeNext

baud_rate(
    unsigned int rate = 0);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__baud_rate/load.html000066400000000000000000000050711340672067200254670ustar00rootroot00000000000000 serial_port_base::baud_rate::load
asio C++ library

PrevUpHomeNext

void load(
    const ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__baud_rate/store.html000066400000000000000000000050541340672067200257050ustar00rootroot00000000000000 serial_port_base::baud_rate::store
asio C++ library

PrevUpHomeNext

void store(
    ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__baud_rate/value.html000066400000000000000000000051131340672067200256610ustar00rootroot00000000000000 serial_port_base::baud_rate::value
asio C++ library

PrevUpHomeNext

unsigned int value() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__character_size.html000066400000000000000000000120201340672067200256000ustar00rootroot00000000000000 serial_port_base::character_size
asio C++ library

PrevUpHomeNext

Serial port option to permit changing the character size.

class character_size
Member Functions

Name

Description

character_size

load

store

value

Implements changing the character size for a given serial port.

Requirements

Header: asio/serial_port_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__character_size/000077500000000000000000000000001340672067200247175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port_base__character_size/character_size.html000066400000000000000000000052741340672067200306030ustar00rootroot00000000000000 serial_port_base::character_size::character_size
asio C++ library

PrevUpHomeNext

character_size(
    unsigned int t = 8);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__character_size/load.html000066400000000000000000000052041340672067200265250ustar00rootroot00000000000000 serial_port_base::character_size::load
asio C++ library

PrevUpHomeNext

void load(
    const ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__character_size/store.html000066400000000000000000000051431340672067200267440ustar00rootroot00000000000000 serial_port_base::character_size::store
asio C++ library

PrevUpHomeNext

void store(
    ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__character_size/value.html000066400000000000000000000051651340672067200267300ustar00rootroot00000000000000 serial_port_base::character_size::value
asio C++ library

PrevUpHomeNext

unsigned int value() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__flow_control.html000066400000000000000000000135351340672067200253350ustar00rootroot00000000000000 serial_port_base::flow_control
asio C++ library

PrevUpHomeNext

Serial port option to permit changing the flow control.

class flow_control
Types

Name

Description

type

Member Functions

Name

Description

flow_control

load

store

value

Implements changing the flow control for a given serial port.

Requirements

Header: asio/serial_port_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__flow_control/000077500000000000000000000000001340672067200244405ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port_base__flow_control/flow_control.html000066400000000000000000000052151340672067200300400ustar00rootroot00000000000000 serial_port_base::flow_control::flow_control
asio C++ library

PrevUpHomeNext

flow_control(
    type t = none);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__flow_control/load.html000066400000000000000000000051461340672067200262530ustar00rootroot00000000000000 serial_port_base::flow_control::load
asio C++ library

PrevUpHomeNext

void load(
    const ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__flow_control/store.html000066400000000000000000000051111340672067200264600ustar00rootroot00000000000000 serial_port_base::flow_control::store
asio C++ library

PrevUpHomeNext

void store(
    ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__flow_control/type.html000066400000000000000000000064611340672067200263160ustar00rootroot00000000000000 serial_port_base::flow_control::type
asio C++ library

PrevUpHomeNext

enum type

Values

none
software
hardware

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__flow_control/value.html000066400000000000000000000050751340672067200264510ustar00rootroot00000000000000 serial_port_base::flow_control::value
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__parity.html000066400000000000000000000131271340672067200241330ustar00rootroot00000000000000 serial_port_base::parity
asio C++ library

PrevUpHomeNext

Serial port option to permit changing the parity.

class parity
Types

Name

Description

type

Member Functions

Name

Description

load

parity

store

value

Implements changing the parity for a given serial port.

Requirements

Header: asio/serial_port_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__parity/000077500000000000000000000000001340672067200232415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port_base__parity/load.html000066400000000000000000000051071340672067200250510ustar00rootroot00000000000000 serial_port_base::parity::load
asio C++ library

PrevUpHomeNext

void load(
    const ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__parity/parity.html000066400000000000000000000047241340672067200254460ustar00rootroot00000000000000 serial_port_base::parity::parity
asio C++ library

PrevUpHomeNext

parity(
    type t = none);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__parity/store.html000066400000000000000000000050171340672067200252660ustar00rootroot00000000000000 serial_port_base::parity::store
asio C++ library

PrevUpHomeNext

void store(
    ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__parity/type.html000066400000000000000000000062711340672067200251160ustar00rootroot00000000000000 serial_port_base::parity::type
asio C++ library

PrevUpHomeNext

enum type

Values

none
odd
even

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__parity/value.html000066400000000000000000000050151340672067200252440ustar00rootroot00000000000000 serial_port_base::parity::value
asio C++ library

PrevUpHomeNext

type value() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits.html000066400000000000000000000133021340672067200246240ustar00rootroot00000000000000 serial_port_base::stop_bits
asio C++ library

PrevUpHomeNext

Serial port option to permit changing the number of stop bits.

class stop_bits
Types

Name

Description

type

Member Functions

Name

Description

load

stop_bits

store

value

Implements changing the number of stop bits for a given serial port.

Requirements

Header: asio/serial_port_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits/000077500000000000000000000000001340672067200237375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits/load.html000066400000000000000000000051751340672067200255540ustar00rootroot00000000000000 serial_port_base::stop_bits::load
asio C++ library

PrevUpHomeNext

void load(
    const ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits/stop_bits.html000066400000000000000000000050111340672067200266300ustar00rootroot00000000000000 serial_port_base::stop_bits::stop_bits
asio C++ library

PrevUpHomeNext

stop_bits(
    type t = one);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits/store.html000066400000000000000000000050741340672067200257670ustar00rootroot00000000000000 serial_port_base::stop_bits::store
asio C++ library

PrevUpHomeNext

void store(
    ASIO_OPTION_STORAGE & storage,
    asio::error_code & ec) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits/type.html000066400000000000000000000063721340672067200256160ustar00rootroot00000000000000 serial_port_base::stop_bits::type
asio C++ library

PrevUpHomeNext

enum type

Values

one
onepointfive
two

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/serial_port_base__stop_bits/value.html000066400000000000000000000050271340672067200257450ustar00rootroot00000000000000 serial_port_base::stop_bits::value
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/service_already_exists.html000066400000000000000000000101341340672067200236220ustar00rootroot00000000000000 service_already_exists
asio C++ library

PrevUpHomeNext

Exception thrown when trying to add a duplicate service to an execution_context.

class service_already_exists
Member Functions

Name

Description

service_already_exists

Requirements

Header: asio/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/service_already_exists/000077500000000000000000000000001340672067200227355ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/service_already_exists/service_already_exists.html000066400000000000000000000051321340672067200303640ustar00rootroot00000000000000 service_already_exists::service_already_exists
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set.html000066400000000000000000000310541340672067200212160ustar00rootroot00000000000000 signal_set
asio C++ library

PrevUpHomeNext

Provides signal functionality.

class signal_set
Types

Name

Description

executor_type

The type of the executor associated with the object.

Member Functions

Name

Description

add

Add a signal to a signal_set.

async_wait

Start an asynchronous operation to wait for a signal to be delivered.

cancel

Cancel all operations associated with the signal set.

clear

Remove all signals from a signal_set.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

remove

Remove a signal from a signal_set.

signal_set

Construct a signal set without adding any signals.

Construct a signal set and add one signal.

Construct a signal set and add two signals.

Construct a signal set and add three signals.

~signal_set

Destroys the signal set.

The signal_set class provides the ability to perform an asynchronous wait for one or more signals to occur.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Example

Performing an asynchronous wait:

void handler(
    const asio::error_code& error,
    int signal_number)
{
  if (!error)
  {
    // A signal occurred.
  }
}

...

// Construct a signal set registered for process termination.
asio::signal_set signals(io_context, SIGINT, SIGTERM);

// Start an asynchronous wait for one of the signals to occur.
signals.async_wait(handler);
Queueing of signal notifications

If a signal is registered with a signal_set, and the signal occurs when there are no waiting handlers, then the signal notification is queued. The next async_wait operation on that signal_set will dequeue the notification. If multiple notifications are queued, subsequent async_wait operations dequeue them one at a time. Signal notifications are dequeued in order of ascending signal number.

If a signal number is removed from a signal_set (using the remove or erase member functions) then any queued notifications for that signal are discarded.

Multiple registration of signals

The same signal number may be registered with different signal_set objects. When the signal occurs, one handler is called for each signal_set object.

Note that multiple registration only works for signals that are registered using Asio. The application must not also register a signal handler using functions such as signal() or sigaction().

Signal masking on POSIX platforms

POSIX allows signals to be blocked using functions such as sigprocmask() and pthread_sigmask(). For signals to be delivered, programs must ensure that any signals registered using signal_set objects are unblocked in at least one thread.

Requirements

Header: asio/signal_set.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/000077500000000000000000000000001340672067200203255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/signal_set/_signal_set.html000066400000000000000000000052551340672067200235110ustar00rootroot00000000000000 signal_set::~signal_set
asio C++ library

PrevUpHomeNext

Destroys the signal set.

~signal_set();

This function destroys the signal set, cancelling any outstanding asynchronous wait operations associated with the signal set as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/add.html000066400000000000000000000060061340672067200217450ustar00rootroot00000000000000 signal_set::add
asio C++ library

PrevUpHomeNext

Add a signal to a signal_set.

void add(
    int signal_number);
  » more...

void add(
    int signal_number,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/add/000077500000000000000000000000001340672067200210555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/signal_set/add/overload1.html000066400000000000000000000071251340672067200236440ustar00rootroot00000000000000 signal_set::add (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Add a signal to a signal_set.

void add(
    int signal_number);

This function adds the specified signal to the set. It has no effect if the signal is already in the set.

Parameters

signal_number

The signal to be added to the set.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/add/overload2.html000066400000000000000000000064771340672067200236560ustar00rootroot00000000000000 signal_set::add (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Add a signal to a signal_set.

void add(
    int signal_number,
    asio::error_code & ec);

This function adds the specified signal to the set. It has no effect if the signal is already in the set.

Parameters

signal_number

The signal to be added to the set.

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/async_wait.html000066400000000000000000000111761340672067200233620ustar00rootroot00000000000000 signal_set::async_wait
asio C++ library

PrevUpHomeNext

Start an asynchronous operation to wait for a signal to be delivered.

template<
    typename SignalHandler>
DEDUCED async_wait(
    SignalHandler && handler);

This function may be used to initiate an asynchronous wait against the signal set. It always returns immediately.

For each call to async_wait(), the supplied handler will be called exactly once. The handler will be called when:

  • One of the registered signals in the signal set occurs; or
  • The signal set was cancelled, in which case the handler is passed the error code asio::error::operation_aborted.
Parameters

handler

The handler to be called when the signal occurs. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  int signal_number // Indicates which signal occurred.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/cancel.html000066400000000000000000000057251340672067200224510ustar00rootroot00000000000000 signal_set::cancel
asio C++ library

PrevUpHomeNext

Cancel all operations associated with the signal set.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/cancel/000077500000000000000000000000001340672067200215525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/signal_set/cancel/overload1.html000066400000000000000000000103431340672067200243350ustar00rootroot00000000000000 signal_set::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all operations associated with the signal set.

void cancel();

This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancellation does not alter the set of registered signals.

Exceptions

asio::system_error

Thrown on failure.

Remarks

If a registered signal occurred before cancel() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/cancel/overload2.html000066400000000000000000000104071340672067200243370ustar00rootroot00000000000000 signal_set::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all operations associated with the signal set.

void cancel(
    asio::error_code & ec);

This function forces the completion of any pending asynchronous wait operations against the signal set. The handler for each cancelled operation will be invoked with the asio::error::operation_aborted error code.

Cancellation does not alter the set of registered signals.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

If a registered signal occurred before cancel() is called, then the handlers for asynchronous wait operations will:

  • have already been invoked; or
  • have been queued for invocation in the near future.

These handlers can no longer be cancelled, and therefore are passed an error code that indicates the successful completion of the wait operation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/clear.html000066400000000000000000000060671340672067200223120ustar00rootroot00000000000000 signal_set::clear
asio C++ library

PrevUpHomeNext

Remove all signals from a signal_set.

void clear();
  » more...

void clear(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/clear/000077500000000000000000000000001340672067200214135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/signal_set/clear/overload1.html000066400000000000000000000067111340672067200242020ustar00rootroot00000000000000 signal_set::clear (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Remove all signals from a signal_set.

void clear();

This function removes all signals from the set. It has no effect if the set is already empty.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Removes all queued notifications.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/clear/overload2.html000066400000000000000000000070211340672067200241760ustar00rootroot00000000000000 signal_set::clear (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Remove all signals from a signal_set.

void clear(
    asio::error_code & ec);

This function removes all signals from the set. It has no effect if the set is already empty.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Removes all queued notifications.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/executor_type.html000066400000000000000000000177541340672067200241300ustar00rootroot00000000000000 signal_set::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/signal_set.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/get_executor.html000066400000000000000000000047401340672067200237150ustar00rootroot00000000000000 signal_set::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/get_io_context.html000066400000000000000000000067661340672067200242440ustar00rootroot00000000000000 signal_set::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/get_io_service.html000066400000000000000000000067361340672067200242150ustar00rootroot00000000000000 signal_set::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/remove.html000066400000000000000000000061441340672067200225150ustar00rootroot00000000000000 signal_set::remove
asio C++ library

PrevUpHomeNext

Remove a signal from a signal_set.

void remove(
    int signal_number);
  » more...

void remove(
    int signal_number,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/remove/000077500000000000000000000000001340672067200216225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/signal_set/remove/overload1.html000066400000000000000000000100501340672067200244000ustar00rootroot00000000000000 signal_set::remove (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Remove a signal from a signal_set.

void remove(
    int signal_number);

This function removes the specified signal from the set. It has no effect if the signal is not in the set.

Parameters

signal_number

The signal to be removed from the set.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Removes any notifications that have been queued for the specified signal number.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/remove/overload2.html000066400000000000000000000073751340672067200244210ustar00rootroot00000000000000 signal_set::remove (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Remove a signal from a signal_set.

void remove(
    int signal_number,
    asio::error_code & ec);

This function removes the specified signal from the set. It has no effect if the signal is not in the set.

Parameters

signal_number

The signal to be removed from the set.

ec

Set to indicate what error occurred, if any.

Remarks

Removes any notifications that have been queued for the specified signal number.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/signal_set.html000066400000000000000000000102701340672067200233430ustar00rootroot00000000000000 signal_set::signal_set
asio C++ library

PrevUpHomeNext

Construct a signal set without adding any signals.

explicit signal_set(
    asio::io_context & io_context);
  » more...

Construct a signal set and add one signal.

signal_set(
    asio::io_context & io_context,
    int signal_number_1);
  » more...

Construct a signal set and add two signals.

signal_set(
    asio::io_context & io_context,
    int signal_number_1,
    int signal_number_2);
  » more...

Construct a signal set and add three signals.

signal_set(
    asio::io_context & io_context,
    int signal_number_1,
    int signal_number_2,
    int signal_number_3);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/signal_set/000077500000000000000000000000001340672067200224555ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/signal_set/signal_set/overload1.html000066400000000000000000000065451340672067200252510ustar00rootroot00000000000000 signal_set::signal_set (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a signal set without adding any signals.

signal_set(
    asio::io_context & io_context);

This constructor creates a signal set without registering for any signals.

Parameters

io_context

The io_context object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/signal_set/overload2.html000066400000000000000000000077151340672067200252520ustar00rootroot00000000000000 signal_set::signal_set (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a signal set and add one signal.

signal_set(
    asio::io_context & io_context,
    int signal_number_1);

This constructor creates a signal set and registers for one signal.

Parameters

io_context

The io_context object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.

signal_number_1

The signal number to be added.

Remarks

This constructor is equivalent to performing:

asio::signal_set signals(io_context);
signals.add(signal_number_1);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/signal_set/overload3.html000066400000000000000000000102311340672067200252360ustar00rootroot00000000000000 signal_set::signal_set (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a signal set and add two signals.

signal_set(
    asio::io_context & io_context,
    int signal_number_1,
    int signal_number_2);

This constructor creates a signal set and registers for two signals.

Parameters

io_context

The io_context object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.

signal_number_1

The first signal number to be added.

signal_number_2

The second signal number to be added.

Remarks

This constructor is equivalent to performing:

asio::signal_set signals(io_context);
signals.add(signal_number_1);
signals.add(signal_number_2);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/signal_set/signal_set/overload4.html000066400000000000000000000105351340672067200252460ustar00rootroot00000000000000 signal_set::signal_set (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Construct a signal set and add three signals.

signal_set(
    asio::io_context & io_context,
    int signal_number_1,
    int signal_number_2,
    int signal_number_3);

This constructor creates a signal set and registers for three signals.

Parameters

io_context

The io_context object that the signal set will use to dispatch handlers for any asynchronous operations performed on the set.

signal_number_1

The first signal number to be added.

signal_number_2

The second signal number to be added.

signal_number_3

The third signal number to be added.

Remarks

This constructor is equivalent to performing:

asio::signal_set signals(io_context);
signals.add(signal_number_1);
signals.add(signal_number_2);
signals.add(signal_number_3);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base.html000066400000000000000000000335121340672067200213510ustar00rootroot00000000000000 socket_base
asio C++ library

PrevUpHomeNext

The socket_base class is used as a base for the basic_stream_socket and basic_datagram_socket class templates so that we have a common place to define the shutdown_type and enum.

class socket_base
Types

Name

Description

broadcast

Socket option to permit sending of broadcast messages.

bytes_readable

IO control command to get the amount of data that can be read without blocking.

debug

Socket option to enable socket-level debugging.

do_not_route

Socket option to prevent routing, use local interfaces only.

enable_connection_aborted

Socket option to report aborted connections on accept.

keep_alive

Socket option to send keep-alives.

linger

Socket option to specify whether the socket lingers on close if unsent data is present.

message_flags

Bitmask type for flags that can be passed to send and receive operations.

out_of_band_inline

Socket option for putting received out-of-band data inline.

receive_buffer_size

Socket option for the receive buffer size of a socket.

receive_low_watermark

Socket option for the receive low watermark.

reuse_address

Socket option to allow the socket to be bound to an address that is already in use.

send_buffer_size

Socket option for the send buffer size of a socket.

send_low_watermark

Socket option for the send low watermark.

shutdown_type

Different ways a socket may be shutdown.

wait_type

Wait types.

Protected Member Functions

Name

Description

~socket_base

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

max_connections

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

max_listen_connections

The maximum length of the queue of pending incoming connections.

message_do_not_route

Specify that the data should not be subject to routing.

message_end_of_record

Specifies that the data marks the end of a record.

message_out_of_band

Process out-of-band data.

message_peek

Peek at incoming data without removing it from the input queue.

Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/000077500000000000000000000000001340672067200204575ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/socket_base/_socket_base.html000066400000000000000000000046641340672067200240000ustar00rootroot00000000000000 socket_base::~socket_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~socket_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/broadcast.html000066400000000000000000000073461340672067200233210ustar00rootroot00000000000000 socket_base::broadcast
asio C++ library

PrevUpHomeNext

Socket option to permit sending of broadcast messages.

typedef implementation_defined broadcast;

Implements the SOL_SOCKET/SO_BROADCAST socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::broadcast option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/bytes_readable.html000066400000000000000000000070551340672067200243210ustar00rootroot00000000000000 socket_base::bytes_readable
asio C++ library

PrevUpHomeNext

IO control command to get the amount of data that can be read without blocking.

typedef implementation_defined bytes_readable;

Implements the FIONREAD IO control command.

Example
asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/debug.html000066400000000000000000000072371340672067200224440ustar00rootroot00000000000000 socket_base::debug
asio C++ library

PrevUpHomeNext

Socket option to enable socket-level debugging.

typedef implementation_defined debug;

Implements the SOL_SOCKET/SO_DEBUG socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::debug option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/do_not_route.html000066400000000000000000000074671340672067200240630ustar00rootroot00000000000000 socket_base::do_not_route
asio C++ library

PrevUpHomeNext

Socket option to prevent routing, use local interfaces only.

typedef implementation_defined do_not_route;

Implements the SOL_SOCKET/SO_DONTROUTE socket option.

Examples

Setting the option:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::udp::socket socket(io_context);
...
asio::socket_base::do_not_route option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/enable_connection_aborted.html000066400000000000000000000102541340672067200265140ustar00rootroot00000000000000 socket_base::enable_connection_aborted
asio C++ library

PrevUpHomeNext

Socket option to report aborted connections on accept.

typedef implementation_defined enable_connection_aborted;

Implements a custom socket option that determines whether or not an accept operation is permitted to fail with asio::error::connection_aborted. By default the option is false.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::enable_connection_aborted option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/keep_alive.html000066400000000000000000000073771340672067200234670ustar00rootroot00000000000000 socket_base::keep_alive
asio C++ library

PrevUpHomeNext

Socket option to send keep-alives.

typedef implementation_defined keep_alive;

Implements the SOL_SOCKET/SO_KEEPALIVE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::keep_alive option;
socket.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/linger.html000066400000000000000000000074061340672067200226340ustar00rootroot00000000000000 socket_base::linger
asio C++ library

PrevUpHomeNext

Socket option to specify whether the socket lingers on close if unsent data is present.

typedef implementation_defined linger;

Implements the SOL_SOCKET/SO_LINGER socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option(true, 30);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::linger option;
socket.get_option(option);
bool is_set = option.enabled();
unsigned short timeout = option.timeout();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/max_connections.html000066400000000000000000000051461340672067200245420ustar00rootroot00000000000000 socket_base::max_connections
asio C++ library

PrevUpHomeNext

(Deprecated: Use max_listen_connections.) The maximum length of the queue of pending incoming connections.

static const int max_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/max_listen_connections.html000066400000000000000000000051771340672067200261240ustar00rootroot00000000000000 socket_base::max_listen_connections
asio C++ library

PrevUpHomeNext

The maximum length of the queue of pending incoming connections.

static const int max_listen_connections = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/message_do_not_route.html000066400000000000000000000052101340672067200255470ustar00rootroot00000000000000 socket_base::message_do_not_route
asio C++ library

PrevUpHomeNext

Specify that the data should not be subject to routing.

static const int message_do_not_route = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/message_end_of_record.html000066400000000000000000000051421340672067200256430ustar00rootroot00000000000000 socket_base::message_end_of_record
asio C++ library

PrevUpHomeNext

Specifies that the data marks the end of a record.

static const int message_end_of_record = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/message_flags.html000066400000000000000000000061211340672067200241450ustar00rootroot00000000000000 socket_base::message_flags
asio C++ library

PrevUpHomeNext

Bitmask type for flags that can be passed to send and receive operations.

typedef int message_flags;
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/message_out_of_band.html000066400000000000000000000050331340672067200253310ustar00rootroot00000000000000 socket_base::message_out_of_band
asio C++ library

PrevUpHomeNext

Process out-of-band data.

static const int message_out_of_band = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/message_peek.html000066400000000000000000000051001340672067200237710ustar00rootroot00000000000000 socket_base::message_peek
asio C++ library

PrevUpHomeNext

Peek at incoming data without removing it from the input queue.

static const int message_peek = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/out_of_band_inline.html000066400000000000000000000076371340672067200251770ustar00rootroot00000000000000 socket_base::out_of_band_inline
asio C++ library

PrevUpHomeNext

Socket option for putting received out-of-band data inline.

typedef implementation_defined out_of_band_inline;

Implements the SOL_SOCKET/SO_OOBINLINE socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option(true);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::out_of_band_inline option;
socket.get_option(option);
bool value = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/receive_buffer_size.html000066400000000000000000000077061340672067200253640ustar00rootroot00000000000000 socket_base::receive_buffer_size
asio C++ library

PrevUpHomeNext

Socket option for the receive buffer size of a socket.

typedef implementation_defined receive_buffer_size;

Implements the SOL_SOCKET/SO_RCVBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/receive_low_watermark.html000066400000000000000000000077041340672067200257350ustar00rootroot00000000000000 socket_base::receive_low_watermark
asio C++ library

PrevUpHomeNext

Socket option for the receive low watermark.

typedef implementation_defined receive_low_watermark;

Implements the SOL_SOCKET/SO_RCVLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::receive_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/reuse_address.html000066400000000000000000000076211340672067200242030ustar00rootroot00000000000000 socket_base::reuse_address
asio C++ library

PrevUpHomeNext

Socket option to allow the socket to be bound to an address that is already in use.

typedef implementation_defined reuse_address;

Implements the SOL_SOCKET/SO_REUSEADDR socket option.

Examples

Setting the option:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option(true);
acceptor.set_option(option);

Getting the current option value:

asio::ip::tcp::acceptor acceptor(io_context);
...
asio::socket_base::reuse_address option;
acceptor.get_option(option);
bool is_set = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/send_buffer_size.html000066400000000000000000000075601340672067200246710ustar00rootroot00000000000000 socket_base::send_buffer_size
asio C++ library

PrevUpHomeNext

Socket option for the send buffer size of a socket.

typedef implementation_defined send_buffer_size;

Implements the SOL_SOCKET/SO_SNDBUF socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option(8192);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_buffer_size option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/send_low_watermark.html000066400000000000000000000076021340672067200252410ustar00rootroot00000000000000 socket_base::send_low_watermark
asio C++ library

PrevUpHomeNext

Socket option for the send low watermark.

typedef implementation_defined send_low_watermark;

Implements the SOL_SOCKET/SO_SNDLOWAT socket option.

Examples

Setting the option:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option(1024);
socket.set_option(option);

Getting the current option value:

asio::ip::tcp::socket socket(io_context);
...
asio::socket_base::send_low_watermark option;
socket.get_option(option);
int size = option.value();
Requirements

Header: asio/socket_base.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/shutdown_type.html000066400000000000000000000067771340672067200243020ustar00rootroot00000000000000 socket_base::shutdown_type
asio C++ library

PrevUpHomeNext

Different ways a socket may be shutdown.

enum shutdown_type

Values

shutdown_receive

Shutdown the receive side of the socket.

shutdown_send

Shutdown the send side of the socket.

shutdown_both

Shutdown both send and receive on the socket.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/socket_base/wait_type.html000066400000000000000000000070611340672067200233560ustar00rootroot00000000000000 socket_base::wait_type
asio C++ library

PrevUpHomeNext

Wait types.

enum wait_type

Values

wait_read

Wait for a socket to become ready to read.

wait_write

Wait for a socket to become ready to write.

wait_error

Wait for a socket to have error conditions pending.

For use with basic_socket::wait() and basic_socket::async_wait().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn.html000066400000000000000000000174771340672067200202330ustar00rootroot00000000000000 spawn
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine.

Start a new stackful coroutine, calling the specified handler when it completes.

template<
    typename Function>
void spawn(
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  » more...

template<
    typename Handler,
    typename Function>
void spawn(
    Handler && handler,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
    typename enable_if<!is_executor< typename decay< Handler >::type >::value &&!is_convertible< Handler &, execution_context & >::value >::type *  = 0);
  » more...

Start a new stackful coroutine, inheriting the execution context of another.

template<
    typename Handler,
    typename Function>
void spawn(
    basic_yield_context< Handler > ctx,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  » more...

Start a new stackful coroutine that executes on a given executor.

template<
    typename Function,
    typename Executor>
void spawn(
    const Executor & ex,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
    typename enable_if< is_executor< Executor >::value >::type *  = 0);
  » more...

Start a new stackful coroutine that executes on a given strand.

template<
    typename Function,
    typename Executor>
void spawn(
    const strand< Executor > & ex,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  » more...

Start a new stackful coroutine that executes in the context of a strand.

template<
    typename Function>
void spawn(
    const asio::io_context::strand & s,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());
  » more...

Start a new stackful coroutine that executes on a given execution context.

template<
    typename Function,
    typename ExecutionContext>
void spawn(
    ExecutionContext & ctx,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);
  » more...

The spawn() function is a high-level wrapper over the Boost.Coroutine library. This function enables programs to implement asynchronous logic in a synchronous manner, as illustrated by the following example:

asio::spawn(my_strand, do_echo);

// ...

void do_echo(asio::yield_context yield)
{
  try
  {
    char data[128];
    for (;;)
    {
      std::size_t length =
        my_socket.async_read_some(
          asio::buffer(data), yield);

      asio::async_write(my_socket,
          asio::buffer(data, length), yield);
    }
  }
  catch (std::exception& e)
  {
    // ...
  }
}
Requirements

Header: asio/spawn.hpp

Convenience header: None


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/000077500000000000000000000000001340672067200173255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/spawn/overload1.html000066400000000000000000000064251340672067200221160ustar00rootroot00000000000000 spawn (1 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine, calling the specified handler when it completes.

template<
    typename Function>
void spawn(
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());

This function is used to launch a new coroutine.

Parameters

function

The coroutine function. The function must have the signature:

void function(basic_yield_context<Handler> yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/overload2.html000066400000000000000000000077421340672067200221220ustar00rootroot00000000000000 spawn (2 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine, calling the specified handler when it completes.

template<
    typename Handler,
    typename Function>
void spawn(
    Handler && handler,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
    typename enable_if<!is_executor< typename decay< Handler >::type >::value &&!is_convertible< Handler &, execution_context & >::value >::type *  = 0);

This function is used to launch a new coroutine.

Parameters

handler

A handler to be called when the coroutine exits. More importantly, the handler provides an execution context (via the the handler invocation hook) for the coroutine. The handler must have the signature:

void handler();

function

The coroutine function. The function must have the signature:

void function(basic_yield_context<Handler> yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/overload3.html000066400000000000000000000075351340672067200221230ustar00rootroot00000000000000 spawn (3 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine, inheriting the execution context of another.

template<
    typename Handler,
    typename Function>
void spawn(
    basic_yield_context< Handler > ctx,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());

This function is used to launch a new coroutine.

Parameters

ctx

Identifies the current coroutine as a parent of the new coroutine. This specifies that the new coroutine should inherit the execution context of the parent. For example, if the parent coroutine is executing in a particular strand, then the new coroutine will execute in the same strand.

function

The coroutine function. The function must have the signature:

void function(basic_yield_context<Handler> yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/overload4.html000066400000000000000000000072771340672067200221270ustar00rootroot00000000000000 spawn (4 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine that executes on a given executor.

template<
    typename Function,
    typename Executor>
void spawn(
    const Executor & ex,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
    typename enable_if< is_executor< Executor >::value >::type *  = 0);

This function is used to launch a new coroutine.

Parameters

ex

Identifies the executor that will run the coroutine. The new coroutine is implicitly given its own strand within this executor.

function

The coroutine function. The function must have the signature:

void function(yield_context yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/overload5.html000066400000000000000000000070351340672067200221200ustar00rootroot00000000000000 spawn (5 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine that executes on a given strand.

template<
    typename Function,
    typename Executor>
void spawn(
    const strand< Executor > & ex,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());

This function is used to launch a new coroutine.

Parameters

ex

Identifies the strand that will run the coroutine.

function

The coroutine function. The function must have the signature:

void function(yield_context yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/overload6.html000066400000000000000000000071151340672067200221200ustar00rootroot00000000000000 spawn (6 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine that executes in the context of a strand.

template<
    typename Function>
void spawn(
    const asio::io_context::strand & s,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes());

This function is used to launch a new coroutine.

Parameters

s

Identifies a strand. By starting multiple coroutines on the same strand, the implementation ensures that none of those coroutines can execute simultaneously.

function

The coroutine function. The function must have the signature:

void function(yield_context yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/spawn/overload7.html000066400000000000000000000073331340672067200221230ustar00rootroot00000000000000 spawn (7 of 7 overloads)
asio C++ library

PrevUpHomeNext

Start a new stackful coroutine that executes on a given execution context.

template<
    typename Function,
    typename ExecutionContext>
void spawn(
    ExecutionContext & ctx,
    Function && function,
    const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
    typename enable_if< is_convertible< ExecutionContext &, execution_context & >::value >::type *  = 0);

This function is used to launch a new coroutine.

Parameters

ctx

Identifies the execution context that will run the coroutine. The new coroutine is implicitly given its own strand within this execution context.

function

The coroutine function. The function must have the signature:

void function(yield_context yield);

attributes

Boost.Coroutine attributes used to customise the coroutine.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context.html000066400000000000000000000450631340672067200215770ustar00rootroot00000000000000 ssl::context
asio C++ library

PrevUpHomeNext
class context :
  public ssl::context_base,
  noncopyable
Types

Name

Description

file_format

File format types.

method

Different methods supported by a context.

native_handle_type

The native handle type of the SSL context.

options

Bitmask type for SSL options.

password_purpose

Purpose of PEM password.

Member Functions

Name

Description

add_certificate_authority

Add certification authority for performing verification.

add_verify_path

Add a directory containing certificate authority files to be used for performing verification.

clear_options

Clear options on the context.

context

Constructor.

Move-construct a context from another.

load_verify_file

Load a certification authority file for performing verification.

native_handle

Get the underlying implementation in the native type.

operator=

Move-assign a context from another.

set_default_verify_paths

Configures the context to use the default directories for finding certification authority certificates.

set_options

Set options on the context.

set_password_callback

Set the password callback.

set_verify_callback

Set the callback used to verify peer certificates.

set_verify_depth

Set the peer verification depth.

set_verify_mode

Set the peer verification mode.

use_certificate

Use a certificate from a memory buffer.

use_certificate_chain

Use a certificate chain from a memory buffer.

use_certificate_chain_file

Use a certificate chain from a file.

use_certificate_file

Use a certificate from a file.

use_private_key

Use a private key from a memory buffer.

use_private_key_file

Use a private key from a file.

use_rsa_private_key

Use an RSA private key from a memory buffer.

use_rsa_private_key_file

Use an RSA private key from a file.

use_tmp_dh

Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters.

use_tmp_dh_file

Use the specified file to obtain the temporary Diffie-Hellman parameters.

~context

Destructor.

Data Members

Name

Description

default_workarounds

Implement various bug workarounds.

no_compression

Disable compression. Compression is disabled by default.

no_sslv2

Disable SSL v2.

no_sslv3

Disable SSL v3.

no_tlsv1

Disable TLS v1.

no_tlsv1_1

Disable TLS v1.1.

no_tlsv1_2

Disable TLS v1.2.

no_tlsv1_3

Disable TLS v1.3.

single_dh_use

Always create a new key when using tmp_dh parameters.

Requirements

Header: asio/ssl/context.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/000077500000000000000000000000001340672067200207015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/_context.html000066400000000000000000000047411340672067200234200ustar00rootroot00000000000000 ssl::context::~context
asio C++ library

PrevUpHomeNext

Destructor.

~context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/add_certificate_authority.html000066400000000000000000000066661340672067200270070ustar00rootroot00000000000000 ssl::context::add_certificate_authority
asio C++ library

PrevUpHomeNext

Add certification authority for performing verification.

void add_certificate_authority(
    const const_buffer & ca);
  » more...

void add_certificate_authority(
    const const_buffer & ca,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/add_certificate_authority/000077500000000000000000000000001340672067200261035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/add_certificate_authority/overload1.html000066400000000000000000000110121340672067200306600ustar00rootroot00000000000000 ssl::context::add_certificate_authority (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Add certification authority for performing verification.

void add_certificate_authority(
    const const_buffer & ca);

This function is used to add one trusted certification authority from a memory buffer.

Parameters

ca

The buffer containing the certification authority certificate. The certificate must use the PEM format.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_get_cert_store and X509_STORE_add_cert.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/add_certificate_authority/overload2.html000066400000000000000000000101501340672067200306630ustar00rootroot00000000000000 ssl::context::add_certificate_authority (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Add certification authority for performing verification.

void add_certificate_authority(
    const const_buffer & ca,
    asio::error_code & ec);

This function is used to add one trusted certification authority from a memory buffer.

Parameters

ca

The buffer containing the certification authority certificate. The certificate must use the PEM format.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_get_cert_store and X509_STORE_add_cert.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/add_verify_path.html000066400000000000000000000066121340672067200247240ustar00rootroot00000000000000 ssl::context::add_verify_path
asio C++ library

PrevUpHomeNext

Add a directory containing certificate authority files to be used for performing verification.

void add_verify_path(
    const std::string & path);
  » more...

void add_verify_path(
    const std::string & path,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/add_verify_path/000077500000000000000000000000001340672067200240315ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/add_verify_path/overload1.html000066400000000000000000000106301340672067200266130ustar00rootroot00000000000000 ssl::context::add_verify_path (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Add a directory containing certificate authority files to be used for performing verification.

void add_verify_path(
    const std::string & path);

This function is used to specify the name of a directory containing certification authority certificates. Each file in the directory must contain a single certificate. The files must be named using the subject name's hash and an extension of ".0".

Parameters

path

The name of a directory containing the certificates.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_load_verify_locations.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/add_verify_path/overload2.html000066400000000000000000000100641340672067200266150ustar00rootroot00000000000000 ssl::context::add_verify_path (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Add a directory containing certificate authority files to be used for performing verification.

void add_verify_path(
    const std::string & path,
    asio::error_code & ec);

This function is used to specify the name of a directory containing certification authority certificates. Each file in the directory must contain a single certificate. The files must be named using the subject name's hash and an extension of ".0".

Parameters

path

The name of a directory containing the certificates.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_load_verify_locations.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/clear_options.html000066400000000000000000000063111340672067200244310ustar00rootroot00000000000000 ssl::context::clear_options
asio C++ library

PrevUpHomeNext

Clear options on the context.

void clear_options(
    options o);
  » more...

void clear_options(
    options o,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/clear_options/000077500000000000000000000000001340672067200235425ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/clear_options/overload1.html000066400000000000000000000105151340672067200263260ustar00rootroot00000000000000 ssl::context::clear_options (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Clear options on the context.

void clear_options(
    options o);

This function may be used to configure the SSL options used by the context.

Parameters

o

A bitmask of options. The available option values are defined in the ssl::context_base class. The specified options, if currently enabled on the context, are cleared.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_clear_options.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/clear_options/overload2.html000066400000000000000000000077371340672067200263430ustar00rootroot00000000000000 ssl::context::clear_options (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Clear options on the context.

void clear_options(
    options o,
    asio::error_code & ec);

This function may be used to configure the SSL options used by the context.

Parameters

o

A bitmask of options. The available option values are defined in the ssl::context_base class. The specified options, if currently enabled on the context, are cleared.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_clear_options.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/context.html000066400000000000000000000062001340672067200232510ustar00rootroot00000000000000 ssl::context::context
asio C++ library

PrevUpHomeNext

Constructor.

explicit context(
    method m);
  » more...

Move-construct a context from another.

context(
    context && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/context/000077500000000000000000000000001340672067200223655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/context/overload1.html000066400000000000000000000047041340672067200251540ustar00rootroot00000000000000 ssl::context::context (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructor.

context(
    method m);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/context/overload2.html000066400000000000000000000073221340672067200251540ustar00rootroot00000000000000 ssl::context::context (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a context from another.

context(
    context && other);

This constructor moves an SSL context from one object to another.

Parameters

other

The other context object from which the move will occur.

Remarks

Following the move, the following operations only are valid for the moved-from object: * Destruction.

  • As a target for move-assignment.

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/default_workarounds.html000066400000000000000000000051051340672067200256520ustar00rootroot00000000000000 ssl::context::default_workarounds
asio C++ library

PrevUpHomeNext

Implement various bug workarounds.

static const long default_workarounds = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/file_format.html000066400000000000000000000062621340672067200240640ustar00rootroot00000000000000 ssl::context::file_format
asio C++ library

PrevUpHomeNext

File format types.

enum file_format

Values

asn1

ASN.1 file.

pem

PEM file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/load_verify_file.html000066400000000000000000000064251340672067200251000ustar00rootroot00000000000000 ssl::context::load_verify_file
asio C++ library

PrevUpHomeNext

Load a certification authority file for performing verification.

void load_verify_file(
    const std::string & filename);
  » more...

void load_verify_file(
    const std::string & filename,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/load_verify_file/000077500000000000000000000000001340672067200242035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/load_verify_file/overload1.html000066400000000000000000000104051340672067200267650ustar00rootroot00000000000000 ssl::context::load_verify_file (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Load a certification authority file for performing verification.

void load_verify_file(
    const std::string & filename);

This function is used to load one or more trusted certification authorities from a file.

Parameters

filename

The name of a file containing certification authority certificates in PEM format.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_load_verify_locations.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/load_verify_file/overload2.html000066400000000000000000000076231340672067200267760ustar00rootroot00000000000000 ssl::context::load_verify_file (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Load a certification authority file for performing verification.

void load_verify_file(
    const std::string & filename,
    asio::error_code & ec);

This function is used to load the certificates for one or more trusted certification authorities from a file.

Parameters

filename

The name of a file containing certification authority certificates in PEM format.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_load_verify_locations.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/method.html000066400000000000000000000166171340672067200230620ustar00rootroot00000000000000 ssl::context::method
asio C++ library

PrevUpHomeNext

Different methods supported by a context.

enum method

Values

sslv2

Generic SSL version 2.

sslv2_client

SSL version 2 client.

sslv2_server

SSL version 2 server.

sslv3

Generic SSL version 3.

sslv3_client

SSL version 3 client.

sslv3_server

SSL version 3 server.

tlsv1

Generic TLS version 1.

tlsv1_client

TLS version 1 client.

tlsv1_server

TLS version 1 server.

sslv23

Generic SSL/TLS.

sslv23_client

SSL/TLS client.

sslv23_server

SSL/TLS server.

tlsv11

Generic TLS version 1.1.

tlsv11_client

TLS version 1.1 client.

tlsv11_server

TLS version 1.1 server.

tlsv12

Generic TLS version 1.2.

tlsv12_client

TLS version 1.2 client.

tlsv12_server

TLS version 1.2 server.

tlsv13

Generic TLS version 1.3.

tlsv13_client

TLS version 1.3 client.

tlsv13_server

TLS version 1.3 server.

tls

Generic TLS.

tls_client

TLS client.

tls_server

TLS server.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/native_handle.html000066400000000000000000000053321340672067200243730ustar00rootroot00000000000000 ssl::context::native_handle
asio C++ library

PrevUpHomeNext

Get the underlying implementation in the native type.

native_handle_type native_handle();

This function may be used to obtain the underlying implementation of the context. This is intended to allow access to context functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/native_handle_type.html000066400000000000000000000061151340672067200254340ustar00rootroot00000000000000 ssl::context::native_handle_type
asio C++ library

PrevUpHomeNext

The native handle type of the SSL context.

typedef SSL_CTX * native_handle_type;
Requirements

Header: asio/ssl/context.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_compression.html000066400000000000000000000050471340672067200246320ustar00rootroot00000000000000 ssl::context::no_compression
asio C++ library

PrevUpHomeNext

Disable compression. Compression is disabled by default.

static const long no_compression = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_sslv2.html000066400000000000000000000046721340672067200233450ustar00rootroot00000000000000 ssl::context::no_sslv2
asio C++ library

PrevUpHomeNext

Disable SSL v2.

static const long no_sslv2 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_sslv3.html000066400000000000000000000046421340672067200233430ustar00rootroot00000000000000 ssl::context::no_sslv3
asio C++ library

PrevUpHomeNext

Disable SSL v3.

static const long no_sslv3 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_tlsv1.html000066400000000000000000000046521340672067200233430ustar00rootroot00000000000000 ssl::context::no_tlsv1
asio C++ library

PrevUpHomeNext

Disable TLS v1.

static const long no_tlsv1 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_tlsv1_1.html000066400000000000000000000047041340672067200235610ustar00rootroot00000000000000 ssl::context::no_tlsv1_1
asio C++ library

PrevUpHomeNext

Disable TLS v1.1.

static const long no_tlsv1_1 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_tlsv1_2.html000066400000000000000000000047141340672067200235630ustar00rootroot00000000000000 ssl::context::no_tlsv1_2
asio C++ library

PrevUpHomeNext

Disable TLS v1.2.

static const long no_tlsv1_2 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/no_tlsv1_3.html000066400000000000000000000047211340672067200235620ustar00rootroot00000000000000 ssl::context::no_tlsv1_3
asio C++ library

PrevUpHomeNext

Disable TLS v1.3.

static const long no_tlsv1_3 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/operator_eq_.html000066400000000000000000000071401340672067200242500ustar00rootroot00000000000000 ssl::context::operator=
asio C++ library

PrevUpHomeNext

Move-assign a context from another.

context & operator=(
    context && other);

This assignment operator moves an SSL context from one object to another.

Parameters

other

The other context object from which the move will occur.

Remarks

Following the move, the following operations only are valid for the moved-from object: * Destruction.

  • As a target for move-assignment.

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/options.html000066400000000000000000000057031340672067200232670ustar00rootroot00000000000000 ssl::context::options
asio C++ library

PrevUpHomeNext

Bitmask type for SSL options.

typedef long options;
Requirements

Header: asio/ssl/context.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/password_purpose.html000066400000000000000000000065171340672067200252170ustar00rootroot00000000000000 ssl::context::password_purpose
asio C++ library

PrevUpHomeNext

Purpose of PEM password.

enum password_purpose

Values

for_reading

The password is needed for reading/decryption.

for_writing

The password is needed for writing/encryption.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_default_verify_paths.html000066400000000000000000000066571340672067200266670ustar00rootroot00000000000000 ssl::context::set_default_verify_paths
asio C++ library

PrevUpHomeNext

Configures the context to use the default directories for finding certification authority certificates.

void set_default_verify_paths();
  » more...

void set_default_verify_paths(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_default_verify_paths/000077500000000000000000000000001340672067200257635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/set_default_verify_paths/overload1.html000066400000000000000000000076421340672067200305560ustar00rootroot00000000000000 ssl::context::set_default_verify_paths (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Configures the context to use the default directories for finding certification authority certificates.

void set_default_verify_paths();

This function specifies that the context should use the default, system-dependent directories for locating certification authority certificates.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_default_verify_paths.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_default_verify_paths/overload2.html000066400000000000000000000076261340672067200305610ustar00rootroot00000000000000 ssl::context::set_default_verify_paths (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Configures the context to use the default directories for finding certification authority certificates.

void set_default_verify_paths(
    asio::error_code & ec);

This function specifies that the context should use the default, system-dependent directories for locating certification authority certificates.

Parameters

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_default_verify_paths.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_options.html000066400000000000000000000063031340672067200241370ustar00rootroot00000000000000 ssl::context::set_options
asio C++ library

PrevUpHomeNext

Set options on the context.

void set_options(
    options o);
  » more...

void set_options(
    options o,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_options/000077500000000000000000000000001340672067200232475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/set_options/overload1.html000066400000000000000000000104301340672067200260270ustar00rootroot00000000000000 ssl::context::set_options (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set options on the context.

void set_options(
    options o);

This function may be used to configure the SSL options used by the context.

Parameters

o

A bitmask of options. The available option values are defined in the ssl::context_base class. The options are bitwise-ored with any existing value for the options.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_options.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_options/overload2.html000066400000000000000000000077601340672067200260440ustar00rootroot00000000000000 ssl::context::set_options (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set options on the context.

void set_options(
    options o,
    asio::error_code & ec);

This function may be used to configure the SSL options used by the context.

Parameters

o

A bitmask of options. The available option values are defined in the ssl::context_base class. The options are bitwise-ored with any existing value for the options.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_options.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_password_callback.html000066400000000000000000000067241340672067200261310ustar00rootroot00000000000000 ssl::context::set_password_callback
asio C++ library

PrevUpHomeNext

Set the password callback.

template<
    typename PasswordCallback>
void set_password_callback(
    PasswordCallback callback);
  » more...

template<
    typename PasswordCallback>
void set_password_callback(
    PasswordCallback callback,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_password_callback/000077500000000000000000000000001340672067200252325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/set_password_callback/overload1.html000066400000000000000000000113441340672067200300170ustar00rootroot00000000000000 ssl::context::set_password_callback (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the password callback.

template<
    typename PasswordCallback>
void set_password_callback(
    PasswordCallback callback);

This function is used to specify a callback function to obtain password information about an encrypted key in PEM format.

Parameters

callback

The function object to be used for obtaining the password. The function signature of the handler must be:

std::string password_callback(
  std::size_t max_length,  // The maximum size for a password.
  password_purpose purpose // Whether password is for reading or writing.
);

The return value of the callback is a string containing the password.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_default_passwd_cb.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_password_callback/overload2.html000066400000000000000000000105561340672067200300240ustar00rootroot00000000000000 ssl::context::set_password_callback (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the password callback.

template<
    typename PasswordCallback>
void set_password_callback(
    PasswordCallback callback,
    asio::error_code & ec);

This function is used to specify a callback function to obtain password information about an encrypted key in PEM format.

Parameters

callback

The function object to be used for obtaining the password. The function signature of the handler must be:

std::string password_callback(
  std::size_t max_length,  // The maximum size for a password.
  password_purpose purpose // Whether password is for reading or writing.
);

The return value of the callback is a string containing the password.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_default_passwd_cb.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_callback.html000066400000000000000000000067441340672067200255750ustar00rootroot00000000000000 ssl::context::set_verify_callback
asio C++ library

PrevUpHomeNext

Set the callback used to verify peer certificates.

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback);
  » more...

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_callback/000077500000000000000000000000001340672067200246745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/set_verify_callback/overload1.html000066400000000000000000000113761340672067200274660ustar00rootroot00000000000000 ssl::context::set_verify_callback (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the callback used to verify peer certificates.

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback);

This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.

Parameters

callback

The function object to be used for verifying a certificate. The function signature of the handler must be:

bool verify_callback(
  bool preverified, // True if the certificate passed pre-verification.
  verify_context& ctx // The peer certificate and other context.
);

The return value of the callback is true if the certificate has passed verification, false otherwise.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_callback/overload2.html000066400000000000000000000106121340672067200274570ustar00rootroot00000000000000 ssl::context::set_verify_callback (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the callback used to verify peer certificates.

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback,
    asio::error_code & ec);

This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.

Parameters

callback

The function object to be used for verifying a certificate. The function signature of the handler must be:

bool verify_callback(
  bool preverified, // True if the certificate passed pre-verification.
  verify_context& ctx // The peer certificate and other context.
);

The return value of the callback is true if the certificate has passed verification, false otherwise.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_depth.html000066400000000000000000000064301340672067200251350ustar00rootroot00000000000000 ssl::context::set_verify_depth
asio C++ library

PrevUpHomeNext

Set the peer verification depth.

void set_verify_depth(
    int depth);
  » more...

void set_verify_depth(
    int depth,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_depth/000077500000000000000000000000001340672067200242445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/set_verify_depth/overload1.html000066400000000000000000000103051340672067200270250ustar00rootroot00000000000000 ssl::context::set_verify_depth (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification depth.

void set_verify_depth(
    int depth);

This function may be used to configure the maximum verification depth allowed by the context.

Parameters

depth

Maximum depth for the certificate chain verification that shall be allowed.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_verify_depth.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_depth/overload2.html000066400000000000000000000075421340672067200270370ustar00rootroot00000000000000 ssl::context::set_verify_depth (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification depth.

void set_verify_depth(
    int depth,
    asio::error_code & ec);

This function may be used to configure the maximum verification depth allowed by the context.

Parameters

depth

Maximum depth for the certificate chain verification that shall be allowed.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_verify_depth.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_mode.html000066400000000000000000000063771340672067200247670ustar00rootroot00000000000000 ssl::context::set_verify_mode
asio C++ library

PrevUpHomeNext

Set the peer verification mode.

void set_verify_mode(
    verify_mode v);
  » more...

void set_verify_mode(
    verify_mode v,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_mode/000077500000000000000000000000001340672067200240645ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/set_verify_mode/overload1.html000066400000000000000000000104311340672067200266450ustar00rootroot00000000000000 ssl::context::set_verify_mode (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification mode.

void set_verify_mode(
    verify_mode v);

This function may be used to configure the peer verification mode used by the context.

Parameters

v

A bitmask of peer verification modes. See ssl::verify_mode for available values.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/set_verify_mode/overload2.html000066400000000000000000000076651340672067200266650ustar00rootroot00000000000000 ssl::context::set_verify_mode (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification mode.

void set_verify_mode(
    verify_mode v,
    asio::error_code & ec);

This function may be used to configure the peer verification mode used by the context.

Parameters

v

A bitmask of peer verification modes. See ssl::verify_mode for available values.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/single_dh_use.html000066400000000000000000000051361340672067200244040ustar00rootroot00000000000000 ssl::context::single_dh_use
asio C++ library

PrevUpHomeNext

Always create a new key when using tmp_dh parameters.

static const long single_dh_use = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate.html000066400000000000000000000064501340672067200247320ustar00rootroot00000000000000 ssl::context::use_certificate
asio C++ library

PrevUpHomeNext

Use a certificate from a memory buffer.

void use_certificate(
    const const_buffer & certificate,
    file_format format);
  » more...

void use_certificate(
    const const_buffer & certificate,
    file_format format,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate/000077500000000000000000000000001340672067200240375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_certificate/overload1.html000066400000000000000000000104751340672067200266300ustar00rootroot00000000000000 ssl::context::use_certificate (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate from a memory buffer.

void use_certificate(
    const const_buffer & certificate,
    file_format format);

This function is used to load a certificate into the context from a buffer.

Parameters

certificate

The buffer containing the certificate.

format

The certificate format (ASN.1 or PEM).

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_certificate or SSL_CTX_use_certificate_ASN1.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate/overload2.html000066400000000000000000000077711340672067200266360ustar00rootroot00000000000000 ssl::context::use_certificate (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate from a memory buffer.

void use_certificate(
    const const_buffer & certificate,
    file_format format,
    asio::error_code & ec);

This function is used to load a certificate into the context from a buffer.

Parameters

certificate

The buffer containing the certificate.

format

The certificate format (ASN.1 or PEM).

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_certificate or SSL_CTX_use_certificate_ASN1.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain.html000066400000000000000000000066431340672067200261000ustar00rootroot00000000000000 ssl::context::use_certificate_chain
asio C++ library

PrevUpHomeNext

Use a certificate chain from a memory buffer.

void use_certificate_chain(
    const const_buffer & chain);
  » more...

void use_certificate_chain(
    const const_buffer & chain,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain/000077500000000000000000000000001340672067200252015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain/overload1.html000066400000000000000000000105761340672067200277740ustar00rootroot00000000000000 ssl::context::use_certificate_chain (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate chain from a memory buffer.

void use_certificate_chain(
    const const_buffer & chain);

This function is used to load a certificate chain into the context from a buffer.

Parameters

chain

The buffer containing the certificate chain. The certificate chain must use the PEM format.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_certificate and SSL_CTX_add_extra_chain_cert.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain/overload2.html000066400000000000000000000100441340672067200277630ustar00rootroot00000000000000 ssl::context::use_certificate_chain (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate chain from a memory buffer.

void use_certificate_chain(
    const const_buffer & chain,
    asio::error_code & ec);

This function is used to load a certificate chain into the context from a buffer.

Parameters

chain

The buffer containing the certificate chain. The certificate chain must use the PEM format.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_certificate and SSL_CTX_add_extra_chain_cert.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain_file.html000066400000000000000000000070321340672067200270700ustar00rootroot00000000000000 ssl::context::use_certificate_chain_file
asio C++ library

PrevUpHomeNext

Use a certificate chain from a file.

void use_certificate_chain_file(
    const std::string & filename);
  » more...

void use_certificate_chain_file(
    const std::string & filename,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain_file/000077500000000000000000000000001340672067200262005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain_file/overload1.html000066400000000000000000000107141340672067200307650ustar00rootroot00000000000000 ssl::context::use_certificate_chain_file (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate chain from a file.

void use_certificate_chain_file(
    const std::string & filename);

This function is used to load a certificate chain into the context from a file.

Parameters

filename

The name of the file containing the certificate. The file must use the PEM format.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_certificate_chain_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_chain_file/overload2.html000066400000000000000000000100671340672067200307670ustar00rootroot00000000000000 ssl::context::use_certificate_chain_file (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate chain from a file.

void use_certificate_chain_file(
    const std::string & filename,
    asio::error_code & ec);

This function is used to load a certificate chain into the context from a file.

Parameters

filename

The name of the file containing the certificate. The file must use the PEM format.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_certificate_chain_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_file.html000066400000000000000000000067401340672067200257330ustar00rootroot00000000000000 ssl::context::use_certificate_file
asio C++ library

PrevUpHomeNext

Use a certificate from a file.

void use_certificate_file(
    const std::string & filename,
    file_format format);
  » more...

void use_certificate_file(
    const std::string & filename,
    file_format format,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_file/000077500000000000000000000000001340672067200250365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_file/overload1.html000066400000000000000000000106061340672067200276230ustar00rootroot00000000000000 ssl::context::use_certificate_file (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate from a file.

void use_certificate_file(
    const std::string & filename,
    file_format format);

This function is used to load a certificate into the context from a file.

Parameters

filename

The name of the file containing the certificate.

format

The file format (ASN.1 or PEM).

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_certificate_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_certificate_file/overload2.html000066400000000000000000000100071340672067200276170ustar00rootroot00000000000000 ssl::context::use_certificate_file (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a certificate from a file.

void use_certificate_file(
    const std::string & filename,
    file_format format,
    asio::error_code & ec);

This function is used to load a certificate into the context from a file.

Parameters

filename

The name of the file containing the certificate.

format

The file format (ASN.1 or PEM).

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_certificate_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_private_key.html000066400000000000000000000065651340672067200250010ustar00rootroot00000000000000 ssl::context::use_private_key
asio C++ library

PrevUpHomeNext

Use a private key from a memory buffer.

void use_private_key(
    const const_buffer & private_key,
    file_format format);
  » more...

void use_private_key(
    const const_buffer & private_key,
    file_format format,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_private_key/000077500000000000000000000000001340672067200240775ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_private_key/overload1.html000066400000000000000000000104731340672067200266660ustar00rootroot00000000000000 ssl::context::use_private_key (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a private key from a memory buffer.

void use_private_key(
    const const_buffer & private_key,
    file_format format);

This function is used to load a private key into the context from a buffer.

Parameters

private_key

The buffer containing the private key.

format

The private key format (ASN.1 or PEM).

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_PrivateKey or SSL_CTX_use_PrivateKey_ASN1.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_private_key/overload2.html000066400000000000000000000077631340672067200266770ustar00rootroot00000000000000 ssl::context::use_private_key (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a private key from a memory buffer.

void use_private_key(
    const const_buffer & private_key,
    file_format format,
    asio::error_code & ec);

This function is used to load a private key into the context from a buffer.

Parameters

private_key

The buffer containing the private key.

format

The private key format (ASN.1 or PEM).

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_PrivateKey or SSL_CTX_use_PrivateKey_ASN1.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_private_key_file.html000066400000000000000000000066641340672067200260000ustar00rootroot00000000000000 ssl::context::use_private_key_file
asio C++ library

PrevUpHomeNext

Use a private key from a file.

void use_private_key_file(
    const std::string & filename,
    file_format format);
  » more...

void use_private_key_file(
    const std::string & filename,
    file_format format,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_private_key_file/000077500000000000000000000000001340672067200250765ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_private_key_file/overload1.html000066400000000000000000000106051340672067200276620ustar00rootroot00000000000000 ssl::context::use_private_key_file (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a private key from a file.

void use_private_key_file(
    const std::string & filename,
    file_format format);

This function is used to load a private key into the context from a file.

Parameters

filename

The name of the file containing the private key.

format

The file format (ASN.1 or PEM).

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_PrivateKey_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_private_key_file/overload2.html000066400000000000000000000100261340672067200276600ustar00rootroot00000000000000 ssl::context::use_private_key_file (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use a private key from a file.

void use_private_key_file(
    const std::string & filename,
    file_format format,
    asio::error_code & ec);

This function is used to load a private key into the context from a file.

Parameters

filename

The name of the file containing the private key.

format

The file format (ASN.1 or PEM).

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_PrivateKey_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key.html000066400000000000000000000067121340672067200256400ustar00rootroot00000000000000 ssl::context::use_rsa_private_key
asio C++ library

PrevUpHomeNext

Use an RSA private key from a memory buffer.

void use_rsa_private_key(
    const const_buffer & private_key,
    file_format format);
  » more...

void use_rsa_private_key(
    const const_buffer & private_key,
    file_format format,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key/000077500000000000000000000000001340672067200247445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key/overload1.html000066400000000000000000000106671340672067200275400ustar00rootroot00000000000000 ssl::context::use_rsa_private_key (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use an RSA private key from a memory buffer.

void use_rsa_private_key(
    const const_buffer & private_key,
    file_format format);

This function is used to load an RSA private key into the context from a buffer.

Parameters

private_key

The buffer containing the RSA private key.

format

The private key format (ASN.1 or PEM).

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_RSAPrivateKey or SSL_CTX_use_RSAPrivateKey_ASN1.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key/overload2.html000066400000000000000000000101431340672067200275260ustar00rootroot00000000000000 ssl::context::use_rsa_private_key (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use an RSA private key from a memory buffer.

void use_rsa_private_key(
    const const_buffer & private_key,
    file_format format,
    asio::error_code & ec);

This function is used to load an RSA private key into the context from a buffer.

Parameters

private_key

The buffer containing the RSA private key.

format

The private key format (ASN.1 or PEM).

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_RSAPrivateKey or SSL_CTX_use_RSAPrivateKey_ASN1.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key_file.html000066400000000000000000000070311340672067200266320ustar00rootroot00000000000000 ssl::context::use_rsa_private_key_file
asio C++ library

PrevUpHomeNext

Use an RSA private key from a file.

void use_rsa_private_key_file(
    const std::string & filename,
    file_format format);
  » more...

void use_rsa_private_key_file(
    const std::string & filename,
    file_format format,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key_file/000077500000000000000000000000001340672067200257435ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key_file/overload1.html000066400000000000000000000107761340672067200305400ustar00rootroot00000000000000 ssl::context::use_rsa_private_key_file (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use an RSA private key from a file.

void use_rsa_private_key_file(
    const std::string & filename,
    file_format format);

This function is used to load an RSA private key into the context from a file.

Parameters

filename

The name of the file containing the RSA private key.

format

The file format (ASN.1 or PEM).

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_use_RSAPrivateKey_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_rsa_private_key_file/overload2.html000066400000000000000000000101171340672067200305260ustar00rootroot00000000000000 ssl::context::use_rsa_private_key_file (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use an RSA private key from a file.

void use_rsa_private_key_file(
    const std::string & filename,
    file_format format,
    asio::error_code & ec);

This function is used to load an RSA private key into the context from a file.

Parameters

filename

The name of the file containing the RSA private key.

format

The file format (ASN.1 or PEM).

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_use_RSAPrivateKey_file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh.html000066400000000000000000000064121340672067200237210ustar00rootroot00000000000000 ssl::context::use_tmp_dh
asio C++ library

PrevUpHomeNext

Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters.

void use_tmp_dh(
    const const_buffer & dh);
  » more...

void use_tmp_dh(
    const const_buffer & dh,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh/000077500000000000000000000000001340672067200230305ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh/overload1.html000066400000000000000000000102201340672067200256050ustar00rootroot00000000000000 ssl::context::use_tmp_dh (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters.

void use_tmp_dh(
    const const_buffer & dh);

This function is used to load Diffie-Hellman parameters into the context from a buffer.

Parameters

dh

The memory buffer containing the Diffie-Hellman parameters. The buffer must use the PEM format.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_tmp_dh.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh/overload2.html000066400000000000000000000075271340672067200256260ustar00rootroot00000000000000 ssl::context::use_tmp_dh (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use the specified memory buffer to obtain the temporary Diffie-Hellman parameters.

void use_tmp_dh(
    const const_buffer & dh,
    asio::error_code & ec);

This function is used to load Diffie-Hellman parameters into the context from a buffer.

Parameters

dh

The memory buffer containing the Diffie-Hellman parameters. The buffer must use the PEM format.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_tmp_dh.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh_file.html000066400000000000000000000064671340672067200247320ustar00rootroot00000000000000 ssl::context::use_tmp_dh_file
asio C++ library

PrevUpHomeNext

Use the specified file to obtain the temporary Diffie-Hellman parameters.

void use_tmp_dh_file(
    const std::string & filename);
  » more...

void use_tmp_dh_file(
    const std::string & filename,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh_file/000077500000000000000000000000001340672067200240275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh_file/overload1.html000066400000000000000000000103701340672067200266120ustar00rootroot00000000000000 ssl::context::use_tmp_dh_file (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use the specified file to obtain the temporary Diffie-Hellman parameters.

void use_tmp_dh_file(
    const std::string & filename);

This function is used to load Diffie-Hellman parameters into the context from a file.

Parameters

filename

The name of the file containing the Diffie-Hellman parameters. The file must use the PEM format.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_CTX_set_tmp_dh.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context/use_tmp_dh_file/overload2.html000066400000000000000000000076001340672067200266150ustar00rootroot00000000000000 ssl::context::use_tmp_dh_file (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Use the specified file to obtain the temporary Diffie-Hellman parameters.

void use_tmp_dh_file(
    const std::string & filename,
    asio::error_code & ec);

This function is used to load Diffie-Hellman parameters into the context from a file.

Parameters

filename

The name of the file containing the Diffie-Hellman parameters. The file must use the PEM format.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_CTX_set_tmp_dh.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base.html000066400000000000000000000235611340672067200225700ustar00rootroot00000000000000 ssl::context_base
asio C++ library

PrevUpHomeNext

The ssl::context_base class is used as a base for the basic_context class template so that we have a common place to define various enums.

class context_base
Types

Name

Description

file_format

File format types.

method

Different methods supported by a context.

options

Bitmask type for SSL options.

password_purpose

Purpose of PEM password.

Protected Member Functions

Name

Description

~context_base

Protected destructor to prevent deletion through this type.

Data Members

Name

Description

default_workarounds

Implement various bug workarounds.

no_compression

Disable compression. Compression is disabled by default.

no_sslv2

Disable SSL v2.

no_sslv3

Disable SSL v3.

no_tlsv1

Disable TLS v1.

no_tlsv1_1

Disable TLS v1.1.

no_tlsv1_2

Disable TLS v1.2.

no_tlsv1_3

Disable TLS v1.3.

single_dh_use

Always create a new key when using tmp_dh parameters.

Requirements

Header: asio/ssl/context_base.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/000077500000000000000000000000001340672067200216735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__context_base/_context_base.html000066400000000000000000000051571340672067200254060ustar00rootroot00000000000000 ssl::context_base::~context_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~context_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/default_workarounds.html000066400000000000000000000051511340672067200266450ustar00rootroot00000000000000 ssl::context_base::default_workarounds
asio C++ library

PrevUpHomeNext

Implement various bug workarounds.

static const long default_workarounds = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/file_format.html000066400000000000000000000063321340672067200250540ustar00rootroot00000000000000 ssl::context_base::file_format
asio C++ library

PrevUpHomeNext

File format types.

enum file_format

Values

asn1

ASN.1 file.

pem

PEM file.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/method.html000066400000000000000000000170141340672067200240440ustar00rootroot00000000000000 ssl::context_base::method
asio C++ library

PrevUpHomeNext

Different methods supported by a context.

enum method

Values

sslv2

Generic SSL version 2.

sslv2_client

SSL version 2 client.

sslv2_server

SSL version 2 server.

sslv3

Generic SSL version 3.

sslv3_client

SSL version 3 client.

sslv3_server

SSL version 3 server.

tlsv1

Generic TLS version 1.

tlsv1_client

TLS version 1 client.

tlsv1_server

TLS version 1 server.

sslv23

Generic SSL/TLS.

sslv23_client

SSL/TLS client.

sslv23_server

SSL/TLS server.

tlsv11

Generic TLS version 1.1.

tlsv11_client

TLS version 1.1 client.

tlsv11_server

TLS version 1.1 server.

tlsv12

Generic TLS version 1.2.

tlsv12_client

TLS version 1.2 client.

tlsv12_server

TLS version 1.2 server.

tlsv13

Generic TLS version 1.3.

tlsv13_client

TLS version 1.3 client.

tlsv13_server

TLS version 1.3 server.

tls

Generic TLS.

tls_client

TLS client.

tls_server

TLS server.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_compression.html000066400000000000000000000050561340672067200256240ustar00rootroot00000000000000 ssl::context_base::no_compression
asio C++ library

PrevUpHomeNext

Disable compression. Compression is disabled by default.

static const long no_compression = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_sslv2.html000066400000000000000000000047731340672067200243410ustar00rootroot00000000000000 ssl::context_base::no_sslv2
asio C++ library

PrevUpHomeNext

Disable SSL v2.

static const long no_sslv2 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_sslv3.html000066400000000000000000000047431340672067200243370ustar00rootroot00000000000000 ssl::context_base::no_sslv3
asio C++ library

PrevUpHomeNext

Disable SSL v3.

static const long no_sslv3 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_tlsv1.html000066400000000000000000000047531340672067200243370ustar00rootroot00000000000000 ssl::context_base::no_tlsv1
asio C++ library

PrevUpHomeNext

Disable TLS v1.

static const long no_tlsv1 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_tlsv1_1.html000066400000000000000000000047731340672067200245610ustar00rootroot00000000000000 ssl::context_base::no_tlsv1_1
asio C++ library

PrevUpHomeNext

Disable TLS v1.1.

static const long no_tlsv1_1 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_tlsv1_2.html000066400000000000000000000050031340672067200245450ustar00rootroot00000000000000 ssl::context_base::no_tlsv1_2
asio C++ library

PrevUpHomeNext

Disable TLS v1.2.

static const long no_tlsv1_2 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/no_tlsv1_3.html000066400000000000000000000047671340672067200245660ustar00rootroot00000000000000 ssl::context_base::no_tlsv1_3
asio C++ library

PrevUpHomeNext

Disable TLS v1.3.

static const long no_tlsv1_3 = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/options.html000066400000000000000000000060111340672067200242520ustar00rootroot00000000000000 ssl::context_base::options
asio C++ library

PrevUpHomeNext

Bitmask type for SSL options.

typedef long options;
Requirements

Header: asio/ssl/context_base.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/password_purpose.html000066400000000000000000000065631340672067200262120ustar00rootroot00000000000000 ssl::context_base::password_purpose
asio C++ library

PrevUpHomeNext

Purpose of PEM password.

enum password_purpose

Values

for_reading

The password is needed for reading/decryption.

for_writing

The password is needed for writing/encryption.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__context_base/single_dh_use.html000066400000000000000000000051401340672067200253710ustar00rootroot00000000000000 ssl::context_base::single_dh_use
asio C++ library

PrevUpHomeNext

Always create a new key when using tmp_dh parameters.

static const long single_dh_use = implementation_defined;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__error__get_stream_category.html000066400000000000000000000061341340672067200255060ustar00rootroot00000000000000 ssl::error::get_stream_category
asio C++ library

PrevUpHomeNext

const asio::error_category & get_stream_category();
Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__error__make_error_code.html000066400000000000000000000060631340672067200246000ustar00rootroot00000000000000 ssl::error::make_error_code
asio C++ library

PrevUpHomeNext

asio::error_code make_error_code(
    stream_errors e);
Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__error__stream_category.html000066400000000000000000000061061340672067200246460ustar00rootroot00000000000000 ssl::error::stream_category
asio C++ library

PrevUpHomeNext

static const asio::error_category & stream_category = asio::ssl::error::get_stream_category();
Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__error__stream_errors.html000066400000000000000000000071451340672067200243510ustar00rootroot00000000000000 ssl::error::stream_errors
asio C++ library

PrevUpHomeNext

enum stream_errors

Values

stream_truncated

The underlying stream closed before the ssl stream gracefully shut down.

Requirements

Header: asio/ssl/error.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__rfc2818_verification.html000066400000000000000000000152121340672067200237430ustar00rootroot00000000000000 ssl::rfc2818_verification
asio C++ library

PrevUpHomeNext

Verifies a certificate against a hostname according to the rules described in RFC 2818.

class rfc2818_verification
Types

Name

Description

result_type

The type of the function object's result.

Member Functions

Name

Description

operator()

Perform certificate verification.

rfc2818_verification

Constructor.

Example

The following example shows how to synchronously open a secure connection to a given host name:

using asio::ip::tcp;
namespace ssl = asio::ssl;
typedef ssl::stream<tcp::socket> ssl_socket;

// Create a context that uses the default paths for finding CA certificates.
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();

// Open a socket and connect it to the remote host.
asio::io_context io_context;
ssl_socket sock(io_context, ctx);
tcp::resolver resolver(io_context);
tcp::resolver::query query("host.name", "https");
asio::connect(sock.lowest_layer(), resolver.resolve(query));
sock.lowest_layer().set_option(tcp::no_delay(true));

// Perform SSL handshake and verify the remote host's certificate.
sock.set_verify_mode(ssl::verify_peer);
sock.set_verify_callback(ssl::rfc2818_verification("host.name"));
sock.handshake(ssl_socket::client);

// ... read and write as normal ...
Requirements

Header: asio/ssl/rfc2818_verification.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__rfc2818_verification/000077500000000000000000000000001340672067200230545ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__rfc2818_verification/operator_lp__rp_.html000066400000000000000000000053001340672067200272650ustar00rootroot00000000000000 ssl::rfc2818_verification::operator()
asio C++ library

PrevUpHomeNext

Perform certificate verification.

bool operator()(
    bool preverified,
    verify_context & ctx) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__rfc2818_verification/result_type.html000066400000000000000000000063331340672067200263260ustar00rootroot00000000000000 ssl::rfc2818_verification::result_type
asio C++ library

PrevUpHomeNext

The type of the function object's result.

typedef bool result_type;
Requirements

Header: asio/ssl/rfc2818_verification.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__rfc2818_verification/rfc2818_verification.html000066400000000000000000000052001340672067200275760ustar00rootroot00000000000000 ssl::rfc2818_verification::rfc2818_verification
asio C++ library

PrevUpHomeNext

Constructor.

rfc2818_verification(
    const std::string & host);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream.html000066400000000000000000000345551340672067200214120ustar00rootroot00000000000000 ssl::stream
asio C++ library

PrevUpHomeNext

Provides stream-oriented functionality using SSL.

template<
    typename Stream>
class stream :
  public ssl::stream_base,
  noncopyable
Types

Name

Description

impl_struct

Structure for use with deprecated impl_type.

executor_type

The type of the executor associated with the object.

handshake_type

Different handshake types.

lowest_layer_type

The type of the lowest layer.

native_handle_type

The native handle type of the SSL stream.

next_layer_type

The type of the next layer.

Member Functions

Name

Description

async_handshake

Start an asynchronous SSL handshake.

async_read_some

Start an asynchronous read.

async_shutdown

Asynchronously shut down SSL on the stream.

async_write_some

Start an asynchronous write.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

handshake

Perform SSL handshaking.

lowest_layer

Get a reference to the lowest layer.

native_handle

Get the underlying implementation in the native type.

next_layer

Get a reference to the next layer.

read_some

Read some data from the stream.

set_verify_callback

Set the callback used to verify peer certificates.

set_verify_depth

Set the peer verification depth.

set_verify_mode

Set the peer verification mode.

shutdown

Shut down SSL on the stream.

stream

Construct a stream.

write_some

Write some data to the stream.

~stream

Destructor.

The stream class template provides asynchronous and blocking stream-oriented functionality using SSL.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe. The application must also ensure that all asynchronous operations are performed within the same implicit or explicit strand.

Example

To use the SSL stream template with an ip::tcp::socket, you would write:

asio::io_context io_context;
asio::ssl::context ctx(asio::ssl::context::sslv23);
asio::ssl::stream<asio:ip::tcp::socket> sock(io_context, ctx);
Requirements

Header: asio/ssl/stream.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/000077500000000000000000000000001340672067200205105ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/_stream.html000066400000000000000000000055761340672067200230450ustar00rootroot00000000000000 ssl::stream::~stream
asio C++ library

PrevUpHomeNext

Destructor.

~stream();
Remarks

A stream object must not be destroyed while there are pending asynchronous operations associated with it.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/async_handshake.html000066400000000000000000000101361340672067200245220ustar00rootroot00000000000000 ssl::stream::async_handshake
asio C++ library

PrevUpHomeNext

Start an asynchronous SSL handshake.

template<
    typename HandshakeHandler>
DEDUCED async_handshake(
    handshake_type type,
    HandshakeHandler && handler);
  » more...

template<
    typename ConstBufferSequence,
    typename BufferedHandshakeHandler>
DEDUCED async_handshake(
    handshake_type type,
    const ConstBufferSequence & buffers,
    BufferedHandshakeHandler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/async_handshake/000077500000000000000000000000001340672067200236335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/async_handshake/overload1.html000066400000000000000000000101421340672067200264130ustar00rootroot00000000000000 ssl::stream::async_handshake (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous SSL handshake.

template<
    typename HandshakeHandler>
DEDUCED async_handshake(
    handshake_type type,
    HandshakeHandler && handler);

This function is used to asynchronously perform an SSL handshake on the stream. This function call always returns immediately.

Parameters

type

The type of handshaking to be performed, i.e. as a client or as a server.

handler

The handler to be called when the handshake operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/async_handshake/overload2.html000066400000000000000000000114061340672067200264200ustar00rootroot00000000000000 ssl::stream::async_handshake (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Start an asynchronous SSL handshake.

template<
    typename ConstBufferSequence,
    typename BufferedHandshakeHandler>
DEDUCED async_handshake(
    handshake_type type,
    const ConstBufferSequence & buffers,
    BufferedHandshakeHandler && handler);

This function is used to asynchronously perform an SSL handshake on the stream. This function call always returns immediately.

Parameters

type

The type of handshaking to be performed, i.e. as a client or as a server.

buffers

The buffered data to be reused for the handshake. Although the buffers object may be copied as necessary, ownership of the underlying buffers is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the handshake operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred // Amount of buffers used in handshake.
);


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/async_read_some.html000066400000000000000000000120711340672067200245320ustar00rootroot00000000000000 ssl::stream::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read one or more bytes of data from the stream. The function call always returns immediately.

Parameters

buffers

The buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying buffers is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes read.
);

Remarks

The async_read_some operation may not read all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/async_shutdown.html000066400000000000000000000074201340672067200244510ustar00rootroot00000000000000 ssl::stream::async_shutdown
asio C++ library

PrevUpHomeNext

Asynchronously shut down SSL on the stream.

template<
    typename ShutdownHandler>
DEDUCED async_shutdown(
    ShutdownHandler && handler);

This function is used to asynchronously shut down SSL on the stream. This function call always returns immediately.

Parameters

handler

The handler to be called when the handshake operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/async_write_some.html000066400000000000000000000117701340672067200247560ustar00rootroot00000000000000 ssl::stream::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write one or more bytes of data to the stream. The function call always returns immediately.

Parameters

buffers

The data to be written to the stream. Although the buffers object may be copied as necessary, ownership of the underlying buffers is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The equivalent function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes written.
);

Remarks

The async_write_some operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/executor_type.html000066400000000000000000000060541340672067200243020ustar00rootroot00000000000000 ssl::stream::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef lowest_layer_type::executor_type executor_type;
Requirements

Header: asio/ssl/stream.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/get_executor.html000066400000000000000000000060021340672067200240710ustar00rootroot00000000000000 ssl::stream::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

This function may be used to obtain the executor object that the stream uses to dispatch handlers for asynchronous operations.

Return Value

A copy of the executor that stream will use to dispatch handlers.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/get_io_context.html000066400000000000000000000052651340672067200244200ustar00rootroot00000000000000 ssl::stream::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/get_io_service.html000066400000000000000000000052511340672067200243670ustar00rootroot00000000000000 ssl::stream::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/handshake.html000066400000000000000000000100771340672067200233310ustar00rootroot00000000000000 ssl::stream::handshake
asio C++ library

PrevUpHomeNext

Perform SSL handshaking.

void handshake(
    handshake_type type);
  » more...

void handshake(
    handshake_type type,
    asio::error_code & ec);
  » more...

template<
    typename ConstBufferSequence>
void handshake(
    handshake_type type,
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
void handshake(
    handshake_type type,
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/handshake/000077500000000000000000000000001340672067200224365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/handshake/overload1.html000066400000000000000000000073041340672067200252240ustar00rootroot00000000000000 ssl::stream::handshake (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Perform SSL handshaking.

void handshake(
    handshake_type type);

This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.

Parameters

type

The type of handshaking to be performed, i.e. as a client or as a server.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/handshake/overload2.html000066400000000000000000000066071340672067200252320ustar00rootroot00000000000000 ssl::stream::handshake (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Perform SSL handshaking.

void handshake(
    handshake_type type,
    asio::error_code & ec);

This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.

Parameters

type

The type of handshaking to be performed, i.e. as a client or as a server.

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/handshake/overload3.html000066400000000000000000000100461340672067200252230ustar00rootroot00000000000000 ssl::stream::handshake (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Perform SSL handshaking.

template<
    typename ConstBufferSequence>
void handshake(
    handshake_type type,
    const ConstBufferSequence & buffers);

This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.

Parameters

type

The type of handshaking to be performed, i.e. as a client or as a server.

buffers

The buffered data to be reused for the handshake.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/handshake/overload4.html000066400000000000000000000073511340672067200252310ustar00rootroot00000000000000 ssl::stream::handshake (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Perform SSL handshaking.

template<
    typename ConstBufferSequence>
void handshake(
    handshake_type type,
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to perform SSL handshaking on the stream. The function call will block until handshaking is complete or an error occurs.

Parameters

type

The type of handshaking to be performed, i.e. as a client or as a server.

buffers

The buffered data to be reused for the handshake.

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/handshake_type.html000066400000000000000000000064001340672067200243650ustar00rootroot00000000000000 ssl::stream::handshake_type
asio C++ library

PrevUpHomeNext

Different handshake types.

enum handshake_type

Values

client

Perform handshaking as a client.

server

Perform handshaking as a server.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/lowest_layer.html000066400000000000000000000061571340672067200241200ustar00rootroot00000000000000 ssl::stream::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/lowest_layer/000077500000000000000000000000001340672067200232215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/lowest_layer/overload1.html000066400000000000000000000061731340672067200260120ustar00rootroot00000000000000 ssl::stream::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of stream layers.

Return Value

A reference to the lowest layer in the stack of stream layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/lowest_layer/overload2.html000066400000000000000000000062331340672067200260100ustar00rootroot00000000000000 ssl::stream::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a reference to the lowest layer in a stack of stream layers.

Return Value

A reference to the lowest layer in the stack of stream layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/lowest_layer_type.html000066400000000000000000000061501340672067200251520ustar00rootroot00000000000000 ssl::stream::lowest_layer_type
asio C++ library

PrevUpHomeNext

The type of the lowest layer.

typedef next_layer_type::lowest_layer_type lowest_layer_type;
Requirements

Header: asio/ssl/stream.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/native_handle.html000066400000000000000000000072371340672067200242100ustar00rootroot00000000000000 ssl::stream::native_handle
asio C++ library

PrevUpHomeNext

Get the underlying implementation in the native type.

native_handle_type native_handle();

This function may be used to obtain the underlying implementation of the context. This is intended to allow access to context functionality that is not otherwise provided.

Example

The native_handle() function returns a pointer of type SSL* that is suitable for passing to functions such as SSL_get_verify_result and SSL_get_peer_certificate:

asio::ssl::stream<asio:ip::tcp::socket> sock(io_context, ctx);

// ... establish connection and perform handshake ...

if (X509* cert = SSL_get_peer_certificate(sock.native_handle()))
{
  if (SSL_get_verify_result(sock.native_handle()) == X509_V_OK)
  {
    // ...
  }
}

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/native_handle_type.html000066400000000000000000000060511340672067200252420ustar00rootroot00000000000000 ssl::stream::native_handle_type
asio C++ library

PrevUpHomeNext

The native handle type of the SSL stream.

typedef SSL * native_handle_type;
Requirements

Header: asio/ssl/stream.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/next_layer.html000066400000000000000000000061211340672067200235500ustar00rootroot00000000000000 ssl::stream::next_layer
asio C++ library

PrevUpHomeNext

Get a reference to the next layer.

const next_layer_type & next_layer() const;
  » more...

next_layer_type & next_layer();
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/next_layer/000077500000000000000000000000001340672067200226625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/next_layer/overload1.html000066400000000000000000000061351340672067200254510ustar00rootroot00000000000000 ssl::stream::next_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the next layer.

const next_layer_type & next_layer() const;

This function returns a reference to the next layer in a stack of stream layers.

Return Value

A reference to the next layer in the stack of stream layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/next_layer/overload2.html000066400000000000000000000061451340672067200254530ustar00rootroot00000000000000 ssl::stream::next_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the next layer.

next_layer_type & next_layer();

This function returns a reference to the next layer in a stack of stream layers.

Return Value

A reference to the next layer in the stack of stream layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/next_layer_type.html000066400000000000000000000060741340672067200246200ustar00rootroot00000000000000 ssl::stream::next_layer_type
asio C++ library

PrevUpHomeNext

The type of the next layer.

typedef remove_reference< Stream >::type next_layer_type;
Requirements

Header: asio/ssl/stream.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/read_some.html000066400000000000000000000066751340672067200233520ustar00rootroot00000000000000 ssl::stream::read_some
asio C++ library

PrevUpHomeNext

Read some data from the stream.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/read_some/000077500000000000000000000000001340672067200224465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/read_some/overload1.html000066400000000000000000000116001340672067200252260ustar00rootroot00000000000000 ssl::stream::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

This function is used to read data from the stream. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

The buffers into which the data will be read.

Return Value

The number of bytes read.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/read_some/overload2.html000066400000000000000000000112011340672067200252240ustar00rootroot00000000000000 ssl::stream::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the stream.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read data from the stream. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

The buffers into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. Returns 0 if an error occurred.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_callback.html000066400000000000000000000066451340672067200254040ustar00rootroot00000000000000 ssl::stream::set_verify_callback
asio C++ library

PrevUpHomeNext

Set the callback used to verify peer certificates.

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback);
  » more...

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_callback/000077500000000000000000000000001340672067200245035ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_callback/overload1.html000066400000000000000000000113521340672067200272670ustar00rootroot00000000000000 ssl::stream::set_verify_callback (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the callback used to verify peer certificates.

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback);

This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.

Parameters

callback

The function object to be used for verifying a certificate. The function signature of the handler must be:

bool verify_callback(
  bool preverified, // True if the certificate passed pre-verification.
  verify_context& ctx // The peer certificate and other context.
);

The return value of the callback is true if the certificate has passed verification, false otherwise.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_callback/overload2.html000066400000000000000000000105711340672067200272720ustar00rootroot00000000000000 ssl::stream::set_verify_callback (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the callback used to verify peer certificates.

template<
    typename VerifyCallback>
void set_verify_callback(
    VerifyCallback callback,
    asio::error_code & ec);

This function is used to specify a callback function that will be called by the implementation when it needs to verify a peer certificate.

Parameters

callback

The function object to be used for verifying a certificate. The function signature of the handler must be:

bool verify_callback(
  bool preverified, // True if the certificate passed pre-verification.
  verify_context& ctx // The peer certificate and other context.
);

The return value of the callback is true if the certificate has passed verification, false otherwise.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_depth.html000066400000000000000000000064111340672067200247430ustar00rootroot00000000000000 ssl::stream::set_verify_depth
asio C++ library

PrevUpHomeNext

Set the peer verification depth.

void set_verify_depth(
    int depth);
  » more...

void set_verify_depth(
    int depth,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_depth/000077500000000000000000000000001340672067200240535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_depth/overload1.html000066400000000000000000000102601340672067200266340ustar00rootroot00000000000000 ssl::stream::set_verify_depth (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification depth.

void set_verify_depth(
    int depth);

This function may be used to configure the maximum verification depth allowed by the stream.

Parameters

depth

Maximum depth for the certificate chain verification that shall be allowed.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_set_verify_depth.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_depth/overload2.html000066400000000000000000000075201340672067200266420ustar00rootroot00000000000000 ssl::stream::set_verify_depth (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification depth.

void set_verify_depth(
    int depth,
    asio::error_code & ec);

This function may be used to configure the maximum verification depth allowed by the stream.

Parameters

depth

Maximum depth for the certificate chain verification that shall be allowed.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_set_verify_depth.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_mode.html000066400000000000000000000063601340672067200245660ustar00rootroot00000000000000 ssl::stream::set_verify_mode
asio C++ library

PrevUpHomeNext

Set the peer verification mode.

void set_verify_mode(
    verify_mode v);
  » more...

void set_verify_mode(
    verify_mode v,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_mode/000077500000000000000000000000001340672067200236735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_mode/overload1.html000066400000000000000000000105201340672067200264530ustar00rootroot00000000000000 ssl::stream::set_verify_mode (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification mode.

void set_verify_mode(
    verify_mode v);

This function may be used to configure the peer verification mode used by the stream. The new mode will override the mode inherited from the context.

Parameters

v

A bitmask of peer verification modes. See ssl::verify_mode for available values.

Exceptions

asio::system_error

Thrown on failure.

Remarks

Calls SSL_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/set_verify_mode/overload2.html000066400000000000000000000077331340672067200264700ustar00rootroot00000000000000 ssl::stream::set_verify_mode (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Set the peer verification mode.

void set_verify_mode(
    verify_mode v,
    asio::error_code & ec);

This function may be used to configure the peer verification mode used by the stream. The new mode will override the mode inherited from the context.

Parameters

v

A bitmask of peer verification modes. See ssl::verify_mode for available values.

ec

Set to indicate what error occurred, if any.

Remarks

Calls SSL_set_verify.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/shutdown.html000066400000000000000000000060701340672067200232540ustar00rootroot00000000000000 ssl::stream::shutdown
asio C++ library

PrevUpHomeNext

Shut down SSL on the stream.

void shutdown();
  » more...

void shutdown(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/shutdown/000077500000000000000000000000001340672067200223635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/shutdown/overload1.html000066400000000000000000000061541340672067200251530ustar00rootroot00000000000000 ssl::stream::shutdown (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Shut down SSL on the stream.

void shutdown();

This function is used to shut down SSL on the stream. The function call will block until SSL has been shut down or an error occurs.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/shutdown/overload2.html000066400000000000000000000062141340672067200251510ustar00rootroot00000000000000 ssl::stream::shutdown (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Shut down SSL on the stream.

void shutdown(
    asio::error_code & ec);

This function is used to shut down SSL on the stream. The function call will block until SSL has been shut down or an error occurs.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/stream.html000066400000000000000000000062741340672067200227020ustar00rootroot00000000000000 ssl::stream::stream
asio C++ library

PrevUpHomeNext

Construct a stream.

template<
    typename Arg>
stream(
    Arg && arg,
    context & ctx);

This constructor creates a stream and initialises the underlying stream object.

Parameters

arg

The argument to be passed to initialise the underlying stream.

ctx

The SSL context to be used for the stream.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/write_some.html000066400000000000000000000066421340672067200235630ustar00rootroot00000000000000 ssl::stream::write_some
asio C++ library

PrevUpHomeNext

Write some data to the stream.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/write_some/000077500000000000000000000000001340672067200226655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream/write_some/overload1.html000066400000000000000000000115611340672067200254530ustar00rootroot00000000000000 ssl::stream::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the stream.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

This function is used to write data on the stream. The function call will block until one or more bytes of data has been written successfully, or until an error occurs.

Parameters

buffers

The data to be written.

Return Value

The number of bytes written.

Exceptions

asio::system_error

Thrown on failure.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream/write_some/overload2.html000066400000000000000000000111111340672067200254430ustar00rootroot00000000000000 ssl::stream::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the stream.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write data on the stream. The function call will block until one or more bytes of data has been written successfully, or until an error occurs.

Parameters

buffers

The data to be written to the stream.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. Returns 0 if an error occurred.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream__impl_struct.html000066400000000000000000000074301340672067200241660ustar00rootroot00000000000000 ssl::stream::impl_struct
asio C++ library

PrevUpHomeNext

Structure for use with deprecated impl_type.

struct impl_struct
Data Members

Name

Description

ssl

Requirements

Header: asio/ssl/stream.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream__impl_struct/000077500000000000000000000000001340672067200232745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream__impl_struct/ssl.html000066400000000000000000000050131340672067200247620ustar00rootroot00000000000000 ssl::stream::impl_struct::ssl
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream_base.html000066400000000000000000000121641340672067200223740ustar00rootroot00000000000000 ssl::stream_base
asio C++ library

PrevUpHomeNext

The ssl::stream_base class is used as a base for the ssl::stream class template so that we have a common place to define various enums.

class stream_base
Types

Name

Description

handshake_type

Different handshake types.

Protected Member Functions

Name

Description

~stream_base

Protected destructor to prevent deletion through this type.

Requirements

Header: asio/ssl/stream_base.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream_base/000077500000000000000000000000001340672067200215025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__stream_base/_stream_base.html000066400000000000000000000051021340672067200250120ustar00rootroot00000000000000 ssl::stream_base::~stream_base
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~stream_base();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__stream_base/handshake_type.html000066400000000000000000000064621340672067200253670ustar00rootroot00000000000000 ssl::stream_base::handshake_type
asio C++ library

PrevUpHomeNext

Different handshake types.

enum handshake_type

Values

client

Perform handshaking as a client.

server

Perform handshaking as a server.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_client_once.html000066400000000000000000000063041340672067200237540ustar00rootroot00000000000000 ssl::verify_client_once
asio C++ library

PrevUpHomeNext

Do not request client certificate on renegotiation. Ignored unless ssl::verify_peer is set.

const int verify_client_once = implementation_defined;
Requirements

Header: asio/ssl/verify_mode.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_context.html000066400000000000000000000134031340672067200231540ustar00rootroot00000000000000 ssl::verify_context
asio C++ library

PrevUpHomeNext

A simple wrapper around the X509_STORE_CTX type, used during verification of a peer certificate.

class verify_context :
  noncopyable
Types

Name

Description

native_handle_type

The native handle type of the verification context.

Member Functions

Name

Description

native_handle

Get the underlying implementation in the native type.

verify_context

Constructor.

Remarks

The ssl::verify_context does not own the underlying X509_STORE_CTX object.

Requirements

Header: asio/ssl/verify_context.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_context/000077500000000000000000000000001340672067200222655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/ssl__verify_context/native_handle.html000066400000000000000000000055171340672067200257640ustar00rootroot00000000000000 ssl::verify_context::native_handle
asio C++ library

PrevUpHomeNext

Get the underlying implementation in the native type.

native_handle_type native_handle();

This function may be used to obtain the underlying implementation of the context. This is intended to allow access to context functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_context/native_handle_type.html000066400000000000000000000063061340672067200270220ustar00rootroot00000000000000 ssl::verify_context::native_handle_type
asio C++ library

PrevUpHomeNext

The native handle type of the verification context.

typedef X509_STORE_CTX * native_handle_type;
Requirements

Header: asio/ssl/verify_context.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_context/verify_context.html000066400000000000000000000052071340672067200262270ustar00rootroot00000000000000 ssl::verify_context::verify_context
asio C++ library

PrevUpHomeNext

Constructor.

verify_context(
    native_handle_type handle);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_fail_if_no_peer_cert.html000066400000000000000000000064551340672067200256160ustar00rootroot00000000000000 ssl::verify_fail_if_no_peer_cert
asio C++ library

PrevUpHomeNext

Fail verification if the peer has no certificate. Ignored unless ssl::verify_peer is set.

const int verify_fail_if_no_peer_cert = implementation_defined;
Requirements

Header: asio/ssl/verify_mode.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_mode.html000066400000000000000000000074521340672067200224230ustar00rootroot00000000000000 ssl::verify_mode
asio C++ library

PrevUpHomeNext

Bitmask type for peer verification.

typedef int verify_mode;

Possible values are:

Requirements

Header: asio/ssl/verify_mode.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_none.html000066400000000000000000000055551340672067200224400ustar00rootroot00000000000000 ssl::verify_none
asio C++ library

PrevUpHomeNext

No verification.

const int verify_none = implementation_defined;
Requirements

Header: asio/ssl/verify_mode.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/ssl__verify_peer.html000066400000000000000000000055351340672067200224320ustar00rootroot00000000000000 ssl::verify_peer
asio C++ library

PrevUpHomeNext

Verify the peer.

const int verify_peer = implementation_defined;
Requirements

Header: asio/ssl/verify_mode.hpp

Convenience header: asio/ssl.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/steady_timer.html000066400000000000000000000432241340672067200215610ustar00rootroot00000000000000 steady_timer
asio C++ library

PrevUpHomeNext

Typedef for a timer based on the steady clock.

typedef basic_waitable_timer< chrono::steady_clock > steady_timer;
Types

Name

Description

clock_type

The clock type.

duration

The duration type of the clock.

executor_type

The type of the executor associated with the object.

time_point

The time point type of the clock.

traits_type

The wait traits type.

Member Functions

Name

Description

async_wait

Start an asynchronous wait on the timer.

basic_waitable_timer

Constructor.

Constructor to set a particular expiry time as an absolute time.

Constructor to set a particular expiry time relative to now.

Move-construct a basic_waitable_timer from another.

cancel

Cancel any asynchronous operations that are waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer.

cancel_one

Cancels one asynchronous operation that is waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer.

expires_after

Set the timer's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time.

Set the timer's expiry time as an absolute time.

(Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the timer's expiry time relative to now.

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

expiry

Get the timer's expiry time as an absolute time.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_waitable_timer from another.

wait

Perform a blocking wait on the timer.

~basic_waitable_timer

Destroys the timer.

The basic_waitable_timer class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the wait() or async_wait() function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the steady_timer, system_timer or high_resolution_timer typedefs.

Remarks

This waitable timer functionality is for use with the C++11 standard library's <chrono> facility, or with the Boost.Chrono library.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Examples

Performing a blocking wait (C++11):

// Construct a timer without setting an expiry time.
asio::steady_timer timer(io_context);

// Set an expiry time relative to now.
timer.expires_after(std::chrono::seconds(5));

// Wait for the timer to expire.
timer.wait();

Performing an asynchronous wait (C++11):

void handler(const asio::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
asio::steady_timer timer(io_context,
    std::chrono::steady_clock::now() + std::chrono::seconds(60));

// Start an asynchronous wait.
timer.async_wait(handler);
Changing an active waitable timer's expiry time

Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:

void on_some_event()
{
  if (my_timer.expires_after(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const asio::error_code& e)
{
  if (e != asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}
  • The asio::basic_waitable_timer::expires_after() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.
  • If a wait handler is cancelled, the error_code passed to it contains the value asio::error::operation_aborted.

This typedef uses the C++11 <chrono> standard library facility, if available. Otherwise, it may use the Boost.Chrono library. To explicitly utilise Boost.Chrono, use the basic_waitable_timer template directly:

typedef basic_waitable_timer<boost::chrono::steady_clock> timer;
Requirements

Header: asio/steady_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand.html000066400000000000000000000236301340672067200203620ustar00rootroot00000000000000 strand
asio C++ library

PrevUpHomeNext

Provides serialised function invocation for any executor type.

template<
    typename Executor>
class strand
Types

Name

Description

inner_executor_type

The type of the underlying executor.

Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the strand to invoke the given function object.

dispatch

Request the strand to invoke the given function object.

get_inner_executor

Obtain the underlying executor.

on_work_finished

Inform the strand that some work is no longer outstanding.

on_work_started

Inform the strand that it has some outstanding work to do.

operator=

Assignment operator.

Converting assignment operator.

Move assignment operator.

Converting move assignment operator.

post

Request the strand to invoke the given function object.

running_in_this_thread

Determine whether the strand is running in the current thread.

strand

Default constructor.

Construct a strand for the specified executor.

Copy constructor.

Converting constructor.

Move constructor.

Converting move constructor.

~strand

Destructor.

Friends

Name

Description

operator!=

Compare two strands for inequality.

operator==

Compare two strands for equality.

Requirements

Header: asio/strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/000077500000000000000000000000001340672067200174705ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/strand/_strand.html000066400000000000000000000045321340672067200220140ustar00rootroot00000000000000 strand::~strand
asio C++ library

PrevUpHomeNext

Destructor.

~strand();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/context.html000066400000000000000000000045361340672067200220520ustar00rootroot00000000000000 strand::context
asio C++ library

PrevUpHomeNext

Obtain the underlying execution context.

execution_context & context() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/defer.html000066400000000000000000000070551340672067200214520ustar00rootroot00000000000000 strand::defer
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void defer(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled by the underlying executor's defer function.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/dispatch.html000066400000000000000000000073751340672067200221710ustar00rootroot00000000000000 strand::dispatch
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;

This function is used to ask the strand to execute the given function object on its underlying executor. The function object will be executed inside this function if the strand is not otherwise busy and if the underlying executor's dispatch() function is also able to execute the function before returning.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/get_inner_executor.html000066400000000000000000000047351340672067200242570ustar00rootroot00000000000000 strand::get_inner_executor
asio C++ library

PrevUpHomeNext

Obtain the underlying executor.

inner_executor_type get_inner_executor() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/inner_executor_type.html000066400000000000000000000060201340672067200244460ustar00rootroot00000000000000 strand::inner_executor_type
asio C++ library

PrevUpHomeNext

The type of the underlying executor.

typedef Executor inner_executor_type;
Requirements

Header: asio/strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/on_work_finished.html000066400000000000000000000051151340672067200237070ustar00rootroot00000000000000 strand::on_work_finished
asio C++ library

PrevUpHomeNext

Inform the strand that some work is no longer outstanding.

void on_work_finished() const;

The strand delegates this call to its underlying executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/on_work_started.html000066400000000000000000000050731340672067200235670ustar00rootroot00000000000000 strand::on_work_started
asio C++ library

PrevUpHomeNext

Inform the strand that it has some outstanding work to do.

void on_work_started() const;

The strand delegates this call to its underlying executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_eq_.html000066400000000000000000000102511340672067200230340ustar00rootroot00000000000000 strand::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

strand & operator=(
    const strand & other);
  » more...

Converting assignment operator.

template<
    class OtherExecutor>
strand & operator=(
    const strand< OtherExecutor > & other);
  » more...

Move assignment operator.

strand & operator=(
    strand && other);
  » more...

Converting move assignment operator.

template<
    class OtherExecutor>
strand & operator=(
    const strand< OtherExecutor > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_eq_/000077500000000000000000000000001340672067200221475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/strand/operator_eq_/overload1.html000066400000000000000000000047601340672067200247400ustar00rootroot00000000000000 strand::operator= (1 of 4 overloads)
asio C++ library

PrevUpHomeNext

Assignment operator.

strand & operator=(
    const strand & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_eq_/overload2.html000066400000000000000000000055321340672067200247370ustar00rootroot00000000000000 strand::operator= (2 of 4 overloads)
asio C++ library

PrevUpHomeNext

Converting assignment operator.

template<
    class OtherExecutor>
strand & operator=(
    const strand< OtherExecutor > & other);

This assignment operator is only valid if the OtherExecutor type is convertible to Executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_eq_/overload3.html000066400000000000000000000047651340672067200247470ustar00rootroot00000000000000 strand::operator= (3 of 4 overloads)
asio C++ library

PrevUpHomeNext

Move assignment operator.

strand & operator=(
    strand && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_eq_/overload4.html000066400000000000000000000055601340672067200247420ustar00rootroot00000000000000 strand::operator= (4 of 4 overloads)
asio C++ library

PrevUpHomeNext

Converting move assignment operator.

template<
    class OtherExecutor>
strand & operator=(
    const strand< OtherExecutor > && other);

This assignment operator is only valid if the OtherExecutor type is convertible to Executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_eq__eq_.html000066400000000000000000000061361340672067200236670ustar00rootroot00000000000000 strand::operator==
asio C++ library

PrevUpHomeNext

Compare two strands for equality.

friend bool operator==(
    const strand & a,
    const strand & b);

Two strands are equal if they refer to the same ordered, non-concurrent state.

Requirements

Header: asio/strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/operator_not__eq_.html000066400000000000000000000061421340672067200240570ustar00rootroot00000000000000 strand::operator!=
asio C++ library

PrevUpHomeNext

Compare two strands for inequality.

friend bool operator!=(
    const strand & a,
    const strand & b);

Two strands are equal if they refer to the same ordered, non-concurrent state.

Requirements

Header: asio/strand.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/post.html000066400000000000000000000071701340672067200213500ustar00rootroot00000000000000 strand::post
asio C++ library

PrevUpHomeNext

Request the strand to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled by the underlying executor's defer function.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/running_in_this_thread.html000066400000000000000000000061631340672067200251100ustar00rootroot00000000000000 strand::running_in_this_thread
asio C++ library

PrevUpHomeNext

Determine whether the strand is running in the current thread.

bool running_in_this_thread() const;
Return Value

true if the current thread is executing a function that was submitted to the strand using post(), dispatch() or defer(). Otherwise returns false.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand.html000066400000000000000000000112771340672067200216610ustar00rootroot00000000000000 strand::strand
asio C++ library

PrevUpHomeNext

Default constructor.

strand();
  » more...

Construct a strand for the specified executor.

explicit strand(
    const Executor & e);
  » more...

Copy constructor.

strand(
    const strand & other);
  » more...

Converting constructor.

template<
    class OtherExecutor>
strand(
    const strand< OtherExecutor > & other);
  » more...

Move constructor.

strand(
    strand && other);
  » more...

Converting move constructor.

template<
    class OtherExecutor>
strand(
    strand< OtherExecutor > && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand/000077500000000000000000000000001340672067200207635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/strand/strand/overload1.html000066400000000000000000000050131340672067200235440ustar00rootroot00000000000000 strand::strand (1 of 6 overloads)
asio C++ library

PrevUpHomeNext

Default constructor.

strand();

This constructor is only valid if the underlying executor type is default constructible.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand/overload2.html000066400000000000000000000047171340672067200235570ustar00rootroot00000000000000 strand::strand (2 of 6 overloads)
asio C++ library

PrevUpHomeNext

Construct a strand for the specified executor.

strand(
    const Executor & e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand/overload3.html000066400000000000000000000046641340672067200235610ustar00rootroot00000000000000 strand::strand (3 of 6 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

strand(
    const strand & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand/overload4.html000066400000000000000000000054201340672067200235510ustar00rootroot00000000000000 strand::strand (4 of 6 overloads)
asio C++ library

PrevUpHomeNext

Converting constructor.

template<
    class OtherExecutor>
strand(
    const strand< OtherExecutor > & other);

This constructor is only valid if the OtherExecutor type is convertible to Executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand/overload5.html000066400000000000000000000046631340672067200235620ustar00rootroot00000000000000 strand::strand (5 of 6 overloads)
asio C++ library

PrevUpHomeNext

Move constructor.

strand(
    strand && other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/strand/strand/overload6.html000066400000000000000000000054051340672067200235560ustar00rootroot00000000000000 strand::strand (6 of 6 overloads)
asio C++ library

PrevUpHomeNext

Converting move constructor.

template<
    class OtherExecutor>
strand(
    strand< OtherExecutor > && other);

This constructor is only valid if the OtherExecutor type is convertible to Executor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/streambuf.html000066400000000000000000000316411340672067200210600ustar00rootroot00000000000000 streambuf
asio C++ library

PrevUpHomeNext

Typedef for the typical usage of basic_streambuf.

typedef basic_streambuf streambuf;
Types

Name

Description

const_buffers_type

The type used to represent the input sequence as a list of buffers.

mutable_buffers_type

The type used to represent the output sequence as a list of buffers.

Member Functions

Name

Description

basic_streambuf

Construct a basic_streambuf object.

capacity

Get the current capacity of the basic_streambuf.

commit

Move characters from the output sequence to the input sequence.

consume

Remove characters from the input sequence.

data

Get a list of buffers that represents the input sequence.

max_size

Get the maximum size of the basic_streambuf.

prepare

Get a list of buffers that represents the output sequence, with the given size.

size

Get the size of the input sequence.

Protected Member Functions

Name

Description

overflow

Override std::streambuf behaviour.

reserve

underflow

Override std::streambuf behaviour.

The basic_streambuf class is derived from std::streambuf to associate the streambuf's input and output sequences with one or more character arrays. These character arrays are internal to the basic_streambuf object, but direct access to the array elements is provided to permit them to be used efficiently with I/O operations. Characters written to the output sequence of a basic_streambuf object are appended to the input sequence of the same object.

The basic_streambuf class's public interface is intended to permit the following implementation strategies:

  • A single contiguous character array, which is reallocated as necessary to accommodate changes in the size of the character sequence. This is the implementation approach currently used in Asio.
  • A sequence of one or more character arrays, where each array is of the same size. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.
  • A sequence of one or more character arrays of varying sizes. Additional character array objects are appended to the sequence to accommodate changes in the size of the character sequence.

The constructor for basic_streambuf accepts a size_t argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the basic_streambuf object, the following invariant holds:

size() <= max_size()

Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class std::length_error.

The constructor for basic_streambuf takes an Allocator argument. A copy of this argument is used for any memory allocation performed, by the constructor and by all member functions, during the lifetime of each basic_streambuf object.

Examples

Writing directly from an streambuf to a socket:

asio::streambuf b;
std::ostream os(&b);
os << "Hello, World!\n";

// try sending some data in input sequence
size_t n = sock.send(b.data());

b.consume(n); // sent data is removed from input sequence

Reading from a socket directly into a streambuf:

asio::streambuf b;

// reserve 512 bytes in output sequence
asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

size_t n = sock.receive(bufs);

// received data is "committed" from output sequence to input sequence
b.commit(n);

std::istream is(&b);
std::string s;
is >> s;
Requirements

Header: asio/streambuf.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/synchronous_socket_operations.html000066400000000000000000000116001340672067200252660ustar00rootroot00000000000000 Requirements on synchronous socket operations
asio C++ library

PrevUpHomeNext

In this section, synchronous socket operations are those member functions specified as two overloads, with and without an argument of type error_code&:

R f(A1 a1, A2 a2, ..., AN aN);
R f(A1 a1, A2 a2, ..., AN aN, error_code& ec);

For an object s, the conditions under which its synchronous socket operations may block the calling thread (C++Std [defns.block]) are determined as follows.

If:

s.non_blocking() == true,

— the synchronous socket operation is specified in terms of a POSIX function other than poll(),

— that POSIX function lists EWOULDBLOCK or EAGAIN in its failure conditions, and

— the effects of the operation cannot be established immediately

then the synchronous socket operation shall not block the calling thread. [Note: And the effects of the operation are not established. —end note]

Otherwise, the synchronous socket operation shall block the calling thread until the effects are established.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_category.html000066400000000000000000000055631340672067200223150ustar00rootroot00000000000000 system_category
asio C++ library

PrevUpHomeNext

Returns the error category used for the system errors produced by asio.

const error_category & system_category();
Requirements

Header: asio/error_code.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context.html000066400000000000000000000244531340672067200221630ustar00rootroot00000000000000 system_context
asio C++ library

PrevUpHomeNext

The executor context for the system executor.

class system_context :
  public execution_context
Types

Name

Description

executor_type

The executor type associated with the context.

fork_event

Fork-related event notifications.

Member Functions

Name

Description

get_executor

Obtain an executor for the context.

join

Join all threads in the system thread pool.

notify_fork

Notify the execution_context of a fork-related event.

stop

Signal all threads in the system thread pool to stop.

stopped

Determine whether the system thread pool has been stopped.

~system_context

Destructor shuts down all threads in the system thread pool.

Protected Member Functions

Name

Description

destroy

Destroys all services in the context.

shutdown

Shuts down all services in the context.

Friends

Name

Description

add_service

(Deprecated: Use make_service().) Add a service object to the execution_context.

has_service

Determine if an execution_context contains a specified service type.

make_service

Creates a service object and adds it to the execution_context.

use_service

Obtain the service object corresponding to the given type.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/000077500000000000000000000000001340672067200212655ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/system_context/_system_context.html000066400000000000000000000050751340672067200254110ustar00rootroot00000000000000 system_context::~system_context
asio C++ library

PrevUpHomeNext

Destructor shuts down all threads in the system thread pool.

~system_context();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/add_service.html000066400000000000000000000141041340672067200244230ustar00rootroot00000000000000 system_context::add_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

(Deprecated: Use make_service().) Add a service object to the execution_context.

template<
    typename Service>
friend void add_service(
    execution_context & e,
    Service * svc);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

svc

The service object. On success, ownership of the service object is transferred to the execution_context. When the execution_context object is destroyed, it will destroy the service object by performing:

delete static_cast<execution_context::service*>(svc)

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

asio::invalid_service_owner

Thrown if the service's owning execution_context is not the execution_context object specified by the e parameter.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/destroy.html000066400000000000000000000062131340672067200236460ustar00rootroot00000000000000 system_context::destroy
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Destroys all services in the context.

void destroy();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order * of the beginning of service object lifetime, performs delete static_cast<execution_context::service*>(svc).

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/executor_type.html000066400000000000000000000174751340672067200250700ustar00rootroot00000000000000 system_context::executor_type
asio C++ library

PrevUpHomeNext

The executor type associated with the context.

typedef system_executor executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the system executor to invoke the given function object.

dispatch

Request the system executor to invoke the given function object.

on_work_finished

Inform the executor that some work is no longer outstanding.

on_work_started

Inform the executor that it has some outstanding work to do.

post

Request the system executor to invoke the given function object.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

The system executor represents an execution context where functions are permitted to run on arbitrary threads. The post() and defer() functions schedule the function to run on an unspecified system thread pool, and dispatch() invokes the function immediately.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/fork_event.html000066400000000000000000000072071340672067200243230ustar00rootroot00000000000000 system_context::fork_event
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Fork-related event notifications.

enum fork_event

Values

fork_prepare

Notify the context that the process is about to fork.

fork_parent

Notify the context that the process has forked and is the parent.

fork_child

Notify the context that the process has forked and is the child.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/get_executor.html000066400000000000000000000047531340672067200246610ustar00rootroot00000000000000 system_context::get_executor
asio C++ library

PrevUpHomeNext

Obtain an executor for the context.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/has_service.html000066400000000000000000000113771340672067200244570ustar00rootroot00000000000000 system_context::has_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Determine if an execution_context contains a specified service type.

template<
    typename Service>
friend bool has_service(
    execution_context & e);

This function is used to determine whether the execution_context contains a service object corresponding to the given service type.

Parameters

e

The execution_context object that owns the service.

Return Value

A boolean indicating whether the execution_context contains the service.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/join.html000066400000000000000000000046721340672067200231230ustar00rootroot00000000000000 system_context::join
asio C++ library

PrevUpHomeNext

Join all threads in the system thread pool.

void join();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/make_service.html000066400000000000000000000120441340672067200246110ustar00rootroot00000000000000 system_context::make_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Creates a service object and adds it to the execution_context.

template<
    typename Service,
    typename... Args>
friend Service & make_service(
    execution_context & e,
    Args &&... args);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

args

Zero or more arguments to be passed to the service constructor.

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/notify_fork.html000066400000000000000000000151121340672067200245040ustar00rootroot00000000000000 system_context::notify_fork
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Notify the execution_context of a fork-related event.

void notify_fork(
    fork_event event);

This function is used to inform the execution_context that the process is about to fork, or has just forked. This allows the execution_context, and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other execution_context function, or any function associated with the execution_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the execution_context or its derived class.

Parameters

event

A fork-related event.

Exceptions

asio::system_error

Thrown on failure. If the notification fails the execution_context object should no longer be used and should be destroyed.

Example

The following code illustrates how to incorporate the notify_fork() function:

my_execution_context.notify_fork(execution_context::fork_prepare);
if (fork() == 0)
{
  // This is the child process.
  my_execution_context.notify_fork(execution_context::fork_child);
}
else
{
  // This is the parent process.
  my_execution_context.notify_fork(execution_context::fork_parent);
}
Remarks

For each service object svc in the execution_context set, performs svc->notify_fork();. When processing the fork_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/shutdown.html000066400000000000000000000061061340672067200240310ustar00rootroot00000000000000 system_context::shutdown
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Shuts down all services in the context.

void shutdown();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order of the beginning of service object lifetime, performs svc->shutdown().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/stop.html000066400000000000000000000046441340672067200231500ustar00rootroot00000000000000 system_context::stop
asio C++ library

PrevUpHomeNext

Signal all threads in the system thread pool to stop.

void stop();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/stopped.html000066400000000000000000000047041340672067200236360ustar00rootroot00000000000000 system_context::stopped
asio C++ library

PrevUpHomeNext

Determine whether the system thread pool has been stopped.

bool stopped() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/use_service.html000066400000000000000000000066031340672067200244740ustar00rootroot00000000000000 system_context::use_service
asio C++ library

PrevUpHomeNext

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);
  » more...

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/use_service/000077500000000000000000000000001340672067200236015ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/system_context/use_service/overload1.html000066400000000000000000000116221340672067200263650ustar00rootroot00000000000000 system_context::use_service (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the execution_context will create a new instance of the service.

Parameters

e

The execution_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_context/use_service/overload2.html000066400000000000000000000126621340672067200263730ustar00rootroot00000000000000 system_context::use_service (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the io_context will create a new instance of the service.

Parameters

ioc

The io_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Remarks

This overload is preserved for backwards compatibility with services that inherit from io_context::service.

Requirements

Header: asio/system_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error.html000066400000000000000000000127301340672067200216230ustar00rootroot00000000000000 system_error
asio C++ library

PrevUpHomeNext

The system_error class is used to represent system conditions that prevent the library from operating correctly.

class system_error :
  public std::exception
Member Functions

Name

Description

code

Get the error code associated with the exception.

operator=

Assignment operator.

system_error

Construct with an error code.

Construct with an error code and context.

Copy constructor.

what

Get a string representation of the exception.

~system_error

Destructor.

Requirements

Header: asio/system_error.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/000077500000000000000000000000001340672067200207325ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/system_error/_system_error.html000066400000000000000000000046471340672067200245270ustar00rootroot00000000000000 system_error::~system_error
asio C++ library

PrevUpHomeNext

Destructor.

virtual ~system_error();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/code.html000066400000000000000000000046621340672067200225420ustar00rootroot00000000000000 system_error::code
asio C++ library

PrevUpHomeNext

Get the error code associated with the exception.

error_code code() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/operator_eq_.html000066400000000000000000000047121340672067200243030ustar00rootroot00000000000000 system_error::operator=
asio C++ library

PrevUpHomeNext

Assignment operator.

system_error & operator=(
    const system_error & e);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/system_error.html000066400000000000000000000072151340672067200243620ustar00rootroot00000000000000 system_error::system_error
asio C++ library

PrevUpHomeNext

Construct with an error code.

system_error(
    const error_code & ec);
  » more...

Construct with an error code and context.

system_error(
    const error_code & ec,
    const std::string & context);
  » more...

Copy constructor.

system_error(
    const system_error & other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/system_error/000077500000000000000000000000001340672067200234675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/system_error/system_error/overload1.html000066400000000000000000000050541340672067200262550ustar00rootroot00000000000000 system_error::system_error (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct with an error code.

system_error(
    const error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/system_error/overload2.html000066400000000000000000000051361340672067200262570ustar00rootroot00000000000000 system_error::system_error (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct with an error code and context.

system_error(
    const error_code & ec,
    const std::string & context);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/system_error/overload3.html000066400000000000000000000050051340672067200262530ustar00rootroot00000000000000 system_error::system_error (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Copy constructor.

system_error(
    const system_error & other);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_error/what.html000066400000000000000000000047651340672067200225770ustar00rootroot00000000000000 system_error::what
asio C++ library

PrevUpHomeNext

Get a string representation of the exception.

virtual const char * what() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor.html000066400000000000000000000165661340672067200223430ustar00rootroot00000000000000 system_executor
asio C++ library

PrevUpHomeNext

An executor that uses arbitrary threads.

class system_executor
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the system executor to invoke the given function object.

dispatch

Request the system executor to invoke the given function object.

on_work_finished

Inform the executor that some work is no longer outstanding.

on_work_started

Inform the executor that it has some outstanding work to do.

post

Request the system executor to invoke the given function object.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

The system executor represents an execution context where functions are permitted to run on arbitrary threads. The post() and defer() functions schedule the function to run on an unspecified system thread pool, and dispatch() invokes the function immediately.

Requirements

Header: asio/system_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/000077500000000000000000000000001340672067200214375ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/system_executor/context.html000066400000000000000000000047311340672067200240160ustar00rootroot00000000000000 system_executor::context
asio C++ library

PrevUpHomeNext

Obtain the underlying execution context.

system_context & context() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/defer.html000066400000000000000000000072641340672067200234230ustar00rootroot00000000000000 system_executor::defer
asio C++ library

PrevUpHomeNext

Request the system executor to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void defer(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run on an unspecified system thread pool.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/dispatch.html000066400000000000000000000072311340672067200241270ustar00rootroot00000000000000 system_executor::dispatch
asio C++ library

PrevUpHomeNext

Request the system executor to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will always be executed inside this function.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/on_work_finished.html000066400000000000000000000051651340672067200256630ustar00rootroot00000000000000 system_executor::on_work_finished
asio C++ library

PrevUpHomeNext

Inform the executor that some work is no longer outstanding.

void on_work_finished() const;

For the system executor, this is a no-op.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/on_work_started.html000066400000000000000000000052171340672067200255360ustar00rootroot00000000000000 system_executor::on_work_started
asio C++ library

PrevUpHomeNext

Inform the executor that it has some outstanding work to do.

void on_work_started() const;

For the system executor, this is a no-op.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/operator_eq__eq_.html000066400000000000000000000062441340672067200256360ustar00rootroot00000000000000 system_executor::operator==
asio C++ library

PrevUpHomeNext

Compare two executors for equality.

friend bool operator==(
    const system_executor & ,
    const system_executor & );

System executors always compare equal.

Requirements

Header: asio/system_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/operator_not__eq_.html000066400000000000000000000063261340672067200260320ustar00rootroot00000000000000 system_executor::operator!=
asio C++ library

PrevUpHomeNext

Compare two executors for inequality.

friend bool operator!=(
    const system_executor & ,
    const system_executor & );

System executors always compare equal.

Requirements

Header: asio/system_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_executor/post.html000066400000000000000000000073171340672067200233220ustar00rootroot00000000000000 system_executor::post
asio C++ library

PrevUpHomeNext

Request the system executor to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;

This function is used to ask the executor to execute the given function object. The function object will never be executed inside this function. Instead, it will be scheduled to run on an unspecified system thread pool.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/system_timer.html000066400000000000000000000432451340672067200216170ustar00rootroot00000000000000 system_timer
asio C++ library

PrevUpHomeNext

Typedef for a timer based on the system clock.

typedef basic_waitable_timer< chrono::system_clock > system_timer;
Types

Name

Description

clock_type

The clock type.

duration

The duration type of the clock.

executor_type

The type of the executor associated with the object.

time_point

The time point type of the clock.

traits_type

The wait traits type.

Member Functions

Name

Description

async_wait

Start an asynchronous wait on the timer.

basic_waitable_timer

Constructor.

Constructor to set a particular expiry time as an absolute time.

Constructor to set a particular expiry time relative to now.

Move-construct a basic_waitable_timer from another.

cancel

Cancel any asynchronous operations that are waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancel any asynchronous operations that are waiting on the timer.

cancel_one

Cancels one asynchronous operation that is waiting on the timer.

(Deprecated: Use non-error_code overload.) Cancels one asynchronous operation that is waiting on the timer.

expires_after

Set the timer's expiry time relative to now.

expires_at

(Deprecated: Use expiry().) Get the timer's expiry time as an absolute time.

Set the timer's expiry time as an absolute time.

(Deprecated: Use non-error_code overload.) Set the timer's expiry time as an absolute time.

expires_from_now

(Deprecated: Use expiry().) Get the timer's expiry time relative to now.

(Deprecated: Use expires_after().) Set the timer's expiry time relative to now.

expiry

Get the timer's expiry time as an absolute time.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

operator=

Move-assign a basic_waitable_timer from another.

wait

Perform a blocking wait on the timer.

~basic_waitable_timer

Destroys the timer.

The basic_waitable_timer class template provides the ability to perform a blocking or asynchronous wait for a timer to expire.

A waitable timer is always in one of two states: "expired" or "not expired". If the wait() or async_wait() function is called on an expired timer, the wait operation will complete immediately.

Most applications will use one of the steady_timer, system_timer or high_resolution_timer typedefs.

Remarks

This waitable timer functionality is for use with the C++11 standard library's <chrono> facility, or with the Boost.Chrono library.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Examples

Performing a blocking wait (C++11):

// Construct a timer without setting an expiry time.
asio::steady_timer timer(io_context);

// Set an expiry time relative to now.
timer.expires_after(std::chrono::seconds(5));

// Wait for the timer to expire.
timer.wait();

Performing an asynchronous wait (C++11):

void handler(const asio::error_code& error)
{
  if (!error)
  {
    // Timer expired.
  }
}

...

// Construct a timer with an absolute expiry time.
asio::steady_timer timer(io_context,
    std::chrono::steady_clock::now() + std::chrono::seconds(60));

// Start an asynchronous wait.
timer.async_wait(handler);
Changing an active waitable timer's expiry time

Changing the expiry time of a timer while there are pending asynchronous waits causes those wait operations to be cancelled. To ensure that the action associated with the timer is performed only once, use something like this: used:

void on_some_event()
{
  if (my_timer.expires_after(seconds(5)) > 0)
  {
    // We managed to cancel the timer. Start new asynchronous wait.
    my_timer.async_wait(on_timeout);
  }
  else
  {
    // Too late, timer has already expired!
  }
}

void on_timeout(const asio::error_code& e)
{
  if (e != asio::error::operation_aborted)
  {
    // Timer was not cancelled, take necessary action.
  }
}
  • The asio::basic_waitable_timer::expires_after() function cancels any pending asynchronous waits, and returns the number of asynchronous waits that were cancelled. If it returns 0 then you were too late and the wait handler has already been executed, or will soon be executed. If it returns 1 then the wait handler was successfully cancelled.
  • If a wait handler is cancelled, the error_code passed to it contains the value asio::error::operation_aborted.

This typedef uses the C++11 <chrono> standard library facility, if available. Otherwise, it may use the Boost.Chrono library. To explicitly utilise Boost.Chrono, use the basic_waitable_timer template directly:

typedef basic_waitable_timer<boost::chrono::system_clock> timer;
Requirements

Header: asio/system_timer.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread.html000066400000000000000000000131751340672067200203410ustar00rootroot00000000000000 thread
asio C++ library

PrevUpHomeNext

A simple abstraction for starting threads.

class thread :
  noncopyable
Member Functions

Name

Description

join

Wait for the thread to exit.

thread

Start a new thread that executes the supplied function.

~thread

Destructor.

The thread class implements the smallest possible subset of the functionality of boost::thread. It is intended to be used only for starting a thread and waiting for it to exit. If more extensive threading capabilities are required, you are strongly advised to use something else.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Example

A typical use of thread would be to launch a thread to run an io_context's event processing loop:

asio::io_context io_context;
// ...
asio::thread t(boost::bind(&asio::io_context::run, &io_context));
// ...
t.join();
Requirements

Header: asio/thread.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread/000077500000000000000000000000001340672067200174445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/thread/_thread.html000066400000000000000000000044611340672067200217450ustar00rootroot00000000000000 thread::~thread
asio C++ library

PrevUpHomeNext

Destructor.

~thread();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread/join.html000066400000000000000000000051431340672067200212740ustar00rootroot00000000000000 thread::join
asio C++ library

PrevUpHomeNext

Wait for the thread to exit.

void join();

This function will block until the thread has exited.

If this function is not called before the thread object is destroyed, the thread itself will continue to run until completion. You will, however, no longer have the ability to wait for it to exit.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread/thread.html000066400000000000000000000060521340672067200216040ustar00rootroot00000000000000 thread::thread
asio C++ library

PrevUpHomeNext

Start a new thread that executes the supplied function.

template<
    typename Function>
thread(
    Function f);

This constructor creates a new thread that will execute the given function or function object.

Parameters

f

The function or function object to be run in the thread. The function signature must be:

void f();


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool.html000066400000000000000000000266771340672067200214050ustar00rootroot00000000000000 thread_pool
asio C++ library

PrevUpHomeNext

A simple fixed-size thread pool.

class thread_pool :
  public execution_context
Types

Name

Description

executor_type

Executor used to submit functions to a thread pool.

fork_event

Fork-related event notifications.

Member Functions

Name

Description

get_executor

Obtains the executor associated with the pool.

join

Joins the threads.

notify_fork

Notify the execution_context of a fork-related event.

stop

Stops the threads.

thread_pool

Constructs a pool with an automatically determined number of threads.

Constructs a pool with a specified number of threads.

~thread_pool

Destructor.

Protected Member Functions

Name

Description

destroy

Destroys all services in the context.

shutdown

Shuts down all services in the context.

Friends

Name

Description

add_service

(Deprecated: Use make_service().) Add a service object to the execution_context.

has_service

Determine if an execution_context contains a specified service type.

make_service

Creates a service object and adds it to the execution_context.

use_service

Obtain the service object corresponding to the given type.

The thread pool class is an execution context where functions are permitted to run on one of a fixed number of threads.

Submitting tasks to the pool

To submit functions to the thread_pool, use the dispatch , post or defer free functions.

For example:

void my_task()
{
  ...
}

...

// Launch the pool with four threads.
asio::thread_pool pool(4);

// Submit a function to the pool.
asio::post(pool, my_task);

// Submit a lambda object to the pool.
asio::post(pool,
    []()
    {
      ...
    });

// Wait for all tasks in the pool to complete.
pool.join();
Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/000077500000000000000000000000001340672067200204755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/thread_pool/_thread_pool.html000066400000000000000000000051551340672067200240300ustar00rootroot00000000000000 thread_pool::~thread_pool
asio C++ library

PrevUpHomeNext

Destructor.

~thread_pool();

Automatically stops and joins the pool, if not explicitly done beforehand.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/add_service.html000066400000000000000000000137741340672067200236470ustar00rootroot00000000000000 thread_pool::add_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

(Deprecated: Use make_service().) Add a service object to the execution_context.

template<
    typename Service>
friend void add_service(
    execution_context & e,
    Service * svc);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

svc

The service object. On success, ownership of the service object is transferred to the execution_context. When the execution_context object is destroyed, it will destroy the service object by performing:

delete static_cast<execution_context::service*>(svc)

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

asio::invalid_service_owner

Thrown if the service's owning execution_context is not the execution_context object specified by the e parameter.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/destroy.html000066400000000000000000000061361340672067200230620ustar00rootroot00000000000000 thread_pool::destroy
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Destroys all services in the context.

void destroy();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order * of the beginning of service object lifetime, performs delete static_cast<execution_context::service*>(svc).

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/fork_event.html000066400000000000000000000070741340672067200235350ustar00rootroot00000000000000 thread_pool::fork_event
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Fork-related event notifications.

enum fork_event

Values

fork_prepare

Notify the context that the process is about to fork.

fork_parent

Notify the context that the process has forked and is the parent.

fork_child

Notify the context that the process has forked and is the child.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/get_executor.html000066400000000000000000000047251340672067200240700ustar00rootroot00000000000000 thread_pool::get_executor
asio C++ library

PrevUpHomeNext

Obtains the executor associated with the pool.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/has_service.html000066400000000000000000000112661340672067200236640ustar00rootroot00000000000000 thread_pool::has_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Determine if an execution_context contains a specified service type.

template<
    typename Service>
friend bool has_service(
    execution_context & e);

This function is used to determine whether the execution_context contains a service object corresponding to the given service type.

Parameters

e

The execution_context object that owns the service.

Return Value

A boolean indicating whether the execution_context contains the service.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/join.html000066400000000000000000000053041340672067200223240ustar00rootroot00000000000000 thread_pool::join
asio C++ library

PrevUpHomeNext

Joins the threads.

void join();

This function blocks until the threads in the pool have completed. If stop() is not called prior to join(), the join() call will wait until the pool has no more outstanding work.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/make_service.html000066400000000000000000000117451340672067200240300ustar00rootroot00000000000000 thread_pool::make_service
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Creates a service object and adds it to the execution_context.

template<
    typename Service,
    typename... Args>
friend Service & make_service(
    execution_context & e,
    Args &&... args);

This function is used to add a service to the execution_context.

Parameters

e

The execution_context object that owns the service.

args

Zero or more arguments to be passed to the service constructor.

Exceptions

asio::service_already_exists

Thrown if a service of the given type is already present in the execution_context.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/notify_fork.html000066400000000000000000000150051340672067200237150ustar00rootroot00000000000000 thread_pool::notify_fork
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Notify the execution_context of a fork-related event.

void notify_fork(
    fork_event event);

This function is used to inform the execution_context that the process is about to fork, or has just forked. This allows the execution_context, and the services it contains, to perform any necessary housekeeping to ensure correct operation following a fork.

This function must not be called while any other execution_context function, or any function associated with the execution_context's derived class, is being called in another thread. It is, however, safe to call this function from within a completion handler, provided no other thread is accessing the execution_context or its derived class.

Parameters

event

A fork-related event.

Exceptions

asio::system_error

Thrown on failure. If the notification fails the execution_context object should no longer be used and should be destroyed.

Example

The following code illustrates how to incorporate the notify_fork() function:

my_execution_context.notify_fork(execution_context::fork_prepare);
if (fork() == 0)
{
  // This is the child process.
  my_execution_context.notify_fork(execution_context::fork_child);
}
else
{
  // This is the parent process.
  my_execution_context.notify_fork(execution_context::fork_parent);
}
Remarks

For each service object svc in the execution_context set, performs svc->notify_fork();. When processing the fork_prepare event, services are visited in reverse order of the beginning of service object lifetime. Otherwise, services are visited in order of the beginning of service object lifetime.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/shutdown.html000066400000000000000000000060451340672067200232430ustar00rootroot00000000000000 thread_pool::shutdown
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Shuts down all services in the context.

void shutdown();

This function is implemented as follows:

  • For each service object svc in the execution_context set, in reverse order of the beginning of service object lifetime, performs svc->shutdown().

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/stop.html000066400000000000000000000050651340672067200223560ustar00rootroot00000000000000 thread_pool::stop
asio C++ library

PrevUpHomeNext

Stops the threads.

void stop();

This function stops the threads as soon as possible. As a result of calling stop(), pending function objects may be never be invoked.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/thread_pool.html000066400000000000000000000062471340672067200236740ustar00rootroot00000000000000 thread_pool::thread_pool
asio C++ library

PrevUpHomeNext

Constructs a pool with an automatically determined number of threads.

thread_pool();
  » more...

Constructs a pool with a specified number of threads.

thread_pool(
    std::size_t num_threads);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/thread_pool/000077500000000000000000000000001340672067200227755ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/thread_pool/thread_pool/overload1.html000066400000000000000000000050411340672067200255570ustar00rootroot00000000000000 thread_pool::thread_pool (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructs a pool with an automatically determined number of threads.

thread_pool();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/thread_pool/overload2.html000066400000000000000000000050551340672067200255650ustar00rootroot00000000000000 thread_pool::thread_pool (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Constructs a pool with a specified number of threads.

thread_pool(
    std::size_t num_threads);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/use_service.html000066400000000000000000000066271340672067200237120ustar00rootroot00000000000000 thread_pool::use_service
asio C++ library

PrevUpHomeNext

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);
  » more...

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/use_service/000077500000000000000000000000001340672067200230115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/thread_pool/use_service/overload1.html000066400000000000000000000115371340672067200256020ustar00rootroot00000000000000 thread_pool::use_service (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    execution_context & e);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the execution_context will create a new instance of the service.

Parameters

e

The execution_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool/use_service/overload2.html000066400000000000000000000125521340672067200256010ustar00rootroot00000000000000 thread_pool::use_service (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from execution_context.

Obtain the service object corresponding to the given type.

template<
    typename Service>
friend Service & use_service(
    io_context & ioc);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the io_context will create a new instance of the service.

Parameters

ioc

The io_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Remarks

This overload is preserved for backwards compatibility with services that inherit from io_context::service.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type.html000066400000000000000000000174531340672067200245130ustar00rootroot00000000000000 thread_pool::executor_type
asio C++ library

PrevUpHomeNext

Executor used to submit functions to a thread pool.

class executor_type
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the thread pool to invoke the given function object.

dispatch

Request the thread pool to invoke the given function object.

on_work_finished

Inform the thread pool that some work is no longer outstanding.

on_work_started

Inform the thread pool that it has some outstanding work to do.

post

Request the thread pool to invoke the given function object.

running_in_this_thread

Determine whether the thread pool is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/000077500000000000000000000000001340672067200236135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/thread_pool__executor_type/context.html000066400000000000000000000051601340672067200261670ustar00rootroot00000000000000 thread_pool::executor_type::context
asio C++ library

PrevUpHomeNext

Obtain the underlying execution context.

thread_pool & context() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/defer.html000066400000000000000000000101061340672067200255640ustar00rootroot00000000000000 thread_pool::executor_type::defer
asio C++ library

PrevUpHomeNext

Request the thread pool to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void defer(
    Function && f,
    const Allocator & a) const;

This function is used to ask the thread pool to execute the given function object. The function object will never be executed inside defer(). Instead, it will be scheduled to run on the thread pool.

If the current thread belongs to the thread pool, defer() will delay scheduling the function object until the current thread returns control to the pool.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/dispatch.html000066400000000000000000000077131340672067200263100ustar00rootroot00000000000000 thread_pool::executor_type::dispatch
asio C++ library

PrevUpHomeNext

Request the thread pool to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void dispatch(
    Function && f,
    const Allocator & a) const;

This function is used to ask the thread pool to execute the given function object. If the current thread belongs to the pool, dispatch() executes the function before returning. Otherwise, the function will be scheduled to run on the thread pool.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/on_work_finished.html000066400000000000000000000056641340672067200300430ustar00rootroot00000000000000 thread_pool::executor_type::on_work_finished
asio C++ library

PrevUpHomeNext

Inform the thread pool that some work is no longer outstanding.

void on_work_finished() const;

This function is used to inform the thread pool that some work has finished. Once the count of unfinished work reaches zero, the thread pool's join() function is permitted to exit.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/on_work_started.html000066400000000000000000000057031340672067200277120ustar00rootroot00000000000000 thread_pool::executor_type::on_work_started
asio C++ library

PrevUpHomeNext

Inform the thread pool that it has some outstanding work to do.

void on_work_started() const;

This function is used to inform the thread pool that some work has begun. This ensures that the thread pool's join() function will not return while the work is underway.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/operator_eq__eq_.html000066400000000000000000000065331340672067200300130ustar00rootroot00000000000000 thread_pool::executor_type::operator==
asio C++ library

PrevUpHomeNext

Compare two executors for equality.

friend bool operator==(
    const executor_type & a,
    const executor_type & b);

Two executors are equal if they refer to the same underlying thread pool.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/operator_not__eq_.html000066400000000000000000000066151340672067200302070ustar00rootroot00000000000000 thread_pool::executor_type::operator!=
asio C++ library

PrevUpHomeNext

Compare two executors for inequality.

friend bool operator!=(
    const executor_type & a,
    const executor_type & b);

Two executors are equal if they refer to the same underlying thread pool.

Requirements

Header: asio/thread_pool.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/post.html000066400000000000000000000076431340672067200255000ustar00rootroot00000000000000 thread_pool::executor_type::post
asio C++ library

PrevUpHomeNext

Request the thread pool to invoke the given function object.

template<
    typename Function,
    typename Allocator>
void post(
    Function && f,
    const Allocator & a) const;

This function is used to ask the thread pool to execute the given function object. The function object will never be executed inside post(). Instead, it will be scheduled to run on the thread pool.

Parameters

f

The function object to be called. The executor will make a copy of the handler object as required. The function signature of the function object must be:

void function();

a

An allocator that may be used by the executor to allocate the internal storage needed for function invocation.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/thread_pool__executor_type/running_in_this_thread.html000066400000000000000000000064411340672067200312320ustar00rootroot00000000000000 thread_pool::executor_type::running_in_this_thread
asio C++ library

PrevUpHomeNext

Determine whether the thread pool is running in the current thread.

bool running_in_this_thread() const;
Return Value

true if the current thread belongs to the pool. Otherwise returns false.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_.html000066400000000000000000000161201340672067200244330ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >
asio C++ library

PrevUpHomeNext

Time traits specialised for posix_time.

template<>
struct time_traits< boost::posix_time::ptime >
Types

Name

Description

duration_type

The duration type.

time_type

The time type.

Member Functions

Name

Description

add

Add a duration to a time.

less_than

Test whether one time is less than another.

now

Get the current time.

subtract

Subtract one time from another.

to_posix_duration

Convert to POSIX duration type.

Requirements

Header: asio/time_traits.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/000077500000000000000000000000001340672067200235455ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/add.html000066400000000000000000000054131340672067200251660ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::add
asio C++ library

PrevUpHomeNext

Add a duration to a time.

static time_type add(
    const time_type & t,
    const duration_type & d);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/duration_type.html000066400000000000000000000064111340672067200273230ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::duration_type
asio C++ library

PrevUpHomeNext

The duration type.

typedef boost::posix_time::time_duration duration_type;
Requirements

Header: asio/time_traits.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/less_than.html000066400000000000000000000053671340672067200264260ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::less_than
asio C++ library

PrevUpHomeNext

Test whether one time is less than another.

static bool less_than(
    const time_type & t1,
    const time_type & t2);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/now.html000066400000000000000000000052051340672067200252400ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::now
asio C++ library

PrevUpHomeNext

Get the current time.

static time_type now();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/subtract.html000066400000000000000000000053351340672067200262700ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::subtract
asio C++ library

PrevUpHomeNext

Subtract one time from another.

static duration_type subtract(
    const time_type & t1,
    const time_type & t2);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/time_type.html000066400000000000000000000064051340672067200264370ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::time_type
asio C++ library

PrevUpHomeNext

The time type.

typedef boost::posix_time::ptime time_type;
Requirements

Header: asio/time_traits.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/time_traits_lt__ptime__gt_/to_posix_duration.html000066400000000000000000000054221340672067200302070ustar00rootroot00000000000000 time_traits< boost::posix_time::ptime >::to_posix_duration
asio C++ library

PrevUpHomeNext

Convert to POSIX duration type.

static boost::posix_time::time_duration to_posix_duration(
    const duration_type & d);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/transfer_all.html000066400000000000000000000073731340672067200215510ustar00rootroot00000000000000 transfer_all
asio C++ library

PrevUpHomeNext

Return a completion condition function object that indicates that a read or write operation should continue until all of the data has been transferred, or until an error occurs.

unspecified transfer_all();

This function is used to create an object, of unspecified type, that meets CompletionCondition requirements.

Example

Reading until a buffer is full:

boost::array<char, 128> buf;
asio::error_code ec;
std::size_t n = asio::read(
    sock, asio::buffer(buf),
    asio::transfer_all(), ec);
if (ec)
{
  // An error occurred.
}
else
{
  // n == 128
}
Requirements

Header: asio/completion_condition.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/transfer_at_least.html000066400000000000000000000074161340672067200225730ustar00rootroot00000000000000 transfer_at_least
asio C++ library

PrevUpHomeNext

Return a completion condition function object that indicates that a read or write operation should continue until a minimum number of bytes has been transferred, or until an error occurs.

unspecified transfer_at_least(
    std::size_t minimum);

This function is used to create an object, of unspecified type, that meets CompletionCondition requirements.

Example

Reading until a buffer is full or contains at least 64 bytes:

boost::array<char, 128> buf;
asio::error_code ec;
std::size_t n = asio::read(
    sock, asio::buffer(buf),
    asio::transfer_at_least(64), ec);
if (ec)
{
  // An error occurred.
}
else
{
  // n >= 64 && n <= 128
}
Requirements

Header: asio/completion_condition.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/transfer_exactly.html000066400000000000000000000073331340672067200224460ustar00rootroot00000000000000 transfer_exactly
asio C++ library

PrevUpHomeNext

Return a completion condition function object that indicates that a read or write operation should continue until an exact number of bytes has been transferred, or until an error occurs.

unspecified transfer_exactly(
    std::size_t size);

This function is used to create an object, of unspecified type, that meets CompletionCondition requirements.

Example

Reading until a buffer is full or contains exactly 64 bytes:

boost::array<char, 128> buf;
asio::error_code ec;
std::size_t n = asio::read(
    sock, asio::buffer(buf),
    asio::transfer_exactly(64), ec);
if (ec)
{
  // An error occurred.
}
else
{
  // n == 64
}
Requirements

Header: asio/completion_condition.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future.html000066400000000000000000000057451340672067200212640ustar00rootroot00000000000000 use_future
asio C++ library

PrevUpHomeNext

A special value, similar to std::nothrow.

constexpr use_future_t use_future;

See the documentation for use_future_t for a usage example.

Requirements

Header: asio/use_future.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t.html000066400000000000000000000167731340672067200216120ustar00rootroot00000000000000 use_future_t
asio C++ library

PrevUpHomeNext

Class used to specify that an asynchronous operation should return a future.

template<
    typename Allocator = std::allocator<void>>
class use_future_t
Types

Name

Description

allocator_type

The allocator type. The allocator is used when constructing the std::promise object for a given asynchronous operation.

Member Functions

Name

Description

get_allocator

Obtain allocator.

operator()

Wrap a function object in a packaged task.

operator[]

(Deprecated: Use rebind().) Specify an alternate allocator.

rebind

Specify an alternate allocator.

use_future_t

Construct using default-constructed allocator.

Construct using specified allocator.

The use_future_t class is used to indicate that an asynchronous operation should return a std::future object. A use_future_t object may be passed as a handler to an asynchronous operation, typically using the special value asio::use_future. For example:

std::future<std::size_t> my_future
  = my_socket.async_read_some(my_buffer, asio::use_future);

The initiating function (async_read_some in the above example) returns a future that will receive the result of the operation. If the operation completes with an error_code indicating failure, it is converted into a system_error and passed back to the caller via the future.

Requirements

Header: asio/use_future.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/000077500000000000000000000000001340672067200207065ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/use_future_t/allocator_type.html000066400000000000000000000062121340672067200246160ustar00rootroot00000000000000 use_future_t::allocator_type
asio C++ library

PrevUpHomeNext

The allocator type. The allocator is used when constructing the std::promise object for a given asynchronous operation.

typedef Allocator allocator_type;
Requirements

Header: asio/use_future.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/get_allocator.html000066400000000000000000000047571340672067200244300ustar00rootroot00000000000000 use_future_t::get_allocator
asio C++ library

PrevUpHomeNext

Obtain allocator.

allocator_type get_allocator() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/operator_lb__rb_.html000066400000000000000000000052061340672067200250700ustar00rootroot00000000000000 use_future_t::operator[]
asio C++ library

PrevUpHomeNext

(Deprecated: Use rebind().) Specify an alternate allocator.

template<
    typename OtherAllocator>
use_future_t< OtherAllocator > operator[](
    const OtherAllocator & allocator) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/operator_lp__rp_.html000066400000000000000000000066011340672067200251240ustar00rootroot00000000000000 use_future_t::operator()
asio C++ library

PrevUpHomeNext

Wrap a function object in a packaged task.

template<
    typename Function>
unspecified operator()(
    Function && f) const;

The package function is used to adapt a function object as a packaged task. When this adapter is passed as a completion token to an asynchronous operation, the result of the function object is retuned via a std::future.

Example
std::future<std::size_t> fut =
  my_socket.async_read_some(buffer,
    use_future([](asio::error_code ec, std::size_t n)
      {
        return ec ? 0 : n;
      }));
...
std::size_t n = fut.get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/rebind.html000066400000000000000000000050601340672067200230400ustar00rootroot00000000000000 use_future_t::rebind
asio C++ library

PrevUpHomeNext

Specify an alternate allocator.

template<
    typename OtherAllocator>
use_future_t< OtherAllocator > rebind(
    const OtherAllocator & allocator) const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/use_future_t.html000066400000000000000000000063051340672067200243110ustar00rootroot00000000000000 use_future_t::use_future_t
asio C++ library

PrevUpHomeNext

Construct using default-constructed allocator.

constexpr use_future_t();
  » more...

Construct using specified allocator.

explicit use_future_t(
    const Allocator & allocator);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/use_future_t/000077500000000000000000000000001340672067200234175ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/use_future_t/use_future_t/overload1.html000066400000000000000000000050511340672067200262020ustar00rootroot00000000000000 use_future_t::use_future_t (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct using default-constructed allocator.

constexpr use_future_t();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_future_t/use_future_t/overload2.html000066400000000000000000000050601340672067200262030ustar00rootroot00000000000000 use_future_t::use_future_t (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct using specified allocator.

use_future_t(
    const Allocator & allocator);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_service.html000066400000000000000000000072041340672067200214020ustar00rootroot00000000000000 use_service
asio C++ library

PrevUpHomeNext

template< typename

[link asio.reference.Service Service]

> Service &

[link asio.reference.use_service.overload1 use_service]

( execution_context & e);

[''''&raquo;''' [link asio.reference.use_service.overload1 more...]]

template<
    typename Service>
Service & use_service(
    io_context & ioc);
  » more...
Requirements

Header: asio/impl/execution_context.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_service/000077500000000000000000000000001340672067200205115ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/use_service/overload1.html000066400000000000000000000075601340672067200233030ustar00rootroot00000000000000 use_service (1 of 2 overloads)
asio C++ library

PrevUpHomeNext
template<
    typename Service>
Service & use_service(
    execution_context & e);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the execution_context will create a new instance of the service.

Parameters

e

The execution_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/use_service/overload2.html000066400000000000000000000105161340672067200232770ustar00rootroot00000000000000 use_service (2 of 2 overloads)
asio C++ library

PrevUpHomeNext
template<
    typename Service>
Service & use_service(
    io_context & ioc);

This function is used to locate a service object that corresponds to the given service type. If there is no existing implementation of the service, then the io_context will create a new instance of the service.

Parameters

ioc

The io_context object that owns the service.

Return Value

The service interface implementing the specified service type. Ownership of the service interface is not transferred to the caller.

Remarks

This overload is preserved for backwards compatibility with services that inherit from io_context::service.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/uses_executor.html000066400000000000000000000071441340672067200217660ustar00rootroot00000000000000 uses_executor
asio C++ library

PrevUpHomeNext

The uses_executor trait detects whether a type T has an associated executor that is convertible from type Executor.

template<
    typename T,
    typename Executor>
struct uses_executor

Meets the BinaryTypeTrait requirements. The Asio library provides a definition that is derived from false_type. A program may specialize this template to derive from true_type for a user-defined type T that can be constructed with an executor, where the first argument of a constructor has type executor_arg_t and the second argument is convertible from type Executor.

Requirements

Header: asio/uses_executor.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/wait_traits.html000066400000000000000000000076521340672067200214270ustar00rootroot00000000000000 wait_traits
asio C++ library

PrevUpHomeNext

Wait traits suitable for use with the basic_waitable_timer class template.

template<
    typename Clock>
struct wait_traits
Member Functions

Name

Description

to_wait_duration

Convert a clock duration into a duration used for waiting.

Requirements

Header: asio/wait_traits.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/wait_traits/000077500000000000000000000000001340672067200205275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/wait_traits/to_wait_duration.html000066400000000000000000000064171340672067200250000ustar00rootroot00000000000000 wait_traits::to_wait_duration
asio C++ library

PrevUpHomeNext

Convert a clock duration into a duration used for waiting.

static Clock::duration to_wait_duration(
    const typename Clock::duration & d);
  » more...

static Clock::duration to_wait_duration(
    const typename Clock::time_point & t);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/wait_traits/to_wait_duration/000077500000000000000000000000001340672067200241025ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/wait_traits/to_wait_duration/overload1.html000066400000000000000000000060611340672067200266670ustar00rootroot00000000000000 wait_traits::to_wait_duration (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Convert a clock duration into a duration used for waiting.

static Clock::duration to_wait_duration(
    const typename Clock::duration & d);
Return Value

d.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/wait_traits/to_wait_duration/overload2.html000066400000000000000000000061071340672067200266710ustar00rootroot00000000000000 wait_traits::to_wait_duration (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Convert a clock duration into a duration used for waiting.

static Clock::duration to_wait_duration(
    const typename Clock::time_point & t);
Return Value

d.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle.html000066400000000000000000000267161340672067200235710ustar00rootroot00000000000000 windows::object_handle
asio C++ library

PrevUpHomeNext

Provides object-oriented handle functionality.

class object_handle
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An object_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

async_wait

Start an asynchronous wait on the object handle.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

object_handle

Construct an object_handle without opening it.

Construct an object_handle on an existing native handle.

Move-construct an object_handle from another.

operator=

Move-assign an object_handle from another.

wait

Perform a blocking wait on the object handle.

The windows::object_handle class provides asynchronous and blocking object-oriented handle functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/object_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/000077500000000000000000000000001340672067200226675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/assign.html000066400000000000000000000063711340672067200250500ustar00rootroot00000000000000 windows::object_handle::assign
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);
  » more...

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/assign/000077500000000000000000000000001340672067200241535ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/assign/overload1.html000066400000000000000000000051011340672067200267320ustar00rootroot00000000000000 windows::object_handle::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/assign/overload2.html000066400000000000000000000051601340672067200267400ustar00rootroot00000000000000 windows::object_handle::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/async_wait.html000066400000000000000000000102531340672067200257170ustar00rootroot00000000000000 windows::object_handle::async_wait
asio C++ library

PrevUpHomeNext

Start an asynchronous wait on the object handle.

template<
    typename WaitHandler>
DEDUCED async_wait(
    WaitHandler && handler);

This function is be used to initiate an asynchronous wait against the object handle. It always returns immediately.

Parameters

handler

The handler to be called when the object handle is set to the signalled state. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error // Result of operation.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/cancel.html000066400000000000000000000062221340672067200250040ustar00rootroot00000000000000 windows::object_handle::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/cancel/000077500000000000000000000000001340672067200241145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/cancel/overload1.html000066400000000000000000000065131340672067200267030ustar00rootroot00000000000000 windows::object_handle::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/cancel/overload2.html000066400000000000000000000065571340672067200267140ustar00rootroot00000000000000 windows::object_handle::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/close.html000066400000000000000000000061621340672067200246670ustar00rootroot00000000000000 windows::object_handle::close
asio C++ library

PrevUpHomeNext

Close the handle.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/close/000077500000000000000000000000001340672067200237745ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/close/overload1.html000066400000000000000000000063751340672067200265710ustar00rootroot00000000000000 windows::object_handle::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the handle.

void close();

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/close/overload2.html000066400000000000000000000065051340672067200265650ustar00rootroot00000000000000 windows::object_handle::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the handle.

void close(
    asio::error_code & ec);

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/executor_type.html000066400000000000000000000203471340672067200264620ustar00rootroot00000000000000 windows::object_handle::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/windows/object_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/get_executor.html000066400000000000000000000051441340672067200262560ustar00rootroot00000000000000 windows::object_handle::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/get_io_context.html000066400000000000000000000072361340672067200265770ustar00rootroot00000000000000 windows::object_handle::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/get_io_service.html000066400000000000000000000072121340672067200265450ustar00rootroot00000000000000 windows::object_handle::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/is_open.html000066400000000000000000000050631340672067200252150ustar00rootroot00000000000000 windows::object_handle::is_open
asio C++ library

PrevUpHomeNext

Determine whether the handle is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/lowest_layer.html000066400000000000000000000065401340672067200262730ustar00rootroot00000000000000 windows::object_handle::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/lowest_layer/000077500000000000000000000000001340672067200254005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/lowest_layer/overload1.html000066400000000000000000000067231340672067200301720ustar00rootroot00000000000000 windows::object_handle::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since an windows::object_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/lowest_layer/overload2.html000066400000000000000000000070051340672067200301650ustar00rootroot00000000000000 windows::object_handle::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since an windows::object_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/lowest_layer_type.html000066400000000000000000000277331340672067200273430ustar00rootroot00000000000000 windows::object_handle::lowest_layer_type
asio C++ library

PrevUpHomeNext

An windows::object_handle is always the lowest layer.

typedef object_handle lowest_layer_type;
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An object_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

async_wait

Start an asynchronous wait on the object handle.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

object_handle

Construct an object_handle without opening it.

Construct an object_handle on an existing native handle.

Move-construct an object_handle from another.

operator=

Move-assign an object_handle from another.

wait

Perform a blocking wait on the object handle.

The windows::object_handle class provides asynchronous and blocking object-oriented handle functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/object_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/native_handle.html000066400000000000000000000055511340672067200263640ustar00rootroot00000000000000 windows::object_handle::native_handle
asio C++ library

PrevUpHomeNext

Get the native handle representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/native_handle_type.html000066400000000000000000000063441340672067200274260ustar00rootroot00000000000000 windows::object_handle::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a handle.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/windows/object_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/object_handle.html000066400000000000000000000105751340672067200263460ustar00rootroot00000000000000 windows::object_handle::object_handle
asio C++ library

PrevUpHomeNext

Construct an windows::object_handle without opening it.

explicit object_handle(
    asio::io_context & io_context);
  » more...

Construct an windows::object_handle on an existing native handle.

object_handle(
    asio::io_context & io_context,
    const native_handle_type & native_handle);
  » more...

Move-construct an windows::object_handle from another.

object_handle(
    object_handle && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/object_handle/000077500000000000000000000000001340672067200254505ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/object_handle/overload1.html000066400000000000000000000072321340672067200302360ustar00rootroot00000000000000 windows::object_handle::object_handle (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an windows::object_handle without opening it.

object_handle(
    asio::io_context & io_context);

This constructor creates an object handle without opening it.

Parameters

io_context

The io_context object that the object handle will use to dispatch handlers for any asynchronous operations performed on the handle.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/object_handle/overload2.html000066400000000000000000000106371340672067200302420ustar00rootroot00000000000000 windows::object_handle::object_handle (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an windows::object_handle on an existing native handle.

object_handle(
    asio::io_context & io_context,
    const native_handle_type & native_handle);

This constructor creates an object handle object to hold an existing native handle.

Parameters

io_context

The io_context object that the object handle will use to dispatch handlers for any asynchronous operations performed on the handle.

native_handle

The new underlying handle implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/object_handle/overload3.html000066400000000000000000000101721340672067200302350ustar00rootroot00000000000000 windows::object_handle::object_handle (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct an windows::object_handle from another.

object_handle(
    object_handle && other);

This constructor moves an object handle from one object to another.

Parameters

other

The other windows::object_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the object_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/operator_eq_.html000066400000000000000000000100401340672067200262270ustar00rootroot00000000000000 windows::object_handle::operator=
asio C++ library

PrevUpHomeNext

Move-assign an windows::object_handle from another.

object_handle & operator=(
    object_handle && other);

This assignment operator moves an object handle from one object to another.

Parameters

other

The other windows::object_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the object_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/wait.html000066400000000000000000000061361340672067200245270ustar00rootroot00000000000000 windows::object_handle::wait
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the object handle.

void wait();
  » more...

void wait(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/wait/000077500000000000000000000000001340672067200236335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__object_handle/wait/overload1.html000066400000000000000000000063531340672067200264240ustar00rootroot00000000000000 windows::object_handle::wait (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the object handle.

void wait();

This function is used to wait for the object handle to be set to the signalled state. This function blocks and does not return until the object handle has been set to the signalled state.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__object_handle/wait/overload2.html000066400000000000000000000065341340672067200264260ustar00rootroot00000000000000 windows::object_handle::wait (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Perform a blocking wait on the object handle.

void wait(
    asio::error_code & ec);

This function is used to wait for the object handle to be set to the signalled state. This function blocks and does not return until the object handle has been set to the signalled state.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle.html000066400000000000000000000302231340672067200244500ustar00rootroot00000000000000 windows::overlapped_handle
asio C++ library

PrevUpHomeNext

Provides Windows handle functionality for objects that support overlapped I/O.

class overlapped_handle
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An overlapped_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

operator=

Move-assign an overlapped_handle from another.

overlapped_handle

Construct an overlapped_handle without opening it.

Construct an overlapped_handle on an existing native handle.

Move-construct an overlapped_handle from another.

Protected Member Functions

Name

Description

~overlapped_handle

Protected destructor to prevent deletion through this type.

The windows::overlapped_handle class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/overlapped_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/000077500000000000000000000000001340672067200235625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_handle/_overlapped_handle.html000066400000000000000000000057451340672067200302760ustar00rootroot00000000000000 windows::overlapped_handle::~overlapped_handle
asio C++ library

PrevUpHomeNext

Protected destructor to prevent deletion through this type.

~overlapped_handle();

This function destroys the handle, cancelling any outstanding asynchronous wait operations associated with the handle as if by calling cancel.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/assign.html000066400000000000000000000065011340672067200257360ustar00rootroot00000000000000 windows::overlapped_handle::assign
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);
  » more...

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/assign/000077500000000000000000000000001340672067200250465ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_handle/assign/overload1.html000066400000000000000000000051351340672067200276340ustar00rootroot00000000000000 windows::overlapped_handle::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/assign/overload2.html000066400000000000000000000051741340672067200276400ustar00rootroot00000000000000 windows::overlapped_handle::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/cancel.html000066400000000000000000000063571340672067200257100ustar00rootroot00000000000000 windows::overlapped_handle::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/cancel/000077500000000000000000000000001340672067200250075ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_handle/cancel/overload1.html000066400000000000000000000065631340672067200276030ustar00rootroot00000000000000 windows::overlapped_handle::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/cancel/overload2.html000066400000000000000000000066271340672067200276050ustar00rootroot00000000000000 windows::overlapped_handle::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/close.html000066400000000000000000000062561340672067200255660ustar00rootroot00000000000000 windows::overlapped_handle::close
asio C++ library

PrevUpHomeNext

Close the handle.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/close/000077500000000000000000000000001340672067200246675ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_handle/close/overload1.html000066400000000000000000000064451340672067200274620ustar00rootroot00000000000000 windows::overlapped_handle::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the handle.

void close();

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/close/overload2.html000066400000000000000000000065551340672067200274650ustar00rootroot00000000000000 windows::overlapped_handle::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Close the handle.

void close(
    asio::error_code & ec);

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/executor_type.html000066400000000000000000000204731340672067200273550ustar00rootroot00000000000000 windows::overlapped_handle::executor_type
asio C++ library

PrevUpHomeNext

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/windows/overlapped_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/get_executor.html000066400000000000000000000052201340672067200271440ustar00rootroot00000000000000 windows::overlapped_handle::get_executor
asio C++ library

PrevUpHomeNext

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/get_io_context.html000066400000000000000000000073261340672067200274720ustar00rootroot00000000000000 windows::overlapped_handle::get_io_context
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/get_io_service.html000066400000000000000000000073021340672067200274400ustar00rootroot00000000000000 windows::overlapped_handle::get_io_service
asio C++ library

PrevUpHomeNext

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/is_open.html000066400000000000000000000051371340672067200261120ustar00rootroot00000000000000 windows::overlapped_handle::is_open
asio C++ library

PrevUpHomeNext

Determine whether the handle is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/lowest_layer.html000066400000000000000000000066341340672067200271720ustar00rootroot00000000000000 windows::overlapped_handle::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/lowest_layer/000077500000000000000000000000001340672067200262735ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_handle/lowest_layer/overload1.html000066400000000000000000000070071340672067200310610ustar00rootroot00000000000000 windows::overlapped_handle::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since an windows::overlapped_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/lowest_layer/overload2.html000066400000000000000000000070711340672067200310630ustar00rootroot00000000000000 windows::overlapped_handle::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since an windows::overlapped_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/lowest_layer_type.html000066400000000000000000000312101340672067200302170ustar00rootroot00000000000000 windows::overlapped_handle::lowest_layer_type
asio C++ library

PrevUpHomeNext

An windows::overlapped_handle is always the lowest layer.

typedef overlapped_handle lowest_layer_type;
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An overlapped_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

operator=

Move-assign an overlapped_handle from another.

overlapped_handle

Construct an overlapped_handle without opening it.

Construct an overlapped_handle on an existing native handle.

Move-construct an overlapped_handle from another.

Protected Member Functions

Name

Description

~overlapped_handle

Protected destructor to prevent deletion through this type.

The windows::overlapped_handle class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/overlapped_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/native_handle.html000066400000000000000000000056251340672067200272610ustar00rootroot00000000000000 windows::overlapped_handle::native_handle
asio C++ library

PrevUpHomeNext

Get the native handle representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/native_handle_type.html000066400000000000000000000064311340672067200303160ustar00rootroot00000000000000 windows::overlapped_handle::native_handle_type
asio C++ library

PrevUpHomeNext

The native representation of a handle.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/windows/overlapped_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/operator_eq_.html000066400000000000000000000102271340672067200271310ustar00rootroot00000000000000 windows::overlapped_handle::operator=
asio C++ library

PrevUpHomeNext

Move-assign an windows::overlapped_handle from another.

overlapped_handle & operator=(
    overlapped_handle && other);

This assignment operator moves a handle from one object to another.

Parameters

other

The other windows::overlapped_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the overlapped_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/overlapped_handle.html000066400000000000000000000110531340672067200301240ustar00rootroot00000000000000 windows::overlapped_handle::overlapped_handle
asio C++ library

PrevUpHomeNext

Construct an windows::overlapped_handle without opening it.

explicit overlapped_handle(
    asio::io_context & io_context);
  » more...

Construct an windows::overlapped_handle on an existing native handle.

overlapped_handle(
    asio::io_context & io_context,
    const native_handle_type & handle);
  » more...

Move-construct an windows::overlapped_handle from another.

overlapped_handle(
    overlapped_handle && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/overlapped_handle/000077500000000000000000000000001340672067200272365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_handle/overlapped_handle/overload1.html000066400000000000000000000074031340672067200320240ustar00rootroot00000000000000 windows::overlapped_handle::overlapped_handle (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an windows::overlapped_handle without opening it.

overlapped_handle(
    asio::io_context & io_context);

This constructor creates a handle without opening it.

Parameters

io_context

The io_context object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/overlapped_handle/overload2.html000066400000000000000000000107411340672067200320240ustar00rootroot00000000000000 windows::overlapped_handle::overlapped_handle (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct an windows::overlapped_handle on an existing native handle.

overlapped_handle(
    asio::io_context & io_context,
    const native_handle_type & handle);

This constructor creates a handle object to hold an existing native handle.

Parameters

io_context

The io_context object that the handle will use to dispatch handlers for any asynchronous operations performed on the handle.

handle

A native handle.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_handle/overlapped_handle/overload3.html000066400000000000000000000104411340672067200320220ustar00rootroot00000000000000 windows::overlapped_handle::overlapped_handle (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct an windows::overlapped_handle from another.

overlapped_handle(
    overlapped_handle && other);

This constructor moves a handle from one object to another.

Parameters

other

The other windows::overlapped_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the overlapped_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr.html000066400000000000000000000157011340672067200240260ustar00rootroot00000000000000 windows::overlapped_ptr
asio C++ library

PrevUpHomeNext

Wraps a handler to create an OVERLAPPED object for use with overlapped I/O.

class overlapped_ptr :
  noncopyable
Member Functions

Name

Description

complete

Post completion notification for overlapped operation. Releases ownership.

get

Get the contained OVERLAPPED object.

overlapped_ptr

Construct an empty overlapped_ptr.

Construct an overlapped_ptr to contain the specified handler.

release

Release ownership of the OVERLAPPED object.

reset

Reset to empty.

Reset to contain the specified handler, freeing any current OVERLAPPED object.

~overlapped_ptr

Destructor automatically frees the OVERLAPPED object unless released.

A special-purpose smart pointer used to wrap an application handler so that it can be passed as the LPOVERLAPPED argument to overlapped I/O functions.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/overlapped_ptr.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/000077500000000000000000000000001340672067200231345ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/_overlapped_ptr.html000066400000000000000000000053141340672067200272120ustar00rootroot00000000000000 windows::overlapped_ptr::~overlapped_ptr
asio C++ library

PrevUpHomeNext

Destructor automatically frees the OVERLAPPED object unless released.

~overlapped_ptr();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/complete.html000066400000000000000000000052331340672067200256350ustar00rootroot00000000000000 windows::overlapped_ptr::complete
asio C++ library

PrevUpHomeNext

Post completion notification for overlapped operation. Releases ownership.

void complete(
    const asio::error_code & ec,
    std::size_t bytes_transferred);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/get.html000066400000000000000000000061011340672067200245770ustar00rootroot00000000000000 windows::overlapped_ptr::get
asio C++ library

PrevUpHomeNext

Get the contained OVERLAPPED object.

OVERLAPPED * get();
  » more...

const OVERLAPPED * get() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/get/000077500000000000000000000000001340672067200237135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/get/overload1.html000066400000000000000000000047611340672067200265050ustar00rootroot00000000000000 windows::overlapped_ptr::get (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the contained OVERLAPPED object.

OVERLAPPED * get();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/get/overload2.html000066400000000000000000000050511340672067200264770ustar00rootroot00000000000000 windows::overlapped_ptr::get (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Get the contained OVERLAPPED object.

const OVERLAPPED * get() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/overlapped_ptr.html000066400000000000000000000075301340672067200270550ustar00rootroot00000000000000 windows::overlapped_ptr::overlapped_ptr
asio C++ library

PrevUpHomeNext

Construct an empty windows::overlapped_ptr.

overlapped_ptr();
  » more...

Construct an windows::overlapped_ptr to contain the specified handler.

template<
    typename Handler>
explicit overlapped_ptr(
    asio::io_context & io_context,
    Handler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/overlapped_ptr/000077500000000000000000000000001340672067200261625ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/overlapped_ptr/overload1.html000066400000000000000000000054071340672067200307520ustar00rootroot00000000000000 windows::overlapped_ptr::overlapped_ptr (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/overlapped_ptr/overload2.html000066400000000000000000000056751340672067200307620ustar00rootroot00000000000000 windows::overlapped_ptr::overlapped_ptr (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Construct an windows::overlapped_ptr to contain the specified handler.

template<
    typename Handler>
overlapped_ptr(
    asio::io_context & io_context,
    Handler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/release.html000066400000000000000000000051331340672067200254440ustar00rootroot00000000000000 windows::overlapped_ptr::release
asio C++ library

PrevUpHomeNext

Release ownership of the OVERLAPPED object.

OVERLAPPED * release();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/reset.html000066400000000000000000000065621340672067200251550ustar00rootroot00000000000000 windows::overlapped_ptr::reset
asio C++ library

PrevUpHomeNext

Reset to empty.

void reset();
  » more...

Reset to contain the specified handler, freeing any current OVERLAPPED object.

template<
    typename Handler>
void reset(
    asio::io_context & io_context,
    Handler && handler);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/reset/000077500000000000000000000000001340672067200242565ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/reset/overload1.html000066400000000000000000000047601340672067200270470ustar00rootroot00000000000000 windows::overlapped_ptr::reset (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__overlapped_ptr/reset/overload2.html000066400000000000000000000054161340672067200270470ustar00rootroot00000000000000 windows::overlapped_ptr::reset (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Reset to contain the specified handler, freeing any current OVERLAPPED object.

template<
    typename Handler>
void reset(
    asio::io_context & io_context,
    Handler && handler);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle.html000066400000000000000000000315531340672067200251170ustar00rootroot00000000000000 windows::random_access_handle
asio C++ library

PrevUpHomeNext

Provides random-access handle functionality.

class random_access_handle :
  public windows::overlapped_handle
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An overlapped_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

async_read_some_at

Start an asynchronous read at the specified offset.

async_write_some_at

Start an asynchronous write at the specified offset.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

operator=

Move-assign a random_access_handle from another.

random_access_handle

Construct a random_access_handle without opening it.

Construct a random_access_handle on an existing native handle.

Move-construct a random_access_handle from another.

read_some_at

Read some data from the handle at the specified offset.

write_some_at

Write some data to the handle at the specified offset.

The windows::random_access_handle class provides asynchronous and blocking random-access handle functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/random_access_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/000077500000000000000000000000001340672067200242225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/assign.html000066400000000000000000000065671340672067200264120ustar00rootroot00000000000000 windows::random_access_handle::assign
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);
  » more...

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/assign/000077500000000000000000000000001340672067200255065ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/assign/overload1.html000066400000000000000000000053431340672067200302750ustar00rootroot00000000000000 windows::random_access_handle::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/assign/overload2.html000066400000000000000000000054621340672067200303000ustar00rootroot00000000000000 windows::random_access_handle::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/async_read_some_at.html000066400000000000000000000154531340672067200307370ustar00rootroot00000000000000 windows::random_access_handle::async_read_some_at
asio C++ library

PrevUpHomeNext

Start an asynchronous read at the specified offset.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some_at(
    uint64_t offset,
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read data from the random-access handle. The function call always returns immediately.

Parameters

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes read.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The read operation may not read all of the requested number of bytes. Consider using the async_read_at function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.

Example

To read into a single data buffer use the buffer function as follows:

handle.async_read_some_at(42, asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/async_write_some_at.html000066400000000000000000000153651340672067200311600ustar00rootroot00000000000000 windows::random_access_handle::async_write_some_at
asio C++ library

PrevUpHomeNext

Start an asynchronous write at the specified offset.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some_at(
    uint64_t offset,
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write data to the random-access handle. The function call always returns immediately.

Parameters

offset

The offset at which the data will be written.

buffers

One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes written.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The write operation may not transmit all of the data to the peer. Consider using the async_write_at function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To write a single data buffer use the buffer function as follows:

handle.async_write_some_at(42, asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/cancel.html000066400000000000000000000064371340672067200263470ustar00rootroot00000000000000 windows::random_access_handle::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/cancel/000077500000000000000000000000001340672067200254475ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/cancel/overload1.html000066400000000000000000000070021340672067200302300ustar00rootroot00000000000000 windows::random_access_handle::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Cancel all asynchronous operations associated with the handle.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/cancel/overload2.html000066400000000000000000000070461340672067200302410ustar00rootroot00000000000000 windows::random_access_handle::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Cancel all asynchronous operations associated with the handle.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/close.html000066400000000000000000000063331340672067200262220ustar00rootroot00000000000000 windows::random_access_handle::close
asio C++ library

PrevUpHomeNext

Close the handle.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/close/000077500000000000000000000000001340672067200253275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/close/overload1.html000066400000000000000000000066641340672067200301250ustar00rootroot00000000000000 windows::random_access_handle::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Close the handle.

void close();

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/close/overload2.html000066400000000000000000000067741340672067200301300ustar00rootroot00000000000000 windows::random_access_handle::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Close the handle.

void close(
    asio::error_code & ec);

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/executor_type.html000066400000000000000000000207471340672067200300210ustar00rootroot00000000000000 windows::random_access_handle::executor_type
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/windows/random_access_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/get_executor.html000066400000000000000000000054361340672067200276150ustar00rootroot00000000000000 windows::random_access_handle::get_executor
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/get_io_context.html000066400000000000000000000075551340672067200301360ustar00rootroot00000000000000 windows::random_access_handle::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/get_io_service.html000066400000000000000000000075311340672067200301040ustar00rootroot00000000000000 windows::random_access_handle::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/is_open.html000066400000000000000000000053551340672067200265540ustar00rootroot00000000000000 windows::random_access_handle::is_open
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Determine whether the handle is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/lowest_layer.html000066400000000000000000000067111340672067200276260ustar00rootroot00000000000000 windows::random_access_handle::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/lowest_layer/000077500000000000000000000000001340672067200267335ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/lowest_layer/overload1.html000066400000000000000000000072261340672067200315240ustar00rootroot00000000000000 windows::random_access_handle::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since an windows::overlapped_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/lowest_layer/overload2.html000066400000000000000000000073101340672067200315170ustar00rootroot00000000000000 windows::random_access_handle::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since an windows::overlapped_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/lowest_layer_type.html000066400000000000000000000324101340672067200306620ustar00rootroot00000000000000 windows::random_access_handle::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

An windows::overlapped_handle is always the lowest layer.

typedef overlapped_handle lowest_layer_type;
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An overlapped_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

operator=

Move-assign an overlapped_handle from another.

overlapped_handle

Construct an overlapped_handle without opening it.

Construct an overlapped_handle on an existing native handle.

Move-construct an overlapped_handle from another.

Protected Member Functions

Name

Description

~overlapped_handle

Protected destructor to prevent deletion through this type.

The windows::overlapped_handle class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/random_access_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/native_handle.html000066400000000000000000000060431340672067200277140ustar00rootroot00000000000000 windows::random_access_handle::native_handle
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get the native handle representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/native_handle_type.html000066400000000000000000000066631340672067200307650ustar00rootroot00000000000000 windows::random_access_handle::native_handle_type
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

The native representation of a handle.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/windows/random_access_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/operator_eq_.html000066400000000000000000000104101340672067200275630ustar00rootroot00000000000000 windows::random_access_handle::operator=
asio C++ library

PrevUpHomeNext

Move-assign a windows::random_access_handle from another.

random_access_handle & operator=(
    random_access_handle && other);

This assignment operator moves a random-access handle from one object to another.

Parameters

other

The other windows::random_access_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the random_access_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/random_access_handle.html000066400000000000000000000113041340672067200312230ustar00rootroot00000000000000 windows::random_access_handle::random_access_handle
asio C++ library

PrevUpHomeNext

Construct a windows::random_access_handle without opening it.

explicit random_access_handle(
    asio::io_context & io_context);
  » more...

Construct a windows::random_access_handle on an existing native handle.

random_access_handle(
    asio::io_context & io_context,
    const native_handle_type & handle);
  » more...

Move-construct a windows::random_access_handle from another.

random_access_handle(
    random_access_handle && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/random_access_handle/000077500000000000000000000000001340672067200303365ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/random_access_handle/overload1.html000066400000000000000000000077351340672067200331340ustar00rootroot00000000000000 windows::random_access_handle::random_access_handle (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a windows::random_access_handle without opening it.

random_access_handle(
    asio::io_context & io_context);

This constructor creates a random-access handle without opening it. The handle needs to be opened before data can be written to or read from it.

Parameters

io_context

The io_context object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/random_access_handle/overload2.html000066400000000000000000000112041340672067200331170ustar00rootroot00000000000000 windows::random_access_handle::random_access_handle (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a windows::random_access_handle on an existing native handle.

random_access_handle(
    asio::io_context & io_context,
    const native_handle_type & handle);

This constructor creates a random-access handle object to hold an existing native handle.

Parameters

io_context

The io_context object that the random-access handle will use to dispatch handlers for any asynchronous operations performed on the handle.

handle

The new underlying handle implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/random_access_handle/overload3.html000066400000000000000000000106211340672067200331220ustar00rootroot00000000000000 windows::random_access_handle::random_access_handle (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a windows::random_access_handle from another.

random_access_handle(
    random_access_handle && other);

This constructor moves a random-access handle from one object to another.

Parameters

other

The other windows::random_access_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the random_access_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/read_some_at.html000066400000000000000000000076161340672067200275440ustar00rootroot00000000000000 windows::random_access_handle::read_some_at
asio C++ library

PrevUpHomeNext

Read some data from the handle at the specified offset.

template<
    typename MutableBufferSequence>
std::size_t read_some_at(
    uint64_t offset,
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t read_some_at(
    uint64_t offset,
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/read_some_at/000077500000000000000000000000001340672067200266445ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/read_some_at/overload1.html000066400000000000000000000150661340672067200314360ustar00rootroot00000000000000 windows::random_access_handle::read_some_at (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the handle at the specified offset.

template<
    typename MutableBufferSequence>
std::size_t read_some_at(
    uint64_t offset,
    const MutableBufferSequence & buffers);

This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read.

Return Value

The number of bytes read.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read_at function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To read into a single data buffer use the buffer function as follows:

handle.read_some_at(42, asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/read_some_at/overload2.html000066400000000000000000000122271340672067200314330ustar00rootroot00000000000000 windows::random_access_handle::read_some_at (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the handle at the specified offset.

template<
    typename MutableBufferSequence>
std::size_t read_some_at(
    uint64_t offset,
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read data from the random-access handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

offset

The offset at which the data will be read.

buffers

One or more buffers into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. Returns 0 if an error occurred.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read_at function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/write_some_at.html000066400000000000000000000075671340672067200277700ustar00rootroot00000000000000 windows::random_access_handle::write_some_at
asio C++ library

PrevUpHomeNext

Write some data to the handle at the specified offset.

template<
    typename ConstBufferSequence>
std::size_t write_some_at(
    uint64_t offset,
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t write_some_at(
    uint64_t offset,
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/write_some_at/000077500000000000000000000000001340672067200270635ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__random_access_handle/write_some_at/overload1.html000066400000000000000000000150631340672067200316520ustar00rootroot00000000000000 windows::random_access_handle::write_some_at (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the handle at the specified offset.

template<
    typename ConstBufferSequence>
std::size_t write_some_at(
    uint64_t offset,
    const ConstBufferSequence & buffers);

This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

offset

The offset at which the data will be written.

buffers

One or more data buffers to be written to the handle.

Return Value

The number of bytes written.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The write_some_at operation may not write all of the data. Consider using the write_at function if you need to ensure that all data is written before the blocking operation completes.

Example

To write a single data buffer use the buffer function as follows:

handle.write_some_at(42, asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__random_access_handle/write_some_at/overload2.html000066400000000000000000000122541340672067200316520ustar00rootroot00000000000000 windows::random_access_handle::write_some_at (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the handle at the specified offset.

template<
    typename ConstBufferSequence>
std::size_t write_some_at(
    uint64_t offset,
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write data to the random-access handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

offset

The offset at which the data will be written.

buffers

One or more data buffers to be written to the handle.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. Returns 0 if an error occurred.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write_at function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle.html000066400000000000000000000304451340672067200236100ustar00rootroot00000000000000 windows::stream_handle
asio C++ library

PrevUpHomeNext

Provides stream-oriented handle functionality.

class stream_handle :
  public windows::overlapped_handle
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An overlapped_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

async_read_some

Start an asynchronous read.

async_write_some

Start an asynchronous write.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

operator=

Move-assign a stream_handle from another.

read_some

Read some data from the handle.

stream_handle

Construct a stream_handle without opening it.

Construct a stream_handle on an existing native handle.

Move-construct a stream_handle from another.

write_some

Write some data to the handle.

The windows::stream_handle class provides asynchronous and blocking stream-oriented handle functionality.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/stream_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/000077500000000000000000000000001340672067200227145ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/assign.html000066400000000000000000000063711340672067200250750ustar00rootroot00000000000000 windows::stream_handle::assign
asio C++ library

PrevUpHomeNext

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);
  » more...

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/assign/000077500000000000000000000000001340672067200242005ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/assign/overload1.html000066400000000000000000000052621340672067200267670ustar00rootroot00000000000000 windows::stream_handle::assign (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/assign/overload2.html000066400000000000000000000053651340672067200267740ustar00rootroot00000000000000 windows::stream_handle::assign (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Assign an existing native handle to the handle.

void assign(
    const native_handle_type & handle,
    asio::error_code & ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/async_read_some.html000066400000000000000000000146211340672067200267410ustar00rootroot00000000000000 windows::stream_handle::async_read_some
asio C++ library

PrevUpHomeNext

Start an asynchronous read.

template<
    typename MutableBufferSequence,
    typename ReadHandler>
DEDUCED async_read_some(
    const MutableBufferSequence & buffers,
    ReadHandler && handler);

This function is used to asynchronously read data from the stream handle. The function call always returns immediately.

Parameters

buffers

One or more buffers into which the data will be read. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the read operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes read.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The read operation may not read all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is read before the asynchronous operation completes.

Example

To read into a single data buffer use the buffer function as follows:

handle.async_read_some(asio::buffer(data, size), handler);

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/async_write_some.html000066400000000000000000000145301340672067200271570ustar00rootroot00000000000000 windows::stream_handle::async_write_some
asio C++ library

PrevUpHomeNext

Start an asynchronous write.

template<
    typename ConstBufferSequence,
    typename WriteHandler>
DEDUCED async_write_some(
    const ConstBufferSequence & buffers,
    WriteHandler && handler);

This function is used to asynchronously write data to the stream handle. The function call always returns immediately.

Parameters

buffers

One or more data buffers to be written to the handle. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the handler is called.

handler

The handler to be called when the write operation completes. Copies will be made of the handler as required. The function signature of the handler must be:

void handler(
  const asio::error_code& error, // Result of operation.
  std::size_t bytes_transferred           // Number of bytes written.
);

Regardless of whether the asynchronous operation completes immediately or not, the handler will not be invoked from within this function. Invocation of the handler will be performed in a manner equivalent to using asio::io_context::post().

Remarks

The write operation may not transmit all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.

Example

To write a single data buffer use the buffer function as follows:

handle.async_write_some(asio::buffer(data, size), handler);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/cancel.html000066400000000000000000000062521340672067200250340ustar00rootroot00000000000000 windows::stream_handle::cancel
asio C++ library

PrevUpHomeNext

Cancel all asynchronous operations associated with the handle.

void cancel();
  » more...

void cancel(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/cancel/000077500000000000000000000000001340672067200241415ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/cancel/overload1.html000066400000000000000000000066741340672067200267400ustar00rootroot00000000000000 windows::stream_handle::cancel (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Cancel all asynchronous operations associated with the handle.

void cancel();

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/cancel/overload2.html000066400000000000000000000067401340672067200267330ustar00rootroot00000000000000 windows::stream_handle::cancel (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Cancel all asynchronous operations associated with the handle.

void cancel(
    asio::error_code & ec);

This function causes all outstanding asynchronous read or write operations to finish immediately, and the handlers for cancelled operations will be passed the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/close.html000066400000000000000000000061621340672067200247140ustar00rootroot00000000000000 windows::stream_handle::close
asio C++ library

PrevUpHomeNext

Close the handle.

void close();
  » more...

void close(
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/close/000077500000000000000000000000001340672067200240215ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/close/overload1.html000066400000000000000000000065561340672067200266170ustar00rootroot00000000000000 windows::stream_handle::close (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Close the handle.

void close();

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/close/overload2.html000066400000000000000000000066661340672067200266220ustar00rootroot00000000000000 windows::stream_handle::close (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Close the handle.

void close(
    asio::error_code & ec);

This function is used to close the handle. Any asynchronous read or write operations will be cancelled immediately, and will complete with the asio::error::operation_aborted error.

Parameters

ec

Set to indicate what error occurred, if any.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/executor_type.html000066400000000000000000000205241340672067200265040ustar00rootroot00000000000000 windows::stream_handle::executor_type
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

The type of the executor associated with the object.

typedef io_context::executor_type executor_type;
Member Functions

Name

Description

context

Obtain the underlying execution context.

defer

Request the io_context to invoke the given function object.

dispatch

Request the io_context to invoke the given function object.

on_work_finished

Inform the io_context that some work is no longer outstanding.

on_work_started

Inform the io_context that it has some outstanding work to do.

post

Request the io_context to invoke the given function object.

running_in_this_thread

Determine whether the io_context is running in the current thread.

Friends

Name

Description

operator!=

Compare two executors for inequality.

operator==

Compare two executors for equality.

Requirements

Header: asio/windows/stream_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/get_executor.html000066400000000000000000000053211340672067200263000ustar00rootroot00000000000000 windows::stream_handle::get_executor
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get the executor associated with the object.

executor_type get_executor();

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/get_io_context.html000066400000000000000000000074131340672067200266210ustar00rootroot00000000000000 windows::stream_handle::get_io_context
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_context();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/get_io_service.html000066400000000000000000000073671340672067200266050ustar00rootroot00000000000000 windows::stream_handle::get_io_service
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

(Deprecated: Use get_executor().) Get the io_context associated with the object.

asio::io_context & get_io_service();

This function may be used to obtain the io_context object that the I/O object uses to dispatch handlers for asynchronous operations.

Return Value

A reference to the io_context object that the I/O object will use to dispatch handlers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/is_open.html000066400000000000000000000052401340672067200252370ustar00rootroot00000000000000 windows::stream_handle::is_open
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Determine whether the handle is open.

bool is_open() const;

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/lowest_layer.html000066400000000000000000000065401340672067200263200ustar00rootroot00000000000000 windows::stream_handle::lowest_layer
asio C++ library

PrevUpHomeNext

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();
  » more...

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/lowest_layer/000077500000000000000000000000001340672067200254255ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/lowest_layer/overload1.html000066400000000000000000000071201340672067200302070ustar00rootroot00000000000000 windows::stream_handle::lowest_layer (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get a reference to the lowest layer.

lowest_layer_type & lowest_layer();

This function returns a reference to the lowest layer in a stack of layers. Since an windows::overlapped_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/lowest_layer/overload2.html000066400000000000000000000072021340672067200302110ustar00rootroot00000000000000 windows::stream_handle::lowest_layer (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get a const reference to the lowest layer.

const lowest_layer_type & lowest_layer() const;

This function returns a const reference to the lowest layer in a stack of layers. Since an windows::overlapped_handle cannot contain any further layers, it simply returns a reference to itself.

Return Value

A const reference to the lowest layer in the stack of layers. Ownership is not transferred to the caller.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/lowest_layer_type.html000066400000000000000000000321131340672067200273540ustar00rootroot00000000000000 windows::stream_handle::lowest_layer_type
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

An windows::overlapped_handle is always the lowest layer.

typedef overlapped_handle lowest_layer_type;
Types

Name

Description

executor_type

The type of the executor associated with the object.

lowest_layer_type

An overlapped_handle is always the lowest layer.

native_handle_type

The native representation of a handle.

Member Functions

Name

Description

assign

Assign an existing native handle to the handle.

cancel

Cancel all asynchronous operations associated with the handle.

close

Close the handle.

get_executor

Get the executor associated with the object.

get_io_context

(Deprecated: Use get_executor().) Get the io_context associated with the object.

get_io_service

(Deprecated: Use get_executor().) Get the io_context associated with the object.

is_open

Determine whether the handle is open.

lowest_layer

Get a reference to the lowest layer.

Get a const reference to the lowest layer.

native_handle

Get the native handle representation.

operator=

Move-assign an overlapped_handle from another.

overlapped_handle

Construct an overlapped_handle without opening it.

Construct an overlapped_handle on an existing native handle.

Move-construct an overlapped_handle from another.

Protected Member Functions

Name

Description

~overlapped_handle

Protected destructor to prevent deletion through this type.

The windows::overlapped_handle class provides the ability to wrap a Windows handle. The underlying object referred to by the handle must support overlapped I/O.

Thread Safety

Distinct objects: Safe.

Shared objects: Unsafe.

Requirements

Header: asio/windows/stream_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/native_handle.html000066400000000000000000000057261340672067200264150ustar00rootroot00000000000000 windows::stream_handle::native_handle
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

Get the native handle representation.

native_handle_type native_handle();

This function may be used to obtain the underlying representation of the handle. This is intended to allow access to native handle functionality that is not otherwise provided.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/native_handle_type.html000066400000000000000000000065121340672067200274500ustar00rootroot00000000000000 windows::stream_handle::native_handle_type
asio C++ library

PrevUpHomeNext

Inherited from windows::overlapped_handle.

The native representation of a handle.

typedef implementation_defined native_handle_type;
Requirements

Header: asio/windows/stream_handle.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/operator_eq_.html000066400000000000000000000100251340672067200262570ustar00rootroot00000000000000 windows::stream_handle::operator=
asio C++ library

PrevUpHomeNext

Move-assign a windows::stream_handle from another.

stream_handle & operator=(
    stream_handle && other);

This assignment operator moves a stream handle from one object to another.

Parameters

other

The other windows::stream_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the stream_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/read_some.html000066400000000000000000000071231340672067200255430ustar00rootroot00000000000000 windows::stream_handle::read_some
asio C++ library

PrevUpHomeNext

Read some data from the handle.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);
  » more...

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/read_some/000077500000000000000000000000001340672067200246525ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/read_some/overload1.html000066400000000000000000000141701340672067200274370ustar00rootroot00000000000000 windows::stream_handle::read_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the handle.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers);

This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

Return Value

The number of bytes read.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.

Example

To read into a single data buffer use the buffer function as follows:

handle.read_some(asio::buffer(data, size));

See the buffer documentation for information on reading into multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/read_some/overload2.html000066400000000000000000000114501340672067200274360ustar00rootroot00000000000000 windows::stream_handle::read_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Read some data from the handle.

template<
    typename MutableBufferSequence>
std::size_t read_some(
    const MutableBufferSequence & buffers,
    asio::error_code & ec);

This function is used to read data from the stream handle. The function call will block until one or more bytes of data has been read successfully, or until an error occurs.

Parameters

buffers

One or more buffers into which the data will be read.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes read. Returns 0 if an error occurred.

Remarks

The read_some operation may not read all of the requested number of bytes. Consider using the read function if you need to ensure that the requested amount of data is read before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/stream_handle.html000066400000000000000000000106001340672067200264050ustar00rootroot00000000000000 windows::stream_handle::stream_handle
asio C++ library

PrevUpHomeNext

Construct a windows::stream_handle without opening it.

explicit stream_handle(
    asio::io_context & io_context);
  » more...

Construct a windows::stream_handle on an existing native handle.

stream_handle(
    asio::io_context & io_context,
    const native_handle_type & handle);
  » more...

Move-construct a windows::stream_handle from another.

stream_handle(
    stream_handle && other);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/stream_handle/000077500000000000000000000000001340672067200255225ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/stream_handle/overload1.html000066400000000000000000000074301340672067200303100ustar00rootroot00000000000000 windows::stream_handle::stream_handle (1 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a windows::stream_handle without opening it.

stream_handle(
    asio::io_context & io_context);

This constructor creates a stream handle without opening it. The handle needs to be opened and then connected or accepted before data can be sent or received on it.

Parameters

io_context

The io_context object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/stream_handle/overload2.html000066400000000000000000000106171340672067200303120ustar00rootroot00000000000000 windows::stream_handle::stream_handle (2 of 3 overloads)
asio C++ library

PrevUpHomeNext

Construct a windows::stream_handle on an existing native handle.

stream_handle(
    asio::io_context & io_context,
    const native_handle_type & handle);

This constructor creates a stream handle object to hold an existing native handle.

Parameters

io_context

The io_context object that the stream handle will use to dispatch handlers for any asynchronous operations performed on the handle.

handle

The new underlying handle implementation.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/stream_handle/overload3.html000066400000000000000000000101631340672067200303070ustar00rootroot00000000000000 windows::stream_handle::stream_handle (3 of 3 overloads)
asio C++ library

PrevUpHomeNext

Move-construct a windows::stream_handle from another.

stream_handle(
    stream_handle && other);

This constructor moves a stream handle from one object to another.

Parameters

other

The other windows::stream_handle object from which the move will occur.

Remarks

Following the move, the moved-from object is in the same state as if constructed using the stream_handle(io_context&) constructor.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/write_some.html000066400000000000000000000072241340672067200257640ustar00rootroot00000000000000 windows::stream_handle::write_some
asio C++ library

PrevUpHomeNext

Write some data to the handle.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);
  » more...

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/write_some/000077500000000000000000000000001340672067200250715ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/windows__stream_handle/write_some/overload1.html000066400000000000000000000141761340672067200276640ustar00rootroot00000000000000 windows::stream_handle::write_some (1 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the handle.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers);

This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the handle.

Return Value

The number of bytes written.

Exceptions

asio::system_error

Thrown on failure. An error code of asio::error::eof indicates that the connection was closed by the peer.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.

Example

To write a single data buffer use the buffer function as follows:

handle.write_some(asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/windows__stream_handle/write_some/overload2.html000066400000000000000000000113751340672067200276630ustar00rootroot00000000000000 windows::stream_handle::write_some (2 of 2 overloads)
asio C++ library

PrevUpHomeNext

Write some data to the handle.

template<
    typename ConstBufferSequence>
std::size_t write_some(
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write data to the stream handle. The function call will block until one or more bytes of the data has been written successfully, or until an error occurs.

Parameters

buffers

One or more data buffers to be written to the handle.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. Returns 0 if an error occurred.

Remarks

The write_some operation may not transmit all of the data to the peer. Consider using the write function if you need to ensure that all data is written before the blocking operation completes.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write.html000066400000000000000000000304111340672067200202140ustar00rootroot00000000000000 write
asio C++ library

PrevUpHomeNext

The write function is a composed operation that writes a certain amount of data to a stream before returning.

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename ConstBufferSequence>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename SyncWriteStream,
    typename ConstBufferSequence>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    asio::error_code & ec,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  » more...

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  » more...

template<
    typename SyncWriteStream,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);
  » more...

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename DynamicBuffer>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename SyncWriteStream,
    typename DynamicBuffer>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

template<
    typename SyncWriteStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);
  » more...

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename Allocator>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b);
  » more...

template<
    typename SyncWriteStream,
    typename Allocator>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);
  » more...

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);
  » more...

template<
    typename SyncWriteStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);
  » more...
Requirements

Header: asio/write.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/000077500000000000000000000000001340672067200173275ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/write/overload1.html000066400000000000000000000141261340672067200221150ustar00rootroot00000000000000 write (1 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename ConstBufferSequence>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To write a single data buffer use the buffer function as follows:

asio::write(s, asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::write(
    s, buffers,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload10.html000066400000000000000000000116631340672067200222000ustar00rootroot00000000000000 write (10 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename Allocator>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

b

The basic_streambuf object from which data will be written.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Remarks

This overload is equivalent to calling:

asio::write(
    s, b,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload11.html000066400000000000000000000133701340672067200221760ustar00rootroot00000000000000 write (11 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

b

The basic_streambuf object from which data will be written.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write_some function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload12.html000066400000000000000000000130731340672067200221770ustar00rootroot00000000000000 write (12 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename Allocator,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

b

The basic_streambuf object from which data will be written.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write_some function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload2.html000066400000000000000000000135421340672067200221170ustar00rootroot00000000000000 write (2 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename ConstBufferSequence>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    asio::error_code & ec,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Example

To write a single data buffer use the buffer function as follows:

asio::write(s, asio::buffer(data, size), ec);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::write(
    s, buffers,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload3.html000066400000000000000000000152721340672067200221220ustar00rootroot00000000000000 write (3 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write_some function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To write a single data buffer use the buffer function as follows:

asio::write(s, asio::buffer(data, size),
    asio::transfer_at_least(32));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload4.html000066400000000000000000000133311340672067200221150ustar00rootroot00000000000000 write (4 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_const_buffer_sequence< ConstBufferSequence >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the stream.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write_some function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload5.html000066400000000000000000000123471340672067200221240ustar00rootroot00000000000000 write (5 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename DynamicBuffer>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied dynamic buffer sequence has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This overload is equivalent to calling:

asio::write(
    s, buffers,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload6.html000066400000000000000000000117301340672067200221200ustar00rootroot00000000000000 write (6 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename DynamicBuffer>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied dynamic buffer sequence has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Remarks

This overload is equivalent to calling:

asio::write(
    s, buffers,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload7.html000066400000000000000000000134231340672067200221220ustar00rootroot00000000000000 write (7 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied dynamic buffer sequence has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write_some function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload8.html000066400000000000000000000131511340672067200221210ustar00rootroot00000000000000 write (8 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data to a stream before returning.

template<
    typename SyncWriteStream,
    typename DynamicBuffer,
    typename CompletionCondition>
std::size_t write(
    SyncWriteStream & s,
    DynamicBuffer && buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec,
    typename enable_if< is_dynamic_buffer< typename decay< DynamicBuffer >::type >::value >::type *  = 0);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied dynamic buffer sequence has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

buffers

The dynamic buffer sequence from which data will be written. Successfully written data is automatically consumed from the buffers.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the stream's write_some function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write/overload9.html000066400000000000000000000122611340672067200221230ustar00rootroot00000000000000 write (9 of 12 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data to a stream before returning.

template<
    typename SyncWriteStream,
    typename Allocator>
std::size_t write(
    SyncWriteStream & s,
    basic_streambuf< Allocator > & b);

This function is used to write a certain number of bytes of data to a stream. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the stream's write_some function.

Parameters

s

The stream to which the data is to be written. The type must support the SyncWriteStream concept.

b

The basic_streambuf object from which data will be written.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This overload is equivalent to calling:

asio::write(
    s, b,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at.html000066400000000000000000000222041340672067200207010ustar00rootroot00000000000000 write_at
asio C++ library

PrevUpHomeNext

The write_at function is a composed operation that writes a certain amount of data at a specified offset before returning.

Write all of the supplied data at the specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers);
  » more...

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    asio::error_code & ec);
  » more...

Write a certain amount of data at a specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition);
  » more...

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec);
  » more...

Write all of the supplied data at the specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b);
  » more...

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);
  » more...

Write a certain amount of data at a specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);
  » more...

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);
  » more...
Requirements

Header: asio/write_at.hpp

Convenience header: asio.hpp


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/000077500000000000000000000000001340672067200200135ustar00rootroot00000000000000asio-1.12.2/doc/asio/reference/write_at/overload1.html000066400000000000000000000145601340672067200226030ustar00rootroot00000000000000 write_at (1 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data at the specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To write a single data buffer use the buffer function as follows:

asio::write_at(d, 42, asio::buffer(data, size));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::write_at(
    d, offset, buffers,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload2.html000066400000000000000000000141551340672067200226040ustar00rootroot00000000000000 write_at (2 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data at the specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    asio::error_code & ec);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Example

To write a single data buffer use the buffer function as follows:

asio::write_at(d, 42,
    asio::buffer(data, size), ec);

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.

Remarks

This overload is equivalent to calling:

asio::write_at(
    d, offset, buffers,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload3.html000066400000000000000000000156721340672067200226120ustar00rootroot00000000000000 write_at (3 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data at a specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write_some_at function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Example

To write a single data buffer use the buffer function as follows:

asio::write_at(d, 42, asio::buffer(data, size),
    asio::transfer_at_least(32));

See the buffer documentation for information on writing multiple buffers in one go, and how to use it with arrays, boost::array or std::vector.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload4.html000066400000000000000000000137001340672067200226010ustar00rootroot00000000000000 write_at (4 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data at a specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename ConstBufferSequence,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    const ConstBufferSequence & buffers,
    CompletionCondition completion_condition,
    asio::error_code & ec);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied buffers has been written. That is, the bytes transferred is equal to the sum of the buffer sizes.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

buffers

One or more buffers containing the data to be written. The sum of the buffer sizes indicates the maximum number of bytes to write to the device.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write_some_at function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload5.html000066400000000000000000000130241340672067200226010ustar00rootroot00000000000000 write_at (5 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data at the specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

b

The basic_streambuf object from which data will be written.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.

Remarks

This overload is equivalent to calling:

asio::write_at(
    d, 42, b,
    asio::transfer_all());

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload6.html000066400000000000000000000123741340672067200226110ustar00rootroot00000000000000 write_at (6 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write all of the supplied data at the specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    asio::error_code & ec);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • An error occurred.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

b

The basic_streambuf object from which data will be written.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes transferred.

Remarks

This overload is equivalent to calling:

asio::write_at(
    d, 42, b,
    asio::transfer_all(), ec);

PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload7.html000066400000000000000000000140721340672067200226070ustar00rootroot00000000000000 write_at (7 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data at a specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

b

The basic_streambuf object from which data will be written.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write_some_at function.

Return Value

The number of bytes transferred.

Exceptions

asio::system_error

Thrown on failure.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/write_at/overload8.html000066400000000000000000000136161340672067200226130ustar00rootroot00000000000000 write_at (8 of 8 overloads)
asio C++ library

PrevUpHomeNext

Write a certain amount of data at a specified offset before returning.

template<
    typename SyncRandomAccessWriteDevice,
    typename Allocator,
    typename CompletionCondition>
std::size_t write_at(
    SyncRandomAccessWriteDevice & d,
    uint64_t offset,
    basic_streambuf< Allocator > & b,
    CompletionCondition completion_condition,
    asio::error_code & ec);

This function is used to write a certain number of bytes of data to a random access device at a specified offset. The call will block until one of the following conditions is true:

  • All of the data in the supplied basic_streambuf has been written.
  • The completion_condition function object returns 0.

This operation is implemented in terms of zero or more calls to the device's write_some_at function.

Parameters

d

The device to which the data is to be written. The type must support the SyncRandomAccessWriteDevice concept.

offset

The offset at which the data will be written.

b

The basic_streambuf object from which data will be written.

completion_condition

The function object to be called to determine whether the write operation is complete. The signature of the function object must be:

std::size_t completion_condition(
  // Result of latest write_some_at operation.
  const asio::error_code& error,

  // Number of bytes transferred so far.
  std::size_t bytes_transferred
);

A return value of 0 indicates that the write operation is complete. A non-zero return value indicates the maximum number of bytes to be written on the next call to the device's write_some_at function.

ec

Set to indicate what error occurred, if any.

Return Value

The number of bytes written. If an error occurs, returns the total number of bytes successfully transferred prior to the error.


PrevUpHomeNext
asio-1.12.2/doc/asio/reference/yield_context.html000066400000000000000000000151241340672067200217400ustar00rootroot00000000000000 yield_context
asio C++ library

PrevUpHomeNext

Context object that represents the currently executing coroutine.

typedef basic_yield_context< unspecified > yield_context;
Types

Name

Description

callee_type

The coroutine callee type, used by the implementation.

caller_type

The coroutine caller type, used by the implementation.

Member Functions

Name

Description

basic_yield_context

Construct a yield context to represent the specified coroutine.

Construct a yield context from another yield context type.

operator[]

Return a yield context that sets the specified error_code.

The basic_yield_context class is used to represent the currently executing stackful coroutine. A basic_yield_context may be passed as a handler to an asynchronous operation. For example:

template <typename Handler>
void my_coroutine(basic_yield_context<Handler> yield)
{
  ...
  std::size_t n = my_socket.async_read_some(buffer, yield);
  ...
}

The initiating function (async_read_some in the above example) suspends the current coroutine. The coroutine is resumed when the asynchronous operation completes, and the result of the operation is returned.

Requirements

Header: asio/spawn.hpp

Convenience header: None


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial.html000066400000000000000000000142071340672067200167740ustar00rootroot00000000000000 Tutorial
asio C++ library

PrevUpHomeNext

Basic Skills

The tutorial programs in this first section introduce the fundamental concepts required to use the asio toolkit. Before plunging into the complex world of network programming, these tutorial programs illustrate the basic skills using simple asynchronous timers.

Introduction to Sockets

The tutorial programs in this section show how to use asio to develop simple client and server programs. These tutorial programs are based around the daytime protocol, which supports both TCP and UDP.

The first three tutorial programs implement the daytime protocol using TCP.

The next three tutorial programs implement the daytime protocol using UDP.

The last tutorial program in this section demonstrates how asio allows the TCP and UDP servers to be easily combined into a single program.


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/000077500000000000000000000000001340672067200161025ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/boost_bind.html000066400000000000000000000045521340672067200211200ustar00rootroot00000000000000 boost::bind
asio C++ library

PrevUpHomeNext

See the Boost: bind.hpp documentation for more information on how to use boost::bind.


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime1.html000066400000000000000000000136721340672067200212530ustar00rootroot00000000000000 Daytime.1 - A synchronous TCP daytime client
asio C++ library

PrevUpHomeNext

This tutorial program shows how to use asio to implement a client application with TCP.

We start by including the necessary header files.

#include <iostream>
#include <boost/array.hpp>
#include <asio.hpp>

The purpose of this application is to access a daytime service, so we need the user to specify the server.

using asio::ip::tcp;

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: client <host>" << std::endl;
      return 1;
    }

All programs that use asio need to have at least one io_context object.

    asio::io_context io_context;

We need to turn the server name that was specified as a parameter to the application, into a TCP endpoint. To do this we use an ip::tcp::resolver object.

    tcp::resolver resolver(io_context);

A resolver takes a query object and turns it into a list of endpoints. We construct a query using the name of the server, specified in argv[1], and the name of the service, in this case "daytime".

The list of endpoints is returned using an iterator of type ip::tcp::resolver::iterator. (Note that a default constructed ip::tcp::resolver::iterator object can be used as an end iterator.)

Now we create and connect the socket. The list of endpoints obtained above may contain both IPv4 and IPv6 endpoints, so we need to try each of them until we find one that works. This keeps the client program independent of a specific IP version. The asio::connect() function does this for us automatically.

The connection is open. All we need to do now is read the response from the daytime service.

We use a boost::array to hold the received data. The asio::buffer() function automatically determines the size of the array to help prevent buffer overruns. Instead of a boost::array, we could have used a char [] or std::vector.

When the server closes the connection, the ip::tcp::socket::read_some() function will exit with the asio::error::eof error, which is how we know to exit the loop.

Finally, handle any exceptions that may have been thrown.

See the full source listing

Return to the tutorial index

Next: Daytime.2 - A synchronous TCP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime1/000077500000000000000000000000001340672067200203545ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime1/src.html000066400000000000000000000074471340672067200220450ustar00rootroot00000000000000 Source listing for Daytime.1
asio C++ library

PrevUpHomeNext
//
// client.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <boost/array.hpp>
#include <asio.hpp>

using asio::ip::tcp;

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: client <host>" << std::endl;
      return 1;
    }

    asio::io_context io_context;

    tcp::resolver resolver(io_context);
    tcp::resolver::results_type endpoints =
      resolver.resolve(argv[1], "daytime");

    tcp::socket socket(io_context);
    asio::connect(socket, endpoints);

    for (;;)
    {
      boost::array<char, 128> buf;
      asio::error_code error;

      size_t len = socket.read_some(asio::buffer(buf), error);

      if (error == asio::error::eof)
        break; // Connection closed cleanly by peer.
      else if (error)
        throw asio::system_error(error); // Some other error.

      std::cout.write(buf.data(), len);
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.1 - A synchronous TCP daytime client


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime2.html000066400000000000000000000115251340672067200212470ustar00rootroot00000000000000 Daytime.2 - A synchronous TCP daytime server
asio C++ library

PrevUpHomeNext

This tutorial program shows how to use asio to implement a server application with TCP.

#include <ctime>
#include <iostream>
#include <string>
#include <asio.hpp>

using asio::ip::tcp;

We define the function make_daytime_string() to create the string to be sent back to the client. This function will be reused in all of our daytime server applications.

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

int main()
{
  try
  {
    asio::io_context io_context;

A ip::tcp::acceptor object needs to be created to listen for new connections. It is initialised to listen on TCP port 13, for IP version 4.

    tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));

This is an iterative server, which means that it will handle one connection at a time. Create a socket that will represent the connection to the client, and then wait for a connection.

    for (;;)
    {
      tcp::socket socket(io_context);
      acceptor.accept(socket);

A client is accessing our service. Determine the current time and transfer this information to the client.

      std::string message = make_daytime_string();

      asio::error_code ignored_error;
      asio::write(socket, asio::buffer(message), ignored_error);
    }
  }

Finally, handle any exceptions.

  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

See the full source listing

Return to the tutorial index

Previous: Daytime.1 - A synchronous TCP daytime client

Next: Daytime.3 - An asynchronous TCP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime2/000077500000000000000000000000001340672067200203555ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime2/src.html000066400000000000000000000070631340672067200220400ustar00rootroot00000000000000 Source listing for Daytime.2
asio C++ library

PrevUpHomeNext
//
// server.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <ctime>
#include <iostream>
#include <string>
#include <asio.hpp>

using asio::ip::tcp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

int main()
{
  try
  {
    asio::io_context io_context;

    tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));

    for (;;)
    {
      tcp::socket socket(io_context);
      acceptor.accept(socket);

      std::string message = make_daytime_string();

      asio::error_code ignored_error;
      asio::write(socket, asio::buffer(message), ignored_error);
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.2 - A synchronous TCP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime3.html000066400000000000000000000227421340672067200212530ustar00rootroot00000000000000 Daytime.3 - An asynchronous TCP daytime server
asio C++ library

PrevUpHomeNext
The main() function
int main()
{
  try
  {

We need to create a server object to accept incoming client connections. The io_context object provides I/O services, such as sockets, that the server object will use.

    asio::io_context io_context;
    tcp_server server(io_context);

Run the io_context object so that it will perform asynchronous operations on your behalf.

    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}
The tcp_server class
class tcp_server
{
public:

The constructor initialises an acceptor to listen on TCP port 13.

  tcp_server(asio::io_context& io_context)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
  {
    start_accept();
  }

private:

The function start_accept() creates a socket and initiates an asynchronous accept operation to wait for a new connection.

  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_executor().context());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          asio::placeholders::error));
  }

The function handle_accept() is called when the asynchronous accept operation initiated by start_accept() finishes. It services the client request, and then calls start_accept() to initiate the next accept operation.

  void handle_accept(tcp_connection::pointer new_connection,
      const asio::error_code& error)
  {
    if (!error)
    {
      new_connection->start();
    }

    start_accept();
  }
The tcp_connection class

We will use shared_ptr and enable_shared_from_this because we want to keep the tcp_connection object alive as long as there is an operation that refers to it.

class tcp_connection
  : public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  static pointer create(asio::io_context& io_context)
  {
    return pointer(new tcp_connection(io_context));
  }

  tcp::socket& socket()
  {
    return socket_;
  }

In the function start(), we call asio::async_write() to serve the data to the client. Note that we are using asio::async_write(), rather than ip::tcp::socket::async_write_some(), to ensure that the entire block of data is sent.

  void start()
  {

The data to be sent is stored in the class member message_ as we need to keep the data valid until the asynchronous operation is complete.

    message_ = make_daytime_string();

When initiating the asynchronous operation, and if using boost::bind , you must specify only the arguments that match the handler's parameter list. In this program, both of the argument placeholders (asio::placeholders::error and asio::placeholders::bytes_transferred) could potentially have been removed, since they are not being used in handle_write().

    asio::async_write(socket_, asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this(),
          asio::placeholders::error,
          asio::placeholders::bytes_transferred));

Any further actions for this client connection are now the responsibility of handle_write().

  }

private:
  tcp_connection(asio::io_context& io_context)
    : socket_(io_context)
  {
  }

  void handle_write(const asio::error_code& /*error*/,
      size_t /*bytes_transferred*/)
  {
  }

  tcp::socket socket_;
  std::string message_;
};
Removing unused handler parameters

You may have noticed that the error, and bytes_transferred parameters are not used in the body of the handle_write() function. If parameters are not needed, it is possible to remove them from the function so that it looks like:

  void handle_write()
  {
  }

The asio::async_write() call used to initiate the call can then be changed to just:

  asio::async_write(socket_, asio::buffer(message_),
      boost::bind(&tcp_connection::handle_write, shared_from_this()));

See the full source listing

Return to the tutorial index

Previous: Daytime.2 - A synchronous TCP daytime server

Next: Daytime.4 - A synchronous UDP daytime client


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime3/000077500000000000000000000000001340672067200203565ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime3/src.html000066400000000000000000000117121340672067200220350ustar00rootroot00000000000000 Source listing for Daytime.3
asio C++ library

PrevUpHomeNext
//
// server.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <ctime>
#include <iostream>
#include <string>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <asio.hpp>

using asio::ip::tcp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

class tcp_connection
  : public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  static pointer create(asio::io_context& io_context)
  {
    return pointer(new tcp_connection(io_context));
  }

  tcp::socket& socket()
  {
    return socket_;
  }

  void start()
  {
    message_ = make_daytime_string();

    asio::async_write(socket_, asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this(),
          asio::placeholders::error,
          asio::placeholders::bytes_transferred));
  }

private:
  tcp_connection(asio::io_context& io_context)
    : socket_(io_context)
  {
  }

  void handle_write(const asio::error_code& /*error*/,
      size_t /*bytes_transferred*/)
  {
  }

  tcp::socket socket_;
  std::string message_;
};

class tcp_server
{
public:
  tcp_server(asio::io_context& io_context)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
  {
    start_accept();
  }

private:
  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_executor().context());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          asio::placeholders::error));
  }

  void handle_accept(tcp_connection::pointer new_connection,
      const asio::error_code& error)
  {
    if (!error)
    {
      new_connection->start();
    }

    start_accept();
  }

  tcp::acceptor acceptor_;
};

int main()
{
  try
  {
    asio::io_context io_context;
    tcp_server server(io_context);
    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.3 - An asynchronous TCP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime4.html000066400000000000000000000125241340672067200212510ustar00rootroot00000000000000 Daytime.4 - A synchronous UDP daytime client
asio C++ library

PrevUpHomeNext

This tutorial program shows how to use asio to implement a client application with UDP.

#include <iostream>
#include <boost/array.hpp>
#include <asio.hpp>

using asio::ip::udp;

The start of the application is essentially the same as for the TCP daytime client.

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: client <host>" << std::endl;
      return 1;
    }

    asio::io_context io_context;

We use an ip::udp::resolver object to find the correct remote endpoint to use based on the host and service names. The query is restricted to return only IPv4 endpoints by the ip::udp::v4() argument.

    udp::resolver resolver(io_context);
    udp::endpoint receiver_endpoint =
      *resolver.resolve(udp::v4(), argv[1], "daytime").begin();

The ip::udp::resolver::resolve() function is guaranteed to return at least one endpoint in the list if it does not fail. This means it is safe to dereference the return value directly.

    udp::socket socket(io_context);
    socket.open(udp::v4());

    boost::array<char, 1> send_buf  = {{ 0 }};
    socket.send_to(asio::buffer(send_buf), receiver_endpoint);

    boost::array<char, 128> recv_buf;
    udp::endpoint sender_endpoint;

Since UDP is datagram-oriented, we will not be using a stream socket. Create an ip::udp::socket and initiate contact with the remote endpoint.

Now we need to be ready to accept whatever the server sends back to us. The endpoint on our side that receives the server's response will be initialised by ip::udp::socket::receive_from().

Finally, handle any exceptions that may have been thrown.

See the full source listing

Return to the tutorial index

Previous: Daytime.3 - An asynchronous TCP daytime server

Next: Daytime.5 - A synchronous UDP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime4/000077500000000000000000000000001340672067200203575ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime4/src.html000066400000000000000000000073731340672067200220460ustar00rootroot00000000000000 Source listing for Daytime.4
asio C++ library

PrevUpHomeNext
//
// client.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <boost/array.hpp>
#include <asio.hpp>

using asio::ip::udp;

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 2)
    {
      std::cerr << "Usage: client <host>" << std::endl;
      return 1;
    }

    asio::io_context io_context;

    udp::resolver resolver(io_context);
    udp::endpoint receiver_endpoint =
      *resolver.resolve(udp::v4(), argv[1], "daytime").begin();

    udp::socket socket(io_context);
    socket.open(udp::v4());

    boost::array<char, 1> send_buf  = {{ 0 }};
    socket.send_to(asio::buffer(send_buf), receiver_endpoint);

    boost::array<char, 128> recv_buf;
    udp::endpoint sender_endpoint;
    size_t len = socket.receive_from(
        asio::buffer(recv_buf), sender_endpoint);

    std::cout.write(recv_buf.data(), len);
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.4 - A synchronous UDP daytime client


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime5.html000066400000000000000000000075171340672067200212600ustar00rootroot00000000000000 Daytime.5 - A synchronous UDP daytime server
asio C++ library

PrevUpHomeNext

This tutorial program shows how to use asio to implement a server application with UDP.

int main()
{
  try
  {
    asio::io_context io_context;

Create an ip::udp::socket object to receive requests on UDP port 13.

    udp::socket socket(io_context, udp::endpoint(udp::v4(), 13));

Wait for a client to initiate contact with us. The remote_endpoint object will be populated by ip::udp::socket::receive_from().

Determine what we are going to send back to the client.

Send the response to the remote_endpoint.

Finally, handle any exceptions.

See the full source listing

Return to the tutorial index

Previous: Daytime.4 - A synchronous UDP daytime client

Next: Daytime.6 - An asynchronous UDP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime5/000077500000000000000000000000001340672067200203605ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime5/src.html000066400000000000000000000073271340672067200220460ustar00rootroot00000000000000 Source listing for Daytime.5
asio C++ library

PrevUpHomeNext
//
// server.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <asio.hpp>

using asio::ip::udp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

int main()
{
  try
  {
    asio::io_context io_context;

    udp::socket socket(io_context, udp::endpoint(udp::v4(), 13));

    for (;;)
    {
      boost::array<char, 1> recv_buf;
      udp::endpoint remote_endpoint;
      asio::error_code error;
      socket.receive_from(asio::buffer(recv_buf), remote_endpoint);

      std::string message = make_daytime_string();

      asio::error_code ignored_error;
      socket.send_to(asio::buffer(message),
          remote_endpoint, 0, ignored_error);
    }
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.5 - A synchronous UDP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime6.html000066400000000000000000000177111340672067200212560ustar00rootroot00000000000000 Daytime.6 - An asynchronous UDP daytime server
asio C++ library

PrevUpHomeNext
The main() function
int main()
{
  try
  {

Create a server object to accept incoming client requests, and run the io_context object.

    asio::io_context io_context;
    udp_server server(io_context);
    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}
The udp_server class
class udp_server
{
public:

The constructor initialises a socket to listen on UDP port 13.

  udp_server(asio::io_context& io_context)
    : socket_(io_context, udp::endpoint(udp::v4(), 13))
  {
    start_receive();
  }

private:
  void start_receive()
  {

The function ip::udp::socket::async_receive_from() will cause the application to listen in the background for a new request. When such a request is received, the io_context object will invoke the handle_receive() function with two arguments: a value of type error_code indicating whether the operation succeeded or failed, and a size_t value bytes_transferred specifying the number of bytes received.

    socket_.async_receive_from(
        asio::buffer(recv_buffer_), remote_endpoint_,
        boost::bind(&udp_server::handle_receive, this,
          asio::placeholders::error,
          asio::placeholders::bytes_transferred));
  }

The function handle_receive() will service the client request.

  void handle_receive(const asio::error_code& error,
      std::size_t /*bytes_transferred*/)
  {

The error parameter contains the result of the asynchronous operation. Since we only provide the 1-byte recv_buffer_ to contain the client's request, the io_context object would return an error if the client sent anything larger. We can ignore such an error if it comes up.

    if (!error)
    {

Determine what we are going to send.

      boost::shared_ptr<std::string> message(
          new std::string(make_daytime_string()));

We now call ip::udp::socket::async_send_to() to serve the data to the client.

      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
          boost::bind(&udp_server::handle_send, this, message,
            asio::placeholders::error,
            asio::placeholders::bytes_transferred));

When initiating the asynchronous operation, and if using boost::bind , you must specify only the arguments that match the handler's parameter list. In this program, both of the argument placeholders (asio::placeholders::error and asio::placeholders::bytes_transferred) could potentially have been removed.

Start listening for the next client request.

      start_receive();

Any further actions for this client request are now the responsibility of handle_send().

    }
  }

The function handle_send() is invoked after the service request has been completed.

  void handle_send(boost::shared_ptr<std::string> /*message*/,
      const asio::error_code& /*error*/,
      std::size_t /*bytes_transferred*/)
  {
  }

  udp::socket socket_;
  udp::endpoint remote_endpoint_;
  boost::array<char, 1> recv_buffer_;
};

See the full source listing

Return to the tutorial index

Previous: Daytime.5 - A synchronous UDP daytime server

Next: Daytime.7 - A combined TCP/UDP asynchronous server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime6/000077500000000000000000000000001340672067200203615ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime6/src.html000066400000000000000000000111101340672067200220300ustar00rootroot00000000000000 Source listing for Daytime.6
asio C++ library

PrevUpHomeNext
//
// server.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <asio.hpp>

using asio::ip::udp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

class udp_server
{
public:
  udp_server(asio::io_context& io_context)
    : socket_(io_context, udp::endpoint(udp::v4(), 13))
  {
    start_receive();
  }

private:
  void start_receive()
  {
    socket_.async_receive_from(
        asio::buffer(recv_buffer_), remote_endpoint_,
        boost::bind(&udp_server::handle_receive, this,
          asio::placeholders::error,
          asio::placeholders::bytes_transferred));
  }

  void handle_receive(const asio::error_code& error,
      std::size_t /*bytes_transferred*/)
  {
    if (!error)
    {
      boost::shared_ptr<std::string> message(
          new std::string(make_daytime_string()));

      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
          boost::bind(&udp_server::handle_send, this, message,
            asio::placeholders::error,
            asio::placeholders::bytes_transferred));

      start_receive();
    }
  }

  void handle_send(boost::shared_ptr<std::string> /*message*/,
      const asio::error_code& /*error*/,
      std::size_t /*bytes_transferred*/)
  {
  }

  udp::socket socket_;
  udp::endpoint remote_endpoint_;
  boost::array<char, 1> recv_buffer_;
};

int main()
{
  try
  {
    asio::io_context io_context;
    udp_server server(io_context);
    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.6 - An asynchronous UDP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime7.html000066400000000000000000000162551340672067200212610ustar00rootroot00000000000000 Daytime.7 - A combined TCP/UDP asynchronous server
asio C++ library

PrevUpHomeNext

This tutorial program shows how to combine the two asynchronous servers that we have just written, into a single server application.

The main() function
int main()
{
  try
  {
    asio::io_context io_context;

We will begin by creating a server object to accept a TCP client connection.

    tcp_server server1(io_context);

We also need a server object to accept a UDP client request.

    udp_server server2(io_context);

We have created two lots of work for the io_context object to do.

    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}
The tcp_connection and tcp_server classes

The following two classes are taken from Daytime.3 .

class tcp_connection
  : public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  static pointer create(asio::io_context& io_context)
  {
    return pointer(new tcp_connection(io_context));
  }

  tcp::socket& socket()
  {
    return socket_;
  }

  void start()
  {
    message_ = make_daytime_string();

    asio::async_write(socket_, asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this()));
  }

private:
  tcp_connection(asio::io_context& io_context)
    : socket_(io_context)
  {
  }

  void handle_write()
  {
  }

  tcp::socket socket_;
  std::string message_;
};

class tcp_server
{
public:
  tcp_server(asio::io_context& io_context)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
  {
    start_accept();
  }

private:
  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_executor().context());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          asio::placeholders::error));
  }

  void handle_accept(tcp_connection::pointer new_connection,
      const asio::error_code& error)
  {
    if (!error)
    {
      new_connection->start();
    }

    start_accept();
  }

  tcp::acceptor acceptor_;
};
The udp_server class

Similarly, this next class is taken from the previous tutorial step .

class udp_server
{
public:
  udp_server(asio::io_context& io_context)
    : socket_(io_context, udp::endpoint(udp::v4(), 13))
  {
    start_receive();
  }

private:
  void start_receive()
  {
    socket_.async_receive_from(
        asio::buffer(recv_buffer_), remote_endpoint_,
        boost::bind(&udp_server::handle_receive, this,
          asio::placeholders::error));
  }

  void handle_receive(const asio::error_code& error)
  {
    if (!error)
    {
      boost::shared_ptr<std::string> message(
          new std::string(make_daytime_string()));

      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
          boost::bind(&udp_server::handle_send, this, message));

      start_receive();
    }
  }

  void handle_send(boost::shared_ptr<std::string> /*message*/)
  {
  }

  udp::socket socket_;
  udp::endpoint remote_endpoint_;
  boost::array<char, 1> recv_buffer_;
};

See the full source listing

Return to the tutorial index

Previous: Daytime.6 - An asynchronous UDP daytime server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tutdaytime7/000077500000000000000000000000001340672067200203625ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tutdaytime7/src.html000066400000000000000000000134231340672067200220420ustar00rootroot00000000000000 Source listing for Daytime.7
asio C++ library

PrevUpHomeNext
//
// server.cpp
// ~~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <asio.hpp>

using asio::ip::tcp;
using asio::ip::udp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

class tcp_connection
  : public boost::enable_shared_from_this<tcp_connection>
{
public:
  typedef boost::shared_ptr<tcp_connection> pointer;

  static pointer create(asio::io_context& io_context)
  {
    return pointer(new tcp_connection(io_context));
  }

  tcp::socket& socket()
  {
    return socket_;
  }

  void start()
  {
    message_ = make_daytime_string();

    asio::async_write(socket_, asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this()));
  }

private:
  tcp_connection(asio::io_context& io_context)
    : socket_(io_context)
  {
  }

  void handle_write()
  {
  }

  tcp::socket socket_;
  std::string message_;
};

class tcp_server
{
public:
  tcp_server(asio::io_context& io_context)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
  {
    start_accept();
  }

private:
  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.get_executor().context());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          asio::placeholders::error));
  }

  void handle_accept(tcp_connection::pointer new_connection,
      const asio::error_code& error)
  {
    if (!error)
    {
      new_connection->start();
    }

    start_accept();
  }

  tcp::acceptor acceptor_;
};

class udp_server
{
public:
  udp_server(asio::io_context& io_context)
    : socket_(io_context, udp::endpoint(udp::v4(), 13))
  {
    start_receive();
  }

private:
  void start_receive()
  {
    socket_.async_receive_from(
        asio::buffer(recv_buffer_), remote_endpoint_,
        boost::bind(&udp_server::handle_receive, this,
          asio::placeholders::error));
  }

  void handle_receive(const asio::error_code& error)
  {
    if (!error)
    {
      boost::shared_ptr<std::string> message(
          new std::string(make_daytime_string()));

      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
          boost::bind(&udp_server::handle_send, this, message));

      start_receive();
    }
  }

  void handle_send(boost::shared_ptr<std::string> /*message*/)
  {
  }

  udp::socket socket_;
  udp::endpoint remote_endpoint_;
  boost::array<char, 1> recv_buffer_;
};

int main()
{
  try
  {
    asio::io_context io_context;
    tcp_server server1(io_context);
    udp_server server2(io_context);
    io_context.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Return to Daytime.7 - A combined TCP/UDP asynchronous server


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer1.html000066400000000000000000000114631340672067200207330ustar00rootroot00000000000000 Timer.1 - Using a timer synchronously
asio C++ library

PrevUpHomeNext

This tutorial program introduces asio by showing how to perform a blocking wait on a timer.

We start by including the necessary header files.

All of the asio classes can be used by simply including the "asio.hpp" header file.

#include <iostream>
#include <asio.hpp>

All programs that use asio need to have at least one io_context object. This class provides access to I/O functionality. We declare an object of this type first thing in the main function.

int main()
{
  asio::io_context io;

Next we declare an object of type asio::steady_timer. The core asio classes that provide I/O functionality (or as in this case timer functionality) always take a reference to an io_context as their first constructor argument. The second argument to the constructor sets the timer to expire 5 seconds from now.

  asio::steady_timer t(io, asio::chrono::seconds(5));

In this simple example we perform a blocking wait on the timer. That is, the call to steady_timer::wait() will not return until the timer has expired, 5 seconds after it was created (i.e. not from when the wait starts).

A timer is always in one of two states: "expired" or "not expired". If the steady_timer::wait() function is called on an expired timer, it will return immediately.

  t.wait();

Finally we print the obligatory "Hello, world!" message to show when the timer has expired.

  std::cout << "Hello, world!" << std::endl;

  return 0;
}

See the full source listing

Return to the tutorial index

Next: Timer.2 - Using a timer asynchronously


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer1/000077500000000000000000000000001340672067200200405ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tuttimer1/src.html000066400000000000000000000057441340672067200215270ustar00rootroot00000000000000 Source listing for Timer.1
asio C++ library

PrevUpHomeNext
//
// timer.cpp
// ~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <asio.hpp>

int main()
{
  asio::io_context io;

  asio::steady_timer t(io, asio::chrono::seconds(5));
  t.wait();

  std::cout << "Hello, world!" << std::endl;

  return 0;
}

Return to Timer.1 - Using a timer synchronously


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer2.html000066400000000000000000000135541340672067200207370ustar00rootroot00000000000000 Timer.2 - Using a timer asynchronously
asio C++ library

PrevUpHomeNext

This tutorial program demonstrates how to use asio's asynchronous callback functionality by modifying the program from tutorial Timer.1 to perform an asynchronous wait on the timer.

#include <iostream>
#include <asio.hpp>

Using asio's asynchronous functionality means having a callback function that will be called when an asynchronous operation completes. In this program we define a function called print to be called when the asynchronous wait finishes.

void print(const asio::error_code& /*e*/)
{
  std::cout << "Hello, world!" << std::endl;
}

int main()
{
  asio::io_context io;

  asio::steady_timer t(io, asio::chrono::seconds(5));

Next, instead of doing a blocking wait as in tutorial Timer.1, we call the steady_timer::async_wait() function to perform an asynchronous wait. When calling this function we pass the print callback handler that was defined above.

  t.async_wait(&print);

Finally, we must call the io_context::run() member function on the io_context object.

The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling io_context::run(). Therefore unless the io_context::run() function is called the callback for the asynchronous wait completion will never be invoked.

The io_context::run() function will also continue to run while there is still "work" to do. In this example, the work is the asynchronous wait on the timer, so the call will not return until the timer has expired and the callback has completed.

It is important to remember to give the io_context some work to do before calling io_context::run(). For example, if we had omitted the above call to steady_timer::async_wait(), the io_context would not have had any work to do, and consequently io_context::run() would have returned immediately.

  io.run();

  return 0;
}

See the full source listing

Return to the tutorial index

Previous: Timer.1 - Using a timer synchronously

Next: Timer.3 - Binding arguments to a handler


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer2/000077500000000000000000000000001340672067200200415ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tuttimer2/src.html000066400000000000000000000060711340672067200215220ustar00rootroot00000000000000 Source listing for Timer.2
asio C++ library

PrevUpHomeNext
//
// timer.cpp
// ~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <asio.hpp>

void print(const asio::error_code& /*e*/)
{
  std::cout << "Hello, world!" << std::endl;
}

int main()
{
  asio::io_context io;

  asio::steady_timer t(io, asio::chrono::seconds(5));
  t.async_wait(&print);

  io.run();

  return 0;
}

Return to Timer.2 - Using a timer asynchronously


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer3.html000066400000000000000000000177311340672067200207410ustar00rootroot00000000000000 Timer.3 - Binding arguments to a handler
asio C++ library

PrevUpHomeNext

In this tutorial we will modify the program from tutorial Timer.2 so that the timer fires once a second. This will show how to pass additional parameters to your handler function.

#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>

To implement a repeating timer using asio you need to change the timer's expiry time in your callback function, and to then start a new asynchronous wait. Obviously this means that the callback function will need to be able to access the timer object. To this end we add two new parameters to the print function:

  • A pointer to a timer object.
  • A counter so that we can stop the program when the timer fires for the sixth time.
void print(const asio::error_code& /*e*/,
    asio::steady_timer* t, int* count)
{

As mentioned above, this tutorial program uses a counter to stop running when the timer fires for the sixth time. However you will observe that there is no explicit call to ask the io_context to stop. Recall that in tutorial Timer.2 we learnt that the io_context::run() function completes when there is no more "work" to do. By not starting a new asynchronous wait on the timer when count reaches 5, the io_context will run out of work and stop running.

  if (*count < 5)
  {
    std::cout << *count << std::endl;
    ++(*count);

Next we move the expiry time for the timer along by one second from the previous expiry time. By calculating the new expiry time relative to the old, we can ensure that the timer does not drift away from the whole-second mark due to any delays in processing the handler.

    t->expires_at(t->expiry() + asio::chrono::seconds(1));

Then we start a new asynchronous wait on the timer. As you can see, the boost::bind function is used to associate the extra parameters with your callback handler. The steady_timer::async_wait() function expects a handler function (or function object) with the signature void(const asio::error_code&). Binding the additional parameters converts your print function into a function object that matches the signature correctly.

See the Boost.Bind documentation for more information on how to use boost::bind .

In this example, the asio::placeholders::error argument to boost::bind is a named placeholder for the error object passed to the handler. When initiating the asynchronous operation, and if using boost::bind , you must specify only the arguments that match the handler's parameter list. In tutorial Timer.4 you will see that this placeholder may be elided if the parameter is not needed by the callback handler.

    t->async_wait(boost::bind(print,
          asio::placeholders::error, t, count));
  }
}

int main()
{
  asio::io_context io;

A new count variable is added so that we can stop the program when the timer fires for the sixth time.

  int count = 0;
  asio::steady_timer t(io, asio::chrono::seconds(1));

As in Step 4, when making the call to steady_timer::async_wait() from main we bind the additional parameters needed for the print function.

  t.async_wait(boost::bind(print,
        asio::placeholders::error, &t, &count));

  io.run();

Finally, just to prove that the count variable was being used in the print handler function, we will print out its new value.

  std::cout << "Final count is " << count << std::endl;

  return 0;
}

See the full source listing

Return to the tutorial index

Previous: Timer.2 - Using a timer asynchronously

Next: Timer.4 - Using a member function as a handler


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer3/000077500000000000000000000000001340672067200200425ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tuttimer3/src.html000066400000000000000000000067521340672067200215310ustar00rootroot00000000000000 Source listing for Timer.3
asio C++ library

PrevUpHomeNext
//
// timer.cpp
// ~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>

void print(const asio::error_code& /*e*/,
    asio::steady_timer* t, int* count)
{
  if (*count < 5)
  {
    std::cout << *count << std::endl;
    ++(*count);

    t->expires_at(t->expiry() + asio::chrono::seconds(1));
    t->async_wait(boost::bind(print,
          asio::placeholders::error, t, count));
  }
}

int main()
{
  asio::io_context io;

  int count = 0;
  asio::steady_timer t(io, asio::chrono::seconds(1));
  t.async_wait(boost::bind(print,
        asio::placeholders::error, &t, &count));

  io.run();

  std::cout << "Final count is " << count << std::endl;

  return 0;
}

Return to Timer.3 - Binding arguments to a handler


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer4.html000066400000000000000000000142321340672067200207330ustar00rootroot00000000000000 Timer.4 - Using a member function as a handler
asio C++ library

PrevUpHomeNext

In this tutorial we will see how to use a class member function as a callback handler. The program should execute identically to the tutorial program from tutorial Timer.3.

#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>

Instead of defining a free function print as the callback handler, as we did in the earlier tutorial programs, we now define a class called printer.

class printer
{
public:

The constructor of this class will take a reference to the io_context object and use it when initialising the timer_ member. The counter used to shut down the program is now also a member of the class.

  printer(asio::io_context& io)
    : timer_(io, asio::chrono::seconds(1)),
      count_(0)
  {

The boost::bind function works just as well with class member functions as with free functions. Since all non-static class member functions have an implicit this parameter, we need to bind this to the function. As in tutorial Timer.3, boost::bind converts our callback handler (now a member function) into a function object that can be invoked as though it has the signature void(const asio::error_code&).

You will note that the asio::placeholders::error placeholder is not specified here, as the print member function does not accept an error object as a parameter.

    timer_.async_wait(boost::bind(&printer::print, this));
  }

In the class destructor we will print out the final value of the counter.

  ~printer()
  {
    std::cout << "Final count is " << count_ << std::endl;
  }

The print member function is very similar to the print function from tutorial Timer.3, except that it now operates on the class data members instead of having the timer and counter passed in as parameters.

  void print()
  {
    if (count_ < 5)
    {
      std::cout << count_ << std::endl;
      ++count_;

      timer_.expires_at(timer_.expiry() + asio::chrono::seconds(1));
      timer_.async_wait(boost::bind(&printer::print, this));
    }
  }

private:
  asio::steady_timer timer_;
  int count_;
};

The main function is much simpler than before, as it now declares a local printer object before running the io_context as normal.

int main()
{
  asio::io_context io;
  printer p(io);
  io.run();

  return 0;
}

See the full source listing

Return to the tutorial index

Previous: Timer.3 - Binding arguments to a handler

Next: Timer.5 - Synchronising handlers in multithreaded programs


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer4/000077500000000000000000000000001340672067200200435ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tuttimer4/src.html000066400000000000000000000070751340672067200215310ustar00rootroot00000000000000 Source listing for Timer.4
asio C++ library

PrevUpHomeNext
//
// timer.cpp
// ~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>

class printer
{
public:
  printer(asio::io_context& io)
    : timer_(io, asio::chrono::seconds(1)),
      count_(0)
  {
    timer_.async_wait(boost::bind(&printer::print, this));
  }

  ~printer()
  {
    std::cout << "Final count is " << count_ << std::endl;
  }

  void print()
  {
    if (count_ < 5)
    {
      std::cout << count_ << std::endl;
      ++count_;

      timer_.expires_at(timer_.expiry() + asio::chrono::seconds(1));
      timer_.async_wait(boost::bind(&printer::print, this));
    }
  }

private:
  asio::steady_timer timer_;
  int count_;
};

int main()
{
  asio::io_context io;
  printer p(io);
  io.run();

  return 0;
}

Return to Timer.4 - Using a member function as a handler


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer5.html000066400000000000000000000232271340672067200207400ustar00rootroot00000000000000 Timer.5 - Synchronising handlers in multithreaded programs
asio C++ library

PrevUpHomeNext

This tutorial demonstrates the use of the io_context::strand class to synchronise callback handlers in a multithreaded program.

The previous four tutorials avoided the issue of handler synchronisation by calling the io_context::run() function from one thread only. As you already know, the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling io_context::run(). Consequently, calling io_context::run() from only one thread ensures that callback handlers cannot run concurrently.

The single threaded approach is usually the best place to start when developing applications using asio. The downside is the limitations it places on programs, particularly servers, including:

  • Poor responsiveness when handlers can take a long time to complete.
  • An inability to scale on multiprocessor systems.

If you find yourself running into these limitations, an alternative approach is to have a pool of threads calling io_context::run(). However, as this allows handlers to execute concurrently, we need a method of synchronisation when handlers might be accessing a shared, thread-unsafe resource.

#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>

We start by defining a class called printer, similar to the class in the previous tutorial. This class will extend the previous tutorial by running two timers in parallel.

class printer
{
public:

In addition to initialising a pair of asio::steady_timer members, the constructor initialises the strand_ member, an object of type io_context::strand.

An io_context::strand is an executor that guarantees that, for those handlers that are dispatched through it, an executing handler will be allowed to complete before the next one is started. This is guaranteed irrespective of the number of threads that are calling io_context::run(). Of course, the handlers may still execute concurrently with other handlers that were not dispatched through an io_context::strand, or were dispatched through a different io_context::strand object.

  printer(asio::io_context& io)
    : strand_(io),
      timer1_(io, asio::chrono::seconds(1)),
      timer2_(io, asio::chrono::seconds(1)),
      count_(0)
  {

When initiating the asynchronous operations, each callback handler is "bound" to an io_context::strand object. The asio::io_context::strand::bind_executor() function returns a new handler that automatically dispatches its contained handler through the io_context::strand object. By binding the handlers to the same io_context::strand, we are ensuring that they cannot execute concurrently.

    timer1_.async_wait(asio::bind_executor(strand_,
          boost::bind(&printer::print1, this)));

    timer2_.async_wait(asio::bind_executor(strand_,
          boost::bind(&printer::print2, this)));
  }

  ~printer()
  {
    std::cout << "Final count is " << count_ << std::endl;
  }

In a multithreaded program, the handlers for asynchronous operations should be synchronised if they access shared resources. In this tutorial, the shared resources used by the handlers (print1 and print2) are std::cout and the count_ data member.

  void print1()
  {
    if (count_ < 10)
    {
      std::cout << "Timer 1: " << count_ << std::endl;
      ++count_;

      timer1_.expires_at(timer1_.expiry() + asio::chrono::seconds(1));

      timer1_.async_wait(asio::bind_executor(strand_,
            boost::bind(&printer::print1, this)));
    }
  }

  void print2()
  {
    if (count_ < 10)
    {
      std::cout << "Timer 2: " << count_ << std::endl;
      ++count_;

      timer2_.expires_at(timer2_.expiry() + asio::chrono::seconds(1));

      timer2_.async_wait(asio::bind_executor(strand_,
            boost::bind(&printer::print2, this)));
    }
  }

private:
  asio::io_context::strand strand_;
  asio::steady_timer timer1_;
  asio::steady_timer timer2_;
  int count_;
};

The main function now causes io_context::run() to be called from two threads: the main thread and one additional thread. This is accomplished using an thread object.

Just as it would with a call from a single thread, concurrent calls to io_context::run() will continue to execute while there is "work" left to do. The background thread will not exit until all asynchronous operations have completed.

int main()
{
  asio::io_context io;
  printer p(io);
  asio::thread t(boost::bind(&asio::io_context::run, &io));
  io.run();
  t.join();

  return 0;
}

See the full source listing

Return to the tutorial index

Previous: Timer.4 - Using a member function as a handler


PrevUpHomeNext
asio-1.12.2/doc/asio/tutorial/tuttimer5/000077500000000000000000000000001340672067200200445ustar00rootroot00000000000000asio-1.12.2/doc/asio/tutorial/tuttimer5/src.html000066400000000000000000000105371340672067200215270ustar00rootroot00000000000000 Source listing for Timer.5
asio C++ library

PrevUpHomeNext
//
// timer.cpp
// ~~~~~~~~~
//
// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <iostream>
#include <asio.hpp>
#include <boost/bind.hpp>

class printer
{
public:
  printer(asio::io_context& io)
    : strand_(io),
      timer1_(io, asio::chrono::seconds(1)),
      timer2_(io, asio::chrono::seconds(1)),
      count_(0)
  {
    timer1_.async_wait(asio::bind_executor(strand_,
          boost::bind(&printer::print1, this)));

    timer2_.async_wait(asio::bind_executor(strand_,
          boost::bind(&printer::print2, this)));
  }

  ~printer()
  {
    std::cout << "Final count is " << count_ << std::endl;
  }

  void print1()
  {
    if (count_ < 10)
    {
      std::cout << "Timer 1: " << count_ << std::endl;
      ++count_;

      timer1_.expires_at(timer1_.expiry() + asio::chrono::seconds(1));

      timer1_.async_wait(asio::bind_executor(strand_,
            boost::bind(&printer::print1, this)));
    }
  }

  void print2()
  {
    if (count_ < 10)
    {
      std::cout << "Timer 2: " << count_ << std::endl;
      ++count_;

      timer2_.expires_at(timer2_.expiry() + asio::chrono::seconds(1));

      timer2_.async_wait(asio::bind_executor(strand_,
            boost::bind(&printer::print2, this)));
    }
  }

private:
  asio::io_context::strand strand_;
  asio::steady_timer timer1_;
  asio::steady_timer timer2_;
  int count_;
};

int main()
{
  asio::io_context io;
  printer p(io);
  asio::thread t(boost::bind(&asio::io_context::run, &io));
  io.run();
  t.join();

  return 0;
}

Return to Timer.5 - Synchronising handlers in multithreaded programs


PrevUpHomeNext
asio-1.12.2/doc/asio/using.html000066400000000000000000000557401340672067200162650ustar00rootroot00000000000000 Using Asio
asio C++ library

PrevUpHomeNext

Supported Platforms

The following platform and compiler combinations are regularly tested:

  • Linux using g++ 4.1 or later
  • Linux using clang 3.2 or later
  • FreeBSD using g++ 4.1 or later
  • macOS using Xcode 8 or later
  • Win32 using Visual C++ 9.0 or later
  • Win32 using g++ 4.1 or later (MinGW)
  • Win64 using Visual C++ 9.0 or later

The following platforms may also work:

  • AIX
  • Android
  • HP-UX
  • iOS
  • NetBSD
  • OpenBSD
  • QNX Neutrino
  • Solaris
  • Tru64
  • Win32 using Cygwin. (__USE_W32_SOCKETS must be defined.)

Dependencies

The following libraries must be available in order to link programs that use Asio:

  • Boost.Coroutine (optional) if you use spawn() to launch coroutines.
  • Boost.Regex (optional) if you use any of the read_until() or async_read_until() overloads that take a boost::regex parameter.
  • OpenSSL (optional) if you use Asio's SSL support.

Furthermore, some of the examples also require Boost.Date_Time or Boost.Serialization libraries.

[Note] Note

With MSVC or Borland C++ you may want to add -DBOOST_DATE_TIME_NO_LIB and -DBOOST_REGEX_NO_LIB to your project settings to disable autolinking of the Boost.Date_Time and Boost.Regex libraries respectively. Alternatively, you may choose to build these libraries and link to them.

Optional separate compilation

By default, Asio is a header-only library. However, some developers may prefer to build Asio using separately compiled source code. To do this, add #include <asio/impl/src.hpp> to one (and only one) source file in a program, then build the program with ASIO_SEPARATE_COMPILATION defined in the project/compiler settings. Alternatively, ASIO_DYN_LINK may be defined to build a separately-compiled Asio as part of a shared library.

If using Asio's SSL support, you will also need to add #include <asio/ssl/impl/src.hpp>.

Building the tests and examples on Linux or UNIX

If the boost directory (e.g. the directory called boost_1_34_1) is in the same directory as the asio source kit, then you may configure asio by simply going:

./configure

in the root directory of the asio source kit. Note that configure will always use the most recent boost version it knows about (i.e. 1.34.1) in preference to earlier versions, if there is more than one version present.

If the boost directory is in some other location, then you need to specify this directory when running configure:

./configure --with-boost=path_to_boost

When specifying the boost directory in this way you should ensure that you use an absolute path.

To build the examples, simply run make in the root directory of the asio source kit. To also build and run the unit tests, to confirm that asio is working correctly, run make check.

Building the tests and examples with MSVC

To build using the MSVC 9.0 (or later) command line compiler, perform the following steps in a Command Prompt window:

  • If you are using a version of boost other than 1.34.1, or if the boost directory (i.e. the directory called boost_1_34_1) is not in the same directory as the asio source kit, then specify the location of boost by running a command similar to set BOOSTDIR=path_to_boost. Ensure that you specify an absolute path.
  • Change to the asio src directory.
  • Execute the command nmake -f Makefile.msc.
  • Execute the command nmake -f Makefile.msc check to run a suite of tests to confirm that asio is working correctly.

Building the tests and examples with MinGW

To build using the MinGW g++ compiler from the command line, perform the following steps in a Command Prompt window:

  • If you are using a version of boost other than 1.34.1, or if the boost directory (i.e. the directory called boost_1_34_1) is not in the same directory as the asio source kit, then specify the location of boost by running a command similar to set BOOSTDIR=path_to_boost. Ensure that you specify an absolute path using forward slashes (i.e. c:/projects/boost_1_34_1 rather than c:\projects\boost_1_34_1).
  • Change to the asio src directory.
  • Execute the command make -f Makefile.mgw.
  • Execute the command make -f Makefile.mgw check to run a suite of tests to confirm that asio is working correctly.
[Note] Note

The above instructions do not work when building inside MSYS. If you want to build using MSYS, you should use export rather than set to specify the location of boost.

Macros

The macros listed in the table below may be used to control the behaviour of Asio.

Macro

Description

ASIO_ENABLE_BUFFER_DEBUGGING

Enables Asio's buffer debugging support, which can help identify when invalid buffers are used in read or write operations (e.g. if a std::string object being written is destroyed before the write operation completes).

When using Microsoft Visual C++ 11.0 or later, this macro is defined automatically if the compiler's iterator debugging support is enabled, unless ASIO_DISABLE_BUFFER_DEBUGGING has been defined.

When using g++, this macro is defined automatically if standard library debugging is enabled (_GLIBCXX_DEBUG is defined), unless ASIO_DISABLE_BUFFER_DEBUGGING has been defined.

ASIO_DISABLE_BUFFER_DEBUGGING

Explictly disables Asio's buffer debugging support.

ASIO_DISABLE_DEV_POLL

Explicitly disables /dev/poll support on Solaris, forcing the use of a select-based implementation.

ASIO_DISABLE_EPOLL

Explicitly disables epoll support on Linux, forcing the use of a select-based implementation.

ASIO_DISABLE_EVENTFD

Explicitly disables eventfd support on Linux, forcing the use of a pipe to interrupt blocked epoll/select system calls.

ASIO_DISABLE_KQUEUE

Explicitly disables kqueue support on macOS and BSD variants, forcing the use of a select-based implementation.

ASIO_DISABLE_IOCP

Explicitly disables I/O completion ports support on Windows, forcing the use of a select-based implementation.

ASIO_DISABLE_THREADS

Explicitly disables Asio's threading support, independent of whether or not Boost supports threads.

ASIO_NO_WIN32_LEAN_AND_MEAN

By default, Asio will automatically define WIN32_LEAN_AND_MEAN when compiling for Windows, to minimise the number of Windows SDK header files and features that are included. The presence of ASIO_NO_WIN32_LEAN_AND_MEAN prevents WIN32_LEAN_AND_MEAN from being defined.

ASIO_NO_NOMINMAX

By default, Asio will automatically define NOMINMAX when compiling for Windows, to suppress the definition of the min() and max() macros. The presence of ASIO_NO_NOMINMAX prevents NOMINMAX from being defined.

ASIO_NO_DEFAULT_LINKED_LIBS

When compiling for Windows using Microsoft Visual C++ or Borland C++, Asio will automatically link in the necessary Windows SDK libraries for sockets support (i.e. ws2_32.lib and mswsock.lib, or ws2.lib when building for Windows CE). The ASIO_NO_DEFAULT_LINKED_LIBS macro prevents these libraries from being linked.

ASIO_ENABLE_CANCELIO

Enables use of the CancelIo function on older versions of Windows. If not enabled, calls to cancel() on a socket object will always fail with asio::error::operation_not_supported when run on Windows XP, Windows Server 2003, and earlier versions of Windows. When running on Windows Vista, Windows Server 2008, and later, the CancelIoEx function is always used.

The CancelIo function has two issues that should be considered before enabling its use:

* It will only cancel asynchronous operations that were initiated in the current thread.

* It can appear to complete without error, but the request to cancel the unfinished operations may be silently ignored by the operating system. Whether it works or not seems to depend on the drivers that are installed.

For portable cancellation, consider using one of the following alternatives:

* Disable asio's I/O completion port backend by defining ASIO_DISABLE_IOCP.

* Use the socket object's close() function to simultaneously cancel the outstanding operations and close the socket.

ASIO_NO_TYPEID

Disables uses of the typeid operator in asio. Defined automatically if BOOST_NO_TYPEID is defined.

ASIO_HASH_MAP_BUCKETS

Determines the number of buckets in asio's internal hash_map objects. The value should be a comma separated list of prime numbers, in ascending order. The hash_map implementation will automatically increase the number of buckets as the number of elements in the map increases.

Some examples:

* Defining ASIO_HASH_MAP_BUCKETS to 1021 means that the hash_map objects will always contain 1021 buckets, irrespective of the number of elements in the map.

* Defining ASIO_HASH_MAP_BUCKETS to 53,389,1543 means that the hash_map objects will initially contain 53 buckets. The number of buckets will be increased to 389 and then 1543 as elements are added to the map.

ASIO_ENABLE_OLD_SERVICES

The service template parameters, and the corresponding classes, are disabled by default. For example, instead of basic_socket<Protocol, SocketService> we now have simply basic_socket<Protocol>. The old interface can be enabled by defining the ASIO_ENABLE_OLD_SERVICES macro.

Mailing List

A mailing list specifically for Asio may be found on SourceForge.net. Newsgroup access is provided via Gmane.

Wiki

Users are encouraged to share examples, tips and FAQs on the Asio wiki, which is located at http://think-async.com/Asio/.


PrevUpHomeNext
asio-1.12.2/doc/async_op1.png000066400000000000000000000573041340672067200157170ustar00rootroot00000000000000‰PNG  IHDR~ƒ,Ö{;sRGB®Îé@IDATxí˜TEÖ†K1/˜EEÌY1§5‹Y1dÕ5°ÌŠ9`V̈9+‚Š sVÌŒˆ EÌèýë=»ÕÏL÷LwO‡{oçyzîí*|ÕóUÕ©SçLEÑN"„€õ‚À¨é<ñGõR[ÕS! Üðé‚B@Ô"þújoÕV!àDüú! ê  ~øá‡»é¦›NŸ˜b0Ë,³¸>ú¨…VÔm! ²˜!û‹Î›"ðÅ_¸ž={::I¼øöÛoÝè8véÒ%^…Si„@ŒñÐ8 -´ÛqÇ xRTO?ý´šÙ)/!¤êIMSª"B@Âñ†“žB@¤jšRB@†€ˆ¿0œô”B 5ˆøSÓ”ªˆB 0Dü…ᤧ„€©A@ÄŸš¦TE„€…! â/ '=%„€H "þÔ4¥*"„€( a8é)! „@jñ§¦)U! „@aˆø ÃIO ! Rƒ€ˆ?5M©Š!  C@Ä_NzJ!Dü©iJUD!P"þÂpÒSB@Ô  @,enÊSO=Õ-¾øân—]viò„ ÜE]ä8à·ÔRK5¸W®/#FŒp=öX&¹é§ŸÞ­»îºn³Í6s3Í4SæºN„€¨o4â/sû­kß}÷uŸ|òIƒ”=ôP÷òË/»%–X¢Áõr~yá…Ü]wÝåf˜aûüþûïîøãw‹,²ˆûí·ßÊ™•ÒB ÁˆøËÜx}úôq=zôp}‡zÈ=øàƒîꫯvŒÂ‘ï¾ûÎ}óÍ7á‘¢?þøcÎw]tQwÞyçÙç²Ë.s<òˆãÙ{î¹§ÉóÙiÐIÐYýý÷ßMžã¯¿þšóz¸øÃ?„S;R¿(Š\ËþòÓO?eußÿ}ƒïú"„@åñW[²øá‡„Ú¯_?wä‘Gºå—_Þ}öÙgn­µÖr‹-¶˜ƒ¤×\sM‡9ýôÓÝöÛooçü™2eŠ›yæ™ß‘õÖ[ÏuÖY–Îa‡f×ZúÓ±cGñüñÇöhã4þúë/׿7çœsºîÝ»»XÀ 6,“ì}÷Ýç\pA»¿Á8:¶sÎ9Çî4Èí´ÓNn=ö°ºp‘ŽUÖ’K.éæŸþAêW[m5wÔQGÙý¹æšËê>|øpËs¾ùæs+­´R«:ÃL¡u"„@³ˆø›…§´›¨sN8á#ü3Î8Ã9ñÄí¸Ï>ûØÀäÉ“£dž…8HøÏ?ÿ´sþ0bþã?2#gÎ/¼ðB÷ïÿÛ 80ó\ö *>úÈ>o¼ñ†;å”Sܘ1cÜÎ;ïl5Nãšk®±ÙÀøñãÝ×_íìvß}wGGA'Å{矾£¼œ_wÝunêÔ©–å…¸Û¶mëž}öY»vÜqÇYžÌfÞ|óMGú¯¿þºÝ£nt*·ß~»7nœåÑ·o_ë$™!€ª*‰•E îwQe@r£G6BüôÓOÝĉíóÕW_¹ŸþÙôá(£ëRåè£v·Ýv›;í´ÓÜã?îf™e#RÎ_yåSù öA%TÌH·wïÞîÀÌ[,È~ÅW´ûÓM7[xá…*Ÿ®]»fÞÉN"ßqÇmÔÍ[o½µc–Àl ˜¥ìºë®öî~ûíç.¸à‚L:œ0R'}ê¶·Þz«ufÿ|`3:žUVYÅÞƒè©/²ì²ËÚldå•W¶ïÌ~èJ‘N:Y¶iÓÆÊ‘ό3ÎèfuÖ&ŸüãnŽ9æ°™ Çð™wÞy]ûöí3fBà(iB õÄÿùçŸ;=_|ñEû¼õÖ[™…Nu ê ˆ‰#£Wˆ¢F5Á{¥„Ãèþª«®r¨H:¬kÑq…W„N§±0:o,+¬°BãK ¾¯¾úêî¹çžkp­ñ—ì4P3¡~ÉÊDyXèÒ¥Kö-׳gÏß!ï°nÁñÞ{ïÍtt@o¶ 6 FX@`™E”"t>ÌDx?|èˆÀõ :1ŽáóÔß3 Îùpž½6AéÜè@:wîlå§Ó$!:âG§þÌ3Ϙú=;£M¬\ ;H 5ÉÒK/mŸvíÚU´­ Â@Šd@D¨Qá¡A •ÆÄôòö@…þ0£l¡sDwO'–Ù‚‰Ñu.A¥ƒJ‹Mè\w•=÷êÕ+W‘о6mÚ4÷í·ßšÚ ÕŸI“&Ùl ÕƒŽtŒa!œveFE›¢º[n¹ål¦Ä ¢Rõ-ºbzAd! âçŸûuT+èœYåŸoË-·t—^z©c<Ûl³eU»6§ÐÓ³@Êì⦛nr›nº©©¸Ï  ¤qÉ%—T¼ `„Îuù£âA݅ʇÙÀI'䨰Å[˜~â[ýõs– « mYØEÐçÓye s¾£‹ ˜ùñiNøÍª©?üÐ>œ³ÖÁuêŒ:‰ê²UW]ÕÏé™EH„@-H4ñCå7Þh£4FôèÔ·Ûn;‡=}ÜRè)ßwÜá˜q &@=‚°ÑŠ…TÈâAž=c¨D}°óg„%3!,ˆÀ3è¹é|X|†ÈÐÍo¼ñƦ·ÏUFÝ_|±Í^ =:\Ö°hZÏ[$¥IhKFùÙk'¡~¨‘Þ{ï=÷î»ïÚ‡Y‹ÖÁJ 1ùźkuÖi±“ éê(Ê…Àtþ:¿±u¹r)c:¢d$ÿÄO˜Úá_ÿú—Ûm·Ý:×r ¡LéËim‚uËûï¿oÄŸK€*SÈjî¶e´Žåä )¡óf-ëÿAd3‚|X3âeQ”òå—_šIh¹Õ,̳ñÒK/ÙzL¾òÄá:¿Û±cÇš UeF5Æzê!::Ç6ÚÈ:Ý8”YeH-Ã3â‡,o¹å3cäÕÃý÷ßo£äJŠËÝüLõƒåM®´Ñ÷W[ аÐòFåƒjbÈ!6:¥óÃjˆEïæ¤qÜ¡C‡æ¯‹{tz̪øó]:VTg¬£ða¦ÅïCÔ|˜Å2»r"û_#¢n¸ÁlÃ1»Ä´Ý1ÿ@’Ê"À¬»~6¤± ]5úþ–ôß•-UzRg‡„ŽàÉ'Ÿ´uÖ]Ø2Ï<ó¸­¶ÚÊ6öýóŸÿÌÌÆÒƒ‚jR bMü¨tØ„.}÷±Ç›×¢¤àÕCžì$ÎÞM\u®UéX' J,c¬€» ®qŸÅxÔš›l²‰fµj¨ä;}ë€þË‘m·ÝÖ¬sø~ÅWˆôãØX*SÅÀÊŠ…qö’°îsæ™gÚ‘N€uÜv z“bˆñ£SfÇ+V8ñâõ ÿ!PÏ@ô|°™‹²—‚vÔn¬ðÁ5Æ/¿üRÏ©îE âê©§ltN“ÀQ£Fµ¸ˆXD=õ¨H X‚ 0Àö°Kó_:…0 `_D4‡@͉ŸQ ‡¸5`¤v×&ÍR§9uOT ü±7×ÇsŒ­ °Ž y¯½öZ¥²Uº G ¦ÄÿÎ;ïØ4õæ›o6S6¬u°$‘!P¸Þ@MÊhŸìì˜f·0û°’ljFüè$±g‡(®€%B@´œâág‰ÑþÈ‘#mó!³iLAQŸJ„TøÙº×^{ÙV~¬ ›”!P^íãœÿ1Tª ´°”C*©oªJüx9d[:öù<ð€mPiì¶·¾›CµåG€ÿ9v³Ó»±?üpsC]þÜ”b¨ñãŒÐ~DZÂO É$B@T6áÇ{¸‡`˜@< s×U=ÀRœSUˆÿé§Ÿ6'Tx2|ùå—ån!Å?(U-Þ0ÃÆjŽÝðìÈÆÁ!›%Ù ©*Nü¨up6Ås|½ã¯]"„@m˜{î¹-R›$™…£þ¹è¢‹2Áej[:å^i*JüÄ_eT±÷Þ{[°jº®4pJ_¤Ô¯XõïßßBp®»îºw×’t#P1â¿óÎ;Ýž{îiÁÄñ³£ Yéþ!©vÉE€Ù)§œbæž„d#%Îá$éE "Ä?tèPó xÈ!‡¸óÎ;/½è©fB E@ø¯¾úªÛf›mÌì7Ĉ–¤²?vÃøÌg‰Ø²! ’ƒ!3¯½öZ‡š–8n¸¡œON TÒB(+ñc²I8ZKºà!Ì`ˆ ¤O¼0ÃZ")/»ì²‹ÙþãˆuâKÒƒ@Ùbîâ/œÄl}衇ª/¶ÍÁNGlœ§M›f§´FQ ”[Ÿ&“°Faw*•$åEÿ;ì`±‚q‘Î^Iâ^âÿí·ß,&+GþgŸ}öD#ƒ[‰ë¯¿Þô›ûì³E>Jt…R^x,ǰC'(I¹º§º‚ªG`ìý‰y(Ä .èe=GÊl}¿ýö³­à8J:éãý&#þ>}úˆôãø³mT¦sÎ9Çv¡âD#ÒFà”áëŒ3Îh³_<€âg‹Y~¶$ÉE Õ1w d#|б37é‚?“¯¿þÚí»ï¾nŽ9æHzuê¢ü]ºt±u¥Ë.»LÄ_¡g&……ÞtñóÃìžØ’d"Ð*âg1—˜ 't’íÌM&ÿ_j¢á"«$F7’ä °ÿþûÛopâĉnÁLNÁVÒ£Ž:ÊÍ<ó̶?‡#€$y´9ÙK)Åþõ×_ÝÆoì–Xb 7dÈTlÐBUÕ­[7·üòË—‰Þ©!;wvW_}µÃF’Ê!гgO‡Ù'ƒ¾ùæ›ÏõèÑ£r™)åJ 0¦ä?þÕW_¹Gyĥŵ2Ö ’d"€Õ¾æÙqÊÆAIeàÿuXCþ‘$’ˆÿùçŸw—_~¹mðXxá…“S[•4ÕôêÕËFýì¿h×®]ªë‡Êxâ‰Õ ¾ -´[c5âP,•¡Š6çÄÔqå•WvlžÁ^_"â‚#P¼¿Þu×]Zä­R£`·ÕV[™Ÿâl°Ð.‰=Ë޹‹é›µ®¼òÊØ×N¬/f™e·úê«+¸x›5/»˜ùÓüüóÏUÌ]Y•Š@QÄÿå—_ººãŽ;ÎFü¥fª÷„@¥À­ð³Ï>[©ä•nÚ¶mëî¹çSû`]%‰?E?„ÏBŽ6oÄ¿a뵄k®¹¦íàÅêLR=°ªºé¦›ló£´ÕýԜ &~lö‰ÓɈŸ)u҅ݹcÇŽMz5TþFàP ½3ÁE$ÕE`‹-¶0mÀ¡‡jûaª›»r+‚‰ÿ´ÓN³ðl;î¸c1éÇòÙ?üÐ7.ñî%b n Ånkö–àW^R}è²âŠ+š¥>~$ñD  â÷ÝwM‡7`À€T8Á‘Üâ‹/®žñüM¶ºT«¬²Š{ýõ×[Ž({ñã?zôhwÆgŸ€Þ¨ ÿYgå–[n9Û S•RU0üðŒ?Þ±ûP’Nˆ$õöÛo§³r ¨ÕRK-åÎ<óL#~ùñgƒµHüìÎÅ.Ÿipy‹ë^¶õ/¶Øbñl•ªÕ0H3fŒÅRhubJ $þóŸÿ˜û“ƒ:ÈEQTRz©r´Hüƒ6]øÎ;ï\¹RT)e~€8aC)I/? ?øàƒôV2æ5Ã…ÞRÙÔ…Qˆ$^4Küÿý·»êª«\ß¾}SaÉóé§ŸÚˆA’^:uêd.X›’ÔÀåè£vS¦L©]A”sš%~ÂÙ}ñÅŽ(Til»YÔEÕ#I7„•¹níÛ˜Þ?þøÃ}öÙµ/ŒJA Yâ'ˆ5K.¹dæ…$Ÿ°è„¯}IúÀ¤SÄ_ûvžgžy>ü/¹ä pTû© —ø±Á:t¨Ûe—]„”HÌì¤ãG³áº·XJâ@^âÇÖ}òäÉn›m¶‰GIU !P"þ"Àªð£m!L#®ð÷%©=y‰äÈ‘fò˜†8ºµ‡Y%¨6ÿ?þè¾ûî»jg­ür pÀX kT>’Ú#Ð,ño²É&µ/¡J J@§a›õ$µG€ø¼ØôS®›kß9‰ÿ—_~1‡¸¸M³<öØcæÐ+Íu¬×ºÍ;ï¼VÄŸ_À¿ÿýo ×xÝu×ŧPuZ’œÄ'N<®ºêª©…eĈn£6rtr’t"À¨_ÄŸ¶¥3ÞsÏ=ÝÅ_¬Ý¼5n–œÄK[BØ¥)ŒN»ØD2jÔ(‡ûX™uÖø—W…ì!þ &T!'eQ(ŒúñŽ«`9…"V™çr?;—_~ùÊäXƒT1M½ÿþûÍŽ·½X*õëׯ%Q–ÕD€¼„ •ÄÜ¥³[êžÚ¶INâg”´è¢‹Ö¶deÌ ÜdØŒÆ6òí¶Û®Œ9(©8"°ÐB ¹Ï?ÿ<ŽE«ë2á ÇS§N­kjYùœÄÿÉ'Ÿ¤ŠøÙ2ŽÌ4ÓLµÄZyWŽ;Šø«Œy!Ù¡feNœ^ImÈIüŒ’-¥E¦M›fU™a†ÒR%Õ£ þo¿ýÖ,I x\T Ü8l¸á†æ JY*›F4!~\cgÛ®]»F&÷+^F\ÅJêˆÁÑ $^ j}ôÑGeÓ_£fi„>äŸ&â ÒH¦F¿“DfÛ¡C+÷ĉYþ4z«­¶²˜ ?üpš«Ûº5!~\#³Î:kl ]lÁᇠØ÷õ|2À‚‹}¢ÈIâ…@ûöíÝšk®éî½÷Þx¬NJÓ„øÃhXM8‰Â„,Ô:án:m3›4´U¹ë0ÿüó‹øË j™ÒÃ%Ìã?^¦Ô”L14!þ0Ò#ÿb‹ë³³Ï>»cj9Ûl³Åµˆ*W…ñWØ2$»Á˜·NÅM(˜E&Ñ„ø·iÓF‹.E©Ç㉀ˆ?žíB©ºwïnk‰õW¿š?EXpÁe Qý¶PŽ@âÿúë¯+²’l-˜W¯³Î:ޝ’ê"“øYdG`r‰H:8Ö_OXà}ùå—ãY¸—*/ñ˹UŠ[½Žª&âwcãJš•U·r?ÚÞxãê–D¹ À.Ño¾ù¦)+Ér Э[7KæÕW_-GrJ£@r=Lǯø˜¢¨Çb‹#~B0·±-hlî¹ç¶¯¯¼òJ"P›jç$~¦_lzJ“îmܸqnÒ¤IµAY¹Ö ˆŸýн[³&h1cöؼýöÛ->§ʇ@NâÇî)ØC=T¾œjœ–ÄÔŒ(‘É“'×WÅT[\¥ðÁ *qò‹š“ø©ÖÖ[omÁKÒâæ€`Ï¿ÿþ{ò[L5( 9çœÓžñ[U†ø™‘gŠUͼN3k–øñqòÒK/5f¯½ör'žxb“ëq¾øqMopI: „("âoûBü ʈÒXžyæ­Ï4¥ ßó?–=Ë.»¬2dH“l^|ñE› 4¹ƒ ÄÖÅÝkcÁÛhpÖîAøÔ/M*­P7ÿ‹ÀŒ3Îh®:DüñøEœzê©î£>jP˜Å_ܵmÛÖ½ùæ› ®ßpà nÝu×uÄ—”¼ÄO6F¾í¶ÛÜ?üÐ Wü›¿ÿþû±í‰_xá÷È#4(ó_ýÕÄ áß°æ‡'I/ŒúEüµo_ÔÆ×_½[c5èôY‡!*¡Å[¬be©ç„›¶:` Ì[n¹Å}üñÇî¸ãŽ3çmDsYüÄLÜJ¯½öÚ™»èûñùͨïöÛo·"23@Åâ’$ݰ°¯|Ú5›Dù?ýé§ŸŒüéî¾ûnwá…šY'ÿŸûí·_| ²’4 þÁƒ›~œF9âˆ#ÜСC-P½î Aƒ¬Qnºé¦ ¡ÒS35‹£P‡ìˆ[,↵ ™°Ö¢Q[®üeÒˆ¿ü˜¶6ÅsÏ=׸#]0϶öáw‡vhm6z? ˆ¿wïÞ®oß¾ø\`ÀwìØÑüó?ðÀ‡WÏ?ÿ|f‘øÑ£GçIº¶—™• CÌÖß3Š€ð¹†¥GçÎk[Hå^DüU¹¨LÖ[o=·þúë›FògôÏÿ,‚ .kiH*ƒ@âçä²Ë.so½õ–‘fÈ’\Œþê{Øa‘Æq7”›}ö¨?”›û«­¶ZxLÇ”#€ª•‚$^œsÎ9™A$äÔÌì¯éÓ§O¼ ›²Ò4 þP76o±ÀrÇw˜-½1¤&<Çõ¸.ðRFHŸ":¨lá;fŸ’ú@€‘ãÏ?ÿ\•MP-QÇn³Í6™‘~(z§NLï¾ëX~2b£ôwÚi'Ó»±¨Ëô‹O¶Ð3Ç݃'#{:¨ œc¥ÄþI} ñO:µ>*›°Zžyæ™ Ö Q÷hQ·òØ,ñ“=f‘l³Æ{Þf›mf%ÊA£ÊV¡T¾ÈÅåÁ¯¾úê™Q?SJ‚¸Ác„M<ï¼óܧŸ~šÓ#h1ï1úëÛ·¯ù©žk®¹ÜvÛm— χÿjfA@Ï3;åzüñÇÃ-7|øp7ß|ó¹e–YÆîÓY½ûî»nã7¶N… t.’Ú" UOmñWîñB 6Äúf¹å–3‚…8 Äœâ1ÀFt¢h1âo,żÇhœXŸþ¹{öÙgÝo¼añHøÁw;ѱÇë†jùçžë6ß|s7iÒ$SCíºë®ŽŽá§Ÿ~²u#<ÒÂU⪷դ“„x±LÛwøÓÖ¢ªOkˆ ñ6ÌÔþøc‹5¼ÔRK¹ðatk ‹ÎTFÙºþì{:¯µ$~~Û 2r VN9åwÛm·U˜_|Ñxàn­µÖr[l±…cæÊªÚrñÅ;ÊR¬ â}ùå—‹}­Ùç1à ’`®vá:„r ñÉ?þxKöé§Ÿ6µv¹ó($½Xÿ«¯¾jê›vmƒ 60þ—_~Ù¤¨PзcâÙXŠyï믿n`Þ÷æ›oæŒõIÌÛ=öØÃÔ:˜’òAÇŠ‡YIc•jÔG’x!ÀúPè]í’¡¶$F5³ÇlÁí¬³Î2Kµìëå>¿êª«Ì*Žúï¿ÿþnùå—7Âáˆð|Õ”; BmlI>µœòÉ'Ÿ8:¢\¿ ®3è+·Lœ8Ѫ’.êe4µX°æ @´Œè ýÎ;ï˜Õ ?Pôìgžy¦c””m…SÊ{,î^tÑEöê[o½å(CPÙ„ô8²€\zj“ÓW\ÑÑq0CáɈá9w ìŽc0Ê,MÍÿ`•U+a@Á³%Ì*™5²Äèo‰%–°¢1‡ŒrQ!eÿᇚú|ä‘#o&y¢¶ä|çyë";÷?ÀÈ›–Z9:uêdeðÿ,™l/¹ä’È«,êáÉßîù†Žü?tä;¨È[õdž/äÄl`©Èï[(äq=S>˜wt 'ðdË\ýõ‘àÞòƒYOxRˆü:QÔ§O»zøá‡GÞ,òÄyrŒŽ8âˆÈ»Ž¼…˜}ü@Äž{ÿý÷#?ˆˆü?{&5¯ª‰üˆÔ¾óûÛqÇ£Ýwß=šsÎ93Ï„“D‹/¾xäÉ9\Êý¨:òäoß½¥\ä׺"oˆyK´h5Öˆ¼ºÕîsÎ9ö¿âM­#þ½š4ºýöÛ£u×]7ò3©¨]»vÑC=dÏúM™‘ï\¢uÖYÇ®ƒÓÕW_m÷ø³úê«g¾û5¹È¶,Mòô–p‘7šˆü`ϰà€÷yÎïéÉüï·TÖvØ!Ú~ûí›øßôn&ÿìÊLáÿ>û×ý€Î.y2·º‚/p‚g?ã·z4(òšãîSfÄk¬ÎÞ¸ ò€È[*÷pï /Œ6Úh#NMü¬Ðø‚:{µuä7’Úuo*n¿k¯½Öø'`ý¿×ò(#õðŠÆÏ £÷.YZCü…fêGF?P.F }Ï«eìÇ–v6ñ‡ë^íùÁ9IÜ/úfþIÂóá‰+"þbkùùZ?%„Ð q¿+ÜŽ @?üzSäÕöÁÿü~‡yôÞ{ïÙ?o6ñCÞäØž…< ·8ÀÒ·‹Y¼Ñ‚  ².å<Ýpà m€C;~=ÀžåÿÿïÚN;íde¢óá·OÞ^mdÏúÙ…‘_ '¯Ê°òy}¹ÝÏ&~:A:¯R±Ð(â­ü¬²/þÏÊ+¯ùQ¿}m©¬3uñ³z+ål,øØí»ï¾ >ÙÄïgkÑž{îÁ)`ã5‘·ô³äà%ž?Š^yå†*2Lžó*íhÉ%—ÌIü”…²§“öÚ ûøÍ¦Et(ÞÊ0bPYˆ4Gü±ÚÀå+×Dü¬À­¶ÚjM®·t¡Ð÷ºBHÕ ¦¥~F.ÙR>¹„˜®;wÎu+o”ûœëbªÀ\¹ÿþ¶Ä“¥Y“QaÔ-ž LEÈwTˆü.1%ε–Å3ÙÂ>Ö–r™?£ê`/IsÖ­„¿}ôòܧcèùÎL·³Wã°·ßW¥›!ñUÅȵö0“Õìô¨ 3TAÔÿÉ'Ÿ´²ò úxÞÇ4šŽ!H¹ËÒÍwdFD‡Ä *5ܵP'ÖQ¡5'¡¬ÌbÀ•Íž¬‡äT^¬ðàYLËÁU]EÄOeJ–R¬z¼þ ¨™Fabç‰6g0§ò o«ÛÞ-s´Ï>ûDÌùlã‹ÞÖ?Âüó4Ìϼ?{¤9Ó9À ³QLMý2ò;í½“O>9ÂêÁ¼ ëïäÍ,Š1K³Zø#«ž*á6¦“µ4ç,¤È^ïy•LÓÍð¿9¯j_K:ò»Âê„c.ñê3ïÄš(ßÿd®÷²¯aÕþ/¼¡„™ªfßo|Žå –K¾È™g%ËÚ¸,Í}¬‚`1ãyák³G,²h×B̺›³l6“7›³ê©ª9'æP~‘(¶Ðü¨ÃÌØüæ’&ÅÆV—ÎÁïn´gyÆ÷|ymr³Àt ›Z‹³_¨1»džiÎt.äé§§–¦S~Ddfuøý49ò+÷fÍ)Æ,Í^hሿ€J¸â/¡Z±{%ì V‡jŽø«ªêa‡+‹HXÌøv0SG¦µÁº {JƒUl\#x›f[`)tÚCÚ¨\lÖ,Ø¢wDš3CÚœÓ5t£ÿüç?Í•3+óèü‚YubjÌÒÈÏϲ«¤s!zP)Qü›¹ªæœX °å»±YzÍÆ‚2ؾ†{xÈ,DXPAÿ†_}HÝÜ©§žš ò’ÏtŽ@+¹œ®…<ÑÕa£‹“)\6ø]¿®T³´¦ŽÕC ±%Fõr®ŸœÐKâ@UGüŒˆYÍgeœÅS>ÄÞm‚ØXÈb3U¶`îUˆà ‹bï²"Ëe6̰HÜœé÷°ÙÍ–l§kx5Äœ‹Ž„Í&uBŠ5K³—ô§j`VÇb›DçªJü¬ô3ªÆ+!ê:VÉ!MÓÇ࢖gß~ûmÛõƳ¨ƒ^xá…L›y=¸íV$½ÆBg‚yª:òÀRiÎt®9§k¼KÇÀ¨4²¡º*Õ,ô$ÕC›y$B@x<©–,¥Xõ°X‹C&¯K7øÉÀQ‚ÿ á‚à´§H8:燷9Žü.;»íýòÛb/ËüZà……X¯2Ê8†bet¼~Þ¬‹HßOÉ$‘ÏéZXÜ RV¬…X@öž;--,ˆXTöÛÛÍRgñ«Q¬³6-î”ËwÄB gcåïj h'måÈWibhnq·êÄOÁƒ3#¯êÉ[,€¸Yä‰àÉ.x¿Ìûâÿnðæd˜Qå2MkÎt®9§kùò-Õ,-Wz"þ\¨´î^XqhVñ—E¥Qiš#þš(=q…3£æ«6‚à‡}=V>l;Ïö{ÑÜû¨dØ ‘OØ$Á'—°ië„b vêåB3˜cz_ÞÏ€èþñrÇN>‰(±ˆéù4#P“¡€ú` ŽD´kÔûiB ¶#þ4¬ºÔíÛ@%ˆ"þø´…JR!ü"šù‹—9g…V²‰C@ÄŸ¸&S‹E€Ñ>"â/9=ŸVDüimYÕ+ƒ@ ~íÜÍ@¢“:G@Ä_ç?€z¨~ ~øë¡µUÇBñ‚’žI4x„EfžyæD×C…åB@Ä_.$•NlÜØ˜'B ÊNÚ¸¨"þZ ®<ãŒ@«6páñ’8³;í´Sœë˜¸²©¤|,!~m¹D¿ûr!©t*…@PqæJ¿Uªž‘#GZªæ2È•i-®Å ?úÞcg-²/*OtÑ»í¶›•·¨õpNÊ=â' Ð;ì3/]qA®#‚!¼×XJñŸtÒIŽP…Þ¥±Ûf›m§»ï_}õ•óq{Ý Aƒœw»ò©@•C ÜÄOÐC¢r¥VÊB r”Dü(¡ ñœ™Ò>¼g"¨§$õ…€w³mfÖ'B „Å]Âöë×ÏùÀ$®OŸ>‰Á°M›6VVbš¬lÅÅ7"â/¤J(á¥ã÷ŽýÝŽ;îè6Ø`7`À€DU=ìÚ ›yUx¶UøÀ?FúaÖתÄô²HE¿“hU¾ùæ›-öl’ê,:‚…G’Ê®²¶ˆŸà?! þ‹@Á:~³xà÷Ì3ϸ$F“ÂR†¨\2•¬¿Ÿ>ªž¶mÛÖ_ÅUc!‚Fü> ¸;ì°Ã\ß¾}- bž´bòO‚éiìLXñ‹øÖh*nE(hÄüñÇ›5ÌÀ+Z˜J'~ÔQG%NEUiLê!}=´²êX -ÿ§Ÿ~j±o/»ì²ÄÛ¿£ê‘Ô?þø£›cŽ9ê¯âª±ȃ@‹ªž³Ï>ÛuèÐÁ……Ý<é貈-S¦Lq³Ï>{l˧‚ j#Ð,ñùå—îÚk¯uÇsŒ¢U»e”_ÙЈ¿lP*¡” Ð,ñßpà ¶(¶Ï>û¤¤ºªF=" â¯ÇVW›C Yâ¿é¦›\ïÞ½À¢9u/öHÕû&R«Œ@^âõÕWÝèѣݞ{îYå");!P^0GžsÎ9Ë›¨R F /ñßÿýn‘Eq«­¶Z‚«×´èýõ— N»šÞÕ•´!E‘›«‹ñC`âĉ޽! þœÄs6¦ÈrfæÜ¨Q£Ü®»îšAlÛm·uï¿ÿ¾ûꫯ2×tOص‹ûøãÙ>*Uíȹ¸»ÒJ+Ypõ·ÞzË­¾úêµ+] rþâ‹/”‚à4k¯½¶[`\×—ø!ÀhñǯmT¢Ú"sÄÏÎVü—¿þúëµ-]sÇwþ‰ò #|‚ÒàÝsàÀùÓõ!:mŒEE‰9‰Ÿ’­²Ê*îå—_ŽE!+]6smläÈ‘9³Ó¦M èS ~ $B@4D /ñ/»ì²æ¨Œõ"tvøêg¦ƒŒ?Þˆþàƒvx+ÍþàäMop½­¼ÛH¥« y‰Ÿâì¼óÎîÆol0®M1«“+;–{õêå^yåÇÆ-¹Ñÿçú,±ÄÕ)”r)ˆ_#þ’áÓ‹)F YâïÛ·¯xzè¡CаjË,³Œ9p»÷Þ{Ý?þØð¦¾%Tq¨zÒL(1 ‚Æf‰¿K—.nƒ 6pW_}ul+P‰‚±Ð»øâ‹ÛH¿é+ÍÊ#ÀhòÇ݆D†4Kü—!Тˆá…v§Ÿ~º}^{íµ¦©¥ü fžea‡/~ùµÁ+ž ޳=ÜŠk×n<ÛG¥ª=E?ÅýÏþãÖYg·Ûn»Õe„®™gžÙí±Çn–Yf1òŸ2eJí[±NKpøá‡ç43fP‚[q‰¹(šøYèe´KhÆ#Ž8"wª)¿ éï¹çžn¦™fr×_½kŽüo¹å÷öÛo§‘ÚT— çœsN“5'‰økÓ&Ê5MüT«cÇŽæÆáÊ+¯´&ɨjyK9묳6 ÿ|Ñ»ˆûúÜsÏ•7s¥fÌ1ÇnêÔ©¶à ùé§Ÿ˜>T"„@nJ"~’¶ÿÈ#tûí·Ÿ«G}?Ýi¯½ör=zô0Õ× Ä7ß|ãBüׯ÷õ½tfŸ}v{9Û—Ôí·ßnxãb["„@nJ&~’;묳Lß[T?õ({Ïž=óVΩ§øÅyÁ(ó FüÈSO=ež892dH?Kýõ—©ä®ºê*‘ºG UÄߦMÇ ]÷V[mU—‹½Ù¿ üö?øàƒ¦j×é·Þz˼E†ë:¶FüXZñ;d­…M[ĉîÓ§%þ÷ß»›o¾ÙáevŸ}öqÄK–!à\«ˆq‚Ù‘ õO½‡$D¥ }÷Ýwöûb!xúé§7\‚}¹~xåA€?-¿9Fó×\sE[o½õÜwÞi¡4±ÀÂEóÞ{ïí.¾øâòd¬T„@Âh5ñS¢Q=ðÀîÙgŸµÑÿŒõ(Xj3äþdâSò ã§D¨|þüóO|à™a¦µï¾ûÚL€NY"„À(ñ“ÜÆoìîºë.]í¿ÿþ©'tÈï¼óŽé–Çg*Fž=V%ŒHÑí‡N]´yË÷¯¬zHuO wÚ…sHðàÁ™ëåËY) d#0C¹‹¿õÖ[»»ï¾ÛôýübjÇÈ+2yòdwß}÷µ¸®j ˆà 7L-&Õlçì?ù†Ògàqùå—‹ô«Ù Ê+1T„‘{õêåî¹ç³¨Øyç›ì¬L :-uNÿþýõíСƒ=Fù^e£×رcóÝÖõ"Èñ‡×Àÿ€é@t9˜Î’*¶ûôÓO;f+¯¼²>|¸kB ©TžøAÜ|óÍͼÐk¬‘TÀŠ.7‹Ž¨v˜°×¨]tQ6w¨^È €³<Ôgx½è¢‹2×u"„@^ªCüdÏ´|÷Ýww?ü°»ì²Ë\ß¾}ó–*­7~þùgóÔÉ/nX—´ÌgûõëçÎ=÷ÜÖ%¤·…@ý P=âSFº pgœq†Y]0Bÿ}½ 8 úø·ß~ûz«~ÙêËïç¼óÎsŸþyÙÒTBB ^«ž|À¡‡=í´ÓÌÖÿ¶Ûn3çfa³M¾wt]! Ê‹@U‰?Q.êv[vëÖÍÌ>Ã=…€B ²Ô„ø©Òb‹-æžþyÓõãâ{¹3¨lc+u! „ÔŒøÉœ…¹ /¼Ð=òÈ#Ö ,»ì²¶–{! „€¨ 5%þP%|üà+}ÓM7µ _˜èµJ"„€åG ÄOµØÕ‹+c|ß<ùä“n©¥–2¯ŠXÀH„€B |ĆøC•ð{3zôh‹e‹Ï•µÖZËvÀ†û: ! „@ëˆñS¶mÛº .¸À‚¸ãëf•UV±E௾úªuµÕÛB@!PÛÅÝ–ð_qÅÝ /¼àn¼ñF7räH·øâ‹»ÓO?Ýýúë¯-½ªûB@!XŽø³Ëʦ¯ÝvÛÍüÝsÌ1nàÀf :hРԺ{ή¿Î…€åF öÄ*ŒC³ã?Þ}ôÑGn—]vqGu”ëÚµ«»òÊ+ÍûexNG! „€hĨFûöíMÿO€¯¼2âéòüóÏ7Gpá9…€B 7‰#þP "^pƒ wïÞîä“Ov:urÇ{¬›8qbxLG! „€h„@b‰?ÔƒÀ.Œö?ûì3wä‘Gºë®»Î-²È"ÖL"„€ H<ñ‡êÌ9çœî¸ãŽsŸ|ò‰2dˆYo½õn X®„ ¢k½üòË¡: ! @jˆ? œ¾½øâ‹æ”h_t .¸ ÛvÛmݰaÃÜüoÕñ†n0×Ò¤ûᇶ*-½,„€¨©#þlàò>xð`ÇÆ/fDÛa‡¬èÓ§{àZezæ™gºõ×_ßÉãb‚…æJÌ,²ë¤s! „@kH5ñpþñØ,à±Ç3UûÞÿ}‡{¬„vÝuWG`˜o¿ý6¼RÐï¢#FŒpÝ»wwýõ—úf}0€¿ÿþ{Aiòå:ôÐCËšf!ùê! Ò‰@]vÓ±Ì"ðK/½dëìÆ h¯½ö²N?á„ÜS>&n!;„g›m6÷è£ÚZB›6mqu±,"ÞI9œÌщ¼öÚk÷qTitL­ÖcpÐ'B ²ÔñgÃI'pÈ!‡Ù ¢AÿñCبpðÚ³gOwÄG¸{î¹ÇM˜0!ûõÌ9ÏAXŒö‰*ÆèŸÎ„™~†žyæ™Ì³¥œtìØÑ=û쳎MlAèPXÈ.¤s ï„ã/¿ü’×í584ç{êÔ©Mf\ãÓX~øá‡¢:«ï¿ÿ¾lë/Ë¢ïB@d!à D’OªÑ-·Üxà‘÷ùàèø‡Ž<ÉG묳NÔ¯_¿È¯Ø3ÞPôÆoD~Í7ß|‘'{–çý,ÀηÜrËh̘1–“¹Û5l=GÎM/}üñÇ–¯_£°›^½dùÌ?ÿüÑŒ3Îhe™6mZÓ]ùóÏ?#ßÑÙ;Þ^ä;¹È/‚ÛSŸ~úi´æškF³Ï>{äÚ¶-rIDATUc‘_Æo÷Î9çœÈ¯D>dfä;{ÿÄO´{§œrŠÕ—:oµÕVvÍÏN"?z·g½µUägPuöê5K\$=òª¶èÖ[o5Œ½{Žh–Yf‰¼I®ÝoéâùN±¥Çt_† C!)H×‡ŠŒ.¿üòh¿ýö‹¶Øb‹Èð!øÆH,ûÄHçAGâGÂE¿·²ç)d ùÞÿýVê/¾ø"ò;—£‹/¾¸ÅZPvˆ’÷3…èàƒŽV]uU{oà 7ŒöÞ{ïÈÏV":νKl»ç±-/Áî_tÑEV?s°ût&ûSFoA 0 òj¯ˆ”ò]uÕUvßûZŠæwÞè믿6 ·Ùf»ÎŸX zøá‡3ß[:ñ·„î œˆøsÂRäÅÉ“'GcÇŽn¾ùf-‡Q~6ñgŸ3Òç{¡#þlâ?ï¼ó¢Î;7(¡×±G~ÏBƒk¹¾¬¶Új‘÷w”¹å£›nºÉ:ÊóÊ+¯dî½ùæ›VFâïÑ£Gæž7‡5âç$›øÁ`žyæ‰ÀÄ«ìCù6Ùd{–Ž…™Å’K.1c!ý "þ€„ŽB ¢ «k¿'»²›Ç>øà÷ïÿÛôßèøƒxUŒâOÈ«EܸqãÜvÛmn}dÁxƒ÷|GP› Þ]zé¥3ïz‚v»ï¾»ó*‹ŒùkÖ+ë§ ÔÉÏ^rêã½ZÊôýË/¿¼EQÃÌ·ÚxYEx¯ÿþæmÕÏœW…duB JÌP¥|R› $×PÜECn¾Ÿv£W—8¯Ò03RÜJwëÖ-ƒÏ”*¤ÉBo¶ø‘·ù)ʾ–ëœw³7šy5‘-h{5‘8¤MÌ„4‘…^ØŽ¸íK3è æž{n³˜ ïøQ½Y;ñ‹ÑX=­»îºfþÚ·o_s²×L’º%„@™Ј¿€~ùå—níµ×6Ò'=Œ¢üq7iÒ$ó$šMú­ÈÎ^õk W^Çoß±„a#ÚÎ;ïÜbÒ^Ÿîîºë.#:&:¬@öK,±„ó:óŒuŽW¹M7ÝÔ1›iIèè¦L™bm¼ñÆÎ«yœ_À5<üz‚Û|óÍÝí·ßn÷!}Ì^ ¬³Á˜m0SÍN§¥¿ê·€rC`¸ˆ¿bØ*a! „@,.UO,ÛE…B@Tå°UÊB@X" âe³¨PB@Ê! ⯶JY!KDü±lJ!P9Dü•ÃV) ! b‰€ˆ?–ÍRûB}ÿý÷îî»ïv¿ýö[í £!PVDüe…3=‰|å½÷Þsþùgz*¥š!`ˆøõCB@Ô"þ:kpUW! â×o@!Pgˆøë¬ÁU]! „€ˆ_¿! „@! ⯳Wu…€rˬß@Nä?',º(Ò€€üñ§¡+]‡üѽöÚk®S§N®k×®•ÎNé !PY†+´ReN|ê?þ¸ëÕ«—k×®›~úéí8räH×¹sçÄ×MõŠ€tüõÚòÖû°Ãsýúõs&Lp_|ñ…þå—_^àÛzL8" [%&eúã?Ü ,à=ôP7묳Z©é7.&%T1„€()¨ÕÉ;3Í4“C­ƒ<ùä“î•W^q·Ýv›:th  j t" âOg»–½V÷ÝwŸ6l˜£3øé§ŸÊž¾B zÈœ³zX§"§“O>Ù]|ñÅî›o¾q3Ì qC*U•¨7†kq·Þš¼Àúâÿ‚ .pK/½´›6mZæ­-·ÜÒýðÃnÒ¤I™k:B Yˆø“Õ^U+-þø§L™bjºŸþÙ¾_rÉ%®K—.®cÇŽU+‹2B ¼ˆøË‹gªR›nºéÜ)§œâÎ8ã #úöíÛ»—^zÉÝ~ûí©ª§*#ê )ië­Å‹¬ïN;íäz÷îíÆŽk›·í·iÓ¦ÈTô¸qB@ħֈiYÚ¶mëºuëÓÒ©XB@‹€T=Å"¦ç…€ G@ÄŸðTñ…€Å" â/1=/„€H8ÚÀ•ð¬Tñå¿RÈ*]!Psä¿æM ! ª‹€vîVoå&„€¨=Òñ×¾ T! „@UñWne&„€¨="þÚ·J „€¨*"þªÂ­Ì„€µG@Ä_û6¨y >ùä“&eˆ¢È}öÙg9¯úé§M®ë‚ÉA@ÄŸœ¶ªHIñ»ýõ×»gžy¦Aú'Nt×^{­›:ujƒë#FŒ°ç‰Ç+B ™ˆø“Ùne+õÜsÏíZh!‹©ûÆodÒýûï¿íœ‘§žzʽþúënÙe—µŒáºŽB@$ ²Ú«"¥]k­µ,Ýûï¿ß}ðÁ9óxíµ×ÜÓO?m÷ÖXcœÏè¢É@@ÄŸŒvªh)—\rI7çœs:F÷wÞy§ûüóÏä‡/þxÀ®uêÔÉ-¸à‚ îë‹ÉB@ÄŸ¬öªXi×\sMGÄ-T<7ß|³ûöÛo-/ré ‚Ê'Ì*V%,„@ÅñWâdd°ÒJ+™Þ‚ÿóÏ?‹¸È°aÃ2¤?×\s¹Å_<R)…€È‹€ˆ?/4õuc†fp«­¶š›~úémÔFøù0Ðh¿¾~ªmzñ§·m‹®Y=2﫞pœyæ™ÝŠ+®˜¹¯! ’‹€ˆ?¹mWö’ÿãÿ0rgÔŸ-|ïÙ³§‚¬gƒ¢s!`þ‡'¸"*zyÀT3Œò³SìÞ½{öW !`Dü n¼J}Þyçu]ºt1]?é·iÓÆ­¼òÊn¶Ùf«DvJS â¯èqÏÓÎ0êÿ믿Üꫯ÷"«|B@€ˆ¿°êåÑE]ÔÍ7ß|V]Ì7ç™gžz©ºê)ê[OI3O›6Í6]}óÍ7ŽÏ×_mG6bM™2ÅýôÓOæpcöùï¿ÿîxÛ}Žá³ôÒK»­·ÞÚÝtÓMî‹/¾p˜{Î8ãŒväœÏ,³ÌâÚµkgŸ¶mÛfÎÃ5:öíÛ['ÎéD/§¤ T !l=)-õÕW_9Ü'óa7mö xÙ ¶÷Ô r…d!Ü9æ˜Ãesö9䈼1±Ó)`ÆÙ¸Sů¿þÚ Á“gèX~üñGëxò• ×|Yd‘ÇÎ;;Ö$B@T Å -!aõ£>rcÆŒq£G¶#ç| RB_`2„”k|Yãu3#kÖ˜udÏDèIJ;/Ι¡„Ž‹k©¥–²3pŽ *u*¡iõŠˆ"þZµ£è·ß~Û5Ê\¿ùæ›îÝwßu¿ýö› WÉðp¢Æ9Ö6\gdž6avAðá‡:œÂ…ã¤I“¬ºì3Xa…î%ºuëæØp¶Ì2ËhAÚ~ ªO¥ñWáþwß}çž{î9÷üóÏÛ¿öd¶Ê*«™±3–$:Fò_~øá›½õÖ[Žq8ÒI‚{ °DÂ¥GÖ$B@äE@ÄŸšVÞ€”ð_?räH÷ÄOQ‘$ª 6IñaÄÊw©/Š›3$fL/¼ð‚u¨¨ÉX¯XuÕUÝlà6Þxcë¸&B ƒ€ˆ?ENÐ]ßwß}îÞ{﵈V,~Bìÿüç?Ýzë­çÖ]w]™F–ç|I.’(aO>ù¤{ì±ÇÜøñãÝì³Ïî6Úh#³PÚrË-F%B Îñ·öÀ¢ä]wÝån¿ývuÎ:ë¬F4Ì&›lâ^xáÖf¡÷KD`ܸqî‘GqD£C`S3wÞÙm»í¶|¦Ä¤õšH2"þRZ5drÝu×¹‡zÈÜôêÕËí´ÓN¦^€ü%ñB€½ >ø •¡Í° Úf›mÜ>ûìcµÔmñj/•¦¢ˆø‹UÂUW]eÌÑ!ïµ×^¦FÀ^’ èî¾ûnwà 7¸gŸ}Ö±wàÀtûTAÉhB•²uˆø Á•Á9çœãn¼ñFÓÑÿë_ÿr|0­”$‚ËÓ™3{c&G»qÄ®cÇŽÉ®˜J/ò# âϳݱ'Ÿ|²¹-ÀIJÿþn×]wµ…ͽ§{ÉCàçŸv×^{­»à‚ 3»8Àüñ¶!.yµQ‰…@³ —“¶øüòË/î„N0{ú—_~ÙÝvÛmîwÞq{ï½·H?^i¸Ä~€C9Ä1¸ôÒK-Ö0êÎ?ÿ|› ¤¡ŽªƒÈI[@âGÌ÷Ûo?slvúé§ÛÔŸô’úB€}]t‘ã7ÀŽé!C†Øþ€úBAµM)ñ‡†E¿‹*‡Ûµ×^ÛÜ0Ýé„êëÈbý1ÇãÞÿ}3É%&ÁÀ3þ„ê Õ6mhÄï['bÛm·©sÙq.Ù°|衇ºÍ6ÛÌÝ|óÍŠH– ŽÎ“†€wñ5ϦFöìºíÚµkÒQå­¯¾úªÙþcÍÅÆ0Ü]K„@¨oâÇqSx¶õó¬HS ü W¹È&L0¸¿Æ“6ëU¹”]9¨_?Û÷·ß~{s&Ò/Ço©>Ò`³×£>êèØð%ID nÝb¦÷Ê+¯8¦ïåé3‹¸òÊ+-íÉ“'››å­¶ÚÊF‰µþ`±„Ëý÷ß¿ìEyï½÷ÌúË/¿¼ÛtÓM­ÎiÜÑL@|3¡"¤mñý#IB .íøYÌÅLïÄO4ï™åj0H¯gÏžîŽ;î0·Ë{î¹§cc$ÈF°ZȲË.kÞ*Éï¡ìB.·°ÇWÈÔ•:/¶Øbîàƒv8ª#W©rÜqÇÙ‚j©ïWò=<­Ò}ôÑW¡’y)m!Pv¼³ªºo–ùЄ‘ߨUÖº{Ò6ÜpÃÈÛ€7H×w‘o¸Èû…ip/Þ»g“k\ðª¨ÈÏrÞã¢wùlŸð€'ØœÏûŒÑÃ?Ëyôqr›”9ùä«7eC¨íêÓ[šÔïâ‹/¶:ùÍx‘†cÏ–óWZç\Î4•–¨0ÃêNÇï Äù‘©›þù˪6ódã¼úÈyòÉ™..<‘g2øÎÂy2³ÐŒga˜ d¬à3ˆ`.¸ 1bDæÝ³Î:Ë®³pŠY!®… ø2ÞGœ">-züiÓ¦ežÏwBèGÜJ㋷ľj,Ã-éü¬Ã\Xð=Ÿû!Î8ã 7uêTÛñŠõKïÞ½ kb ëÇüÁ%2U”Ÿ¼ ˆ|üå`auÐA5ÉŠ¨f´Ûa‡f»gYße—]Ü=÷Ü“y–ØÅ¬1`žëUnæb™zar ŽÔ­ÜB²f$IB î¬z 2‚*§° 9iÒ$ žË’…Ø»™ñ#Y#@ÄÜ-»Ç<ܶ#GH9×Y¤†;uêäüL"Üjñؾ}ûÌ3^Õce€\ýhÚ:›ÌMBG”OˆBF§GP>t:tT^Åcî/Xè凇 f इc4pÃ?õÇRæŠ+®p^ Ö ;p¡Í²ëÎË-·\æ9p Bœ]:ŽrkšCº”‰K"’„@Ýø!vçúEDz¶ÄáÜ£±0Çî;Û\‚`VÊl€Î2Þc=ŒüéB'Àè;—xU†=z´¸ý:æPÉ7;aAšÙ‚h>Yf™ẽi¸ÆD·" <³d÷ÝwwÇ·X¸àäÕ.vt™ñx5–™ÖBÎ^¿o÷²ÿ€ é\¼Îß]~ùå™ÇòÕ'ó@Nøá²["’„@Ý?ƒ#6FåÈ’Gy¤Ùxÿþûï–ü˜1cœ_üs묳ŽÅy y<ØÜý2bd„‹º„@àØ…CA-Áf!¯ÿwŒªs £sFÁŒ:iãQñ:B;2’'âT1>t"ŒÚI‡Ùê˜|B™Ï=÷Ü ÉóÜsÏ=çüB·‘?ß1„ðÁˆN „:<ûì³MEDÙ½£®ÉUvÊľ¿î`÷éüªaMúµfG<ð€ýžj‘¿ò%#PáE„X&å,ò1XËZ>c} ³ÆÁ’ˬeúôéÓÀô’Å]?"6+ÌJWZi¥óG‹Hýè5òª³Þaá ‹»˜'aaÕûޱÅb?/»ì2[ô Ö;^'n µÞ±˜-€³KC½î=$cG?RFeçXa9C°Œá=2s f˜XîPf,•üèäc¹²S:y j.¤}èJ‹æ…¿|Fö=¦ºÌΈÞ%uŒ€ˆ¿OFˆuÛû Bø?“°ÍŸH\t„”´tõl¾ƒì™u±Á ?ùÞšùÉgæåƒÅ˧Në`ÖÛéB@Ä_öüðÃ-Þì3Ï£# |øPVοÿþûeÆÇèÀ82ãa¦ÙûP’qn•M$R[Žr³©ŒŽÕQ Öp„d9ÿöÛomÇ1äÌÇÇ®X•‰e::›ÐewBtF|ÐÁ³KV–Nk%,ò! âχLZ¯£:Ê¡ûø¼™<£úì=£ýìY@83f è™M`¹$B öˆøcßD* B ¼(KyñTjB@ø# ·Ìño#•P!PVDüe…S‰ ! âÀÿáSwkªD“IEND®B`‚asio-1.12.2/doc/async_op2.png000066400000000000000000000577361340672067200157310ustar00rootroot00000000000000‰PNG  IHDR~ƒ,Ö{;sRGB®Îé@IDATxí˜ÅööË{M(Æ«b@DQ ¨€ˆbÎ9Ì"朊z˜sFEÌJ0 0 Š¢WQT@QÄ‹¢À„Ùþêw¾ÏÝ™í™éîyÏóÌNO‡ oõž:uê„9‚ x؉„€B V;‡güA­ôVýB@7ôA! j 1þÚoõV!àÄøõ! j 1þ&ü¤“NrsÌ1‡>1Å`Þyçuüq£¨ËB@d#0gö×GàóÏ?wݺusL¢x!ðÍ7߸£Ž:ÊñÝ®]»x5N­1F@Œ¿€ÁiݺµëÞ½{wê–J"ðÙgŸU²:Õ%Rƒ€T=©JuD!Pbü…᤻„€©A@Œ?5C©Ž!  C@Œ¿0œt—B 5ˆñ§f(Õ! „@aˆñ†“îB@¤1þÔ ¥:"„€( 1þÂpÒ]B@Ô ÆŸš¡TG„€…! Æ_NºK!ÄøS3”êˆB 0Äø ÃIw ! Rƒ€j†RB@†€a8é.! „@jãOÍPª#B@Âã/ 'Ý%„€H JÄñPþûßÿv+­´’ëÙ³g’?ýôSwÍ5׸#Ž8­²Ê*u®EõãÉ'ŸtÏ=÷\¦¸üãn“M6qÛm·›{î¹3çu „@m# ‰?âñ'[×!‡â¦NZ§äN8Á½þúë®}ûöuÎGùãÕW_u<òˆ›sÎ9íóÛo¿¹>}ú¸å–[Îýúë¯QV¥²„€H0bü^¯^½Ü:ë¬ã`ô! >Ü=õÔSî¶ÛnsHáзß~ë¾þúë𖢿¿ÿþû¼Ï,¿üòîŠ+®°Ï7Þèž~úiǽƒ®wvLLVÿýw½û8ñË/¿ä=žœ5kVxhßô/‚:ç²üøãÙ?Ýwß}Wç·~!P>ÄøË€- f?bÄC=î¸ãÜ©§žêÖXc ÷ßÿþ×m¸á†n…Vp0é 6ØÀ¡‚.¼ðB·Ç{Ø1~øá7Ï<ó8¾C›nº©»ä’K¬œO<ÑÎ5õg™e–1‰ÿ“O>±[sËøë¯¿Ü)§œâ^xa×µkW·ä’Kº!C†dŠ}üñÇÝRK-e×7ß|sÇÄvÙe—Ùõ믿Þíµ×^nÿý÷·¾p’‰UÖÊ+¯ìZµjU'Iýºë®ëN;í4»¾È"‹X߇ju.¾øâ®S§NÍš 3Ö" Æß(<¥]DsöÙgÿ袋¬sÎ9Ǿ>ø`Û˜9s¦CJæ^'þã?ì˜?HÌ¿ÿþ{Fræøê«¯vGy¤ëׯ_æ¾ìT:ü±}Þ~ûmwþù绉'º=zØm¹eÜqǶ˜2eŠ›1c†»ýöÛÝ~ûíç˜(˜¤xîÊ+¯t´—ã»îºËýôÓOVí…q·lÙÒ½üòËvβ:YÍŒ7ÎQþ[o½e×è“ʃ>è>úè#«£wïÞ6I²BTU"! Ê‹@Ímî¢Ê€ÉM˜0ÁâgŸ}æ¦OŸnŸ/¿üÒýüóϦ‡"]—J§Ÿ~º{àÜ\àFŽéæw^c¤¿ñƦòAíƒJ¨Iwï½÷vGuTƒÍ‚ÙwìØÑ®Ï1ÇnÙe—u¨|V\qÅÌ3ÙeÀÈ»wïnR77ì²Ë.ŽU«0`•²Ï>ûس‡v˜»êª«2åp€¤Nùôlï¿ÿ~›Ì`ü~ø¡­X˜xÖZk-{FO¡:Øj¤sçÎö›ÕB)Ô¦MÃþóŸÖ¾ùÌ5×\®E‹õ>óÏ?¿[h¡…l%ÃwøYl±ÅÜK,‘ù°G‘H©güÓ¦MslzŽ3Æ>ï¼óNf£‡ºõŒ‰o¤WŒÕÏ•B0¤û[o½Õ¡"˜p°® çØx…˜tr é<—Ö\sÍÜSu~¯·ÞznôèÑuÎåþÈ.5ê—l¢M´‡=€víÚe_rݺu«óæî[ðýØce&& ˜o6¡6 Œ°€ Ë*¢bòa%Âóᇉ ÙŸ`ã;üp/ýãý`¥Á1޳÷&h#“hî§mÛ¶Ö~& ‘H©cüèÔGeêôìH›X¹Àì`Z¨IV]uUû,°Àe+aÈ©#B2<Ô!L%—ñ…zy»¡LpÁ(›˜ÑÝ3Ie6¡FBºÎG¨tPi±¢ '—܉£\ÒóN;픯IEŸûóÏ?Ý7ß|cj/T_|¾úê+[­¡úBˆà›‰1Üg\YQ1¦¨îV_}u[)!T”«¿EwL,RÁøùgÅ~Õ :g6EùçÛqÇÝ 7Üà‚ç›o¾¬nWç0d èéÙ eu1pà@·í¶ÛšÊë¬P‘À4®»îº²7ŒÐ¹£î¡~T<¨»Pù°8÷Üsþ;ì°ƒéça|›m¶YÞvaĦ-»ú|&¯l :ïƒ1:‰ÀÊOcÄ;>¨¦&OžlŽÙëà<}FÄŠuÙÚk¯m›çLˆ¬"DB š$šñà a”÷ÜsIiHôèÔwß}w‡=}ܦ£§}=ôcÅšõ„£©0 úðìC9úƒ?>–8¬„° ÏPÏÍäÃæ3Œ ÝüÖ[omzû|mAê¾öÚkmõÓcÂe_‹¦M½ERšˆ±DÊÏÞ; û‡éý÷ßwï½÷ž}XÕ±iZi#&¿Xwm¼ñÆMN2a¹úQ!0‡ÿ‡nØØ:ªZ",‡æÂ(‘äŸþyS;zè¡nß}÷uè\£&6BYÒGim‚uË|`Œ?Ÿ:U¦•ô¶EZÇræ )CçÍ^*4ö=`üG}´­Â‰—MQ>Ð_|a&¡Q«=ؘg?âµ×^³ý˜†Ú‡ó¼·“&M25ª0ÚŒjŒýÔCLLŽ[mµ•Mºqh³ÚZ†&Fâ‡YÞwß}fÆÈ?ª‡'žx¤ärKÅQ?KýÐò&_Ùèû+M0Ðp£9¬•ª‰þýû›tÊä‡Õ›ÞQî¼ôÒK7v{M\cÒcUÅ'4ßebEuÆ> VZ¼ç þãÃ*–Õ…HD‰@ìß($¢˜m8f—˜¢;æHT^Xu`×CNhèªÑ÷7¥ÿ.o«ÒS:{<¬ ø@L/¼ð‚í³°ï‚È¿þõ/·óÎ;›cß–[n™Y¥õ¤Äšñ£ÒÁ!]>úî3Ï<³A‹’j€W uâIœíM\ }®V™Ø' -”Ø,ÆXpœã:›ñ¨5·Ùf­ª5P)¨÷qìúo,GvÛm7³Îá÷Í7ß,¦ÇÁR›Ê†VVlŒãK¾ÏÅ_lßLì»¶Õ›H‹@¬?:e<^±z ˆ/<Ö/üˆ„@-#£?æ˜cÌ\_ 6ØQ»±À‡Ð³gÏ®eˆÔ÷"ˆ ãñÅMºG§ŒIàØ±c›ÜD,¢ŸºU¤,Áúöík>xicþˤ®ð+ ƨ:ãGJaã°HúÄÐÁ»6i–:¬kB \ßßBOœqƶ'€yÿùÏÊU­ÊM8UeüãÇ·eê½÷Þk¦lXë`I"B 8½šiv<¦ñÆ/K!‘ÈF jŒ$öàxˆ2 X$„@ó (q–öŸyæs>d5)(êS‘Š3~<@<ð@såÇ*iݤHh@Ú' 8ÿc¨T´°”C*ªm*Êø‰rˆ[:öùÆ 3•ܰ½µ=꽈þçðÆÓÞØ't’…¡Ž¾6•˜*Æø Fj?2-§„€d"! *‡Î_Ä"ðá!Ø&OÂÂuU°×TÆÿÒK/Y*"¾þúë ·âJ]‹7¬°±šÃlâ,‰o€¨v(;ãG­C°)\̉õN¼v‘ÕE`ÑEµLi8I² GýsÍ5×d’ËT·uª½Ü”•ñ“©â ƒ²d• 3\nàT¾H¨_±:å”S,ç&›lâw-J7ecü?ü°;à€,™8qvä•îI½K.d矾™{’vGJ‚Éҋ@Yÿ Aƒ,‚à±Ç뮸âŠô¢§ž !ÃóÍ7Ý®»îjfŸ„ G´(}DÎø±&f>Hä– !H™yçw:Ô´äÁØb‹-,á|rz –‚@¤Œ“MòÉò!ÐZ+ˆG}Ô‘A) Lø_|ñTô%ÌFÒQ´ôìÙÓlÿ‰Ä>yƒEéA ²œ»Ä Ç3œ­Ã‡¯h¾ØrÇ”)Slù[Î:*Y6É=Èê„UGÇ$¬QðNÅQI-èü÷ÜsOËLˆt|D‰G`h$Œÿ×_µœ¬|ó¸à‚ &™´v&ɽÞz륦‹XŽa‡NR’¨º§¤ft„<ÀØû“ó5P˜3¸EêÑê"M²õÃ;Ì\Á %¦_ÝmªvcÚ<5/»ì2óB% ˆ$Ò¦Þ€â¯Ï5×\æáKPâl± Ζ(¹4;çîõ×_o’ÀSO=åðÌÅ4JÄíÚµ³}¥o¼QŒ¿L¯ï zDÓ%Ϋ{r`‹’‰@³?›¹ä=÷ÜsÍ37™Ô^«Ó&ñ3‚‡~¸½ƒÓ§OwK-µTí j…z|Úi§¹yæ™Çüsøf%’­z~ùåÇÎ?úâ>}ú$¯ç5Úâ4ªzJâÍÄ ,Qy8þøã굓O>ÙÂ>”·6•^J–ø‘ô¿üòK÷ôÓO;…V.ÇД§Ì4ªz@ ÏpbÍãqŠã ¨¼ðÿº¬1&ù‹(9”Äø_yåwÓM7™ƒÇ²Ë.›œÞª¥n¥•VrlÒ¥‘vÚi'wÛm·¹üÑ-°Àiìb¬útÎ9ç8Tklø¶nÝÚ­¿þú±jŸÓ0E›s’A«sçÎçìõEB . ýõ‘GÑ&o…寿þr;ï¼³Åù!Ïí¢Ø#0´h?º=œµn¹å–Ø÷N ¬-æw^óOPrñÊ;j^»Xù3üüóÏ•«\5•Œ@QŒÿ‹/¾pýúõsgu–Iü%ת…@™ ¬ðË/¿\¦ÒUl>Z¶lélj¬«DñG (ÆÃg#GÎñØZmál`¼X‰*‡@Û¶mÝÀ-¸›´•ýԚ füØì“§‰Ÿ%µHÄŠ¡w&¹ˆ¨²ì°Ã¦ 8á„Üøñã+[¹j+ ‚7w Ô4yòdÅC) ^Ý\ VYewÄG˜“Q5ê¯å:™t±î!¾ùµ ÷ Š…mî¾÷Þ{¦ÃëÛ·¯‚`Ån Õ \ÖZk-÷Ö[oåžÖï Àf/qü'L˜à.ºè¢ Ô¨*JA  UÏ%—\âV_}us)¥=°Èb“>ÍD&©wß}7Í]ŒußXq]|ñÅÆøÇ?žCÕ$ãÇ;»hbr¤Õë3žCSžV=Úl®ËSzúèÔEƒMÃp6Éøo¿ýv µÜ£G4ô·æû0çœs¦ž!Âøq4üðÃk~¼«!4ˆ–ŠSF!¢x!Ð(ãÿûï¿Ý­·Þêz÷î-Kžx[É­AË\š©M›6²½)Qõ@â'Ëé§Ÿî~øá‡ê5D5×C QÆäçŸî>øàzêD2¨‰Ÿ‘!è¤I“’9H)j5¼¿ÿþ»»ôÒKSÔ«äw¥QÆOk,$HÐ-Jµ ñ3RíÛ·ãÁ+K~gbø_wÝunÆŒ1h‘š 2~ìp d1÷Uz¨‰Ÿ(¤ÒñÇã½%t3a°Å?IÓgΜévÝu×x´T­ˆZ‘øÅø#y]")dþùç·4„rH»)q$€U ÿ3Ï<ãVXaåÑ­À T² Ò.¿üò•¬²*uÁø¿ÿþ{÷í·ßV¥~UZ<©Zh!SùÔ½¢_Õ@ QÆ¿Í6ÛT£Mª³ŒtèÐÁm¹å–e¬!E4 š2eŠ}ëOu ?/6ý$ÊQèæê޵çeü³g϶˜<„¸ $"@–1T büñ½#<ÒÒ5Þu×]ñiT¶$/ã''¶Þk¯½v¢n§¤~1þøŒ$“ñ஽öZyóVyXò2~BÚ’ÂNiÔª<:ª¾YÀø?ýôÓf•¡‡£E©Ÿ(¿J–-®Å––—ñãñ¸Æk[–î±B^‚Ò‰âƒ@ÇŽ-g·Ô=Õ“¼Œ)©,?ª ½j/7­[·vÓ¦M+w5*¿Hˆ@àÇŸ~ú©È'u{TäeüS§Nã a•S5–Yf1þª¡ßpÅûì³%j!O¯¨:äeüHIHK¢ô!@Ü”÷ßߢW¦¯wu{ãÿæ›oÌ’¤îýª&„qØb‹-,2@5ÛQËu×cüA˜í ,P˸¤¶ïØP?úè£æ•ÚNþ_Ç`üEñB`÷ÝwwÏ>û¬lú«4,õ?Œæ/Æ_¥)sµ8Ò@Ä«O;-½ôÒÖÅéÓ§§½«‰ëßÎ;ïlïàˆ#×ö44¸ãÿå—_¬_-Z´HCÿÔ‡j‰ñ"`Þyçud‘Å %–XÂm°Áî±Ç‹WÃj¤5õÿÜsÏm]G,Ji#;R­Œo«V­ÄøcúfäÈ‘1m]º›Uñ‡’~(ù§»ûµÙ;¤þZPõ0ºbüñ}Ç7ß|s‹Ö©„9•£zŒ‰©P”*?•ªQŒ¿RH«žÆèÚµ«í%Jêo ¥ò\«Çø©†Ð½²„(àq(µÖ¿2?Åá­«ß’m¼ñÆŽ¯¢Ê"—ñ/·Ürî³Ï>«lKT[Å •&›kµ@Ö_OØà}ýõ×ãÙ¸·jÎ|}ƒñ¶A”N6Ûl³tv,O¯Äøó€£SD&ž«²ZFâ^‰Ÿmo¿ývÚ§6f!€—è×_ݬ2ôpùèÒ¥‹þæ›o–¯•\¼ŒuÖ1¿òcÖÃK'†?)ÿüóÏ„µ¼6š»è¢‹ZŠ×7Þx£6:“^æeü,¿æ˜céÞb2HjFéÀøñDWîÝÒ1,÷“;wvï¾ûn¹«QùYäeü .¸ c 6|øð¬[u(’‡%4sæÌä5¾FZŒ±Á‡~X#½G7ó2~š¶Ë.»¸'žxB)Òâ1NjE‰,¼ðÂö¤‰Và1ÿG}äþþûï Ô¦*@ QÆOŒ“×^{­Rx ;çœsê× !7H! ‰ñÇmdþ×?žääÉ¥Q£Fi&”~7Èø±ìéСƒëß¿½jÆŒc«zt"üúë¯îwÞ±d‰hp39×\s¹ùæ›OŒ¿Fùè¿ÿýo÷ñÇ×)r¥•Vr-[¶tãÆ«s~À€n“M6qäE‹@ƒŒŸjHŒüÀ¸Y³fÕ©¯Þ>ø@3qT’óƒ”wC‡­fˆÔ/‰¿úï'›ìwß}·[ýõëèôÙ‡AáÌþÐCuK.¹¤ÃÊP-2þý÷ßßáÞóÍ7gjÅ4nöìÙ&-’ÉI”<æŸ~k4ãX „ž_Œ¿ú#¥à…^hÎZxìNœ81Ó(Bh‡&žÖ;í´“ñ˜?ω¢E QÆuÏi§æ.¸à“ð©/»Þzë­ðPß B€¬ü3Õ ãç=þá‡4BémjÏž=ݪ«®ja4`þ¡ðãG¨ü믿Ü{ìáÂä9tPzÁ¨bÏeü´ë”SNq;vt$Hf&düX’î­Š#×̪aþbüÍQG¿~ýì¹ï¾ûÎm¸á†nüøñŽUÿ©§žêFm×Q ­°Â EסšF ^¬<aê!q|ß}÷¹N:¹³Î:˵oßÞ®s_>‹Ÿð9}Ç6Š@Õ$~¸œ~úéuÚ‰g%±ÿC;v¬åþ%MÛÎ;ïìÎ9眂‡9| R¶ÑF£'ÿ&áZŸþy×¥K7jÔ¨:Ïeÿ(ä9RIÞsÏ=ÙÕ9þüóÏ3í¨s¡ˆò"I½(Àøs3ÈÅ£ej…¨<±Rõ <Øí¶ÛnîÓO?µPÏW^y¥;î¸ã2¨p¼ï¾ûZâ†É“'g’7„7ú\x?ß?üðƒ ‚À-´ÐB™ÓùApÏÌ™3Ý¢‹.š¹/< ä/“ŲË.ž2é’`k¢x UO<ÆA­ˆU“øs»Oæ#F¸vÚÉÝ|óÍ–ìå˜cŽ©s9~¯¸â ÷ÙgŸåZÌsH½{÷¶8Õ‹,²ˆÛ}÷Ý3ÎLįf• è¹ÆNš‘#G†—ÜСCÝâ‹/îV[m5»ÎdõÞ{ï¹­·ÞÚ&bÁ3¹ˆª‹€T=ÕÅ_µÇ Ø0~Ô7«¯¾º1X'‰˜³S<†°‘g©¥–rHü¹TÌsHãä˜6mš{ùå—ÝÛo¿mù(“xøaìv&£3Ï<Ó 4È&†Ë/¿Üm¿ýö¾25Ô>ûìã˜0‰d_àÔSOµt•„ªÆj†røUIüÕÅ_µÇ Ø0þ!C†˜šx¾ÿþûãÑ£V1³BÈ¥bŸc#™xÕ˜4î½÷Þ¶âÈ-ó–[n±Õ@·nÝÜìÙ³Ý6ÛlcRÿ“O>iñØYôèÑÃã :.EñB@¼ÆC­©.±aüäóÝe—] 6E§L™’™·ÞzË‘`•K.óÜÒK/í–_~ùLk®¹¦ûúë¯3¿ÃƒO>ùÄr ¯²Ê*.ü ÝcĞɢ³ •Q¶®?ûZ雿¹N\}ô‘¥Øüàƒ2ßql¡mª&ãçÝFÈÈ'¬œþùî(´%ß7fÌwÔQG¹ 7ÜÐí°ÃŽ•+T¥éÚk¯u´¥XBÅKñ( C2 æΣAˆšÈOÞ§O+ö¥—^2µvÔuR^,ÿ›o¾iê›0íÚæ›on:ü/¾ø¢^P¡ oÇÄ3—ŠynÆŒuÌûÆ—7o09o÷ßSë´„:~TFTHÛgÍšUï6Ê;þøãÌŸ‰‡ÿ­K/½ÔVy;wÝuWgØû ÛXçÂÿýà=ÈÆ’:j/× 1¡ÍÞS ëÄç"Û*®ÿþ¶R ¯ó]H[£\Õ°_רÿ3+‡|c@[ ‡¶h4"êo¬ =—{>Œ?[¿O‘ÎØìE“es”Ïa‡f/ï±Ç›Ûû]ÌsË-·œ{ñÅI¯µÖZ>V>¹Äòx‹-¶05Ï09`=´òÊ+»N:Ùäѽ{w+‡M૯¾Ú±‘H»Û´icçsÕ(¹uTû7Øf[±Š¡Pö?yµÛ™äú<òHÃôŒ3ΰnœwÞy¶rʼn†qÊ)§¸…^ØuíÚÕÞ™PD° ¤F6C ºîºë¬œë¯¿Þíµ×^ÆÐ³U—!VwÞy§½‡p@xʾ۶mkï?ï=ÄJ5êRÊaß U&„ZõjLV¹X ¹³bà7íÆ¢ÔµÉ&›X½h·ß~»]ËýÃ;‡õ÷´jÕÊöϨòYÅm¼ñÆîÞ{ïµ"šj+ÿ{î¹§cµN<ª¾}ûæV]Ôo„"ú–€SÈœqåÿ‡Ö}ìr=übõ¿þúëÛ=<Ï`CÔõ šÞ&i„øV³Éÿc—L |Z»’Ÿ/äAÏ4¿ì <3*äöÌ=…>ç&ðnæ9üª"ðf¥uÎyðïø­sž~Ó7ð{õÎsÂ/Oóžoì$Ïø ¼î½±Û"»6pàÀàñÇÏ”w÷Ýw+®¸bà™àuãŸÄïÍœ¹žÄƒ:gŸ}v$MŸù曯è²üê5ð««À[Ù÷èÑ£­ /‰žÙ^ `¿ýÊÑÊ÷L%ð©1í]ðR^¦>o*x“cûí £#Ž8" ü\òF gع§ëýöÂMpÐA~ ¼´mÇžÙ}ü?x ¸€ÿwÏ?ÑX›¼:ÄÞ}êöŒÑîõ«‹À¯ƒáÇÛo?Yû<3·ßë­·^pÛm·Ùq¯^½?A^¥ø‰-ðþ3퀼àx†jÇüéܹsà¥~ûÝT[ùßaŒè‹_Õ[{øÍ%ÚȽôûC©óá¼_ÉÛ#~µøÉ,€§€Ÿx/äÙ5ø÷‚‰_ o¼ñFà'±€ÿ)ÈOB·4þåUÚö?åH»ÆØmµÕVvL[ü$eÿg~x톽#ÞÙ4€GQ‡ŸŒ?Á~õ`Ï4õǯˆì9¯šÎ½uÈœ¾ÀXSË–-ݺë®[t }.ÜW+@ÂbµtŸM˜òÉGätE‚ÊG e¹ÏwoµÎ!±d«zpTCZBªDC}…Å»ï¾ëü„P­f&¾^Ì•‘ìYYzfiR5B’ WüF…È{‰¤Ù!i"-æ3f¥€/Icî[y¦eeP››¬hCµ«âpÕÀ •'«aV·X³yÁ!SÒù¶Ûnk¿wÝuWç™¶óŒÍùÉ7sê ÏœMÅÊ»†j‡•<+žìw1óÀÿÒVö£B'LÚxÒI'™ª–Ux>¢~´!y.Ú7N£¬j " ÚÂè!›.»ì2Ùý$|î£OìIb£ì·ß~yÃÁ4f=b‰ºhQPì,¦Œ'žx–ä'žxb1%ú^ö†4ÿô|B¡íÁtÆ 3}qx^ßÅ#Àæ*ûT|‡„J%7v‚¡EòQî†, 5ÓçYTv^R7•~+Ùľ„º†}tH¡à¶![èÙ#èð Q.êªr…T¹³ô cÎn;^CzrÊÇÚ¯©¶ÂÈCš‹òs1 ¯ó}á…Ö3Áf$$TŸçž{®ó«/³âcb`²Í¦ì:©‰”}lÁ•ã|qÀØH'µìr³õùlÊGE±ÐñGÕ™(ÊáMßðÅËDúºÿþûß©úFªÏ–²˜ü²%6€YAñO$j!“ ¿) Æ‹„˜M`2ëlÆŠ^9W*Í~6û æI6±ézôÑG;˜L F•mÅÂÆ/š&‡íÈ.£¡ãp•^ϵÐá|È((`x|èï{c QÔmm¨žð<8³·Èª†~yõœIݹxdgø,ÿ3àŒitH¹ãž†¬Ã{¢üã/MlˆY¶Kù^úbË(÷ýLr^ט©¦5k,W ¦Ç¦ÛvÛm—¹GÑ!Àf- 0dHЍ|ØhE²~øá‡­ÂGyĘd¡µ³!‹™3+ŒI“&ÙclL¢ Á,5ÂJ+­d–E&„Ö[^Gm×BG¡õq~!áD†Ö7¹*+b^± ŠŠã¬^ðuðz›ìꙌ²%^ÊŽº­”ÙQ?Vn¨`î„‹a ²dÊ.‹0.¬~À•Í^ây±)ž³ÌwsÏUMÕÃrC¾™2·S¼H&Ńü2—Ð}" !Ñä¶çrƒ®å>Ÿï7e2ÃgëTaœÙfiùž«ö9þ ³ƒÏ! òÏËrÉüQÀ„DÑ#€I'>‚8òî=6”ŠO>ùdcˆ˜¢Cu¾…´„ñë"ÊÇÊæŽ½<×™X`ôL0&îaš)ROö=8C« â‹—Ðd5û>,Žʈ*;ïWh¹“mÇj ¤¨Û–ÛÐ7|‡ ‰=ÔPà…K!þ'˜¼¢°­ìs`Íêøcù4¨¼X 0Fð$Æ(´ä}ˆœüR¦db—ßSÔó>€…ÏyiÂ,-<£Í[»êžiÛî¶Ë|ðÁA¿~ýòÞ›{ÒÛú~Éh–ÞK7ðNJv‹gÌÿG ¼ú"ðËFûx]gæq¬< ü2-ð/dà=íÚyçgVüð“V€u‚ߤ3Ë,¼™gàM®Ïô¬.°ÂÊ‚zü ™•÷B•¶êi¨M~“׬J¼äÕÐ-‰9說ª[õ4–×{þŸ?ðRf½[y缪¡ÞùbNð^auÂw>bœ½Š'Àš¨¡ÿÉ|ÏeŸÃª'ü¿ð†ÿo–7X.ù‰/oålkcíʽþX…„ÅŒ_•…?ýf<×|¹6f=˜{oS¿³êAWX2Ëø1‡ò›DŸ- 4ï\bflÞ¹¤^ü’Ê&ïÝh÷r Ô;ÁÔ»7÷&V~k š—ÙoÔ^±Û3 ëôËS»Ó)?ÃÛ?BÈøý29ðRW€)/-TŒYš=ÐÄŸ¸0þ&š™¨ËI`ü‰´Æ†Œ¿Ë:]AcüÕñ³tDo‡ÅŒï¿9;àÀZd/gУ±‹Mho3m,¡SQö}ùŽ))Ž#ž‰šÅª ¨1Ó9ô¨,³BÞÜ kèFIUˆ³ ;ó¨ˆÐb–FŸXš‡fiÔ—½aš¯:'Ò†@[¯T¢øjEuüX  »Ê5K¾9—p5m_Ãk¡—aø»¡o6Tпa†ˆ•ænÿþ÷¿3I^2Ã~=_е°,Ðdн&€RÍÒÂ2õ]9ÐÏŠÊ‹@¶pykRéÍA ¢?1›ˆìŒ‡&\äÞÍMÁH‡0Û™*›0÷*„„Ħ ¹wÙ‘'ä23lR6f:Ç5lv³);ènë˜s1‘„a# ¸bÍÒ²ëÐqù`ÓÍ6‘ÎU”ñ³ÓTMTBÔ1L$5iB˜>†!j¹OQ¼Þ¸uЫ¯¾š3T80eÊË%&Ì£PÍ0P–:Pc¦s]ãY&¤FLÐȆꊉ¬³4ÊUTpòC¨Þª)æx¦Z2»¹KElÖbùâuéÃ8ÞäËÚ@ü 6áBòf`fùãMË,¦‡7c ¼—]öqùm³‹€\Â’€¸ÄEa#Ö«Œ2ñAØY§¯Ÿ7ë",‹¼©U¦¦ÀÚE¼ oZ7 7wÃi+ÖBìöûÈV±EØTöîíf©À½~•xS¶€>²«Ï3ÕØÜõ&c™Ø$´!m„…–w«¤[~O§¤X=‘T®B„@4¶¹[Q«ž°½^Ïofe^Ýžª÷×1+ƒyB4 q½rNðæd˜Qå3MkÌt®± k9Õd~–j––) ë ŒK(&·pÎjN*™È ЉñG¢Ê(71þª(=qpÂ¥1Â*Gâp£JÁʇì¸=Jgˆ†oU>ù§¶Þ:¡ÂÂO½†(îÁÚpÚð0D¥•6’ª'm#ªþ4Šêø‹i(3˜cú®ŽÈ€èþÑ÷çóÂ-¦\Ý›¼¨!IŒ?£ª>•Š@U$þB»Ç{8>¢ò#@ 66?‰›’FãO㨪O¥"[‰¿Ôé¹Ò@Ý#‰¿tüô¤H büI© ´ÆŸF‰ßo¢Y€,™sVà%R‰@@Œ?ÃT™F¢çO#ãG͉ñWæ=R-ñG Ö:þøÃ—®b1:º¥©g!ã—çnšFU}ibüÍA/eÏææNK÷BÆ/‰?-#ª~4©zš‹ ž=D„…|¾„Ø·U •@@Œ¿(«Žª"@p>Ç<‘Ò&À…@5ã¯êª3Î4KÇÏF 95÷Úk¯8÷1qmSQt,ÂI-*Ò{’*§\„*Î|å7KÕóÌ3ÏXªÆ*ÈW©Î5Žºè}÷Ý×âþ7~§®‚@Ô? öÜsÏBªÖ="@–=ò\Èòª@À ¸ÍG'¶ †àšK%Küçž{®#U!ÙãÉ"/qE jÆO Ð0‡D\ûœ´v‘qÏG=µ”¦L¢ò"P’ÄïŸ[*C¨‰é—w€*]ú /¼àÞ|óÍJW[Öú|˜m+_ ¥¬07«ðÐäŸÿüg³ÊÑÃ…!P4ã'áqÇç|ìv׫W¯ÂjÑ]‰A€T•¤ÅLâã暴ŒŸðæ¢ò#PÊ>°¿ëÞ½»Û|óÍ]ß¾}Ëß:ÕPqÈ•2ÊŠW^¦ }âcúb*e8‚bC';éø#³€"Šbü>M¢yï½÷ZîÙÊ×- C ­ŒŸ~‰â‹VRxV“@IT~ ÞÜe3kذanÔ¨Q.îÙ¤Ê[zkH#ãgÓ²eËôZ zã—guå² ‰ß'w'žx¢ëÝ»·¥A¬\óTS¥@n†VºîrÕ‡ªGŒ¿\èFSîŸþ)Æ ”•RÄß§O‹Úد_¿‚ ÕMÉE‰ß'Ž7Ǽ´H`büñ×_}·ÞzëÅ¿¡)ia“Œÿ³Ï>³Ü·7Þx£[d‘ERÒmu£!B]8ê‘´0þï¿ÿÞ-´ÐB uYçc‚€ôû•ˆ&U=—^z©[zé¥]¸±[¹¦©¦j ÀþÍ~ûíçÈÆ•"d˜L>-}R?„@sh”ññÅîÎ;ïtgœq†²5å=‹9]»víR5Þ’øôª©A QÆ?`ÀÛ;øàƒ+ÒU"Ê€9PU™IF QÆ?pà@·÷Þ{§F×›äRÛKG@ªžÒ±Ó“éD AÆO¼– &¸8 =W¯jÌ‘^xášé¯:*šB AÆÿÄO¸å–[Α€[$’Š@næÌ™nÑEMjRßnÂ5„±zRßÙ˜t°AƇn“fªB 4Póà— Æ_~•xjôèÑŽˆ¿¢Ê!—ñã>ýÚk¯¹M6Ù¤r-QMB  |÷ÝwVªÀ¨È3f¸Å_<¢ÒTL!äeüãÇw¤«Ã›NT{Œ7Î=öØc©è¸ü‡‘Pà­ZµŠCSÔ¼Œÿ“O>±”Š+¬°BŠºª®Š!ðØN¡ß‡$ñÇs4IÛÊæ»eǧAÆßºuëT9ñTÖd×FRò0Ay²{âÜ×_mBŒÂÄs$qe~©¥–ŠgSÚª¼Œi¯mÛ¶)í²ºÕÄèaŸ' ã' …’°Äs4ÉöF¥4…‰'Òu[•—ñ“œ: ÖU÷výªø±„!TnÒ‰Ã%–X"éÝHmûaüË.»ljû׎åeüØÕ’ GT›„Q9Ó õ#ñ‹ñÇ÷=&¹úòË/ߦ´eyÃ2Ãø•û2¥#^@·ø!ôüI_ùÉT°€¯â-„„U¼?ú6,;Dµ‰@š$~©z’ñO™2Å=þøãŽoQùÈËøYc[+ªM˜ø‰ÈºØb‹%¬FÈ'!Š'„jØ~ûíÝf›mæÎ?ÿ|×¾}{÷ÐCų±)j•Š3ª®`Ó¦M7÷ÜsGUdÕÊ™>}ºL«†~Ó_wÝuŽU!ÿóŸÿ¸«®ºÊ]~ùåM?¨;š…@^ÆOp6#mI·›…”Nxí²A-‰?¾CG¢'ôü-Z´°Fyä‘nðàÁñmpJZ–—ñwêÔÉ¢å½óÎ;)馺Q‹ íCbüñ}·>þøckÜÚk¯mÖ=gŸ}v<›²Våeü˜W¿ü­·ÞJYwÕZBàóÏ?·îŠñÇsÔÙA«pÇw¸³Î:ËÝrË-ŽHèü¦¹¼c–ל“*×Zk-÷ú믻£>º¼-PéB Là4ß|ó)NO™ð-µXôù„ËF¥ {ì±n÷Ýw·c Kà=Ä [qÅíœþD@^‰Ÿj¶Ùf÷ôÓOkæs•X!=Â&µ(^¼üòË5Ù0ÎÐFøQùhñï°Ã¶Á;vìØò·B52 ã¥Ê2¯"K@†Ï§K—.nŽ9æpû»é¦›Ü—_~ésõÕW»:8E.Ü"iñ>ÚHÁ(ª=ž{î9G¶$ÓÔ©S%ñÇlÙ7$éJŸç’K.±èœ¬Ì–Yf÷ÔSO¹ûî»OAõʰ•jÙRB Äø™©q¬2dˆyó&°Ÿjr‘¨ ?©$ÆŸÔ‘S»+@AŒŸ†lµÕVƈ«‘†\¬•7ÉuŒ%Û•>I}ùþûïÀØ› !P‚?’$¨~ýúÕ/Ig„@Lxÿý÷­%xŸ‹„€¨@QŒ7ë /¼Ð>dË 8"ðöÛo[XqyíVotØ\ÿñÇ«×ÕÜ(E1~J:þøãÝÆolÁ•”¡«Qlu±ÌœtÒIyÍŒJí+ªß|ó{ä‘Gœ9UÿBj-šñ³Ñ;`À‹ÜyòÉ'R‡î‰1ÄE饗,PVv3gΜéFŽ™}ÊŽQõH+DH†Ë.»¬ÞžÀÄø«3B$P!uâ’K.é6Ø`ƒê4Bµ6‰@ÑŒŸ‰¢G2æ 8°ÉJtC| pA²†Z§‘„Î%R61Ü{ï½'û|µŽ‰ÝþÓO?™µYØÔ ˜Ã*ITy^xá÷í·ßZbÙíWÿBk,‰ñS8¦~§žzª;ì°Ãœôý…¿û°ÜANÔÄgžy&ÓÀÜZ&Vz|¯¿þú™ûªy°à‚ ZõÙ±¤|ðA‹*J> Qe@¯ÿÊ+¯¸m·ÝVÓ•…¾èÚJfüÔD,môý„u˜1cFÑ•ëx °ÑFYCÆŒcÿ¸ü? ±qäBÒÇL²E‹nõÕWEÃÃlM¬XPû@ýû÷7i“œÑ!ýõ×_îî»ïv·ÞzkxJß#À* ?"o拾qu*®™4‹ñt kî¹çv;ï¼³%Nnf{ôx ëb‹-f5“€«˜ñÃ4~øaËšÄ Ýºu‹M’ $~BKðÂØqÚ"Ot¯^½¬/è›™°èßÁìÞ{ï=;¯?Ñ#Àfî¿þõ/K”}é*1jšÅøi A°Øì#92êŸ$»ùG n’ÊcåY×HŒ1¶DºDòÿÇ?þQ'‰Fxµ¾‘øÃ ÒüwÜáÚú¬q›nº©MV+¯¼²Ûÿý!š:è wíµ×V«©©¯õÎ^{í¥xú é9ü?NE[I²@ì~Ô>è‚C‰1вUFùà5ÀAï矶Êr_ ¤ê5×\ÓVvåoMa5 eÂlB"¾+BOœ81—ñÓVö—ÄôËóžaáÅ&ù¬Y³ÊSJ­ecüô`“M6±Í¶>úÈá$4mÚ´ŠuL•Ž›¸læB¨:vìXzae|²eË–©¦Ì1Ǹn¸¡Œ5ÖfÑ¡/þÝ»w·È§µ‰Dzz™9gcàU¹ýöÛ;¢öÀ)ŽúâÆÚ_Žk£Fr_}õU9ŠŽ¤L&i¸á”ç„,p€ûõ×_-jì5×\IßUÈÿ ÒC=dñwzöìéÍ.J<C+Âø‰àYûí·Ÿ1b„»ñÆ]ïÞ½^©`óÃ8o|/½ôÒz›88qVÓá5~ÜqǹË/¿¼ÔáÐs Àä×6ÃôD©@ rŒ¸`x}ûöu]t‘Y] ¡Í3Ï<©@²˜N€–3X?í±ÇÅ<ª{³àý¹âŠ+¤BÌÂ$ªCÔ³Hú„»Ø}÷Ýkòÿ4*,cXNt\…t=ì\`¶þ<ð€yYÑO$„@¼ ôúf›mf’~- gñè[SÖÍ݆š‹”K² Ô]ºt±@Z Ý«óB@T¬»âjÍUy4ÒWcU?0®°Â ]?´°÷'ƒH! Ê‹@Õ?ÝbÓèꫯ6{8tèÐÁ=þøãåí±JB@Ô8Ueü!öÄø!V:Ž^„|ÀD‹"! ʃfš„ßæ[T{Ä‚ñ;qWîöÉ4øÉÛ¹Ê*«˜—`¥ö†F=Ñ#€3¹”¯¿þz7eÊ”X›êFß{•"Æ6ˆ8?&Lpx Å\!Tð;ï¼^Ö·%"@^e|h]ÍÿÕÑGí°ÞÕ±cü ®ø$!‰;NN„ fX¢jïU›ÙÔn¾ùf÷Øc¹¶>¼6¡-¡Æcj~ *!iÄ’ñ‡ #æÕW_u÷Üs{#Bä…^è~ùå—ð} !ШJÉ£L.Ø‘{hä ]ªbÍøœ¾öÝw_Ë{Æg¸~ýú™)(:Êß~û­ÆH}%#ÀÿÏa‡fù°r¡dS÷`ìˆx‹-\Ÿ>}ÜÇlÞ„§vš[qÅÝ-·Üb)÷Âûô-„@]¬juÏêW-#ÆÒK,aú&L??þx·üòË»+¯¼ÒÁ…÷é[¤Ô8èïŸ}öÙ´wUý‹Ä1þ°ÿD$ö:ÀÞ{ïíÎ;ï<צMwæ™gºéÓ§‡·é[¤3f³Ç‚@j=h^$ E`ÎBoŒë}­[·6iÿœsαÌK×]wýÞm·Ýl3‹d0"!t¾ûî;srÄÑçFÒa®½öÚ®S§Næ“ôþ©ý•E ±.Lü#œuÖYnêÔ©®ÿþŽä/›nº©…`#¸q€Æï^ýõܦè·ˆlïßxã 3l8äCLʼnP“›p>òŠU`*H ãG‡²}3fŒE%ÛÂRK-åX 2ÄýþûïáíÍú0`€…–¦ÜÉ“'7«,=,C`›m¶q'Ÿ|²…5a•+ÍA uŒ?ŒÎ;»Ûo¿Ýt ¬È¶çž{Ú$ЫW/7lذf™„^|ñEÞÊŒIDATų|èСb‚ær¬,²û¤ãô @jKT7Ç7oÚÆz6ï¼ó6vYׄ@Q¤šñ‡HÌ?ÿü¶ À‘Uþ|ð#<VBûì³#1 9‹!¢‹>ùä“®k×®–œœý…å–[ÎÒFéc@»N8á„fMRÅôK÷F8Œ;Ö2¯•–BÃçŸnÙ¢¯U% üÔãÏî:ËäSO=Õ½öÚk¶€'0ÿÄb€‰Ÿ}öÙîÅ_,ÈC˜„˜ÓRøŸþÙ,‹È7ÀdE9&‘0|Ev_ârŒ*‰©¹†èK#‘·˜üżW¨yÏ:è BG¢¤'iõøö)ñV=Í–IàØcµj çŸÞrÀ°É Œã q‚ø§äÃ1±Nr‰ 6V·nÝl2ùóÏ?m2a%qÙe—¹k¯½Öm¼ñƹü›@Zlîe ØLV8·C³g϶ 7þ\BUE|¤|׸—0¾à’Žs”™K³fÍr .¸`ÁÒ,–+Qí¿ä¶%êß¿þú«›9s¦£|Óÿ-·Ü²Áj0> (Úb‹-Öà=º *†€g ¢<x•Ppß}÷>¾Iàc>9zà%ðL>ðL<8î¸ã¿`÷<óÌ3ÁÛo¿øUDàfàSJÚ½ÜïWv¼ãŽ;'N´šÙzžšëŸúä“O¬^?9ÙE¯^²zZµjx&lmñ“MýsÎx[ïÀOtöŒ„x©3ð›àv—ŸD?¹žQ^5øMñÀ‡íµk~ò üÞHàSf~’±ç½ù¬];ÿüó­¿ôÙDZs~uxéÝîõ /ð+¨€>{õš•®Ð´iÓ?q÷ß¿aìà ^—Üu×]v½©?^UøI±©Û"»îmæï)\rÉ%÷±ý§>¤¸õ1²ÊT(CPEˆ @¦ë³„7ÝtSàcŸ;ì°CàõùÆað¹˜Xö9#“‰—‹büÞbÈî§ 0K˜¯O¢a­öúáÀ{.~UÑd/h;Œ&ïÝ>JcàmÁí¹-¶Ø"ðª‡ÀÇk˜ 8ö¡{íšßĶúan\¿æšk¬/^ʵëL&ÞÄÐŽi£·  úöíxµWÀJûn½õV»îc-^ê ¼’a¸ë®»Úyþ,¹ä’Áˆ#2¿›:Èfü~ø¡µ­±g¼šÅÊ÷Q*ƒ‡~8¸÷Þ{¿éøÈ•Ö'&§ÆÈçŠü>Qðæ›oÞq0ð+”&ël¬<]UB`HM«z¼±(ùïÿëFŽií÷““©fÐÙãfB[gul„‰òxÒI'9ÏlT³‰Ð¿¨kN<ñDÛß 0íúpÜé‰'ÓEïß®]»’kýôÓOݺë®[çyö Tç\¾<»êª«f.Á”÷Ûo?7jÔ(c|˜¿†„uæ@`/!$úÄ‘OïÕR¶°Æk„·Û÷ꫯnß<óÇ÷Má†öê<\À&š¦Ç'‘Ήñ7ó-€É5”pÑH“H!³GšÄ™Œ°Ò]ºtÉÔÄ=¥eænôŽ7Îâ5U&Ïf;šaFˆC›Wó‡i“ó¢L(\зBˆ bÑEµçðVCX;AäR ž^§˜¿bѤ(B rÔœ9g”Ð~ñŖɦÁÐñ@ŠFuòÕW_Y$Ñl¦ßÜúýÞ‚©GH” a ƒ#Z=š,ÚëÓÝ#ZmµÕœ7±Ìw)±çÄø;tjxuÚ´XUݪö"ˆ"lBÕéV! Š€6w:pj¶B TÄøKENÏ ! Š€BNÍB@”Š€©Èé9! „@BãOèÀ©ÙB@Rã/9='„€H(bü 85[!P*bü¥"§ç„€ E@Œ?¡§f ! JE@Œ¿TäôœB ¡ˆñ'tàÔl! „@©ˆñ—ŠœžB@$1þ„œš-„€(1þR‘ÓsB@„" ÆŸÐS³…€¥" xü¥"Ás¯¾új&ßlÅÕ\aBøšë¸:,š‰€2p5ÀR_zé¥ÝôéÓK}¼ìÏ-¶Øb– ýÉ'Ÿt³gÏ.{}¥V°Î:ë8Ÿ/¸ÔÇõœ¨E”«Z£îW«ê‚ê%mÿþýÝwÜa9x zH7 !¤ãOÄ0©‘B@èãK•$„€Hbü‰&5R!büÑa©’„€‰@@Œ?äF ! ¢C@Œ?:,U’B ÈŽ?ÃTùFþòË/nÊ”)®}ûönÎ9åçWùPB l ã/¶*X!K†JÕËqQ£„€åC@Œ¿|تd! „@,ãå°¨QB@ò! Æ_>lU²B –ˆñÇrXÔ(! „@ùã/¶*Y!KÄøc9,ÕoÔwß}ç}ôQ÷믿V¿1j‘" Æ)œé)Œä+ï¿ÿ¾ûã?ÒÓ)õDC@Œ_/‚B Æ㯱Ww…€büz„€5†€ ¸º+„€ã×; „€¨1ÄøklÀÕ]! „€Â2ëÈ‹€âñç…E'…@PXæ4Œb9úТE ·Új«ÕIÂ2kÖ,7hРrT§2…€¨ ’ø+vÒ«êÞ½»9r¤Ã«W$„@bÄŸØ¡«pÃû÷ïï^yå• ×ªê„€(ÚÜ-ª)+sÒ¤Iî‚ .pW\qEÊz¦îÚD@Y´ksÜ îõï¿ÿîzöì鮽öZ·À üœnB ¾HâïØÄ¢egžy¦ëÚµ«Ûe—]bÑ5Bæ# Æß| S[ÂØ±cÝm·Ýæ6Ûl3÷ÄO¸1cÆX´NŽ¿úê«Ôö[iG@ªž´p‰ýÃrçé§Ÿvݺuswß}·•2sæL‹Ïã7ºÅ_ܵjÕªÄÒõ˜ÕD@Œ¿šèǸnâñÿý÷ßnðàÁÝþË/¿l*Ÿ#FĸåjšM! UOSéºB eˆñ§l@ËÙ6ÚHÎ[åXe ! Æ_! UB .ˆñÇe$Ô! „@…ã¯ЪF!Äøã2j‡B B(:g…€NZ5ŠÇŸ´S{…@Á ã/+Ý(„€H ËœŠaT'„€E `éV! „@ãOÃ(ªB@"ã/,Ý*„€HbüiEõA!PbüE€¥[…€i@@Œ? £X†>ÿÑGµøûe(^E !PEÄø«~œ«&ÿûï¿o·âÜNµMâã/3=!„€H4bü‰>5^!P<büÅc¦'„€‰F@Œ?ÑÃ§Æ ! ŠG@Œ¿xÌô„B шñ'zøÔx! „@ñ(,sñ˜ÕÄŠÇ_ìNÖ&ŠÇ_›ã®^ !PÃ( ¾º.„@" ¼º-„@í" Æ_»c¯ž !P£ÌY£ýN]·ÿüóO÷Í7߸¯¿þÚ>3f̰oÎýðÃîÇt?ýô“}gÿöÛoŽgÿøãûæ8üüõ×_îŸÿü§›sÎ9í3×\seŽ97ï¼óºXÀ>-[¶Ì‡ç_|q·ÄK8¾Ããýë_îÿ¼‘ºPJ²êIÈp}ùå—nêÔ©öùì³Ïê|O›6ÍM3‚Lo`®0YîB -ä²sö1Ì»!ÆÓ‡ùç›8‡åOö$’=±|ÿý÷6ñ4Ô®6mÚ8>Ë-·\ï¶mÛºÅ[,Ó!9²ê‰Òfˆ¤ýñÇ»‰'º &Ø7Ç|`¤ }É%—Ì0Ìr.[²^tÑEc!Y3qä®D˜Ä²'/ŽY¡„Ö*«¬bŸUW]5s¼üòËÇ¢OÍb=* µF‰ùÝwßucÇŽuo½õ–7nœ{ï½÷2ñï[·nax+¯¼²·k×Îq•KÚ•ÀäɓݤI“êLz_}õ•uwþùçwk®¹¦ëÔ©“ëÒ¥‹[guÜj«­fꨴá¡þ2" Æ_Fpëýí·ßºÑ£G»W^yžaö0;˜ÙZk­e̬cÇŽŽÒ.êÑÿG`Ö¬Y¶zçwŸ·ß~Û¾ýõWïk×®nƒ 6pn¸¡}³Ç B AÄø„¦™`J/½ô’{æ™gÜóÏ?oŒŠ"Q]¬¿þúöAbå·6;‹›+$VL¯¾úªM¨¨ÉدX{íµÝæ›oî¶Þzk›8'B ƒ€ŠÐ]?þøãî±Çs/¼ð‚m~ÂØ·ÜrK·é¦›ºM6ÙÄ6\#¨JEäA`úôéîÅ_4ìŸ{î97eÊ·à‚ º­¶ÚÊí²Ë.nÇwt‹,²Hž'uJÔbüÍn6%yä÷àƒšÔÙ¢E c40™m¶ÙÆ-»ì²Í­BÏ—ˆÀG}äž~úi÷ÄOØ„ð÷ßÛJ Gn·Ývs /¼p‰%ë1!hÄøK>Ô 0“»îºË >ÜÍ7ß|n§vr{íµ—©`þ¢x!€/ÃSO=å~øa3,ˆvÝuWwðÁÛD-u[¼ÆK­)+büÅÀ‹*áÖ[oµŽRè<ð@S#`/JL>ú¨0`€{ùå—¾Gu”;äC¤ Jƪ•ÍC@Œ¿üP\vÙeîž{î1ý¡‡êø`Z)J6~ø¡Mä¬ÞXÉ1®'Ÿ|²[f™e’Ý1µ^4Œ€ÃØ8óŽ=ï¼óÜÀÍÄò”SNqûì³›{î¹{L׈ÀÏ?ÿìî¼óNwÕUW9VvGq„ëÓ§9Å%°;j²h …e·ÎìÙ³ÝÙgŸmÌþõ×_w<ð€?~¼;è ƒÄôó–‚søS{챎À 7Üà† âVZi%wå•WÚJ ]T„@ÅêÉ@ñÿ0<ì°Ã,°Ù…^hKbÖˆj ü0®¹æÇ;€ÇtÿþýÍ? ¶PPoSŠ€$þp`Ñï¢ÊaÃv£6²°,÷ÅôC„jë›Íú3Î8Ã}ðÁf’»Þzë¹~ýúeâ ÕêmÚÄïG” b»ï¾»©sì8 l°æ:á„ÜvÛmçî½÷^3á;®c! ´¹ûù矛S’=^·+®¸b‚ÆOM­$o¾ù¦ÙþcÍ…cá®EB Ô6ã'pKxÜúùG&°H4†À§Ÿ~j!8M &9ë5†–®ÅÚÕñ㾿Ç{X€41ý˜¾ž1lÎ^Ï>û¬cÀáK$’ˆ@͆-ÄLï7Þp,ߣ”ôYEÜrË-VöÌ™3-ÌòÎ;ïlRbµ_,–ˆ`yøá‡GÞ”÷ßßlà‰§¿Æk¸m·ÝÖúœFf›‰ Œ-±DB IÔdòS6s1Ó;çœs,,rTÓëÖ­›{衇,ìòàp ‚ âV êСƒE«¤n¢‡â…5áã@(dúJŸWXawÌ1ÇX4L2p•Jgu–m¨–ú|9Ÿ#Ò*èé§ŸnyÊY—Ê‘#àƒUÕy³¼À§& ¼£V¤}÷L?Øb‹-o^§\? 7ðqaêœç‡îYï'¼**𫇼×8éóÝÚ'¼Á3ؼ÷û”ŒÁˆ#ÂÛò~û¼¹õÚÞXF>ÎMà'·ðûöfÖgŸ8¥Îù†~Пp¥ÎeïPxuJsüð+©€þ6D”~!5ux_±ßÞÃ7ðÙÐïàW죺_T!Ø%×Á ½´i¿½ÚÈÏ•·\¿‰ø€nvͧR ¼gpà~s0à·OØyÎ{ŽÞb$ðQ?/=^Ec×¼RàÃE>´€M\>2¨÷öæOPnŸöíÛ>r¨÷Ù¼‚9æ˜#ðê–ÀÇ¢ ¼z+ðûvÍÇ öÜsOûM``~d×øãs LÔ·Ùf›>ŠeÀ„™¸æ³†¿ÿþ{Ë>Û˜MFÔÓ»wïÌ5ï3aeû@iÆÄ}kûí¦>wAà´çŸ~Ào>^bÏþç?ÿ ü Æ0ó!• ÃÁÓŸí·ß>ðá–ƒyæ™'Xzé¥¯Ž ¼dx‹­Àgå B¼2 ‰à€:»wïAI*BT Úcü0 ˜™Ì)Ê0VNȈr ?î¸ãŸyËNÔ`Ð^õb’6R-LšgaN0)˜=¿ díåÞiÓ¦ÙäâÓ šÔïC ^ç|òÉ'V¶÷C|¨L;²%þ‹/¾8#™sÌ*äî»ï6éÙ{©>4±­‚|î[c®÷Ýw_àÕ7·a·{³'†ìþù°y,µÔRkІÿþ÷¿™[|(äÀ'@ÉL ~3=ð–T¶baûpÖÖ^V?^o\}õÕöl¶ÄOù}ûöµ6M:ÕúMÛ úÃ$ǸúÄôV&ý»öÚk­OÞ/ðÉpìÞ(ÿx•¡MÎQ–©²„@™Rs:~Ï@œ—L]«V­"U›yfã¼úÈyæ“·\BxFž¹†3mð“…óÌÌR3’lœaÈØ+ fÉ\ðä“Ofž½ä’Kì<§˜Z˜„/S|Æ)òÓ¢ÇÿóÏ?3÷7t@êGÂJ‹ž°Ä±jH,Ã-éÈ5@ ¾7D”ƒ?ÄE]ä~úé'óxÅúeï½÷6¬ÉU€®óGˆÈXTÑ~ê&u"y ˆ—ƒ…ÕÑG]¯*²š1n'žx¢yϲ!ß³gO7xðà̽ä.fó\¯r³Ëô “Kp¤oQcÈž‘H$ š³ê‘A0¨(‰ ͯ¾úÊÁàóY²{—„à!ÁÌCò’¬1@ˆ—Ü—–ÝÈ‘#ÃËöM¹!Á”Câ<›Ô0À6mÚ8¿’/5ù½ÄKdîñªkÌÕKÓ6Ùd.ú&¢†ˆ,dLz$5áäÃDåU<þ‚^Žaø0d ± ܘ\è?–27ß|³ój°:Õ c–ÝwnX}õÕ3÷cHäÙeòábBnÎFsXnî7mb $!Ps?Œï\¿éé8Áaø$÷È%$pì¾³CAÈ%$ÌJY 0yÀŒ÷ßcþLá$€ô¼*ÃM˜0Á$n¿Oà°„)”Z°Š Ìl ´!ZmµÕ,‚ixŒÉnERyV1Ð~ûíç†ê0)'¯v±ó”ËŠÇ«±Ì´æìõûv-û¸0¹P^ˆ‹×ù»›nº)s[CýÉÜP†Þ#¿¿Q†’U¤(5Çø’@lHQÌ’§žzªÙxÿöÛoVüĉßüso¼±åy ë¼ýöÛ-Ü/#.êcƒ Õ8 yý¿CªÎGHçHÁHHÚD”„¼ŽÐ¾‘äÉ8U “R;å°š@ÓÑæË/¿<Ãä¹oôèÑÎotóç7æ0|0bS^z饦"¢íHï¨kòµ6áá÷ì:€ßX5¬)¿Äêhذaö>U£~Õ)JF Ì›±,ËXàs°FÚ>6c}"³ÆÁ’ˬezõêUÇô’Í]/›f¥:u 0„°xaƒÔK¯WݘõÇP¸¹‹ybHl¬úØ1¶YÌæç7Þh›ž¡õŽ×‰ÛF­,f ¡Ù%›¡^÷cß^RÆŽkÇXa9C°Œá962óf˜XîÐf,•¼t¬ºêª·ÙtÚi§î“&MÊœ~ë­· ¯+7‹?ÞÌ®{õ˜ÕZͰÙÌ&²ßÏ0\ÁÉO°vonØ`îܹs¦?™Ô%±±Ì†>ÖV"! jϪ',I0£Äj%jòÒ«1/ïœ×>ÆSÃRÅ«:òVÿÅ_öÒzÞëÙ'±igâ`Ò€`†^ož¹…‰"¼–9ÙÈíòê³´ÁrÚj«­˜gc„]»—ô¾óÑõ×_o¦¡¹×üª'+êÌ%êçzHc:›ïÞðžJ|ƒ/œ_ÁT¢:Õ!¢D v?æ‘^=x}z”€TVÈø º¹ 7 æ—^Åcf>×°Iå 1ô¦šÈÄãUEffê# 6u{ì¯3‰âo€Ùl9‡Ø &Ú3ç ub˜áae‚u n÷•$ôØqé 6ìAÜvÛm¦s'õ$ú~ïPLè㽃…qÀ´3ÉÄæ3–KlȳZ‰%¹Oj{í!Pó‰XØäÅÞsB,d”q«öþ í±W;™Å¦¹~Èm¸á†…>ªû„@œ¨íxüáHøX6Îëüݺë®ëî¿ÿ~sŠ ¯é[€æ¸8ù½KØÓµkW#’Š@íÆãÏ1¢gŽ3ÆlÉ1Ìö’;Oǵ‰¾˜Ôbë­žœ˜~m¾iêuMÚñç@Âã„ãvé¬p*Õ.ÞìÔr øsæaŒo¡1DB éˆñg uÄÊyá…‰EЧO‹“u›SŽ€·j²xA8”‘c€\ò7„áRÞ}u¯ãÏ3ÈÞaÉB:x$wÇwXÌ—sÏ=WÁ¸ò`•¦S¬ðGè 6o½ãœy,{»4uS}®æ­zšzø¼«ó¡‚-ôÑ,‰™¬©2t=Þ¼öÚk6Ƙöz/hç=Œêtú"!BdÕSè “M¾ë®»Îy/Y‹´ sÀÒÃÇÏ/´ÝÈLÞ\VtãÆ³ [Be³·#•NLIÍ(bü¥ ËÎM8ðll—]v1_¬ƒˆ¯/Š'ÄóÙÉÌiøÿŒŒžÜ¹²Ô‰ç˜©UeA@Œ¿9°-õ’#ÉPˆ¹ÝvÛ™Uß„U6j1Ïõ¡"‘N‰êãYÂd+–~uÇGµW1þ¨`'+>/¾ø¢Å×'Ô2™ŸH>‚s˜OùUu*§ÈZFiâþ“Í‹xùHö0{LuY‘½K$j1þr >ia<¨pï'qéÿHL‚›?™¸˜H(jèêq¾ƒÙ³êÂÁŠ8ù>€šÅÉgåå“Å+¦Nó`ÖÓéB@Œ¿ã9yòdË7;jÔ(KPBòöÈc‹nyíµ×v˜ âªÉ áÉ#Á³‹m=Ÿ03>Lª$¼!}£­ÆQWj1þj¼Ø‹û*&"¡’©ŠU©Ûú<±>‰‰¥ócb ­RÖ ¡6Ãk–ìeáK*ÎC‹-¶˜ëÒ¥‹Mš¨ÓH{I4‘! Æ_L¸iÊ”)&ɾ÷Þ{fóÃ"-# ÚI¨~HHà Ãt†hnÉUÖ˜äê„jÎþ° â7¼Ocå³úaÒ 'Bâ(±2Zf™eJ®_ !àÄøãüøl¶?€ÔË$ð© s ™$yx¹‚é³iÉÊé—Ox Å×€OË–-ë“G%l׳?œ£L5–0áÇ'!ɦ&™$ßÙÇ>£#¡|ø¡­÷ÝwuÚLŒÿpã›+˜½O%çáQÛ„@RãOêÈÑnœÊ˜P…Œ5ü†ÉrüÍ7ߘÇ1Ì™Ï \¶.“Ë œX˜l ({b2âƒ/YY:•m8T°h1þ†IëyTGÙºÏÏ›‘à‘ê³%z¤ýìU@x®X-„ŒžÕ–K"! b€ì‡H B@D‹€±D‹§JB@Ä…eŽÿ©…B@HãN&„€ˆ?ÿþåLϹIEND®B`‚asio-1.12.2/doc/blank.png000066400000000000000000000005661340672067200151100ustar00rootroot00000000000000‰PNG  IHDR€€L\öœgAMA± üa-IDATxœíÑA À0À¿çMF4 z×;3'ÎÓ¿kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À€5kÖ¬X°` À`fýHfIEND®B`‚asio-1.12.2/doc/boostbook.css000066400000000000000000000423231340672067200160230ustar00rootroot00000000000000 /*============================================================================= Copyright (c) 2004 Joel de Guzman http://spirit.sourceforge.net/ Copyright 2013 Niall Douglas additions for colors and alignment. Copyright 2013 Paul A. Bristow additions for more colors and alignments. Copyright 2017 Tom Westerhout font fixes to support Sphinx Distributed under the Boost Software License, Version 1.0. (See accompany- ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ /*============================================================================= Body defaults =============================================================================*/ body { margin: 1em; font-size: 16px; font-family: sans-serif; } /*============================================================================= Paragraphs =============================================================================*/ p, div.document, div.footer { text-align: left; font-size: 10pt; line-height: 1.15; } /*============================================================================= Program listings =============================================================================*/ /* Code on paragraphs */ p tt.computeroutput { font-size: 9pt; } pre.synopsis { font-size: 9pt; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } div.highlight, .programlisting, .screen { font-size: 9pt; display: block; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } /* Program listings in tables don't get borders */ td .programlisting, td .screen { margin: 0pc 0pc 0pc 0pc; padding: 0pc 0pc 0pc 0pc; } /*============================================================================= Headings =============================================================================*/ h1, h2, h3, h4, h5, h6 { text-align: left; margin: 1em 0em 0.5em 0em; font-weight: bold; } h1 { font-size: 140%; } h2 { font-weight: bold; font-size: 140%; } h3 { font-weight: bold; font-size: 130%; } h4 { font-weight: bold; font-size: 120%; } h5 { font-weight: normal; font-style: italic; font-size: 110%; } h6 { font-weight: normal; font-style: italic; font-size: 100%; } /* Top page titles */ title, h1.title, h2.title h3.title, h4.title, h5.title, h6.title, .refentrytitle { font-weight: bold; margin-bottom: 1pc; } h1.title { font-size: 140% } h2.title { font-size: 140% } h3.title { font-size: 130% } h4.title { font-size: 120% } h5.title { font-size: 110% } h6.title { font-size: 100% } .section h1 { margin: 0em 0em 0.5em 0em; font-size: 140%; } .section h2 { font-size: 140% } .section h3 { font-size: 130% } .section h4 { font-size: 120% } .section h5 { font-size: 110% } .section h6 { font-size: 100% } /* Code on titles */ h1 tt.computeroutput { font-size: 140% } h2 tt.computeroutput { font-size: 140% } h3 tt.computeroutput { font-size: 130% } h4 tt.computeroutput { font-size: 130% } h5 tt.computeroutput { font-size: 130% } h6 tt.computeroutput { font-size: 130% } /*============================================================================= Author =============================================================================*/ h3.author { font-size: 100% } /*============================================================================= Lists =============================================================================*/ li { font-size: 10pt; line-height: 1.3; } /* Unordered lists */ ul { text-align: left; } /* Ordered lists */ ol { text-align: left; } /*============================================================================= Links =============================================================================*/ a { text-decoration: none; /* no underline */ } a:hover { text-decoration: underline; } /*============================================================================= Spirit style navigation =============================================================================*/ .spirit-nav { text-align: right; } .spirit-nav a { color: white; padding-left: 0.5em; } .spirit-nav img { border-width: 0px; } /*============================================================================= Copyright footer =============================================================================*/ .copyright-footer { text-align: right; font-size: 70%; } .copyright-footer p { text-align: right; font-size: 80%; } /*============================================================================= Table of contents =============================================================================*/ div.toc { margin: 1pc 4% 0pc 4%; padding: 0.1pc 1pc 0.1pc 1pc; font-size: 80%; line-height: 1.15; } .boost-toc { float: right; padding: 0.5pc; } /* Code on toc */ .toc .computeroutput { font-size: 120% } /* No margin on nested menus */ .toc dl dl { margin: 0; } /*============================================================================= Tables =============================================================================*/ .table-title, div.table p.title { margin-left: 4%; padding-right: 0.5em; padding-left: 0.5em; } .informaltable table, .table table { width: 92%; margin-left: 4%; margin-right: 4%; } div.informaltable table, div.table table { padding: 4px; } /* Table Cells */ div.informaltable table tr td, div.table table tr td { padding: 0.5em; text-align: left; font-size: 9pt; } div.informaltable table tr th, div.table table tr th { padding: 0.5em 0.5em 0.5em 0.5em; border: 1pt solid white; font-size: 80%; } table.simplelist { width: auto !important; margin: 0em !important; padding: 0em !important; border: none !important; } table.simplelist td { margin: 0em !important; padding: 0em !important; text-align: left !important; font-size: 9pt !important; border: none !important; } /*============================================================================= Suppress margins in tables =============================================================================*/ table th > *:first-child, table td > *:first-child { margin-top: 0; } table th > *:last-child, table td > *:last-child { margin-bottom: 0; } /*============================================================================= Blurbs =============================================================================*/ div.note, div.tip, div.important, div.caution, div.warning, div.blurb, p.blurb { font-size: 9pt; /* A little bit smaller than the main text */ line-height: 1.2; display: block; margin: 1pc 4% 0pc 4%; padding: 0.5pc 0.5pc 0.5pc 0.5pc; } div.blurb img, p.blurb img { padding: 1pt; } /*============================================================================= Variable Lists =============================================================================*/ div.variablelist { margin: 1em 0; } /* Make the terms in definition lists bold */ div.variablelist dl dt, span.term { font-weight: bold; font-size: 10pt; } div.variablelist table tbody tr td { text-align: left; vertical-align: top; padding: 0em 2em 0em 0em; font-size: 10pt; margin: 0em 0em 0.5em 0em; line-height: 1; } div.variablelist dl dt { margin-bottom: 0.2em; } div.variablelist dl dd { margin: 0em 0em 0.5em 2em; font-size: 10pt; } div.variablelist table tbody tr td p, div.variablelist dl dd p { margin: 0em 0em 0.5em 0em; line-height: 1; } /*============================================================================= Misc =============================================================================*/ /* Title of books and articles in bibliographies */ span.title { font-style: italic; } span.underline { text-decoration: underline; } span.strikethrough { text-decoration: line-through; } /* Copyright, Legal Notice */ div div.legalnotice p { text-align: left } /*============================================================================= Colors =============================================================================*/ @media screen { body { background-color: #FFFFFF; color: #000000; } /* Syntax Highlighting */ .property, .highlight .k, .highlight .kc, .highlight .kd, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kt, .keyword { color: #0000AA; } .highlight .n, .highlight .na, .highlight .nb, .highlight .bp, .highlight .nc, .highlight .no, .highlight .nd, .highlight .ni, .highlight .ne, .highlight .nf, .highlight .py, .highlight .nl, .highlight .nn, .highlight .nx, .highlight .nt, .highlight .nv, .highlight .vc, .highlight .vg, .highlight .vi, .identifier { color: #000000; } .special { color: #707070; } .highlight .cp, .preprocessor { color: #402080; } .highlight .sc .char { color: teal; } .highlight .c, .highlight .ch, .highlight .cm, .highlight .cp, .highlight .cpf, .highlight .c1, .highlight .cs, .highlight .sd, .highlight .sh, .comment { color: #800000; } .highlight .s, .highlight .sa, .highlight .sb, .highlight .dl, .highlight .s2, .highlight .se, .highlight .si, .highlight .sx, .highlight .sr, .highlight .s1, .highlight .ss, .string { color: teal; } .highlight .m, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .mo, .number { color: teal; } .highlight, .white_bkd { background-color: #FFFFFF; } .highlight .hll, .dk_grey_bkd { background-color: #999999; } /* Links */ a, a .keyword, a .identifier, a .special, a .preprocessor a .char, a .comment, a .string, a .number { color: #005a9c; } a:visited, a:visited .keyword, a:visited .identifier, a:visited .special, a:visited .preprocessor a:visited .char, a:visited .comment, a:visited .string, a:visited .number { color: #9c5a9c; } h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover, h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited { text-decoration: none; /* no underline */ color: #000000; } /* Copyright, Legal Notice */ .copyright { color: #666666; font-size: small; } div div.legalnotice p { color: #666666; } /* Program listing */ pre.synopsis { border: 1px solid #DCDCDC; } div.highlight, .programlisting, .screen { border: 1px solid #DCDCDC; } td .programlisting, td .screen { border: 0px solid #DCDCDC; } /* Blurbs */ div.note, div.tip, div.important, div.caution, div.warning, div.blurb, p.blurb { border: 1px solid #DCDCDC; } /* Table of contents */ div.toc { border: 1px solid #DCDCDC; } /* Tables */ div.informaltable table tr td, div.table table tr td { border: 1px solid #DCDCDC; } div.informaltable table tr th, div.table table tr th { background-color: #F0F0F0; border: 1px solid #DCDCDC; } .copyright-footer { color: #8F8F8F; } /* Misc */ span.highlight { color: #00A000; } } @media print { /* Links */ a { color: black; } a:visited { color: black; } .spirit-nav { display: none; } /* Program listing */ pre.synopsis { border: 1px solid gray; } div.highlight, .programlisting, .screen { border: 1px solid gray; } td .programlisting, td .screen { border: 0px solid #DCDCDC; } /* Table of contents */ div.toc { border: 1px solid gray; } .informaltable table, .table table { border: 1px solid gray; border-collapse: collapse; } /* Tables */ div.informaltable table tr td, div.table table tr td { border: 1px solid gray; } div.informaltable table tr th, div.table table tr th { border: 1px solid gray; } table.simplelist tr td { border: none !important; } /* Misc */ span.highlight { font-weight: bold; } } /*============================================================================= Images =============================================================================*/ span.inlinemediaobject img { vertical-align: middle; } /*============================================================================== Super and Subscript: style so that line spacing isn't effected, see http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341 ==============================================================================*/ sup, sub { height: 0; line-height: 1; vertical-align: baseline; position: relative; } /* For internet explorer: */ * html sup, * html sub { vertical-align: bottom; } sup { bottom: 1ex; } sub { top: .5ex; } /*============================================================================== Indexes: pretty much the same as the TOC. ==============================================================================*/ .index { font-size: 80%; padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; } .index ul { padding-left: 3em; } .index p { padding: 2px; margin: 2px; } .index-entry-level-0 { font-weight: bold; } .index em { font-weight: bold; } /*============================================================================== Alignment and coloring use 'role' feature, available from Quickbook 1.6 up. Added from Niall Douglas for role color and alignment. http://article.gmane.org/gmane.comp.lib.boost.devel/243318 */ /* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */ span.aligncenter { display: inline-block; width: 100%; text-align: center; } span.alignright { display: inline-block; width: 100%; text-align: right; } /* alignleft is the default. */ span.alignleft { display: inline-block; width: 100%; text-align: left; } /* alignjustify stretches the word spacing so that each line has equal width within a chosen fraction of page width (here arbitrarily 20%). *Not* useful inside table items as the column width remains the total string width. Nor very useful, except to temporarily restrict the width. */ span.alignjustify { display: inline-block; width: 20%; text-align: justify; } /* Text colors. Names at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords. Quickbook Usage: [role red Some red text] */ span.red { inline-block; color: red; } span.green { color: green; } span.lime { color: #00FF00; } span.blue { color: blue; } span.navy { color: navy; } span.yellow { color: yellow; } span.magenta { color: magenta; } span.indigo { color: #4B0082; } span.cyan { color: cyan; } span.purple { color: purple; } span.gold { color: gold; } span.silver { color: silver; } /* lighter gray */ span.gray { color: #808080; } /* light gray */ asio-1.12.2/doc/caution.png000066400000000000000000000023421340672067200154550ustar00rootroot00000000000000‰PNG  IHDRשÍÊPLTE!!11BBZZcckkss{{„„„„sŒŒŒŒsŒŒŒ””””s””{œœœœsœœ{œœ”œœœ¥¥¥¥c¥¥œ¥¥¥µµµµZµµcµµµ½½½½cÎÎÎÎÎÖÖÖÖÎÖÖÖÞÞÞÞ1ÞÞ9ÞÞBçççç1çç9çççïïïïï÷÷÷÷÷÷÷÷1÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ_§ä\bKGDˆHñIDATxÚu’ÛŽ‚@ †ñÀ®bÌ®ÊIc¹APÛ`bxÿ³sBEíU§_çïOh¿<Îô`Ó'€á1û§wpŽÜä õW–Èt:%suá&³w,ÀHêéȯøf Øþ“Èü‚—²59 ævÀ:€Ç\^ F;`çªHãJ'Ê8‰ƒ71€›íZJ²Æ+ïçb²2B‘¢8·ÀŸ›¤Q§$×wŠéRKÕ ´v)ÎnR˜Áp¯t¤ß} Ì²ŽÅîéŸVb¢Tšz·Dç ±·vã@Ïí=”rPºþ—§¥duõ—Ÿvz{Nël;—a*CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec70387830aa4ecd5a4a32a852283b3d6øP¶tEXtPage24x24+0+0r[ 1IEND®B`‚asio-1.12.2/doc/draft.png000066400000000000000000000420561340672067200151210ustar00rootroot00000000000000‰PNG  IHDRŒ¶K°ZJgAMA± üa IDATxœíÝÛvÛ¸–…a<ËNºG¿ÿ3öèŠmQ<¢/Ö·¶’€ øW®TB1rÌ©,ÚZ«ˆÏ4MY–m}[2[ߟ躮m۾﷾‘-å[ßïu]w¹\¦išçY)U–åÖw´ *i@\–„VJãx¹\[OSI"rÐbùâ€õ´¦q ‰ ½È󼪪ªªÂßÕ†¨¤Qø&¡•Rã8*¥´Ö‡ª§ iÀö¾Oh!ãÞÖÚãÔÓ„4`c·$´RJk-õ´Rê 9MH¶tcB/•Ó„4`3÷&´8NNÒ€mô}ÿ@B‹ƒä4! ØÀc5ôµ#ä4! mM }mÙç$Õœ&¤Aõ}ß¶íú„Vè÷fïn@8z1 Ã0 KZ§„„ã<¡•Ryžc’Úsœ„Vì8ðÚ BàØÿýßÿÍóìöšLhÅp7À­þù‡„v…8Ã<´[ wÜ`Ú9*i€$´„4`-ÚB° í! xb^Ñ8x5´oTÒ€GÐÒ€»‘ÐaÒ€û0 sÒ€;ø«¡ëº&¡ß!¤·b”;0†»7¡†üÌkBC}Ž÷ðb$ô÷xkßñ”ÐeY’Ð?âÝ|‰„Þoàs$ôæxŸ ¡cÀÛx„Žïà?ÐñàÍü Þ/À¿üù󇄎 {w”¢†Žï€:R¼qptþüÇÑí5Ih'xïàÐHè˜1' ÇÅæ¡•RÓ4EAB;Ä[ ÇòÏ?ÿøHh¥”ÖúõõÕÓʼn€ñ1}ÍZûòòBN»BHÀQø˜‡þˆœvˆ€Cð4ý)rÚBÒ2¡9í„¶Ön}|ÏCCkýëׯzA=í •4Äew ­®êi¯}dêxõ4! ùóçÏîZHNWUŸ·C„4Äb/óÐ_a~Ú9B¢°÷„ä´[„4l/„ä´C„4l,¥„ä´+„4l)½„ÁrúÏŸ? ç4ë¤`3©&ô‚õÓ+mÿ-€cŠóä ·8z%*iØ@ò5ô5©§»®›çÙë ¥WOÇõ€#xyy9NB«€ûœ¤7?Ý÷Ò6ϳóí3cNh¦Lkظw¤ßNH•1&Ïó¦i´Ö®.yB Öe=€9iØÀ4Mã8¶m»ršv/ ½ ßû.ûø¦@b²,Ëó¼®ë5ẻ„VÔÓw¢’€Í¬©§÷˜Ð êéíï[ Éx¸žŽm=ô½¨§oD% »·ž–º®kß çõôvù R"õôeñ2ʽ÷„Vìï}B¶·äô÷ë²v=ý©%§½þö»~šánˆÅ4MÃ0\.—OǽÓKèkmÛú÷¶Öþþý{_ãÞ„4Dä«ùédæ¡¿ §ÕÞæ§ü8Z¹9ɧýÞGHh¥TÓ4ô{¿C% μ¾¾Ê$ëʤ¹®§’Ð êék„4¸!§OºÊTÉé®ë²,;NB rzAH€×çC»Êéyž§iʲ,ÉN±ï‘Ó‚€µ®Z¸Êik­«Ã²v‡œV„4¬ô1¡ÅÑæ’} §7„}•ÐJ©yžeѳïŒIýÞ„4<蛄äôz’Ó¾gå£ÍiBñcB rz½¦iªª:æþÞÌIÀÝnLèóÓë…™Ÿ~~~.ËÒëKÜ…JîóòòrWB+êiÂÌO¿¾¾ö}ïõ%îBHÀž¼$§× 3?UNÒp«•íEäôz2? ,’œfNnâªXk]–%óÓkg~šJ~æ°õ×ZK=½Òqæ§ iøÁbß›çyÇqË|ØArš€ïøØæBkçyžç‡Ý—Û‰#ô‘1' _ò‘Ь™v«mÛ®ëæyöú*[ÍOSIÀçHè]³ÙVýÞ„4|‚„Þ‘óÓZëMršánx„Þ£$×eQIÀ ¡w*É~o*iø·{Oθ Rbõ4•4ü‹óõЊ„.±uYTÒ £ÜiI¦ž¦’_;–Ð[I¦ž¦’ptÔЩJ ž¦’phž:Ïszs ô{SI8.jè#Øu=M% à HèƒØõü4•4€#b=ôÑì´ž¦’p8¬‡> ÎOÒŽ…QîÃÚcNÒ„„>¸Ýå4! à(Hh¨½å4! àXEÓ4UUí"§ iéó´ëgžçMÓÐ{T×õ.rš8£Ü$ô®Õuÿ¸7! eþF¹IèÄ??MHH£ÜøQäóÓ„4€4ù;}’„NLÌóÓl Ažvý¤†NØåréº.¶}C©¤¤ÆÓ®Ÿ$tÚ⬧ iI¡S ‹0§ ié S +Å–Ó„4€D°NDµ~šÆ1)`”nEÒGF% `÷Hh8ɸ7! `ßHhxCNÒvŒ„†W›ÏOÒöŠ„FÛîïMã€]bO1„´U•4€ýñ±§ë¡ñ­æ§ i;ÃÉØÄ&9MHØ ŸÓ„4€Ý`O1l.XNË?uBÀ>°/7" §ó<·ÖZks¯®°Ú Q©ëZ)å©ß»(ŠªªŠ¢ÐZSIˆ yª§¯Z1Ü r$4¢å|?²w ­ØÌ@ÌHhÄÏÕ>'ZQIˆ ]p2îýiB+B@œHhìÈÊœþ*¡! B$ôÓ49÷ð£‡sú›„VJ± @\Hè5Æq†a†q›¦ÙúvŽåuYß'´"¤D…„^Cºm[¥Ô<ÏJ)r:°»rúÇ„V wˆ ½ÆuB+¥æyîºnùOsã¸÷- ­¨¤D‚„^ã]B ÉiE=œÔÓ}ßu ê ­i1 ¡×ø4¡Å<Ïrž9˜ä´RêcNߞЊ°9zoZLÓDNoâÓœ¾+¡! `[þº®kZLÓĸ÷&Þåô½ ­i¢†^ãÆ„Œ{oeÉi­õ½ ­Ø»ÀVHè5îJèE–eeY’Óáõ}/‡—ߕЊ° ¯£Üyžøác -Èé­XkïMhÅ:iá‘ÐkHBŸÏçÇþ¸ô‘±~:¼ZQIÌGBk­‹¢8NB¯XcLUUÔÓñ£’ ½Æ8Ž}ß?\C_“>2êéøÒ!¡×úr¹<6júãÞ»@H„^ÃÕ(÷;Ó4MÓôÕÖ•ˆ! À;O }¨N1%ožçEQ$ÿî! À/5tÓ4ÉÌÊ^îoäy^UUUUί ‡èîà£Ükx­¡Iè] ’à £ÜkPCCÒèÐi£’°™ä÷÷–õÐ>jhú ¨¤l,Õzzåvþ˜e”û8¨¤l,ÉùiNÒ¶—XN“Ðp……drš„†CÌIˆÈ<ÏmÛîw~š„†[„4€¸ì7§eµ ‡îcLÓ4»÷^NŸ$¡á! :»ËiO»~ZkIèƒ#¤ÄhÉéø÷9ñ·ëgQ$ôÁ1' ^ñÏOÓ)¯iQ “ÓÆ˜ß¿ß›Ó$4|c¸@ÔÂÌOÏó|ï¸7 i±‹°lésžÐY–‘ÐXÒvÀÏyY^χæl+\cNÀnë#{~~βìÓÿëu”»,˺®Ý^»F% `7‚{¿¾¾~ú9ÀSB[ke”›„Æ;TÒvFêé¾ï½>¾>ÖÓžv,QtŠákTÒvFêé²,ÔÓÓ4-ÿé)¡éÃ7¨¤ìRÈùi¥546AHØ«09­µ®ªªë::Å! `ÇÂÌOû@BãÌIرe~ÚëúiçHhÜ(ßú`Éi¥”ïqoWHhÜŽJÀî…Y?í »Äþn±‹œ&¡q¯xÿ5À]"ÏiˆñŸ2<&Úœ&¡ñ˜¸þÀJæ4 ‡Åò\‰*§Ih¬±ý¿`pnÉém×O“ÐX‰uÒÒ´ùúiëQIHÖ†õ4 'i)ÛdßP®Ò8§Ih8Äœ4€ô…œŸÎ󜄆+TÒ!غ¬¾ï§iòú8BÀQ„Ééyž_^^Èi8AH80ýÞä4\ÑÖڭç¹m[ßóÓÆ˜_¿~eYæï%<*i‡Ã¸7ö‚pDä4vánÇ5ÏóåréûžqoĉJÀqcêº.Ë’zq"¤Ú’Óô{#B wãÞˆ•40îHÒ 9(Ò@\Æqô}¾BN#6ÌIy}}íû¾,K9îP)åû4|f~Zkýû÷oæ§ñ=Bˆ…$ôòŸyžgYVU•1†¨Œ>2D‚¢ð.¡¯UU•繜 áu™®‘Óˆ! lVJYkµÖEQäy^UQ ãÞØ! lìû„’ÓBf¬}¶A=mÒÀ–nIèOÑ\ 9 ÒÀfNh¡µ6Æ”eYE–eÖþ0î­ÒÀ6V&ô5kmÓ4Y–IaMZû@Nc„4°‡ ½0ÆÈª-9+‚1pç÷Fx„4š„^H]×u–eEQ( k§ÈiFHA½½½u]æµd5càn‘Ó‰ ™Ð²jË£µ–šæ2WÈiCH„LèOITSX;AN# Baó„^ ë<Ïe/)²7¼¥½£ßÒ€w›'ô;²s™Öyž+ ëGQOÃ7Bð+¶„Ka-;—åyΖà!§á! xgB¿ó®°&ªï,§ŸŸŸeäÇAH¾ì"¡¯I[ÙÒ\†Û‘Óð„¼Çñíímš¦­oänƘ,˪ªÊ²Œæ²Û‘Óð¼°ÖÊÎb; 9­µDµ4„+šËn@NÃ9BðeÇ———½ÿˆÉ.(Ò_FsÙÈi¸EH¾LÓÔ¶m×u ›Œ{7M#ƒá üü!§á! xÔuÝÛÛÛcVk]E<o­•„–½Pèÿ9 WiÀ£išÎçó0 üYkm]×yž_.k­×Çý½¤§¬®kc ÍeŸ"§á! øÕ¶­¤ì½ÐZ›çùét2Æ ÃÐ÷ý4MñüÀZkeÜ[¢ZŽÅÄ5rëÒ€_ÖÚ?þ<¶K"°ª*­µµ¶ëºaÆq”ýœßêÃd \ZÁi.»&9= ƒ×ÅxZë_¿~‘ÓI"¤¿¬µRL?|…_¿~-uª„ôc¥¹WR÷Ks™ÖšÀXPOc BðnÇ?þ<üÇó<zzºÞ·Y¢ºëºiš",[—ƒ¶h.aêir:I„4àÓmÛ>–XRž–eiŒY~Qʲ¶m§iŠm\nFXË8'CÓx ! „Ð÷ýÛÛÛÃ?n‹ia­¦i†®ë¢jÿ^Èзl ~ðð`~ ¤¬µooo}ß?|…ªªžžž¾ú¿òèïº.¶ÅZêoa-càÒwØæ2r÷"¤¬µ}ߟÏç‡âŒ1MÓTUõÍKÌó<üõèúu}zÇ1ÇÀeÆi yž_^^Æq|¸ˆ,˲išï³ÍZ+diu„«w]·æ eY>???–²Ëø<Ïã8>|^ÉsIšÀ¥¡=áÂ:Ìü´"§÷‰‚’yâ———5•“Öút:•eùp5,·!MàÑFµÈó<ùæ2êi|…B“C¦W®*ËRN±|ø ÒD6Žã<ÏçóYýÝj4NÒ\&ýeI6—ÑïOÒÀú¾yyY™4·/ÇúÑ4M²a™4;¹¦×;—©äÆÀÉi|DHbzå¾`EQ4Mãêi+…µ4Ë”yÌcÌua½õí8Ãü4Þ!¤m¬\‹¥”ÒZ?==•eéê–„µvÇqû¾÷+i­¥ \Þ„4ÒšœÆ5BØÆ<ϯ¯¯+›¶Œ1¿ÿöN²FKvA‰v'ðE–eRXgY–@T‡Éé<Ïe-Ÿ¿—Àz|Œ6“çù0 +g¦û¾—ÎgWw%äÙ]×µ¬Ô’>p·/áÌ©_.—º®%°w}Жœ ._{Êé,Ë\54À+*i`3ã8¾¼¼¬ü,ŠâééÉw&MÓ4ϳÌXKõsíºÜߺ¬,ˤ›2:~„4°‰½óù¼2Hš¦Y /dëïišú¾—IëÈóÏS×µ´˜©¸?U|ÅǸ7 ½/ w›‘ÕׇÇ0 r:…“»úŠþ«( ‰ 9b+Úú²þ{9½CVmí+ª—qoWG™‘лC% lìíímÍ.¡J)kíóó³„P0RU/Mà‘?Id·2iÏó|_Qíªž&¡÷ˆ¶$‡^œÏç•u’œº~×LY]}¹\duuœGa.äÞ–-Á#¿ÛkësÚs:HèÝa¸Ø’ ÆfY¶2¤eqsø>)y9i/ŠBšÀ£ýè/7v¹\´Ö}ßËY[Zëøske¿75ô~QI“búõõuåuò<ÿýû·“[zØ<ÏÖZ9bKÒ:æRUâ¹,K™ÑünÕ£õ4 ½k„4°½q___§iÚE›÷¤›Lvïû^ÅÝ®e­½ŽêÈXß›Ó$ôÞÒ@.—‹EµÆú£±Ü’#¶Ú¶uÕœì•4ÛKs™“®{OnÏiÙ±DÖ‹‡¹78Çœ495yeûn×uEQnóþ†l -3îRXÇÕó<Ë(ýRX—eáøë²Hè4PI±p²KŠéðmÞß“çŒë7o CŽÅ”íP"ܹìûzš„N•4kmUUÃ0¬©5µÖq- 'gUåy.Û–E¾ºZú¤g^VmEÕ\öM¿·lµFB§Jˆ…ì%VkÄ63ýÑõ[ñw–)¥¬µÒUUIUÉ ¬§1MÓÐÉ ’b!Ûú–#¡b~F/GlÉøü0 2„Iò}¤µ–#Fdƺ®kYà¾õ}½¯§åN•4‘išÚ¶íºne\Õu}:\Ý•o2î-Û–y=AÙ!éÏó\šã¶ýx!õô4MeY’Љ!¤¸8Y‹eŒyzzŠ¡Ô»4W÷}ßu]ÌUµÉiY¬%…õ¶Íz²•ºô¸mxpŽán .eY.3µ“À‹§Ëé2×+{‹n}/?“7VJ—éê­VmI/zàE|S¸HM¦õªQ.kíù|–µ×ïÍ·qåøË}¶P7NÇQñ”íP¨há! ÄEk]–¥œ(µæ"J)©ðöxÃ0ÈÄêçàäM–¨^šËŒ1yžïî3¢Âœ4éº\.+¯SÅóóó.b× ý)kmñ—ŒgìâØPIÑYæWaã8v]W×µ»[óbY3½õ¸$ËH{_-{ƒo}_Ø*i F®Šé²,Ÿžžb®áÒ«¡?%­²D*Ë2ÆÀq#*i FNÚÇ”R}ß—e)ûqFHjèäZýÝdt iYµEs~D% DÊZûòò²~¸ªª¦i"̃ƒÔП’¡oÙœÂß ’âUUÕú †!Âiiç5´ìã±—‰íyžå”Y¯UU…5>E% Äkš¦××ו;eÊùZQÍL/bº,˺®§i’^-ÙËÅÉňgç2Ćâe­íûþõõue¾fYöüüÉÓ_zW\Z*Q9ë³ë:Y²ìêU|³ÖcŠ¢Èó¼,ËxÚ¶i jÃ0œÏçqW>²›¦YŽKÚï„^XkåÐ*‰êø7¿&çvÈ)a‘|´ÂVi vooo]×­¼Hžç§ÓiÛí}$tQß·ÅÉ6æmÛÊ4°«—@6,«ëšM¹Œï=;i[Ù%Ç!»º¥«¡?þ69LŽØ’ F\݃Wò©BN‰ÞÑ0Ü"¤Ø9Ù[vGÉó|“âeµ•« Þ˜Ð׿_k}:Æq”C»­µ‘#J+Yžç$ô‘Ò@ìŒ1MÓ¬ï…–ÃšŠ¢üÐw¾úÞ„ò·Îÿ’PRª:¹+·äˆŽ¢(X—up|ûݼW†œŒ÷†Ohçë¡Hèw²,“ÓG꺮ªJEvúE–eMÓÐP4Ž{ÑuÝúµXZë§§§`»„FRCO¦iêº.†ªZNHhB؇yžßÞÞÖ7^ÕuÝ4M€ÂÑߎ%>ÒK¦¨¥èßpuµÌC“ÐXÒÀ>H„´m»ò:Zëççç¢(œÜÕWö•Ð ‰j™«–mËBƒ“Ðøˆvcžç?þ¬\I¥µ–‰XI°Ó„¾&CôRX‡'¡ñ)þ5{"F®¹‚TŠþ Dç ­µœÐJ©,Ëdû—§§§Û‰Ðø •4°'ã8¾¼¼¬_‹u:ä8W7&¨¡ß‘C$e w>NB㬓öÄSUÕårYsIyžÝî F ýñ”RyžËª­yže ÜÕöm$4¾GH{bŒq’¬}ßEá0¤Ó«¡ß‘C$1ÏÏÏKgÙÊmËHhüˆv¦ªª¾ï×/†ÁUNoµ/wxRXËBó¢(–F¸Ô²ëglGD…vÆZ+Gn¬qÕZËŽë7_jè5¹mB/䓳Ÿ‹¢†AÎļ=­—„æ$J|/ÒŸ_‘qW'½K—Ëeåètò£Üß“ïEUUOOO§Ó©,Ë[Þ‡e_n?¢»ØYFõöö¶ò:Y–É!ÓEþÁú#YT-Uõ8ŽŸ¾«ìú‰»0Ü ìÖZŽIž¦iMI-ÝOí>FB”e™,°VJɦåïfHhÜ‹JØ«¶m×ïjŒyzzº7§Iè[,çvÌó,ÓÿMÓ0»PI»d­-ŠBÖ­¹ŽT{wx“Ð7Zή–ÕÕUUI©½õ}aOi`—¤e)˲õ;K·m+Ê·üfú^˸µ6Õ¿#üá_ °WZëõ‡NÊ¿1t}ì)VE ½6‚­ïûÃ?`ßœ:ÙuÝ¿ÇÓ®ŸMÓ^ÀWøÙ@ÔìÚúv¢“e™ì~µ’Lš~óHh`ÌI#"²¬ÈZ;ϳœA$[k-7ò…ÖZ~›¿SwA~X¹%§¼ÛÒüñÿú˜‡.Š‚„~DHcKKOÓ$t(¥–Ó%9ä u5«gŒ‘Þæ¥yJ]EøÑHSÒú}³»®Ë󼪪w¿NBb4¶!¬”êºN¶Ôx¬,–zZ‚JjJõ·ê8¬µ///+w϶ÖÖu]×õõÇØ•4‚’†A6yX¢Zbõp•¹êyž‡aM¸deꡤZkó<—ш‡/¢µîûþº’&¡ÍQI#™õìºNBÚk½[–å2x{„ÂzÇ———•?ÎÖÚ²,ŸžžŒ1$4B!H±+}ä à IDAT)øÂgñWòUµµör¹œÏç•ol–eOOOr5Ø! ï$˜Û¶Ýd•LZ7M³œ|ª¾ï___×’y}ˆ! ¿º®ëºneOÓzÒ\&ÛOn{'þXkÏçó-Û’„DBk¤\X`CÖZ9XW èÍg…­µrʯ¬Ýʲló[òAÖbI/^ d×Ox•4Ü“Ï}߯_¼ëƒÌRWU•^NÏóüúúºù¸… †Ö£’†cÖÚ¶mû¾§ž{Gz˧iJ/?Œ1UUÅÒ$4à??pFúÂ^__å”û­oç;óç/¡åŒ&é:^ÿ¬—1ð¾ïû¾†Á_xü×ý×~Ïœ–·è|>;ùyÿõë×~Ç€}a¸ŸõÐnÏZ›eYY–eYfYæêâ˘¹Ll;ÔýôUd˜w§¤ ]¸jëû^zÖ_ À÷ø1Ã{RC;O£º®O§Óétr˜Ð×ʲ¬ëÚÓ ´4¬ù¸r0r䆓Kãèä:~DHã?xÚSìt:UUU–¥úÛæƒÌsÿþýÛG‘7Ž£“é­H1ídÄ~š&W#ç¾GHãß|ÔÐZë_¿~•eéiÊw¤“ùùùÙÇGä^I7€“¿‚4د¿€ïÒøçb²½³4ž¿Ìóüׯ_n_ÔZÛuÝ®“ÉZ+õë/%ëßÖ_À÷i(åa”[¶w>Na 褞v˜ÓRšï:¤—}cÖ_J>²Ó€o„4ÜrËÜp]×Û®Yʲ¬i‡”…L»ñ6Æ8yOd8ÙnýÕ|…>:ç5tžçMÓlžÐêïAû½%™v]L«¿ÓN.u¹\8uˆ!}hÎkh Å<Ï#YD++³î¼!士«mÂá§ -‘‹âIŠM8ï‹-¡…/áêjËš®.¸‰¢(œäô<ÏÃ0ìýÝbÑÃ!9OhÙ+#¶„eY:áa¸jSJMÓ”ÀD+ºç)ð4gB ‡ËÀäèL'—ÚŠœ8éªÍ[N])EúH…?Î÷åŽs”ûš´JeYæd`VNÉ\mYk˲tòÏàr¹Ò€'‘>UáIòb_qX;¦±îH¶fsuµ½oóD+ê+Ü:H§ØWœœŒ¹\'œ–åì믣µ– SxO€ØìàÙ 'žÐJ)cŒ“L’¥Ò{Ÿ–V®ÛÇœŸm @ÒAB«¿›b®¿á”¢¨ª*'k±¤˜¦Ípn7OX<Œ„^8¹g é4†våÈ ';æyÇ1·ˆÇβ¸ ýÎúédkmÝÝB™v56Ð÷}2ï ‰]>gq#úÙÍÛÉu’ô–]hœTÀòñeïÛ¦QÙ壷8Ôžb7r2-Àf&ïdYæä³‹µör¹0â 8´×§-¾ç£†Ž|O±­ÏWiŠN)ŠŠ¢p¸½y×u)½9À¶öýÀŧåþ†1feNËf&)ÓÖZÙ‘ÍÉ¥dÍôúKP„tzHè­‰‰ç”Zýms5<0 C×uë¯@Ò‰!¡o±&bÝæY<´Öu]»ÚÛdÚ¼'Òyò‚„¾ÑÊ|Õ¹ºŸH¸j}WJÑã ¸’ÔÃ÷ÈHèÍó¼&?d¸;±2ZdYæd÷1¥”µ¶m[ŽÜÖKêù{X¬¶ºÝ<ÏkþR2ÜÞÛ"òˆ£m[ú.rÊäš+aüÖá§:È€•Ò|AÛ¶mÛ:¼`ò -eôš–3£R}„1¦( WŸEº®c-°FÊ›„‘ÐY?úº~òøIÛ ««õ}O›7𰔟ȩ:ŸÏ$ô¬µ+‡^Ýîq-Y0íêÃ0 ɬüIù¡œ$æ¡¶ò´ckmòoÑ¢,KWíc²fúsù€Gyè¤QoÓZWUuœ¢°( WÙišX3 <&ñGsJHè5¦iZ3!m­Í²,áÒïh­‹¢0Ƹ:rƒAoà1é?Ó@B¯1MÓúW‡#À» #g¦‡apr)àPÒ@'€„^cÙelM%W…«}­÷Âaû˜ÖzGΙþ3zïèå^IkÝuÝʾncŒ«cwÄá‘Zë¶mÙØ¸×!ÓûÅ®ŸëÏç•ûicš¦qu?;"3Ó? Ã@1 Üå(Oê=b”{½¾ï׃LE³ïÉaû˜µ¶ïûõ×å(ëÝiÛö|>; †&ô4MÃ0¬ßîª,ËŽu kmÓ4®þú+{ì:Êóz_¤†v˜Ð ŸýaÖGB]×Gk»&«Îž_éäcpzdï…QîTχþF×uçóyåEòlB;Yí##Nniïò첫Oi­ëº^ÿ©EkÝ4,¿vrc@Úø9Ù˜ìúé¶b³ÖÎó|¨JEþÊ®Î->N‡:KãFòÙeå$¡ù܈'Ñ–Ú¶u»ëç¢ë:©Tò4´Ö¾½½­¯¡­µRCú±ÉZ+¿.Çu\ ÿ\~q9Ôrù#ËûeŒ‘)€Ç> ‘ÐÀéÍt]çv=ô5kírñ䟉ó<¿¾¾®_Õc­Íóüã‘”ËÈÄ<ÏÒ’¶¼–µÖZ+gÊr?Y–É/j­1׺ò…ü¯ÝŶ,`wOx !½ y çyîoc‡ƒä´$´«·±,˲,Õß`VJõ}/Ù,9½‘ïêæå×åëŸ$¯3[¾)ò@~1þj[ί¼w;tx؃#WXÏZ;Žãår†Áß«¤ý|t›ÐUU5M#ß—e—é•QE~î$›•RÒå·Œ'ÇœÙÖÚ?þÜ5nq:RýøFHo)LN«DŸ’nZ)U×õ8ŽŸÖÁ¾-¹Ä³DµÔôKGØr˜Õù|¾åÑ!=áG>¡X‰áî-É㸮k¥”לNoÜÛyB+¥œ·Ùßny]c—O RÊËæá²1çõYÞêíÿŠÅ ’ÞžÔÓmÛz=x ¥qo ­e`|écÝÐä?·*²/—Ë÷‹ûSú÷lˆŽóÓ·;TB¿³t«ÉwPzÈó<—5cRd‡ ìaÎçó7óIΰá1Ü…0ãÞ ô{ÏóüòòrØ3”–ºYFÅ—þs¥”´‹/­gÛþ2»(Š<Ï?ýF¤ñYˆ•tD¨§¿wäúGï&ªË²”Ö3Y- ¸¶´×½¾¾¾Û@f¿ÿº€8QIG„zú$ô÷®X°Õß"ûz}—1ÆI뙿1fš¦å:$4à•tt‚ÕÓ;ZsðQî•®#YN ’ïþ²!šz4°‡axyy‘¯IhÀB:FŒ{_³Ö¾¼¼PC;±ÌRË0¸L]KëÙEö4MmÛö}¿—KÀîÒ‘bŸAB‡!%µDuQêoëø­grH xBHÇ‹zš„iYß%©,G>ËØø²ÉÇÀ–c¼—­È¸EHGíÈ9MBoèzT\)u]dËðø»“E"Ù²H!»cæô§8ÀŸwI,E¶tJßOX‚»®Ë’š„ŽÇ»õ]Ã0\Ÿ¶ ÀBz•ÓŒrGN¦¨eÜ…2ðÞ‡ƒä4 ¿ØfF€´ñAx7–œ–2žXkÏçó0 ›œ©LBGNvA!¡`¨¤÷$áó§7IhY<ϳ Û^·G-[RËt/+jh` „ôÎ$9[–É!Q2Ÿj­•ÕD×냗ÿœçÙþ%÷6Ž£ü§×ûŒ54!½?‰å´ï^nIb§UJÉ×êæâx‰d‰m9Rbš&In òq½ž ¹¹}íô¤„uÒ{•Æúiߣܲ+u]×ú¯õ×\JmùÙ‘´–…IJ)ù:±‚»iØ!½c{?/Ë_BË*Þ²,ó<Ïó@ÃEò£$sØó<Ã ß )ÁÃ܃sÔÐÀ¶é}ÛoNûKè,˪ª’z«ñçë‰m­õ0 ó{š¦Aˆ !y¦w]×÷½×z`Mާ„.ËRÚÄÒHèw$°µÖ2¾´ž-­¸ý[“Ð@léÔÄYO“ÐN\ï€f­íû^Šì¥ø^ó>Ð@„é…©§o¦“Ð>\·žÉ`ø²&ûjˆÛ‚&Hö •¯ýå´µör¹(¥¾²“О,ËÌäT´¥È¾^ßµÔÙêÛ"›„¢E%¬êizïf²…¶úÐ.NB1#¤S¶mN“БŸñ%ª¥]|Ù „bFH'n«>2:N×­gêïa$4-B:}áëiz"Ü‹À;4Ž¥/pYQçó™„Žï$?*é£VOk­ŸÌHB8&*é£VO;ÿØGB8,Bú@Âä´[$4€##¤e_9MB88Búpö’Ó$4ÒGN“РéÊ9§Ih„ôqÅ™Ó$4,éC‹-§Ih¸FHÝ’Ór¾á†wBBÀ;fëÀö$§ëº–“‰7ABÀGl Š ³oè§HhøÃÝø—­æ§Ihø ! ??MBÀ7˜“þÜrPÄõËáNÿo2–ùé²,}¿–1&Ïs¾B%­–¸•ÿœ¦ÉZ«µž¦iùõ71Zë,Ëä÷cŒ1J)­µ1FþàÞ#'ظ÷4Mó:Ü“qžgcL×uÓ4 à ±ÔÊ_UÀ˯ú®G¼­µ]×-ñ\E–eyž/Õ¶‡¿/Áêé¶måå²,ó÷*°G‡X‚%ð8ŽÖÚ¾ï§iZŠfÁ)oìRU—eiŒ‘¯½¾®[aÖei­eœœ€k‰‡´$±Íã8JNoò¢EQcªªZFÈÃßɽ‚­Ÿnš†œ€k)‡´”ËmÛÎó<Ž£ŠfÀ9Ë2©e{ëÛù9 ›H3¤¥t–ê9Ú¿ µ6Ïó¢(dê:òšœ€ð é®ë†aèºNES:Oê麮#ož ™ÓEQìbŒ¼J'¤eÝÔù|–%U[ßÎÝ´ÖEQ”eYE´Ÿ-Èi)‘‡à0 }ßã¸ì@²;Òy> CY–yžWUaxàuYŠõÓŽm÷O@i {{{KcH@VZã8 CÓ4²AÊÖ7õÈifßÃÝã8ö}¿ì†±õí8–e™ €G˜Raƽ­µ§Ó‰qo‡µã–„sXÓ†´Ö§Ó)ÏóØzÊÈiðm>™©=ŸÏÃ0ìwúvó<¿½½ÉyŽUUm};ÿloƽÖΞz²}ØårñÝ]Æ—‚uš¦ÓéOCYÈùiò!§ÊžyÖÚa.—‹lv4ó<_.—išd™V$ eÁršó²Ðnžwó<Ë.%ÇLhõ·¤†AÚ뺎d–š~oðd»yžÛ¶•|Úú^¶'{’Ïó|:Œ11 }/9-£þ^è|>7M£Èiǰƒînú+Ƙ¦iâiü–~ïËåâ»åžýÈDì!=MSÛ¶;Ýé3­uÓ4²¢zë{QŠœ§¢éiš^^^ˆçïÉPsUUeYn}/J\?-çe‘Ó¾‘L[k­µ1,¤3?­µ¦ß@ò"}ºÅ“ÐËHÃÇþ¬xÖ++¥Æq”Ié«Ú–ä´¾I¿7<,ÆGÛ0 oooÁZbXâV´Ð-k‘µÖÒS-_ÈŸšç9ªœV7ý¨ªjó®oÖeÀzÑ=×.—˲½TÆeYJ¨dYf­•„»oõ·n–Qe­õ<ÏÛã8Ê>hó’Hèät×uÆ­u ç”0î àÈœ=Hè`|ç´\<ÏóBZýݵF¾fÜÀ¡¸9Ž‚„LZÜýe‰µöõõ5Ì)×7*Š¢ª*ß“åmÛö}Õ_À‘9xʓЛXêéa|ì&ÍÞr>·ó‹?&@=͸7€¨¬} ‘Ð*ËRV¢{ªü¤‰¬ªªxeÜÀ¡¬z‘Лóº.ËZÛ÷½|ˆç1rÀq<^!‘Бùé,Ë|lÃ>MÓù|Ž'¡óÓâÁ*„ŽJY–ó<ûônÛ6†íB¯1? ੤IèÕuí/G‡að}²õ¤žö½‰©lAïõ°8øÊÝõg[Eët:i­}œÃ1Žã0 yžÇÓA&–zºë:×·Ö6M£µŽmÀÀAÜ÷Ìõw¶ íDÓ4žÞF¯g{¬QEY–žêé¦iʲd¬ÀVîxúxå–c—HhW꺞çÙÇè´œ‘abyª§ëº&¡lëÖóÐ{¡µ–²ÒyNOÓ4M“1&¶Aoå:§e”›„°¹›žAþZ–¹½ìÁ-'R8ï÷–=Èb8ÅòSsš„‰ŸK"¯ Ûž4HNû8!C–MGÛêìd~šQnñøáI䯗›„öJk-oï<Ïn¿}Ó4㸔­±YYO“Тò]%í¯—›„@rÚy1-˱Ü^Ó­‡ëi@l¾ i½Ü$t0Zë_¿~9Ïé¾ïËik- BŸ‡´×^n:°º®ÝöcÏóyvË<4bi&²²,Ýî™åã3œs·ä454€˜½iæ¡Ó“eYQn½çyîº.òbZÝÓÔÐbö!ͯÐâ—w]çi£G¹¦µ–³xãÑ4Í4MÏÞèû>˲ÜøTQr«{ù`ààŒ]?}ßûèÇÃdÅ‘ÃLóéodYFBØ óßÿýßþ®.E9­µ1¦( WÃnërÀ5£”úŸÿù/@NÇÆSU•ÃoÇ^ÖbÀîükØ“œ>”,ËN§“«oÇŽz¼`_þ=7 §½ÎãvZë,˶7;? Þí8æ;§‡a §#!ë†\JL;¹àÚû._êéãp¸lšJ|ød)Ž×œžç™z:Czz¼À¹Ï×Ë2î}²%œ«µX|7À¹/7µ §À“繓ïBß÷,Ä·¾ÛyŠùéä¹ÚØDkm­å[ ný°=$óÓiÓZçyîd-=ÞàÜÏ{8SO§-ÏscÌú÷ßþåä®ê–VÔÓ©+ËÒÉ‘Ó4ñM‡n}4ÓG–0Ièõoþ<ÏK ÝQ?‘Ó©’ö±õ×™ç™bºo“œN’1&˲•E°µvžgŠipèî™Hr:=ÖÚ¢(VNKË*,Å®&àÎ#Ïer:1ZkcŒ«ÕÒNn   iź¬eY¶þ Ÿ¦‰ánpåñNÖe¥DN˜^¾_àЪiHƽ“¡µ–Aï•×áÌJphíC™œNÆúJšÇÀ-ûL‘ÓiXßö%³Ñ|§À!­ÈéT¬,¦e©´«›¸ iENïŸ1ÆÉÞ|Àg!­Èéý[¹©§«õÖá2¤9½gë»»i·‡´"§wËZ+ ±Ö\„%XàûVìG¶[+Ka†»À-/!­ØlŸÖ¿Ÿ$48ä+¤õô­¯ƒ ipÈcH+êé]‘Ó ×¼™Nfµ ¿!­è#ÛkíÊ3¬ä”B\ñÒŠœÞ ©ƒW^ÄÃ7\ Ò*TN³'åã8®œw BZé#»\.”q‘Ùèõ•´“‹D¸Vô‘ELÞ½•ÉóÜÉîßú‘ʸw„\}¬Y¿±(àÚÔ9͸÷½ú¾Ÿ¦iÍ´Öyž»º€Ú$¤ýÞ‘Y¿øJ.’ç9ÒàÐfƒ“Œ{Ç£ïû•ÒÖZúºÀ¹-gÃô{“Óß›çyå@·ú;Ö]…“[ˆÛ|ô{“Óß›ç¹ïû•‘½Æ˜_·¶ïÅ¥žÞ$ôú7Gk]–%ÒàÖö!­ü×Óäô§¤ðÇq}ËÝàC!­Èé-h­»®Çqý¥ØÆ|ˆèÁJNÖ÷ýúÙh¥TQ´v€…´"§’µÑëûº•Ryž³ øWH+r:”qÛ¶]cLUUë¯ø(ºVä´ã8^.'—b—1ð'ÆVä´O²|ÜI¿˜Rªª*ZÆÀ“x¯ä´ÖZkm×uN6©ëš–1ð'ÞVä´Zëóùìä¯,SRF€?±?aÉi·Îçóʳ4EQÔuíäR€OÅÒŠœv§m[W eY]×lÖ ^í ¤9íÂ0 Ã08Y-Çicèë¯öÒŠœ^g†¾ï]utk­›¦a6|ÛÓs–œ~ŒüÕº®suÁ¦ihê€öÒŠœ~ˆÛ„.Ë’„€0vÒŠœ¾Óår9ŸÏ®Ûzz#ÍIDAT®¦µ.Š‚º Œý…´"§oæ6¡•RUU±S7³ËVäô ú¾w›ÐeY’ÐÒ^CZ‘Ó߆Áá<´RÊSÝÒ¾Ÿ¹äô§†a¸\.®\)¥Œ1eY–eÉÂhiß!­Èé–„v¸˜1¦iÛ}H+ÿ9ÝuÝ^rÚSB???“Ð^ !­<ç´µvõ´§„>N$4l"‘V‡÷–„†ÁaBk­åÄhB6‘NH«ç´óN1‘çyQì/[I*¤Õ!sÚÇ(·ú{\4 J-¤ÕÁrz†¶mÝ&´µVº‹¢puMÀ iu˜œ–zš&·5´Öút:‘а¹4CZ §=r+¥žžžØþb ?â£ò¿ÿû¿þ.®µ®ªª®ëð›e’ÐpÉVÒ"ÉõÓþºiš²,Ý^ð°ÄCZ÷nÛ6XNûK說Ø¢’~H+ÿ9--ÖrÚwB³à ¢rˆVIä´¿„–®hç€Ø$Þ8öŽ×>29q¹i}d¾kh"t”JZì´ž&¡à˜ŽÒj‡9MBÀa.¤Õ®rš„€#;Öœôµøç§—Ó'Þ˜ ¡`ŽXI‹ÈëiO§O*öã¸!­"ÎiF¹êÈÃÝ‹ØÆ½åˆCWÒ"ªzš„,i¥¢Éiæ¡×éÙ<§™‡¼ÃœôØj~Z"|š&° ’þ›ÔÓRC“Ѐwé÷ç4£Ü€¯0Üý¹0ãÞÓ4‘Ѐ¯Ò_òÓY–Ykéå|…þŽ×œ–w^kíö²$4$ƒþלvŽ„€”Ð8ö¯}dn‘ÐBúg»ÈiÒCHß$òœ&¡ I„ô­¢ÍiREHß!œ&¡ a„ô}¢ÊiÒFHß-’œ&¡ y„ô#6ÏiŽ€~І9MBÀAÒÛ$§Ih8Bz•À9MBÀ¡ÒkËé²,Ih8BÚ9]–eUU$4 §`9ãï¼,F¹à˜¨¤ñTO“ÐpX„´KÎsš„€##¤s˜ÓtŠÀÁÒî9Éi:Å„´+sš„(BÚŸ‡sš„BÚ£rš„,i¿îÊipöîÆœ&¡ïÒ!ü˜Ó$4à#B:orZ:Ïó÷ˆ!Χ9½$´Ö:ü-bFHõ.§IhÀ7éЖœ&¡ßã¨Êm¼¾¾’Ѐïý?`uüÐð«ÎIEND®B`‚asio-1.12.2/doc/examples/000077500000000000000000000000001340672067200151225ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/000077500000000000000000000000001340672067200162155ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/allocation/000077500000000000000000000000001340672067200203425ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/allocation/server.cpp.html000066400000000000000000007363141340672067200233350ustar00rootroot00000000000000 HTML Diff allocation/server.cpp
src/​examples/​cpp03/​allocation/​server.​cppsrc/​examples/​cpp11/​allocation/​server.​cpp
1 /​/​1 /​/​
2 /​/​·​server.​cpp2 /​/​·​server.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<array>
11 #include·​<cstdlib>12 #include·​<cstdlib>
12 #include·​<iostream>13 #include·​<iostream>
13 #include·​<boost/​aligned_storage.​hpp>14 #include·​<memory>
14 #include·​<boost/​array.​hpp>15 #include·​<type_traits>
15 #include·​<boost/​bind.​hpp>16 #include·​<utility>
16 #include·<boost/​enable_shared_from_th​is.​hpp>
17 #include·<boost/​noncopyable.​hpp>
18 #include·<boost/​shared_ptr.​hpp>
19 #include·​"asio.​hpp"17 #include·​"asio.​hpp"
20 18
21 using·​asio:​:​ip:​:​tcp;​19 using·​asio:​:​ip:​:​tcp;​
22 20
23 /​/​·​Class·​to·​manage·​the·​memory·​to·​be·​used·​for·​handler-​based·​custom·​allocation.​21 /​/​·​Class·​to·​manage·​the·​memory·​to·​be·​used·​for·​handler-​based·​custom·​allocation.​
24 /​/​·​It·​contains·​a·​single·​block·​of·​memory·​which·​may·​be·​returned·​for·​allocation22 /​/​·​It·​contains·​a·​single·​block·​of·​memory·​which·​may·​be·​returned·​for·​allocation
25 /​/​·​requests.​·​If·​the·​memory·​is·​in·​use·​when·​an·​allocation·​request·​is·​made,​·​the23 /​/​·​requests.​·​If·​the·​memory·​is·​in·​use·​when·​an·​allocation·​request·​is·​made,​·​the
26 /​/​·​allocator·​delegates·​allocation·​to·​the·​global·​heap.​24 /​/​·​allocator·​delegates·​allocation·​to·​the·​global·​heap.​
27 class·​handler_memory25 class·​handler_memory
28 ··​:​·​private·​boost:​:​noncopyable
29 {26 {
30 public:​27 public:​
31 ··​handler_memory()​28 ··​handler_memory()​
32 ····​:​·​in_use_(false)​29 ····​:​·​in_use_(false)​
33 ··​{30 ··​{
34 ··​}31 ··​}
35 32
33 ··​handler_memory(const·​handler_memory&)​·​=·​delete;​
34 ··​handler_memory&·​operator=(const·​handler_memory&)​·​=·​delete;​
35
36 ··​void*·​allocate(std:​:​size_t·​size)​36 ··​void*·​allocate(std:​:​size_t·​size)​
37 ··​{37 ··​{
38 ····​if·​(!in_use_·​&&·​size·​<·​storage_.​size)​38 ····​if·​(!in_use_·​&&·​size·​<·sizeof(storage_)​)​
39 ····​{39 ····​{
40 ······​in_use_·​=·​true;​40 ······​in_use_·​=·​true;​
41 ······​return·​storage_.​address()​;​41 ······​return·&storage_;​
42 ····​}42 ····​}
43 ····​else43 ····​else
44 ····​{44 ····​{
45 ······​return·​:​:​operator·​new(size)​;​45 ······​return·​:​:​operator·​new(size)​;​
46 ····​}46 ····​}
47 ··​}47 ··​}
48 48
49 ··​void·​deallocate(void*·​pointer)​49 ··​void·​deallocate(void*·​pointer)​
50 ··​{50 ··​{
51 ····​if·​(pointer·​==·​storage_.​address()​)​51 ····​if·​(pointer·​==·&storage_)​
52 ····​{52 ····​{
53 ······​in_use_·​=·​false;​53 ······​in_use_·​=·​false;​
54 ····​}54 ····​}
55 ····​else55 ····​else
56 ····​{56 ····​{
57 ······​:​:​operator·​delete(pointer)​;​57 ······​:​:​operator·​delete(pointer)​;​
58 ····​}58 ····​}
59 ··​}59 ··​}
60 60
61 private:​61 private:​
62 ··​/​/​·​Storage·​space·​used·​for·​handler-​based·​custom·​memory·​allocation.​62 ··​/​/​·​Storage·​space·​used·​for·​handler-​based·​custom·​memory·​allocation.​
63 ··boost:​:​aligned_storage<1024>​·​storage_;​63 ··typename·std:​:​aligned_storage<1024>​:​:​type·​storage_;​
64 64
65 ··​/​/​·​Whether·​the·​handler-​based·​custom·​allocation·​storage·​has·​been·​used.​65 ··​/​/​·​Whether·​the·​handler-​based·​custom·​allocation·​storage·​has·​been·​used.​
66 ··​bool·​in_use_;​66 ··​bool·​in_use_;​
67 };​67 };​
68 68
69 /​/​·​The·​allocator·​to·​be·​associated·​with·​the·​handler·​objects.​·​This·​allocator·​only69 /​/​·​The·​allocator·​to·​be·​associated·​with·​the·​handler·​objects.​·​This·​allocator·​only
70 /​/​·​needs·​to·​satisfy·​the·​C++11·​minimal·​allocator·​requirements,​·plus·rebind·when70 /​/​·​needs·​to·​satisfy·​the·​C++11·​minimal·​allocator·​requirements.​
71 /​/​·targeting·C++03.​
72 template·​<typename·​T>71 template·​<typename·​T>
73 class·​handler_allocator72 class·​handler_allocator
74 {73 {
75 public:​74 public:​
76 ··typedef·T·​value_type;​75 ··using·​value_type·=·T;​
77 76
78 ··​explicit·​handler_allocator(han​dler_memory&·​mem)​77 ··​explicit·​handler_allocator(han​dler_memory&·​mem)​
79 ····​:​·​memory_(mem)​78 ····​:​·​memory_(mem)​
80 ··​{79 ··​{
81 ··​}80 ··​}
82 81
83 ··​template·​<typename·​U>82 ··​template·​<typename·​U>
84 ··​handler_allocator(con​st·​handler_allocator<U>&​·​other)​83 ··​handler_allocator(con​st·​handler_allocator<U>&​·​other)​·noexcept
85 ····​:​·​memory_(other.​memory_)​84 ····​:​·​memory_(other.​memory_)​
86 ··​{85 ··​{
87 ··​}86 ··​}
88 87
89 ··​template·<typename·U>88 ··bool·operator==(const·handler_allocator&·other)​·const·noexcept
90 ··struct·rebind
91 ··{
92 ····typedef·handler_allocator<U>·other;​
93 ··};​
94
95 ··bool·operator==(const·handler_allocator&·other)​·const
96 ··​{89 ··​{
97 ····​return·​&memory_·​==·​&other.​memory_;​90 ····​return·​&memory_·​==·​&other.​memory_;​
98 ··​}91 ··​}
99 92
100 ··​bool·​operator!=(const·​handler_allocator&·​other)​·​const93 ··​bool·​operator!=(const·​handler_allocator&·​other)​·​const·noexcept
101 ··​{94 ··​{
102 ····​return·​&memory_·​!=·​&other.​memory_;​95 ····​return·​&memory_·​!=·​&other.​memory_;​
103 ··​}96 ··​}
104 97
105 ··​T*·​allocate(std:​:​size_t·​n)​·​const98 ··​T*·​allocate(std:​:​size_t·​n)​·​const
106 ··​{99 ··​{
107 ····​return·​static_cast<T*>(memor​y_.​allocate(sizeof(T)​·​*·​n)​)​;​100 ····​return·​static_cast<T*>(memor​y_.​allocate(sizeof(T)​·​*·​n)​)​;​
108 ··​}101 ··​}
109 102
110 ··​void·​deallocate(T*·​p,​·​std:​:​size_t·​/​*n*/​)​·​const103 ··​void·​deallocate(T*·​p,​·​std:​:​size_t·​/​*n*/​)​·​const
111 ··​{104 ··​{
112 ····​return·​memory_.​deallocate(p)​;​105 ····​return·​memory_.​deallocate(p)​;​
113 ··​}106 ··​}
114 107
115 /​/​private:​108 private:​
109 ··​template·​<typename>·​friend·​class·​handler_allocator;​
110
116 ··​/​/​·​The·​underlying·​memory.​111 ··​/​/​·​The·​underlying·​memory.​
117 ··​handler_memory&·​memory_;​112 ··​handler_memory&·​memory_;​
118 };​113 };​
119 114
120 /​/​·​Wrapper·​class·​template·​for·​handler·​objects·​to·​allow·​handler·​memory115 /​/​·​Wrapper·​class·​template·​for·​handler·​objects·​to·​allow·​handler·​memory
121 /​/​·​allocation·​to·​be·​customised.​·​The·​allocator_type·​typedef·​and·​get_allocator()​116 /​/​·​allocation·​to·​be·​customised.​·​The·​allocator_type·​type·​and·​get_allocator()​
122 /​/​·​member·​function·​are·​used·​by·​the·​asynchronous·​operations·​to·​obtain·​the117 /​/​·​member·​function·​are·​used·​by·​the·​asynchronous·​operations·​to·​obtain·​the
123 /​/​·​allocator.​·​Calls·​to·​operator()​·​are·​forwarded·​to·​the·​encapsulated·​handler.​118 /​/​·​allocator.​·​Calls·​to·​operator()​·​are·​forwarded·​to·​the·​encapsulated·​handler.​
124 template·​<typename·​Handler>119 template·​<typename·​Handler>
125 class·​custom_alloc_handler120 class·​custom_alloc_handler
126 {121 {
127 public:​122 public:​
128 ··​typedef·​handler_allocator<Han​dler>·allocator_type;​123 ··using·allocator_type·=·​handler_allocator<Han​dler>;​
129 124
130 ··​custom_alloc_handler(​handler_memory&·​m,​·​Handler·​h)​125 ··​custom_alloc_handler(​handler_memory&·​m,​·​Handler·​h)​
131 ····​:​·​memory_(m)​,​126 ····​:​·​memory_(m)​,​
132 ······​handler_(h)​127 ······​handler_(h)​
133 ··​{128 ··​{
134 ··​}129 ··​}
135 130
136 ··​allocator_type·​get_allocator()​·​const131 ··​allocator_type·​get_allocator()​·​const·noexcept
137 ··​{132 ··​{
138 ····​return·​allocator_type(memory​_)​;​133 ····​return·​allocator_type(memory​_)​;​
139 ··​}134 ··​}
140 135
141 ··​template·​<typename·​Arg1>136 ··​template·​<typename·.​.​.​Args>
142 ··​void·​operator()​(Arg1·​arg1)​137 ··​void·​operator()​(Args&&.​.​.​·​args)​
143 ··{
144 ····handler_(arg1)​;​
145 ··}
146
147 ··template·<typename·Arg1,​·typename·Arg2>
148 ··void·operator()​(Arg1·arg1,​·Arg2·arg2)​
149 ··​{138 ··​{
150 ····​handler_(arg1,​·arg2)​;​139 ····​handler_(std:​:​forward<Args>(args)​.​.​.​)​;​
151 ··​}140 ··​}
152 141
153 private:​142 private:​
154 ··​handler_memory&·​memory_;​143 ··​handler_memory&·​memory_;​
155 ··​Handler·​handler_;​144 ··​Handler·​handler_;​
156 };​145 };​
157 146
158 /​/​·​Helper·​function·​to·​wrap·​a·​handler·​object·​to·​add·​custom·​allocation.​147 /​/​·​Helper·​function·​to·​wrap·​a·​handler·​object·​to·​add·​custom·​allocation.​
159 template·​<typename·​Handler>148 template·​<typename·​Handler>
160 inline·​custom_alloc_handler<​Handler>·​make_custom_alloc_han​dler(149 inline·​custom_alloc_handler<​Handler>·​make_custom_alloc_han​dler(
161 ····​handler_memory&·​m,​·​Handler·​h)​150 ····​handler_memory&·​m,​·​Handler·​h)​
162 {151 {
163 ··​return·​custom_alloc_handler<​Handler>(m,​·​h)​;​152 ··​return·​custom_alloc_handler<​Handler>(m,​·​h)​;​
164 }153 }
165 154
166 class·​session155 class·​session
167 ··​:​·​public·boost:​:​enable_shared_from_th​is<session>156 ··​:​·​public·​std:​:​enable_shared_from_th​is<session>
168 {157 {
169 public:​158 public:​
170 ··​session(asio:​:​io_context&·io_context)​159 ··​session(tcp:​:​socket·socket)​
171 ····​:​·​socket_(io_context)​160 ····​:​·​socket_(std:​:​move(socket)​)​
172 ··​{161 ··​{
173 ··​}162 ··​}
174 163
175 ··tcp:​:​socket&·​socket()​164 ··void·​start()​
176 ··​{165 ··​{
177 ····return·socket_;​166 ····do_read()​;​
178 ··​}167 ··​}
179 168
180 ··void·start()​169 private:​
170 ··​void·​do_read()​
181 ··​{171 ··​{
172 ····​auto·​self(shared_from_this​()​)​;​
182 ····​socket_.​async_read_some(asio:​:​buffer(data_)​,​173 ····​socket_.​async_read_some(asio:​:​buffer(data_)​,​
183 ········​make_custom_alloc_han​dler(handler_memory_,​174 ········​make_custom_alloc_han​dler(handler_memory_,​
184 ··········boost:​:​bind(&session:​:​handle_read,​175 ··········[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·length)​
185 ············shared_from_this()​,​176 ··········{
186 ············asio:​:​placeholders:​:​error,​177 ············​if·(!ec)​
187 ············asio:​:​placeholders:​:​bytes_transferred)​)​)​;​178 ············{
188 ··}179 ··············do_write(length)​;​
189 180 ············}
190 ··void·handle_read(const·asio:​:​error_code&·error,​181 ··········})​)​;​
191 ······size_t·bytes_transferred)​
192 ··{
193 ····if·(!error)​
194 ····{
195 ······asio:​:​async_write(socket_,​
196 ··········asio:​:​buffer(data_,​·bytes_transferred)​,​
197 ··········make_custom_alloc_han​dler(handler_memory_,​
198 ············boost:​:​bind(&session:​:​handle_write,​
199 ··············shared_from_this()​,​
200 ··············asio:​:​placeholders:​:​error)​)​)​;​
201 ····}
202 ··​}182 ··​}
203 183
204 ··​void·handle_write(const·asio:​:​error_code&·error)​184 ··​void·​do_write(std:​:​size_t·length)​
205 ··​{185 ··​{
206 ····if·​(!error)​186 ····auto·self(shared_from_this​()​)​;​
207 ····{187 ····asio:​:​async_write(socket_,​·asio:​:​buffer(data_,​·length)​,​
208 ······socket_.​async_read_some(asio:​:​buffer(data_)​,​188 ········make_custom_alloc_han​dler(handler_memory_,​
209 ··········make_custom_alloc_han​dler(handler_memory_,​189 ··········[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·/​*length*/​)​
210 ············boost:​:​bind(&session:​:​handle_read,​190 ··········{
211 ··············shared_from_this()​,​191 ············if·(!ec)​
212 ··············asio:​:​placeholders:​:​error,​192 ············{
213 ··············asio:​:​placeholders:​:​bytes_transferred)​)​)​;​193 ··············​do_read()​;​
214 ····​}194 ············​}
195 ··········​})​)​;​
215 ··​}196 ··​}
216 197
217 private:​
218 ··​/​/​·​The·​socket·​used·​to·​communicate·​with·​the·​client.​198 ··​/​/​·​The·​socket·​used·​to·​communicate·​with·​the·​client.​
219 ··​tcp:​:​socket·​socket_;​199 ··​tcp:​:​socket·​socket_;​
220 200
221 ··​/​/​·​Buffer·​used·​to·​store·​data·​received·​from·​the·​client.​201 ··​/​/​·​Buffer·​used·​to·​store·​data·​received·​from·​the·​client.​
222 ··boost:​:​array<char,​·​1024>·​data_;​202 ··​std:​:​array<char,​·​1024>·​data_;​
223 203
224 ··​/​/​·​The·​memory·​to·​use·​for·​handler-​based·​custom·​memory·​allocation.​204 ··​/​/​·​The·​memory·​to·​use·​for·​handler-​based·​custom·​memory·​allocation.​
225 ··​handler_memory·​handler_memory_;​205 ··​handler_memory·​handler_memory_;​
226 };​206 };​
227 207
228 typedef·​boost:​:​shared_ptr<session>·​session_ptr;​
229
230 class·​server208 class·​server
231 {209 {
232 public:​210 public:​
233 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​211 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​
234 ····​:​·​io_context_(io_contex​t)​,​212 ····​:​·acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​
235 ······acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​
236 ··​{213 ··​{
237 ····session_ptr·new_session(new·session(io_context_)​)​;​214 ····do_accept()​;​
238 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​
239 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​
240 ··········asio:​:​placeholders:​:​error)​)​;​
241 ··​}215 ··​}
242 216
243 ··void·handle_accept(session​_ptr·new_session,​217 private:​
244 ······const·asio:​:​error_code&·error)​218 ··void·do_accept()​
245 ··​{219 ··​{
246 ····if·(!error)​220 ····acceptor_.​async_accept(
247 ····{221 ········[this](std:​:​error_code·ec,​·tcp:​:​socket·socket)​
248 ······new_session-​>start()​;​222 ········{
249 ····}223 ··········if·(!ec)​
224 ··········​{
225 ············​std:​:​make_shared<session>(​std:​:​move(socket)​)​-​>start()​;​
226 ··········​}
250 227
251 ····new_session.​reset(new·session(io_context_)​)​;​228 ··········do_accept()​;​
252 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​229 ········})​;​
253 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​
254 ··········asio:​:​placeholders:​:​error)​)​;​
255 ··​}230 ··​}
256 231
257 private:​
258 ··​asio:​:​io_context&·​io_context_;​
259 ··​tcp:​:​acceptor·​acceptor_;​232 ··​tcp:​:​acceptor·​acceptor_;​
260 };​233 };​
261 234
262 int·​main(int·​argc,​·​char*·​argv[])​235 int·​main(int·​argc,​·​char*·​argv[])​
263 {236 {
264 ··​try237 ··​try
265 ··​{238 ··​{
266 ····​if·​(argc·​!=·​2)​239 ····​if·​(argc·​!=·​2)​
267 ····​{240 ····​{
268 ······​std:​:​cerr·​<<·​"Usage:​·​server·​<port>\n";​241 ······​std:​:​cerr·​<<·​"Usage:​·​server·​<port>\n";​
269 ······​return·​1;​242 ······​return·​1;​
270 ····​}243 ····​}
271 244
272 ····​asio:​:​io_context·​io_context;​245 ····​asio:​:​io_context·​io_context;​
273 246 ····server·s(io_context,​·std:​:​atoi(argv[1])​)​;​
274 ····using·namespace·std;​·/​/​·For·atoi.​
275 ····server·s(io_context,​·atoi(argv[1])​)​;​
276
277 ····​io_context.​run()​;​247 ····​io_context.​run()​;​
278 ··​}248 ··​}
279 ··​catch·​(std:​:​exception&·​e)​249 ··​catch·​(std:​:​exception&·​e)​
280 ··​{250 ··​{
281 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​251 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
282 ··​}252 ··​}
283 253
284 ··​return·​0;​254 ··​return·​0;​
285 }255 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/buffers/000077500000000000000000000000001340672067200176515ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/buffers/reference_counted.cpp.html000066400000000000000000003172201340672067200250040ustar00rootroot00000000000000 HTML Diff buffers/reference_counted.cpp
src/​examples/​cpp03/​buffers/​reference_counted.​cppsrc/​examples/​cpp11/​buffers/​reference_counted.​cpp
1 /​/​1 /​/​
2 /​/​·​reference_counted.​cpp2 /​/​·​reference_counted.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio.​hpp>11 #include·​<asio.​hpp>
12 #include·​<boost/​bind.​hpp>
13 #include·​<boost/​enable_shared_from_th​is.​hpp>
14 #include·​<boost/​shared_ptr.​hpp>
15 #include·​<iostream>12 #include·​<iostream>
13 #include·​<memory>
14 #include·​<utility>
16 #include·​<vector>15 #include·​<vector>
16 #include·​<ctime>
17 17
18 using·​asio:​:​ip:​:​tcp;​18 using·​asio:​:​ip:​:​tcp;​
19 19
20 /​/​·​A·​reference-​counted·​non-​modifiable·​buffer·​class.​20 /​/​·​A·​reference-​counted·​non-​modifiable·​buffer·​class.​
21 class·​shared_const_buffer21 class·​shared_const_buffer
22 {22 {
23 public:​23 public:​
24 ··​/​/​·​Construct·​from·​a·​std:​:​string.​24 ··​/​/​·​Construct·​from·​a·​std:​:​string.​
25 ··​explicit·​shared_const_buffer(c​onst·​std:​:​string&·​data)​25 ··​explicit·​shared_const_buffer(c​onst·​std:​:​string&·​data)​
26 ····​:​·​data_(new·​std:​:​vector<char>(data.​begin()​,​·​data.​end()​)​)​,​26 ····​:​·​data_(new·​std:​:​vector<char>(data.​begin()​,​·​data.​end()​)​)​,​
27 ······​buffer_(asio:​:​buffer(*data_)​)​27 ······​buffer_(asio:​:​buffer(*data_)​)​
28 ··​{28 ··​{
29 ··​}29 ··​}
30 30
31 ··​/​/​·​Implement·​the·​ConstBufferSequence·​requirements.​31 ··​/​/​·​Implement·​the·​ConstBufferSequence·​requirements.​
32 ··​typedef·​asio:​:​const_buffer·​value_type;​32 ··​typedef·​asio:​:​const_buffer·​value_type;​
33 ··​typedef·​const·​asio:​:​const_buffer*·​const_iterator;​33 ··​typedef·​const·​asio:​:​const_buffer*·​const_iterator;​
34 ··​const·​asio:​:​const_buffer*·​begin()​·​const·​{·​return·​&buffer_;​·​}34 ··​const·​asio:​:​const_buffer*·​begin()​·​const·​{·​return·​&buffer_;​·​}
35 ··​const·​asio:​:​const_buffer*·​end()​·​const·​{·​return·​&buffer_·​+·​1;​·​}35 ··​const·​asio:​:​const_buffer*·​end()​·​const·​{·​return·​&buffer_·​+·​1;​·​}
36 36
37 private:​37 private:​
38 ··boost:​:​shared_ptr<std:​:​vector<char>·​>·​data_;​38 ··​std:​:​shared_ptr<std:​:​vector<char>·​>·​data_;​
39 ··​asio:​:​const_buffer·​buffer_;​39 ··​asio:​:​const_buffer·​buffer_;​
40 };​40 };​
41 41
42 class·​session42 class·​session
43 ··​:​·​public·boost:​:​enable_shared_from_th​is<session>43 ··​:​·​public·​std:​:​enable_shared_from_th​is<session>
44 {44 {
45 public:​45 public:​
46 ··​session(asio:​:​io_context&·io_context)​46 ··​session(tcp:​:​socket·socket)​
47 ····​:​·​socket_(io_context)​47 ····​:​·​socket_(std:​:​move(socket)​)​
48 ··​{48 ··​{
49 ··​}49 ··​}
50 50
51 ··​tcp:​:​socket&·​socket()​
52 ··​{
53 ····​return·​socket_;​
54 ··​}
55
56 ··​void·​start()​51 ··​void·​start()​
57 ··​{52 ··​{
58 ····using·namespace·std;​·/​/​·For·time_t,​·time·and·ctime.​53 ····​do_write()​;​
59 ····time_t·now·=·time(0)​;​
60 ····shared_const_buffer·buffer(ctime(&now)​)​;​
61 ····asio:​:​async_write(socket_,​·buffer,​
62 ········boost:​:​bind(&session:​:​handle_write,​·shared_from_this()​)​)​;​
63 ··​}54 ··​}
64 55
65 ··void·handle_write()​56 private:​
57 ··​void·​do_write()​
66 ··​{58 ··​{
59 ····​std:​:​time_t·​now·​=·​std:​:​time(0)​;​
60 ····​shared_const_buffer·​buffer(std:​:​ctime(&now)​)​;​
61
62 ····​auto·​self(shared_from_this​()​)​;​
63 ····​asio:​:​async_write(socket_,​·​buffer,​
64 ········​[this,​·​self](std:​:​error_code·​/​*ec*/​,​·​std:​:​size_t·​/​*length*/​)​
65 ········​{
66 ········​})​;​
67 ··​}67 ··​}
68 68
69 private:​
70 ··​/​/​·​The·​socket·​used·​to·​communicate·​with·​the·​client.​69 ··​/​/​·​The·​socket·​used·​to·​communicate·​with·​the·​client.​
71 ··​tcp:​:​socket·​socket_;​70 ··​tcp:​:​socket·​socket_;​
72 };​71 };​
73 72
74 typedef·​boost:​:​shared_ptr<session>·​session_ptr;​
75
76 class·​server73 class·​server
77 {74 {
78 public:​75 public:​
79 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​76 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​
80 ····​:​·​io_context_(io_contex​t)​,​77 ····​:​·acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​
81 ······acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​
82 ··​{78 ··​{
83 ····session_ptr·new_session(new·session(io_context_)​)​;​79 ····do_accept()​;​
84 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​
85 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​
86 ··········asio:​:​placeholders:​:​error)​)​;​
87 ··​}80 ··​}
88 81
89 ··void·handle_accept(session​_ptr·new_session,​82 private:​
90 ······const·asio:​:​error_code&·error)​83 ··void·do_accept()​
91 ··​{84 ··​{
92 ····if·(!error)​85 ····acceptor_.​async_accept(
93 ····{86 ········[this](std:​:​error_code·ec,​·tcp:​:​socket·socket)​
94 ······new_session-​>start()​;​87 ········{
95 ····}88 ··········if·(!ec)​
89 ··········​{
90 ············​std:​:​make_shared<session>(​std:​:​move(socket)​)​-​>start()​;​
91 ··········​}
96 92
97 ····new_session.​reset(new·session(io_context_)​)​;​93 ··········do_accept()​;​
98 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​94 ········})​;​
99 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​
100 ··········asio:​:​placeholders:​:​error)​)​;​
101 ··​}95 ··​}
102 96
103 private:​
104 ··​asio:​:​io_context&·​io_context_;​
105 ··​tcp:​:​acceptor·​acceptor_;​97 ··​tcp:​:​acceptor·​acceptor_;​
106 };​98 };​
107 99
108 int·​main(int·​argc,​·​char*·​argv[])​100 int·​main(int·​argc,​·​char*·​argv[])​
109 {101 {
110 ··​try102 ··​try
111 ··​{103 ··​{
112 ····​if·​(argc·​!=·​2)​104 ····​if·​(argc·​!=·​2)​
113 ····​{105 ····​{
114 ······​std:​:​cerr·​<<·​"Usage:​·​reference_counted·​<port>\n";​106 ······​std:​:​cerr·​<<·​"Usage:​·​reference_counted·​<port>\n";​
115 ······​return·​1;​107 ······​return·​1;​
116 ····​}108 ····​}
117 109
118 ····​asio:​:​io_context·​io_context;​110 ····​asio:​:​io_context·​io_context;​
119 111
120 ····using·namespace·​std;​·/​/​·For·atoi.​112 ····server·s(io_context,​·​std:​:​atoi(argv[1])​)​;​
121 ····server·s(io_context,​·atoi(argv[1])​)​;​
122 113
123 ····​io_context.​run()​;​114 ····​io_context.​run()​;​
124 ··​}115 ··​}
125 ··​catch·​(std:​:​exception&·​e)​116 ··​catch·​(std:​:​exception&·​e)​
126 ··​{117 ··​{
127 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​118 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
128 ··​}119 ··​}
129 120
130 ··​return·​0;​121 ··​return·​0;​
131 }122 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/chat/000077500000000000000000000000001340672067200171345ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/chat/chat_client.cpp.html000066400000000000000000006277261340672067200231040ustar00rootroot00000000000000 HTML Diff chat/chat_client.cpp
src/​examples/​cpp03/​chat/​chat_client.​cppsrc/​examples/​cpp11/​chat/​chat_client.​cpp
1 /​/​1 /​/​
2 /​/​·​chat_client.​cpp2 /​/​·​chat_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<deque>12 #include·​<deque>
13 #include·​<iostream>13 #include·​<iostream>
14 #include·​<boost/​bind.​hpp>14 #include·​<thread>
15 #include·​"asio.​hpp"15 #include·​"asio.​hpp"
16 #include·​"chat_message.​hpp"16 #include·​"chat_message.​hpp"
17 17
18 using·​asio:​:​ip:​:​tcp;​18 using·​asio:​:​ip:​:​tcp;​
19 19
20 typedef·​std:​:​deque<chat_message>·​chat_message_queue;​20 typedef·​std:​:​deque<chat_message>·​chat_message_queue;​
21 21
22 class·​chat_client22 class·​chat_client
23 {23 {
24 public:​24 public:​
25 ··​chat_client(asio:​:​io_context&·​io_context,​25 ··​chat_client(asio:​:​io_context&·​io_context,​
26 ······​const·​tcp:​:​resolver:​:​results_type&·​endpoints)​26 ······​const·​tcp:​:​resolver:​:​results_type&·​endpoints)​
27 ····​:​·​io_context_(io_contex​t)​,​27 ····​:​·​io_context_(io_contex​t)​,​
28 ······​socket_(io_context)​28 ······​socket_(io_context)​
29 ··​{29 ··​{
30 ····asio:​:​async_connect(socket_​,​·endpoints,​30 ····do_connect(endpoints)​;​
31 ········boost:​:​bind(&chat_client:​:​handle_connect,​·this,​
32 ··········asio:​:​placeholders:​:​error)​)​;​
33 ··​}31 ··​}
34 32
35 ··​void·​write(const·​chat_message&·​msg)​33 ··​void·​write(const·​chat_message&·​msg)​
36 ··​{34 ··​{
37 ····​asio:​:​post(io_context_,​35 ····​asio:​:​post(io_context_,​
38 ········boost:​:​bind(&chat_client:​:​do_write,​·this,​·​msg)​)​;​36 ········[this,​·​msg]()​
37 ········​{
38 ··········​bool·​write_in_progress·​=·​!write_msgs_.​empty()​;​
39 ··········​write_msgs_.​push_back(msg)​;​
40 ··········​if·​(!write_in_progress)​
41 ··········​{
42 ············​do_write()​;​
43 ··········​}
44 ········​})​;​
39 ··​}45 ··​}
40 46
41 ··​void·​close()​47 ··​void·​close()​
42 ··​{48 ··​{
43 ····​asio:​:​post(io_context_,​49 ····​asio:​:​post(io_context_,​·[this]()​·{·socket_.​close()​;​·})​;​
44 ········boost:​:​bind(&chat_client:​:​do_close,​·this)​)​;​
45 ··​}50 ··​}
46 51
47 private:​52 private:​
48 53 ··void·do_connect(const·tcp:​:​resolver:​:​results_type&·endpoints)​
49 ··void·handle_connect(const·asio:​:​error_code&·error)​
50 ··{
51 ····if·(!error)​
52 ····{
53 ······asio:​:​async_read(socket_,​
54 ··········asio:​:​buffer(read_msg_.​data()​,​·chat_message:​:​header_length)​,​
55 ··········boost:​:​bind(&chat_client:​:​handle_read_header,​·this,​
56 ············asio:​:​placeholders:​:​error)​)​;​
57 ····}
58 ··}
59
60 ··void·handle_read_header(co​nst·asio:​:​error_code&·error)​
61 ··{
62 ····if·(!error·&&·read_msg_.​decode_header()​)​
63 ····{
64 ······asio:​:​async_read(socket_,​
65 ··········asio:​:​buffer(read_msg_.​body()​,​·read_msg_.​body_length()​)​,​
66 ··········boost:​:​bind(&chat_client:​:​handle_read_body,​·this,​
67 ············asio:​:​placeholders:​:​error)​)​;​
68 ····}
69 ····else
70 ····{
71 ······do_close()​;​
72 ····}
73 ··}
74
75 ··void·handle_read_body(cons​t·asio:​:​error_code&·error)​
76 ··{
77 ····if·(!error)​
78 ····{
79 ······std:​:​cout.​write(read_msg_.​body()​,​·read_msg_.​body_length()​)​;​
80 ······std:​:​cout·<<·"\n";​
81 ······asio:​:​async_read(socket_,​
82 ··········asio:​:​buffer(read_msg_.​data()​,​·chat_message:​:​header_length)​,​
83 ··········boost:​:​bind(&chat_client:​:​handle_read_header,​·this,​
84 ············asio:​:​placeholders:​:​error)​)​;​
85 ····}
86 ····else
87 ····{
88 ······do_close()​;​
89 ····}
90 ··}
91
92 ··void·do_write(chat_message​·msg)​
93 ··{
94 ····bool·write_in_progress·=·!write_msgs_.​empty()​;​
95 ····write_msgs_.​push_back(msg)​;​
96 ····if·(!write_in_progress)​
97 ····{
98 ······asio:​:​async_write(socket_,​
99 ··········asio:​:​buffer(write_msgs_.​front()​.​data()​,​
100 ············write_msgs_.​front()​.​length()​)​,​
101 ··········boost:​:​bind(&chat_client:​:​handle_write,​·this,​
102 ············asio:​:​placeholders:​:​error)​)​;​
103 ····}
104 ··}
105
106 ··void·handle_write(const·asio:​:​error_code&·error)​
107 ··​{54 ··​{
108 ····​if·(!error)​55 ····asio:​:​async_connect(socket_​,​·endpoints,​
109 ····{56 ········[this](std:​:​error_code·ec,​·tcp:​:​endpoint)​
110 ······write_msgs_.​pop_front()​;​57 ········{
111 ······if·(!write_msgs_.​empty()​)​58 ··········if·(!ec)​
112 ······​{59 ··········​{
113 ········asio:​:​async_write(socket_,​60 ············do_read_header()​;​
114 ············asio:​:​buffer(write_msgs_.​front()​.​data()​,​61 ··········}
115 ··············write_msgs_.​front()​.​length()​)​,​62 ········})​;​
116 ············boost:​:​bind(&chat_client:​:​handle_write,​·this,​63 ··}
117 ··············asio:​:​placeholders:​:​error)​)​;​64
118 ······}65 ··void·do_read_header()​
119 ····}66 ··{
120 ····​else67 ····asio:​:​async_read(socket_,​
121 ····{68 ········asio:​:​buffer(read_msg_.​data()​,​·chat_message:​:​header_length)​,​
122 ······​do_close()​;​69 ········[this](std:​:​error_code·ec,​·std:​:​size_t·/​*length*/​)​
123 ····}70 ········{
124 ··}71 ··········if·(!ec·&&·read_msg_.​decode_header()​)​
125 72 ··········{
126 ··void·​do_close()​73 ············​do_read_body()​;​
127 ··{74 ··········}
128 ····socket_.​close()​;​75 ··········else
76 ··········​{
77 ············​socket_.​close()​;​
78 ··········​}
79 ········​})​;​
80 ··​}
81
82 ··​void·​do_read_body()​
83 ··​{
84 ····​asio:​:​async_read(socket_,​
85 ········​asio:​:​buffer(read_msg_.​body()​,​·​read_msg_.​body_length()​)​,​
86 ········​[this](std:​:​error_code·​ec,​·​std:​:​size_t·​/​*length*/​)​
87 ········​{
88 ··········​if·​(!ec)​
89 ··········​{
90 ············​std:​:​cout.​write(read_msg_.​body()​,​·​read_msg_.​body_length()​)​;​
91 ············​std:​:​cout·​<<·​"\n";​
92 ············​do_read_header()​;​
93 ··········​}
94 ··········​else
95 ··········​{
96 ············​socket_.​close()​;​
97 ··········​}
98 ········​})​;​
99 ··​}
100
101 ··​void·​do_write()​
102 ··​{
103 ····​asio:​:​async_write(socket_,​
104 ········​asio:​:​buffer(write_msgs_.​front()​.​data()​,​
105 ··········​write_msgs_.​front()​.​length()​)​,​
106 ········​[this](std:​:​error_code·​ec,​·​std:​:​size_t·​/​*length*/​)​
107 ········​{
108 ··········​if·​(!ec)​
109 ··········​{
110 ············​write_msgs_.​pop_front()​;​
111 ············​if·​(!write_msgs_.​empty()​)​
112 ············​{
113 ··············​do_write()​;​
114 ············​}
115 ··········​}
116 ··········​else
117 ··········​{
118 ············​socket_.​close()​;​
119 ··········​}
120 ········​})​;​
129 ··​}121 ··​}
130 122
131 private:​123 private:​
132 ··​asio:​:​io_context&·​io_context_;​124 ··​asio:​:​io_context&·​io_context_;​
133 ··​tcp:​:​socket·​socket_;​125 ··​tcp:​:​socket·​socket_;​
134 ··​chat_message·​read_msg_;​126 ··​chat_message·​read_msg_;​
135 ··​chat_message_queue·​write_msgs_;​127 ··​chat_message_queue·​write_msgs_;​
136 };​128 };​
137 129
138 int·​main(int·​argc,​·​char*·​argv[])​130 int·​main(int·​argc,​·​char*·​argv[])​
139 {131 {
140 ··​try132 ··​try
141 ··​{133 ··​{
142 ····​if·​(argc·​!=·​3)​134 ····​if·​(argc·​!=·​3)​
143 ····​{135 ····​{
144 ······​std:​:​cerr·​<<·​"Usage:​·​chat_client·​<host>·​<port>\n";​136 ······​std:​:​cerr·​<<·​"Usage:​·​chat_client·​<host>·​<port>\n";​
145 ······​return·​1;​137 ······​return·​1;​
146 ····​}138 ····​}
147 139
148 ····​asio:​:​io_context·​io_context;​140 ····​asio:​:​io_context·​io_context;​
149 141
150 ····​tcp:​:​resolver·​resolver(io_context)​;​142 ····​tcp:​:​resolver·​resolver(io_context)​;​
151 ····tcp:​:​resolver:​:​results_type·​endpoints·​=·​resolver.​resolve(argv[1],​·​argv[2])​;​143 ····auto·​endpoints·​=·​resolver.​resolve(argv[1],​·​argv[2])​;​
152
153 ····​chat_client·​c(io_context,​·​endpoints)​;​144 ····​chat_client·​c(io_context,​·​endpoints)​;​
154 145
155 ····asio:​:​thread·​t(boost:​:​bind(&asio:​:​io_context:​:​run,​·&io_context)​)​;​146 ····​std:​:​thread·​t([&io_context]()​{·​io_context.​run()​;​·})​;​
156 147
157 ····​char·​line[chat_message:​:​max_body_length·​+·​1];​148 ····​char·​line[chat_message:​:​max_body_length·​+·​1];​
158 ····​while·​(std:​:​cin.​getline(line,​·​chat_message:​:​max_body_length·​+·​1)​)​149 ····​while·​(std:​:​cin.​getline(line,​·​chat_message:​:​max_body_length·​+·​1)​)​
159 ····​{150 ····​{
160 ······​using·​namespace·​std;​·​/​/​·​For·​strlen·​and·​memcpy.​
161 ······​chat_message·​msg;​151 ······​chat_message·​msg;​
162 ······​msg.​body_length(strlen(li​ne)​)​;​152 ······​msg.​body_length(std:​:​strlen(line)​)​;​
163 ······​memcpy(msg.​body()​,​·​line,​·​msg.​body_length()​)​;​153 ······std:​:​memcpy(msg.​body()​,​·​line,​·​msg.​body_length()​)​;​
164 ······​msg.​encode_header()​;​154 ······​msg.​encode_header()​;​
165 ······​c.​write(msg)​;​155 ······​c.​write(msg)​;​
166 ····​}156 ····​}
167 157
168 ····​c.​close()​;​158 ····​c.​close()​;​
169 ····​t.​join()​;​159 ····​t.​join()​;​
170 ··​}160 ··​}
171 ··​catch·​(std:​:​exception&·​e)​161 ··​catch·​(std:​:​exception&·​e)​
172 ··​{162 ··​{
173 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​163 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
174 ··​}164 ··​}
175 165
176 ··​return·​0;​166 ··​return·​0;​
177 }167 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/chat/chat_message.hpp.html000066400000000000000000001344611340672067200232440ustar00rootroot00000000000000 HTML Diff chat/chat_message.hpp
src/​examples/​cpp03/​chat/​chat_message.​hppsrc/​examples/​cpp11/​chat/​chat_message.​hpp
1 /​/​1 /​/​
2 /​/​·​chat_message.​hpp2 /​/​·​chat_message.​hpp
3 /​/​·​~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​CHAT_MESSAGE_HPP11 #ifndef·​CHAT_MESSAGE_HPP
12 #define·​CHAT_MESSAGE_HPP12 #define·​CHAT_MESSAGE_HPP
13 13
14 #include·​<cstdio>14 #include·​<cstdio>
15 #include·​<cstdlib>15 #include·​<cstdlib>
16 #include·​<cstring>16 #include·​<cstring>
17 17
18 class·​chat_message18 class·​chat_message
19 {19 {
20 public:​20 public:​
21 ··​enum·​{·​header_length·​=·​4·​};​21 ··​enum·​{·​header_length·​=·​4·​};​
22 ··​enum·​{·​max_body_length·​=·​512·​};​22 ··​enum·​{·​max_body_length·​=·​512·​};​
23 23
24 ··​chat_message()​24 ··​chat_message()​
25 ····​:​·​body_length_(0)​25 ····​:​·​body_length_(0)​
26 ··​{26 ··​{
27 ··​}27 ··​}
28 28
29 ··​const·​char*·​data()​·​const29 ··​const·​char*·​data()​·​const
30 ··​{30 ··​{
31 ····​return·​data_;​31 ····​return·​data_;​
32 ··​}32 ··​}
33 33
34 ··​char*·​data()​34 ··​char*·​data()​
35 ··​{35 ··​{
36 ····​return·​data_;​36 ····​return·​data_;​
37 ··​}37 ··​}
38 38
39 ··​size_t·​length()​·​const39 ··std:​:​size_t·​length()​·​const
40 ··​{40 ··​{
41 ····​return·​header_length·​+·​body_length_;​41 ····​return·​header_length·​+·​body_length_;​
42 ··​}42 ··​}
43 43
44 ··​const·​char*·​body()​·​const44 ··​const·​char*·​body()​·​const
45 ··​{45 ··​{
46 ····​return·​data_·​+·​header_length;​46 ····​return·​data_·​+·​header_length;​
47 ··​}47 ··​}
48 48
49 ··​char*·​body()​49 ··​char*·​body()​
50 ··​{50 ··​{
51 ····​return·​data_·​+·​header_length;​51 ····​return·​data_·​+·​header_length;​
52 ··​}52 ··​}
53 53
54 ··​size_t·​body_length()​·​const54 ··std:​:​size_t·​body_length()​·​const
55 ··​{55 ··​{
56 ····​return·​body_length_;​56 ····​return·​body_length_;​
57 ··​}57 ··​}
58 58
59 ··​void·​body_length(size_t·​new_length)​59 ··​void·​body_length(std:​:​size_t·​new_length)​
60 ··​{60 ··​{
61 ····​body_length_·​=·​new_length;​61 ····​body_length_·​=·​new_length;​
62 ····​if·​(body_length_·​>·​max_body_length)​62 ····​if·​(body_length_·​>·​max_body_length)​
63 ······​body_length_·​=·​max_body_length;​63 ······​body_length_·​=·​max_body_length;​
64 ··​}64 ··​}
65 65
66 ··​bool·​decode_header()​66 ··​bool·​decode_header()​
67 ··​{67 ··​{
68 ····​using·​namespace·​std;​·​/​/​·​For·​strncat·​and·​atoi.​
69 ····​char·​header[header_length·​+·​1]·​=·​"";​68 ····​char·​header[header_length·​+·​1]·​=·​"";​
70 ····​strncat(header,​·​data_,​·​header_length)​;​69 ····std:​:​strncat(header,​·​data_,​·​header_length)​;​
71 ····​body_length_·​=·​atoi(header)​;​70 ····​body_length_·​=·std:​:​atoi(header)​;​
72 ····​if·​(body_length_·​>·​max_body_length)​71 ····​if·​(body_length_·​>·​max_body_length)​
73 ····​{72 ····​{
74 ······​body_length_·​=·​0;​73 ······​body_length_·​=·​0;​
75 ······​return·​false;​74 ······​return·​false;​
76 ····​}75 ····​}
77 ····​return·​true;​76 ····​return·​true;​
78 ··​}77 ··​}
79 78
80 ··​void·​encode_header()​79 ··​void·​encode_header()​
81 ··​{80 ··​{
82 ····​using·​namespace·​std;​·​/​/​·​For·​sprintf·​and·​memcpy.​
83 ····​char·​header[header_length·​+·​1]·​=·​"";​81 ····​char·​header[header_length·​+·​1]·​=·​"";​
84 ····​sprintf(header,​·​"%4d",​·​static_cast<int>(body​_length_)​)​;​82 ····std:​:​sprintf(header,​·​"%4d",​·​static_cast<int>(body​_length_)​)​;​
85 ····​memcpy(data_,​·​header,​·​header_length)​;​83 ····std:​:​memcpy(data_,​·​header,​·​header_length)​;​
86 ··​}84 ··​}
87 85
88 private:​86 private:​
89 ··​char·​data_[header_length·​+·​max_body_length];​87 ··​char·​data_[header_length·​+·​max_body_length];​
90 ··​size_t·​body_length_;​88 ··std:​:​size_t·​body_length_;​
91 };​89 };​
92 90
93 #endif·​/​/​·​CHAT_MESSAGE_HPP91 #endif·​/​/​·​CHAT_MESSAGE_HPP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/chat/chat_server.cpp.html000066400000000000000000007477551340672067200231410ustar00rootroot00000000000000 HTML Diff chat/chat_server.cpp
src/​examples/​cpp03/​chat/​chat_server.​cppsrc/​examples/​cpp11/​chat/​chat_server.​cpp
1 /​/​1 /​/​
2 /​/​·​chat_server.​cpp2 /​/​·​chat_server.​cpp
3 /​/​·​~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<algorithm>
12 #include·​<cstdlib>11 #include·​<cstdlib>
13 #include·​<deque>12 #include·​<deque>
14 #include·​<iostream>13 #include·​<iostream>
15 #include·​<list>14 #include·​<list>
15 #include·​<memory>
16 #include·​<set>16 #include·​<set>
17 #include·​<boost/​bind.​hpp>17 #include·​<utility>
18 #include·<boost/​shared_ptr.​hpp>
19 #include·<boost/​enable_shared_from_th​is.​hpp>
20 #include·​"asio.​hpp"18 #include·​"asio.​hpp"
21 #include·​"chat_message.​hpp"19 #include·​"chat_message.​hpp"
22 20
23 using·​asio:​:​ip:​:​tcp;​21 using·​asio:​:​ip:​:​tcp;​
24 22
25 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​23 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
26 24
27 typedef·​std:​:​deque<chat_message>·​chat_message_queue;​25 typedef·​std:​:​deque<chat_message>·​chat_message_queue;​
28 26
29 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​27 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
30 28
31 class·​chat_participant29 class·​chat_participant
32 {30 {
33 public:​31 public:​
34 ··​virtual·​~chat_participant()​·​{}32 ··​virtual·​~chat_participant()​·​{}
35 ··​virtual·​void·​deliver(const·​chat_message&·​msg)​·​=·​0;​33 ··​virtual·​void·​deliver(const·​chat_message&·​msg)​·​=·​0;​
36 };​34 };​
37 35
38 typedef·boost:​:​shared_ptr<chat_parti​cipant>·​chat_participant_ptr;​36 typedef·​std:​:​shared_ptr<chat_parti​cipant>·​chat_participant_ptr;​
39 37
40 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​38 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
41 39
42 class·​chat_room40 class·​chat_room
43 {41 {
44 public:​42 public:​
45 ··​void·​join(chat_participant​_ptr·​participant)​43 ··​void·​join(chat_participant​_ptr·​participant)​
46 ··​{44 ··​{
47 ····​participants_.​insert(participant)​;​45 ····​participants_.​insert(participant)​;​
48 ····std:​:​for_each(recent_msgs_​.​begin()​,​·​recent_msgs_.​end()​,​46 ····​for·(auto·msg:​·​recent_msgs_)​
49 ········boost:​:​bind(&chat_participan​t:​:​deliver,​·participant,​·_1)​)​;​47 ······​participant-​>deliver(msg)​;​
50 ··​}48 ··​}
51 49
52 ··​void·​leave(chat_participan​t_ptr·​participant)​50 ··​void·​leave(chat_participan​t_ptr·​participant)​
53 ··​{51 ··​{
54 ····​participants_.​erase(participant)​;​52 ····​participants_.​erase(participant)​;​
55 ··​}53 ··​}
56 54
57 ··​void·​deliver(const·​chat_message&·​msg)​55 ··​void·​deliver(const·​chat_message&·​msg)​
58 ··​{56 ··​{
59 ····​recent_msgs_.​push_back(msg)​;​57 ····​recent_msgs_.​push_back(msg)​;​
60 ····​while·​(recent_msgs_.​size()​·​>·​max_recent_msgs)​58 ····​while·​(recent_msgs_.​size()​·​>·​max_recent_msgs)​
61 ······​recent_msgs_.​pop_front()​;​59 ······​recent_msgs_.​pop_front()​;​
62 60
63 ····std:​:​for_each(participants​_.​begin()​,​·​participants_.​end()​,​61 ····​for·(auto·participant:​·​participants_)​
64 ········boost:​:​bind(&chat_participan​t:​:​deliver,​·_1,​·boost:​:​ref(msg)​)​)​;​62 ······​participant-​>deliver(msg)​;​
65 ··​}63 ··​}
66 64
67 private:​65 private:​
68 ··​std:​:​set<chat_participant_​ptr>·​participants_;​66 ··​std:​:​set<chat_participant_​ptr>·​participants_;​
69 ··​enum·​{·​max_recent_msgs·​=·​100·​};​67 ··​enum·​{·​max_recent_msgs·​=·​100·​};​
70 ··​chat_message_queue·​recent_msgs_;​68 ··​chat_message_queue·​recent_msgs_;​
71 };​69 };​
72 70
73 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​71 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
74 72
75 class·​chat_session73 class·​chat_session
76 ··​:​·​public·​chat_participant,​74 ··​:​·​public·​chat_participant,​
77 ····​public·boost:​:​enable_shared_from_th​is<chat_session>75 ····​public·​std:​:​enable_shared_from_th​is<chat_session>
78 {76 {
79 public:​77 public:​
80 ··​chat_session(asio:​:​io_context&·io_context,​·​chat_room&·​room)​78 ··​chat_session(tcp:​:​socket·socket,​·​chat_room&·​room)​
81 ····​:​·​socket_(io_context)​,​79 ····​:​·​socket_(std:​:​move(socket)​)​,​
82 ······​room_(room)​80 ······​room_(room)​
83 ··​{81 ··​{
84 ··​}82 ··​}
85 83
86 ··​tcp:​:​socket&·​socket()​
87 ··​{
88 ····​return·​socket_;​
89 ··​}
90
91 ··​void·​start()​84 ··​void·​start()​
92 ··​{85 ··​{
93 ····​room_.​join(shared_from_this​()​)​;​86 ····​room_.​join(shared_from_this​()​)​;​
94 ····asio:​:​async_read(socket_,​87 ····do_read_header()​;​
95 ········asio:​:​buffer(read_msg_.​data()​,​·chat_message:​:​header_length)​,​
96 ········boost:​:​bind(
97 ··········&chat_session:​:​handle_read_header,​·shared_from_this()​,​
98 ··········asio:​:​placeholders:​:​error)​)​;​
99 ··​}88 ··​}
100 89
101 ··​void·​deliver(const·​chat_message&·​msg)​90 ··​void·​deliver(const·​chat_message&·​msg)​
102 ··​{91 ··​{
103 ····​bool·​write_in_progress·​=·​!write_msgs_.​empty()​;​92 ····​bool·​write_in_progress·​=·​!write_msgs_.​empty()​;​
104 ····​write_msgs_.​push_back(msg)​;​93 ····​write_msgs_.​push_back(msg)​;​
105 ····​if·​(!write_in_progress)​94 ····​if·​(!write_in_progress)​
106 ····​{95 ····​{
107 ······asio:​:​async_write(socket_,​96 ······do_write()​;​
108 ··········asio:​:​buffer(write_msgs_.​front()​.​data()​,​
109 ············write_msgs_.​front()​.​length()​)​,​
110 ··········boost:​:​bind(&chat_session:​:​handle_write,​·shared_from_this()​,​
111 ············asio:​:​placeholders:​:​error)​)​;​
112 ····​}97 ····​}
113 ··​}98 ··​}
114 99
115 ··void·handle_read_header(co​nst·asio:​:​error_code&·error)​100 private:​
116 ··{101 ··void·do_read_header()​
117 ····if·(!error·&&·read_msg_.​decode_header()​)​
118 ····{
119 ······asio:​:​async_read(socket_,​
120 ··········asio:​:​buffer(read_msg_.​body()​,​·read_msg_.​body_length()​)​,​
121 ··········boost:​:​bind(&chat_session:​:​handle_read_body,​·shared_from_this()​,​
122 ············asio:​:​placeholders:​:​error)​)​;​
123 ····}
124 ····else
125 ····{
126 ······room_.​leave(shared_from_thi​s()​)​;​
127 ····}
128 ··}
129
130 ··void·handle_read_body(cons​t·asio:​:​error_code&·error)​
131 ··​{102 ··​{
132 ····if·​(!error)​103 ····auto·self(shared_from_this​()​)​;​
133 ····{104 ····asio:​:​async_read(socket_,​
134 ······​room_.​deliver(read_msg_)​;​105 ········asio:​:​buffer(read_msg_.​data()​,​·chat_message:​:​header_length)​,​
135 ······asio:​:​async_read(socket_,​106 ········[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·/​*length*/​)​
136 ··········asio:​:​buffer(read_msg_.​data()​,​·chat_message:​:​header_length)​,​107 ········{
137 ··········boost:​:​bind(&chat_session:​:​handle_read_header,​·shared_from_this()​,​108 ··········​if·(!ec·&&·read_msg_.​decode_header()​)​
138 ············asio:​:​placeholders:​:​error)​)​;​109 ··········{
139 ····}110 ············do_read_body()​;​
140 ····else111 ··········}
141 ····{112 ··········else
142 ······room_.​leave(shared_from_thi​s()​)​;​113 ··········{
143 ····}114 ············room_.​leave(shared_from_thi​s()​)​;​
115 ··········​}
116 ········​})​;​
144 ··​}117 ··​}
145 118
146 ··​void·handle_write(const·asio:​:​error_code&·error)​119 ··​void·​do_read_body()​
147 ··​{120 ··​{
148 ····if·​(!error)​121 ····auto·self(shared_from_this​()​)​;​
149 ····{122 ····asio:​:​async_read(socket_,​
150 ······write_msgs_.​pop_front()​;​123 ········asio:​:​buffer(read_msg_.​body()​,​·read_msg_.​body_length()​)​,​
151 ······​if·(!write_msgs_.​empty()​)​124 ········[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·/​*length*/​)​
152 ······​{125 ········​{
153 ········asio:​:​async_write(socket_,​126 ··········if·(!ec)​
154 ············asio:​:​buffer(write_msgs_.​front()​.​data()​,​127 ··········{
155 ··············write_msgs_.​front()​.​length()​)​,​128 ············​room_.​deliver(read_msg_)​;​
156 ············boost:​:​bind(&chat_session:​:​handle_write,​·shared_from_this()​,​129 ············​do_read_header()​;​
157 ··············asio:​:​placeholders:​:​error)​)​;​130 ··········}
158 ······}131 ··········else
159 ····}132 ··········{
160 ····​else133 ············room_.​leave(shared_from_thi​s()​)​;​
161 ····{134 ··········}
162 ······room_.​leave(shared_from_thi​s()​)​;​135 ········})​;​
163 ····​}136 ··​}
137
138 ··​void·​do_write()​
139 ··​{
140 ····​auto·​self(shared_from_this​()​)​;​
141 ····​asio:​:​async_write(socket_,​
142 ········​asio:​:​buffer(write_msgs_.​front()​.​data()​,​
143 ··········​write_msgs_.​front()​.​length()​)​,​
144 ········​[this,​·​self](std:​:​error_code·​ec,​·​std:​:​size_t·​/​*length*/​)​
145 ········​{
146 ··········​if·​(!ec)​
147 ··········​{
148 ············​write_msgs_.​pop_front()​;​
149 ············​if·​(!write_msgs_.​empty()​)​
150 ············​{
151 ··············​do_write()​;​
152 ············​}
153 ··········​}
154 ··········​else
155 ··········​{
156 ············​room_.​leave(shared_from_thi​s()​)​;​
157 ··········​}
158 ········​})​;​
164 ··​}159 ··​}
165 160
166 private:​
167 ··​tcp:​:​socket·​socket_;​161 ··​tcp:​:​socket·​socket_;​
168 ··​chat_room&·​room_;​162 ··​chat_room&·​room_;​
169 ··​chat_message·​read_msg_;​163 ··​chat_message·​read_msg_;​
170 ··​chat_message_queue·​write_msgs_;​164 ··​chat_message_queue·​write_msgs_;​
171 };​165 };​
172 166
173 typedef·​boost:​:​shared_ptr<chat_sessi​on>·​chat_session_ptr;​
174
175 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​167 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
176 168
177 class·​chat_server169 class·​chat_server
178 {170 {
179 public:​171 public:​
180 ··​chat_server(asio:​:​io_context&·​io_context,​172 ··​chat_server(asio:​:​io_context&·​io_context,​
181 ······​const·​tcp:​:​endpoint&·​endpoint)​173 ······​const·​tcp:​:​endpoint&·​endpoint)​
182 ····​:​·io_context_(io_contex​t)​,​174 ····​:​·acceptor_(io_context,​·endpoint)​
183 ······acceptor_(io_context,​·endpoint)​
184 ··​{175 ··​{
185 ····start_accept()​;​176 ····do_accept()​;​
186 ··​}177 ··​}
187 178
188 ··void·start_accept()​179 private:​
189 ··{180 ··void·do_accept()​
190 ····chat_session_ptr·new_session(new·chat_session(io_conte​xt_,​·room_)​)​;​
191 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​
192 ········boost:​:​bind(&chat_server:​:​handle_accept,​·this,​·new_session,​
193 ··········asio:​:​placeholders:​:​error)​)​;​
194 ··}
195
196 ··void·handle_accept(chat_se​ssion_ptr·session,​
197 ······const·asio:​:​error_code&·error)​
198 ··​{181 ··​{
199 ····if·(!error)​182 ····acceptor_.​async_accept(
200 ····{183 ········[this](std:​:​error_code·ec,​·tcp:​:​socket·socket)​
201 ······session-​>start()​;​184 ········{
202 ····}185 ··········if·(!ec)​
186 ··········​{
187 ············​std:​:​make_shared<chat_sess​ion>(std:​:​move(socket)​,​·​room_)​-​>start()​;​
188 ··········​}
203 189
204 ····start_accept()​;​190 ··········do_accept()​;​
191 ········​})​;​
205 ··​}192 ··​}
206 193
207 private:​
208 ··​asio:​:​io_context&·​io_context_;​
209 ··​tcp:​:​acceptor·​acceptor_;​194 ··​tcp:​:​acceptor·​acceptor_;​
210 ··​chat_room·​room_;​195 ··​chat_room·​room_;​
211 };​196 };​
212 197
213 typedef·​boost:​:​shared_ptr<chat_serve​r>·​chat_server_ptr;​
214 typedef·​std:​:​list<chat_server_ptr>​·​chat_server_list;​
215
216 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​198 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
217 199
218 int·​main(int·​argc,​·​char*·​argv[])​200 int·​main(int·​argc,​·​char*·​argv[])​
219 {201 {
220 ··​try202 ··​try
221 ··​{203 ··​{
222 ····​if·​(argc·​<·​2)​204 ····​if·​(argc·​<·​2)​
223 ····​{205 ····​{
224 ······​std:​:​cerr·​<<·​"Usage:​·​chat_server·​<port>·​[<port>·​.​.​.​]\n";​206 ······​std:​:​cerr·​<<·​"Usage:​·​chat_server·​<port>·​[<port>·​.​.​.​]\n";​
225 ······​return·​1;​207 ······​return·​1;​
226 ····​}208 ····​}
227 209
228 ····​asio:​:​io_context·​io_context;​210 ····​asio:​:​io_context·​io_context;​
229 211
230 ····​chat_server_list·​servers;​212 ····std:​:​list<chat_server>·​servers;​
231 ····​for·​(int·​i·​=·​1;​·​i·​<·​argc;​·​++i)​213 ····​for·​(int·​i·​=·​1;​·​i·​<·​argc;​·​++i)​
232 ····​{214 ····​{
233 ······using·​namespace·​std;​·/​/​·For·atoi.​215 ······tcp:​:​endpoint·endpoint(tcp:​:​v4()​,​·​std:​:​atoi(argv[i])​)​;​
234 ······tcp:​:​endpoint·endpoint(tcp:​:​v4()​,​·atoi(argv[i])​)​;​216 ······servers.​emplace_back(io_conte​xt,​·endpoint)​;​
235 ······chat_server_ptr·server(new·chat_server(io_contex​t,​·endpoint)​)​;​
236 ······servers.​push_back(server)​;​
237 ····​}217 ····​}
238 218
239 ····​io_context.​run()​;​219 ····​io_context.​run()​;​
240 ··​}220 ··​}
241 ··​catch·​(std:​:​exception&·​e)​221 ··​catch·​(std:​:​exception&·​e)​
242 ··​{222 ··​{
243 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​223 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
244 ··​}224 ··​}
245 225
246 ··​return·​0;​226 ··​return·​0;​
247 }227 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/echo/000077500000000000000000000000001340672067200171335ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/echo/async_tcp_echo_server.cpp.html000066400000000000000000003771641340672067200251730ustar00rootroot00000000000000 HTML Diff echo/async_tcp_echo_server.cpp
src/​examples/​cpp03/​echo/​async_tcp_echo_server​.​cppsrc/​examples/​cpp11/​echo/​async_tcp_echo_server​.​cpp
1 /​/​1 /​/​
2 /​/​·​async_tcp_echo_server​.​cpp2 /​/​·​async_tcp_echo_server​.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<iostream>12 #include·​<iostream>
13 #include·​<boost/​bind.​hpp>13 #include·​<memory>
14 #include·​<utility>
14 #include·​"asio.​hpp"15 #include·​"asio.​hpp"
15 16
16 using·​asio:​:​ip:​:​tcp;​17 using·​asio:​:​ip:​:​tcp;​
17 18
18 class·​session19 class·​session
20 ··​:​·​public·​std:​:​enable_shared_from_th​is<session>
19 {21 {
20 public:​22 public:​
21 ··​session(asio:​:​io_context&·io_context)​23 ··​session(tcp:​:​socket·socket)​
22 ····​:​·​socket_(io_context)​24 ····​:​·​socket_(std:​:​move(socket)​)​
23 ··​{25 ··​{
24 ··​}26 ··​}
25 27
26 ··​tcp:​:​socket&·​socket()​
27 ··​{
28 ····​return·​socket_;​
29 ··​}
30
31 ··​void·​start()​28 ··​void·​start()​
32 ··​{29 ··​{
33 ····socket_.​async_read_some(asio:​:​buffer(data_,​·max_length)​,​30 ····do_read()​;​
34 ········boost:​:​bind(&session:​:​handle_read,​·this,​
35 ··········asio:​:​placeholders:​:​error,​
36 ··········asio:​:​placeholders:​:​bytes_transferred)​)​;​
37 ··​}31 ··​}
38 32
39 private:​33 private:​
40 ··​void·handle_read(const·asio:​:​error_code&·error,​34 ··​void·​do_read()​
41 ······size_t·bytes_transferred)​
42 ··{
43 ····if·(!error)​
44 ····{
45 ······asio:​:​async_write(socket_,​
46 ··········asio:​:​buffer(data_,​·bytes_transferred)​,​
47 ··········boost:​:​bind(&session:​:​handle_write,​·this,​
48 ············asio:​:​placeholders:​:​error)​)​;​
49 ····}
50 ····else
51 ····{
52 ······delete·this;​
53 ····}
54 ··}
55
56 ··void·handle_write(const·asio:​:​error_code&·error)​
57 ··​{35 ··​{
58 ····if·​(!error)​36 ····auto·self(shared_from_this​()​)​;​
59 ····{37 ····socket_.​async_read_some(asio:​:​buffer(data_,​·max_length)​,​
60 ······socket_.​async_read_some(asio:​:​buffer(data_,​·max_length)​,​38 ········[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·length)​
61 ··········boost:​:​bind(&session:​:​handle_read,​·this,​39 ········{
62 ············asio:​:​placeholders:​:​error,​40 ··········​if·(!ec)​
63 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​41 ··········{
64 ····}42 ············do_write(length)​;​
65 ····else43 ··········}
66 ····{44 ········})​;​
67 ······delete·this;​45 ··}
68 ····}46
47 ··​void·​do_write(std:​:​size_t·​length)​
48 ··​{
49 ····​auto·​self(shared_from_this​()​)​;​
50 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer(data_,​·​length)​,​
51 ········​[this,​·​self](std:​:​error_code·​ec,​·​std:​:​size_t·​/​*length*/​)​
52 ········​{
53 ··········​if·​(!ec)​
54 ··········​{
55 ············​do_read()​;​
56 ··········​}
57 ········​})​;​
69 ··​}58 ··​}
70 59
71 ··​tcp:​:​socket·​socket_;​60 ··​tcp:​:​socket·​socket_;​
72 ··​enum·​{·​max_length·​=·​1024·​};​61 ··​enum·​{·​max_length·​=·​1024·​};​
73 ··​char·​data_[max_length];​62 ··​char·​data_[max_length];​
74 };​63 };​
75 64
76 class·​server65 class·​server
77 {66 {
78 public:​67 public:​
79 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​68 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​
80 ····​:​·​io_context_(io_contex​t)​,​69 ····​:​·acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​
81 ······acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​
82 ··​{70 ··​{
83 ····start_accept()​;​71 ····do_accept()​;​
84 ··​}72 ··​}
85 73
86 private:​74 private:​
87 ··​void·start_accept()​75 ··​void·do_accept()​
88 ··​{76 ··​{
89 ····session*·new_session·=·new·session(io_context_)​;​77 ····acceptor_.​async_accept(
90 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​78 ········[this](std:​:​error_code·ec,​·tcp:​:​socket·socket)​
91 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​79 ········{
92 ··········asio:​:​placeholders:​:​error)​)​;​80 ··········​if·(!ec)​
93 ··}81 ··········{
94 82 ············std:​:​make_shared<session>(​std:​:​move(socket)​)​-​>start()​;​
95 ··void·handle_accept(session​*·new_session,​83 ··········}
96 ······const·asio:​:​error_code&·error)​
97 ··{
98 ····if·(!error)​
99 ····{
100 ······new_session-​>start()​;​
101 ····}
102 ····else
103 ····{
104 ······delete·new_session;​
105 ····}
106 84
107 ····start_accept()​;​85 ··········do_accept()​;​
86 ········​})​;​
108 ··​}87 ··​}
109 88
110 ··​asio:​:​io_context&·​io_context_;​
111 ··​tcp:​:​acceptor·​acceptor_;​89 ··​tcp:​:​acceptor·​acceptor_;​
112 };​90 };​
113 91
114 int·​main(int·​argc,​·​char*·​argv[])​92 int·​main(int·​argc,​·​char*·​argv[])​
115 {93 {
116 ··​try94 ··​try
117 ··​{95 ··​{
118 ····​if·​(argc·​!=·​2)​96 ····​if·​(argc·​!=·​2)​
119 ····​{97 ····​{
120 ······​std:​:​cerr·​<<·​"Usage:​·​async_tcp_echo_server​·​<port>\n";​98 ······​std:​:​cerr·​<<·​"Usage:​·​async_tcp_echo_server​·​<port>\n";​
121 ······​return·​1;​99 ······​return·​1;​
122 ····​}100 ····​}
123 101
124 ····​asio:​:​io_context·​io_context;​102 ····​asio:​:​io_context·​io_context;​
125 103
126 ····using·namespace·​std;​·/​/​·For·atoi.​104 ····server·s(io_context,​·​std:​:​atoi(argv[1])​)​;​
127 ····server·s(io_context,​·atoi(argv[1])​)​;​
128 105
129 ····​io_context.​run()​;​106 ····​io_context.​run()​;​
130 ··​}107 ··​}
131 ··​catch·​(std:​:​exception&·​e)​108 ··​catch·​(std:​:​exception&·​e)​
132 ··​{109 ··​{
133 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​110 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
134 ··​}111 ··​}
135 112
136 ··​return·​0;​113 ··​return·​0;​
137 }114 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/echo/async_udp_echo_server.cpp.html000066400000000000000000002760031340672067200251630ustar00rootroot00000000000000 HTML Diff echo/async_udp_echo_server.cpp
src/​examples/​cpp03/​echo/​async_udp_echo_server​.​cppsrc/​examples/​cpp11/​echo/​async_udp_echo_server​.​cpp
1 /​/​1 /​/​
2 /​/​·​async_udp_echo_server​.​cpp2 /​/​·​async_udp_echo_server​.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<iostream>12 #include·​<iostream>
13 #include·​<boost/​bind.​hpp>
14 #include·​"asio.​hpp"13 #include·​"asio.​hpp"
15 14
16 using·​asio:​:​ip:​:​udp;​15 using·​asio:​:​ip:​:​udp;​
17 16
18 class·​server17 class·​server
19 {18 {
20 public:​19 public:​
21 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​20 ··​server(asio:​:​io_context&·​io_context,​·​short·​port)​
22 ····​:​·​socket_(io_context,​·​udp:​:​endpoint(udp:​:​v4()​,​·​port)​)​21 ····​:​·​socket_(io_context,​·​udp:​:​endpoint(udp:​:​v4()​,​·​port)​)​
23 ··​{22 ··​{
24 ····socket_.​async_receive_from(23 ····do_receive()​;​
25 ········asio:​:​buffer(data_,​·max_length)​,​·sender_endpoint_,​
26 ········boost:​:​bind(&server:​:​handle_receive_from,​·this,​
27 ··········asio:​:​placeholders:​:​error,​
28 ··········asio:​:​placeholders:​:​bytes_transferred)​)​;​
29 ··​}24 ··​}
30 25
31 ··​void·handle_receive_from(c​onst·asio:​:​error_code&·error,​26 ··​void·​do_receive()​
32 ······size_t·bytes_recvd)​
33 ··​{27 ··​{
34 ····if·(!error·&&·bytes_recvd·>·0)​28 ····socket_.​async_receive_from(
35 ····{29 ········asio:​:​buffer(data_,​·max_length)​,​·sender_endpoint_,​
36 ······​socket_.​async_send_to(30 ········[this](std:​:​error_code·ec,​·std:​:​size_t·bytes_recvd)​
37 ··········asio:​:​buffer(data_,​·bytes_recvd)​,​·sender_endpoint_,​31 ········{
38 ··········boost:​:​bind(&server:​:​handle_send_to,​·this,​32 ··········​if·(!ec·&&·bytes_recvd·>·0)​
39 ············asio:​:​placeholders:​:​error,​33 ··········{
40 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​34 ············do_send(bytes_recvd)​;​
41 ····​}35 ··········​}
42 ····​else36 ··········​else
43 ····​{37 ··········​{
44 ······socket_.​async_receive_from(38 ············do_receive()​;​
45 ··········asio:​:​buffer(data_,​·max_length)​,​·sender_endpoint_,​39 ··········}
46 ··········boost:​:​bind(&server:​:​handle_receive_from,​·this,​40 ········})​;​
47 ············asio:​:​placeholders:​:​error,​
48 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​
49 ····}
50 ··​}41 ··​}
51 42
52 ··​void·handle_send_to(const·asio:​:​error_code&·/​*error*/​,​43 ··​void·​do_send(std:​:​size_t·length)​
53 ······size_t·/​*bytes_sent*/​)​
54 ··​{44 ··​{
55 ····​socket_.​async_receive_from(45 ····​socket_.​async_send_to(
56 ········​asio:​:​buffer(data_,​·max_length)​,​·​sender_endpoint_,​46 ········​asio:​:​buffer(data_,​·​length)​,​·​sender_endpoint_,​
57 ········boost:​:​bind(&server:​:​handle_receive_from,​·this,​47 ········[this](std:​:​error_code·/​*ec*/​,​·std:​:​size_t·/​*bytes_sent*/​)​
58 ··········asio:​:​placeholders:​:​error,​48 ········{
59 ··········asio:​:​placeholders:​:​bytes_transferred)​)​;​49 ··········​do_receive()​;​
50 ········​})​;​
60 ··​}51 ··​}
61 52
62 private:​53 private:​
63 ··​udp:​:​socket·​socket_;​54 ··​udp:​:​socket·​socket_;​
64 ··​udp:​:​endpoint·​sender_endpoint_;​55 ··​udp:​:​endpoint·​sender_endpoint_;​
65 ··​enum·​{·​max_length·​=·​1024·​};​56 ··​enum·​{·​max_length·​=·​1024·​};​
66 ··​char·​data_[max_length];​57 ··​char·​data_[max_length];​
67 };​58 };​
68 59
69 int·​main(int·​argc,​·​char*·​argv[])​60 int·​main(int·​argc,​·​char*·​argv[])​
70 {61 {
71 ··​try62 ··​try
72 ··​{63 ··​{
73 ····​if·​(argc·​!=·​2)​64 ····​if·​(argc·​!=·​2)​
74 ····​{65 ····​{
75 ······​std:​:​cerr·​<<·​"Usage:​·​async_udp_echo_server​·​<port>\n";​66 ······​std:​:​cerr·​<<·​"Usage:​·​async_udp_echo_server​·​<port>\n";​
76 ······​return·​1;​67 ······​return·​1;​
77 ····​}68 ····​}
78 69
79 ····​asio:​:​io_context·​io_context;​70 ····​asio:​:​io_context·​io_context;​
80 71
81 ····using·namespace·​std;​·/​/​·For·atoi.​72 ····server·s(io_context,​·​std:​:​atoi(argv[1])​)​;​
82 ····server·s(io_context,​·atoi(argv[1])​)​;​
83 73
84 ····​io_context.​run()​;​74 ····​io_context.​run()​;​
85 ··​}75 ··​}
86 ··​catch·​(std:​:​exception&·​e)​76 ··​catch·​(std:​:​exception&·​e)​
87 ··​{77 ··​{
88 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​78 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
89 ··​}79 ··​}
90 80
91 ··​return·​0;​81 ··​return·​0;​
92 }82 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/echo/blocking_tcp_echo_client.cpp.html000066400000000000000000001056621340672067200256060ustar00rootroot00000000000000 HTML Diff echo/blocking_tcp_echo_client.cpp
src/​examples/​cpp03/​echo/​blocking_tcp_echo_cli​ent.​cppsrc/​examples/​cpp11/​echo/​blocking_tcp_echo_cli​ent.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_tcp_echo_cli​ent.​cpp2 /​/​·​blocking_tcp_echo_cli​ent.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<cstring>12 #include·​<cstring>
13 #include·​<iostream>13 #include·​<iostream>
14 #include·​"asio.​hpp"14 #include·​"asio.​hpp"
15 15
16 using·​asio:​:​ip:​:​tcp;​16 using·​asio:​:​ip:​:​tcp;​
17 17
18 enum·​{·​max_length·​=·​1024·​};​18 enum·​{·​max_length·​=·​1024·​};​
19 19
20 int·​main(int·​argc,​·​char*·​argv[])​20 int·​main(int·​argc,​·​char*·​argv[])​
21 {21 {
22 ··​try22 ··​try
23 ··​{23 ··​{
24 ····​if·​(argc·​!=·​3)​24 ····​if·​(argc·​!=·​3)​
25 ····​{25 ····​{
26 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_echo_cli​ent·​<host>·​<port>\n";​26 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_echo_cli​ent·​<host>·​<port>\n";​
27 ······​return·​1;​27 ······​return·​1;​
28 ····​}28 ····​}
29 29
30 ····​asio:​:​io_context·​io_context;​30 ····​asio:​:​io_context·​io_context;​
31 31
32 ····​tcp:​:​resolver·​resolver(io_context)​;​
33 ····​tcp:​:​resolver:​:​results_type·​endpoints·​=
34 ······​resolver.​resolve(tcp:​:​v4()​,​·​argv[1],​·​argv[2])​;​
35
36 ····​tcp:​:​socket·​s(io_context)​;​32 ····​tcp:​:​socket·​s(io_context)​;​
37 ····asio:​:​connect(s,​·endpoints)​;​33 ····tcp:​:​resolver·resolver(io_context)​;​
34 ····​asio:​:​connect(s,​·​resolver.​resolve(argv[1],​·​argv[2])​)​;​
38 35
39 ····​using·​namespace·​std;​·​/​/​·​For·​strlen.​
40 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​36 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​
41 ····​char·​request[max_length];​37 ····​char·​request[max_length];​
42 ····​std:​:​cin.​getline(request,​·​max_length)​;​38 ····​std:​:​cin.​getline(request,​·​max_length)​;​
43 ····​size_t·​request_length·​=·​strlen(request)​;​39 ····​size_t·​request_length·​=·std:​:​strlen(request)​;​
44 ····​asio:​:​write(s,​·​asio:​:​buffer(request,​·​request_length)​)​;​40 ····​asio:​:​write(s,​·​asio:​:​buffer(request,​·​request_length)​)​;​
45 41
46 ····​char·​reply[max_length];​42 ····​char·​reply[max_length];​
47 ····​size_t·​reply_length·​=·​asio:​:​read(s,​43 ····​size_t·​reply_length·​=·​asio:​:​read(s,​
48 ········​asio:​:​buffer(reply,​·​request_length)​)​;​44 ········​asio:​:​buffer(reply,​·​request_length)​)​;​
49 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​45 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​
50 ····​std:​:​cout.​write(reply,​·​reply_length)​;​46 ····​std:​:​cout.​write(reply,​·​reply_length)​;​
51 ····​std:​:​cout·​<<·​"\n";​47 ····​std:​:​cout·​<<·​"\n";​
52 ··​}48 ··​}
53 ··​catch·​(std:​:​exception&·​e)​49 ··​catch·​(std:​:​exception&·​e)​
54 ··​{50 ··​{
55 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​51 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
56 ··​}52 ··​}
57 53
58 ··​return·​0;​54 ··​return·​0;​
59 }55 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/echo/blocking_tcp_echo_server.cpp.html000066400000000000000000001525661340672067200256430ustar00rootroot00000000000000 HTML Diff echo/blocking_tcp_echo_server.cpp
src/​examples/​cpp03/​echo/​blocking_tcp_echo_ser​ver.​cppsrc/​examples/​cpp11/​echo/​blocking_tcp_echo_ser​ver.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_tcp_echo_ser​ver.​cpp2 /​/​·​blocking_tcp_echo_ser​ver.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<iostream>12 #include·​<iostream>
13 #include·​<boost/​bind.​hpp>13 #include·​<thread>
14 #include·​<boost/​smart_ptr.​hpp>14 #include·​<utility>
15 #include·​"asio.​hpp"15 #include·​"asio.​hpp"
16 16
17 using·​asio:​:​ip:​:​tcp;​17 using·​asio:​:​ip:​:​tcp;​
18 18
19 const·​int·​max_length·​=·​1024;​19 const·​int·​max_length·​=·​1024;​
20 20
21 typedef·boost:​:​shared_ptr<tcp:​:​socket>·​socket_ptr;​21 void·​session(tcp:​:​socket·​sock)​
22
23 void·session(socket_ptr·sock)​
24 {22 {
25 ··​try23 ··​try
26 ··​{24 ··​{
27 ····​for·​(;​;​)​25 ····​for·​(;​;​)​
28 ····​{26 ····​{
29 ······​char·​data[max_length];​27 ······​char·​data[max_length];​
30 28
31 ······​asio:​:​error_code·​error;​29 ······​asio:​:​error_code·​error;​
32 ······​size_t·​length·​=·​sock-​>read_some(asio:​:​buffer(data)​,​·​error)​;​30 ······​size_t·​length·​=·​sock.​read_some(asio:​:​buffer(data)​,​·​error)​;​
33 ······​if·​(error·​==·​asio:​:​error:​:​eof)​31 ······​if·​(error·​==·​asio:​:​error:​:​eof)​
34 ········​break;​·​/​/​·​Connection·​closed·​cleanly·​by·​peer.​32 ········​break;​·​/​/​·​Connection·​closed·​cleanly·​by·​peer.​
35 ······​else·​if·​(error)​33 ······​else·​if·​(error)​
36 ········​throw·​asio:​:​system_error(error)​;​·​/​/​·​Some·​other·​error.​34 ········​throw·​asio:​:​system_error(error)​;​·​/​/​·​Some·​other·​error.​
37 35
38 ······​asio:​:​write(*sock,​·​asio:​:​buffer(data,​·​length)​)​;​36 ······​asio:​:​write(sock,​·​asio:​:​buffer(data,​·​length)​)​;​
39 ····​}37 ····​}
40 ··​}38 ··​}
41 ··​catch·​(std:​:​exception&·​e)​39 ··​catch·​(std:​:​exception&·​e)​
42 ··​{40 ··​{
43 ····​std:​:​cerr·​<<·​"Exception·​in·​thread:​·​"·​<<·​e.​what()​·​<<·​"\n";​41 ····​std:​:​cerr·​<<·​"Exception·​in·​thread:​·​"·​<<·​e.​what()​·​<<·​"\n";​
44 ··​}42 ··​}
45 }43 }
46 44
47 void·​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​45 void·​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​
48 {46 {
49 ··​tcp:​:​acceptor·​a(io_context,​·​tcp:​:​endpoint(tcp:​:​v4()​,​·​port)​)​;​47 ··​tcp:​:​acceptor·​a(io_context,​·​tcp:​:​endpoint(tcp:​:​v4()​,​·​port)​)​;​
50 ··​for·​(;​;​)​48 ··​for·​(;​;​)​
51 ··​{49 ··​{
52 ····​socket_ptr·sock(new·tcp:​:​socket(io_context)​)​;​50 ····​std:​:​thread(session,​·a.​accept()​)​.​detach()​;​
53 ····a.​accept(*sock)​;​
54 ····asio:​:​thread·t(boost:​:​bind(session,​·sock)​)​;​
55 ··​}51 ··​}
56 }52 }
57 53
58 int·​main(int·​argc,​·​char*·​argv[])​54 int·​main(int·​argc,​·​char*·​argv[])​
59 {55 {
60 ··​try56 ··​try
61 ··​{57 ··​{
62 ····​if·​(argc·​!=·​2)​58 ····​if·​(argc·​!=·​2)​
63 ····​{59 ····​{
64 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_echo_ser​ver·​<port>\n";​60 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_echo_ser​ver·​<port>\n";​
65 ······​return·​1;​61 ······​return·​1;​
66 ····​}62 ····​}
67 63
68 ····​asio:​:​io_context·​io_context;​64 ····​asio:​:​io_context·​io_context;​
69 65
70 ····using·namespace·​std;​·/​/​·For·atoi.​66 ····server(io_context,​·​std:​:​atoi(argv[1])​)​;​
71 ····server(io_context,​·atoi(argv[1])​)​;​
72 ··​}67 ··​}
73 ··​catch·​(std:​:​exception&·​e)​68 ··​catch·​(std:​:​exception&·​e)​
74 ··​{69 ··​{
75 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​70 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
76 ··​}71 ··​}
77 72
78 ··​return·​0;​73 ··​return·​0;​
79 }74 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/echo/blocking_udp_echo_client.cpp.html000066400000000000000000001053351340672067200256050ustar00rootroot00000000000000 HTML Diff echo/blocking_udp_echo_client.cpp
src/​examples/​cpp03/​echo/​blocking_udp_echo_cli​ent.​cppsrc/​examples/​cpp11/​echo/​blocking_udp_echo_cli​ent.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_udp_echo_cli​ent.​cpp2 /​/​·​blocking_udp_echo_cli​ent.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<cstring>12 #include·​<cstring>
13 #include·​<iostream>13 #include·​<iostream>
14 #include·​"asio.​hpp"14 #include·​"asio.​hpp"
15 15
16 using·​asio:​:​ip:​:​udp;​16 using·​asio:​:​ip:​:​udp;​
17 17
18 enum·​{·​max_length·​=·​1024·​};​18 enum·​{·​max_length·​=·​1024·​};​
19 19
20 int·​main(int·​argc,​·​char*·​argv[])​20 int·​main(int·​argc,​·​char*·​argv[])​
21 {21 {
22 ··​try22 ··​try
23 ··​{23 ··​{
24 ····​if·​(argc·​!=·​3)​24 ····​if·​(argc·​!=·​3)​
25 ····​{25 ····​{
26 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_udp_echo_cli​ent·​<host>·​<port>\n";​26 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_udp_echo_cli​ent·​<host>·​<port>\n";​
27 ······​return·​1;​27 ······​return·​1;​
28 ····​}28 ····​}
29 29
30 ····​asio:​:​io_context·​io_context;​30 ····​asio:​:​io_context·​io_context;​
31 31
32 ····​udp:​:​socket·​s(io_context,​·​udp:​:​endpoint(udp:​:​v4()​,​·​0)​)​;​32 ····​udp:​:​socket·​s(io_context,​·​udp:​:​endpoint(udp:​:​v4()​,​·​0)​)​;​
33 33
34 ····​udp:​:​resolver·​resolver(io_context)​;​34 ····​udp:​:​resolver·​resolver(io_context)​;​
35 ····​udp:​:​resolver:​:​results_type·​endpoints·​=35 ····​udp:​:​resolver:​:​results_type·​endpoints·​=
36 ······​resolver.​resolve(udp:​:​v4()​,​·​argv[1],​·​argv[2])​;​36 ······​resolver.​resolve(udp:​:​v4()​,​·​argv[1],​·​argv[2])​;​
37 37
38 ····​using·​namespace·​std;​·​/​/​·​For·​strlen.​
39 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​38 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​
40 ····​char·​request[max_length];​39 ····​char·​request[max_length];​
41 ····​std:​:​cin.​getline(request,​·​max_length)​;​40 ····​std:​:​cin.​getline(request,​·​max_length)​;​
42 ····​size_t·​request_length·​=·​strlen(request)​;​41 ····​size_t·​request_length·​=·std:​:​strlen(request)​;​
43 ····​s.​send_to(asio:​:​buffer(request,​·​request_length)​,​·​*endpoints.​begin()​)​;​42 ····​s.​send_to(asio:​:​buffer(request,​·​request_length)​,​·​*endpoints.​begin()​)​;​
44 43
45 ····​char·​reply[max_length];​44 ····​char·​reply[max_length];​
46 ····​udp:​:​endpoint·​sender_endpoint;​45 ····​udp:​:​endpoint·​sender_endpoint;​
47 ····​size_t·​reply_length·​=·​s.​receive_from(46 ····​size_t·​reply_length·​=·​s.​receive_from(
48 ········​asio:​:​buffer(reply,​·​max_length)​,​·​sender_endpoint)​;​47 ········​asio:​:​buffer(reply,​·​max_length)​,​·​sender_endpoint)​;​
49 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​48 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​
50 ····​std:​:​cout.​write(reply,​·​reply_length)​;​49 ····​std:​:​cout.​write(reply,​·​reply_length)​;​
51 ····​std:​:​cout·​<<·​"\n";​50 ····​std:​:​cout·​<<·​"\n";​
52 ··​}51 ··​}
53 ··​catch·​(std:​:​exception&·​e)​52 ··​catch·​(std:​:​exception&·​e)​
54 ··​{53 ··​{
55 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​54 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
56 ··​}55 ··​}
57 56
58 ··​return·​0;​57 ··​return·​0;​
59 }58 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/echo/blocking_udp_echo_server.cpp.html000066400000000000000000000766671340672067200256540ustar00rootroot00000000000000 HTML Diff echo/blocking_udp_echo_server.cpp
src/​examples/​cpp03/​echo/​blocking_udp_echo_ser​ver.​cppsrc/​examples/​cpp11/​echo/​blocking_udp_echo_ser​ver.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_udp_echo_ser​ver.​cpp2 /​/​·​blocking_udp_echo_ser​ver.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<iostream>12 #include·​<iostream>
13 #include·​"asio.​hpp"13 #include·​"asio.​hpp"
14 14
15 using·​asio:​:​ip:​:​udp;​15 using·​asio:​:​ip:​:​udp;​
16 16
17 enum·​{·​max_length·​=·​1024·​};​17 enum·​{·​max_length·​=·​1024·​};​
18 18
19 void·​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​19 void·​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​
20 {20 {
21 ··​udp:​:​socket·​sock(io_context,​·​udp:​:​endpoint(udp:​:​v4()​,​·​port)​)​;​21 ··​udp:​:​socket·​sock(io_context,​·​udp:​:​endpoint(udp:​:​v4()​,​·​port)​)​;​
22 ··​for·​(;​;​)​22 ··​for·​(;​;​)​
23 ··​{23 ··​{
24 ····​char·​data[max_length];​24 ····​char·​data[max_length];​
25 ····​udp:​:​endpoint·​sender_endpoint;​25 ····​udp:​:​endpoint·​sender_endpoint;​
26 ····​size_t·​length·​=·​sock.​receive_from(26 ····​size_t·​length·​=·​sock.​receive_from(
27 ········​asio:​:​buffer(data,​·​max_length)​,​·​sender_endpoint)​;​27 ········​asio:​:​buffer(data,​·​max_length)​,​·​sender_endpoint)​;​
28 ····​sock.​send_to(asio:​:​buffer(data,​·​length)​,​·​sender_endpoint)​;​28 ····​sock.​send_to(asio:​:​buffer(data,​·​length)​,​·​sender_endpoint)​;​
29 ··​}29 ··​}
30 }30 }
31 31
32 int·​main(int·​argc,​·​char*·​argv[])​32 int·​main(int·​argc,​·​char*·​argv[])​
33 {33 {
34 ··​try34 ··​try
35 ··​{35 ··​{
36 ····​if·​(argc·​!=·​2)​36 ····​if·​(argc·​!=·​2)​
37 ····​{37 ····​{
38 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_udp_echo_ser​ver·​<port>\n";​38 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_udp_echo_ser​ver·​<port>\n";​
39 ······​return·​1;​39 ······​return·​1;​
40 ····​}40 ····​}
41 41
42 ····​asio:​:​io_context·​io_context;​42 ····​asio:​:​io_context·​io_context;​
43 43
44 ····using·namespace·​std;​·/​/​·For·atoi.​44 ····server(io_context,​·​std:​:​atoi(argv[1])​)​;​
45 ····server(io_context,​·atoi(argv[1])​)​;​
46 ··​}45 ··​}
47 ··​catch·​(std:​:​exception&·​e)​46 ··​catch·​(std:​:​exception&·​e)​
48 ··​{47 ··​{
49 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​48 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
50 ··​}49 ··​}
51 50
52 ··​return·​0;​51 ··​return·​0;​
53 }52 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/executors/000077500000000000000000000000001340672067200202365ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/executors/actor.cpp.html000066400000000000000000000032641340672067200230220ustar00rootroot00000000000000 HTML Diff executors/actor.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/executors/bank_account_1.cpp.html000066400000000000000000000032751340672067200245630ustar00rootroot00000000000000 HTML Diff executors/bank_account_1.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/executors/bank_account_2.cpp.html000066400000000000000000000032751340672067200245640ustar00rootroot00000000000000 HTML Diff executors/bank_account_2.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/executors/fork_join.cpp.html000066400000000000000000000032701340672067200236670ustar00rootroot00000000000000 HTML Diff executors/fork_join.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/executors/pipeline.cpp.html000066400000000000000000000032671340672067200235220ustar00rootroot00000000000000 HTML Diff executors/pipeline.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/executors/priority_scheduler.cpp.html000066400000000000000000000033011340672067200256210ustar00rootroot00000000000000 HTML Diff executors/priority_scheduler.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/fork/000077500000000000000000000000001340672067200171565ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/fork/daemon.cpp.html000066400000000000000000005603741340672067200221070ustar00rootroot00000000000000 HTML Diff fork/daemon.cpp
src/​examples/​cpp03/​fork/​daemon.​cppsrc/​examples/​cpp11/​fork/​daemon.​cpp
1 /​/​1 /​/​
2 /​/​·​daemon.​cpp2 /​/​·​daemon.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio/​io_context.​hpp>11 #include·​<asio/​io_context.​hpp>
12 #include·​<asio/​ip/​udp.​hpp>12 #include·​<asio/​ip/​udp.​hpp>
13 #include·​<asio/​signal_set.​hpp>13 #include·​<asio/​signal_set.​hpp>
14 #include·​<boost/​array.​hpp>14 #include·​<array>
15 #include·<boost/​bind.​hpp>
16 #include·​<ctime>15 #include·​<ctime>
17 #include·​<iostream>16 #include·​<iostream>
18 #include·​<syslog.​h>17 #include·​<syslog.​h>
19 #include·​<unistd.​h>18 #include·​<unistd.​h>
20 19
21 using·​asio:​:​ip:​:​udp;​20 using·​asio:​:​ip:​:​udp;​
22 21
23 class·​udp_daytime_server22 class·​udp_daytime_server
24 {23 {
25 public:​24 public:​
26 ··​udp_daytime_server(as​io:​:​io_context&·​io_context)​25 ··​udp_daytime_server(as​io:​:​io_context&·​io_context)​
27 ····​:​·​socket_(io_context,​·udp:​:​endpoint(udp:​:​v4()​,​·​13)​)​26 ····​:​·​socket_(io_context,​·{udp:​:​v4()​,​·​13})​
28 ··​{27 ··​{
29 ····start_receive()​;​28 ····​receive()​;​
30 ··​}29 ··​}
31 30
32 private:​31 private:​
33 ··​void·start_receive()​32 ··​void·​receive()​
34 ··​{33 ··​{
35 ····​socket_.​async_receive_from(34 ····​socket_.​async_receive_from(
36 ········​asio:​:​buffer(recv_buffer_)​,​·​remote_endpoint_,​35 ········​asio:​:​buffer(recv_buffer_)​,​·​remote_endpoint_,​
37 ········boost:​:​bind(&udp_daytime_ser​ver:​:​handle_receive,​·this,​·_1)​)​;​36 ········[this](std:​:​error_code·ec,​·std:​:​size_t·/​*n*/​)​
38 ··}37 ········{
39 38 ··········if·(!ec)​
40 ··void·handle_receive(const·asio:​:​error_code&·ec)​39 ··········{
41 ··{40 ············using·namespace·std;​·/​/​·For·time_t,​·time·and·ctime;​
42 ····​if·(!ec)​41 ············time_t·now·=·time(0)​;​
43 ····{42 ············std:​:​string·message·=·ctime(&now)​;​
44 ······using·namespace·std;​·/​/​·For·time_t,​·time·and·ctime;​43
45 ······​time_t·now·=·time(0)​;​44 ············std:​:​error_code·ignored_ec;​
46 ······std:​:​string·message·=·ctime(&now)​;​45 ············socket_.​send_to(asio:​:​buffer(message)​,​
47 46 ················remote_endpoint_,​·0,​·ignored_ec)​;​
48 ······asio:​:​error_code·ignored_ec;​47 ··········}
49 ······socket_.​send_to(asio:​:​buffer(message)​,​
50 ··········remote_endpoint_,​·0,​·ignored_ec)​;​
51 ····}
52 48
53 ····start_receive()​;​49 ··········receive()​;​
50 ········​})​;​
54 ··​}51 ··​}
55 52
56 ··​udp:​:​socket·​socket_;​53 ··​udp:​:​socket·​socket_;​
57 ··​udp:​:​endpoint·​remote_endpoint_;​54 ··​udp:​:​endpoint·​remote_endpoint_;​
58 ··boost:​:​array<char,​·​1>·​recv_buffer_;​55 ··​std:​:​array<char,​·​1>·​recv_buffer_;​
59 };​56 };​
60 57
61 int·​main()​58 int·​main()​
62 {59 {
63 ··​try60 ··​try
64 ··​{61 ··​{
65 ····​asio:​:​io_context·​io_context;​62 ····​asio:​:​io_context·​io_context;​
66 63
67 ····​/​/​·​Initialise·​the·​server·​before·​becoming·​a·​daemon.​·​If·​the·​process·​is64 ····​/​/​·​Initialise·​the·​server·​before·​becoming·​a·​daemon.​·​If·​the·​process·​is
68 ····​/​/​·​started·​from·​a·​shell,​·​this·​means·​any·​errors·​will·​be·​reported·​back·​to·​the65 ····​/​/​·​started·​from·​a·​shell,​·​this·​means·​any·​errors·​will·​be·​reported·​back·​to·​the
69 ····​/​/​·​user.​66 ····​/​/​·​user.​
70 ····​udp_daytime_server·​server(io_context)​;​67 ····​udp_daytime_server·​server(io_context)​;​
71 68
72 ····​/​/​·​Register·​signal·​handlers·​so·​that·​the·​daemon·​may·​be·​shut·​down.​·​You·​may69 ····​/​/​·​Register·​signal·​handlers·​so·​that·​the·​daemon·​may·​be·​shut·​down.​·​You·​may
73 ····​/​/​·​also·​want·​to·​register·​for·​other·​signals,​·​such·​as·​SIGHUP·​to·​trigger·​a70 ····​/​/​·​also·​want·​to·​register·​for·​other·​signals,​·​such·​as·​SIGHUP·​to·​trigger·​a
74 ····​/​/​·​re-​read·​of·​a·​configuration·​file.​71 ····​/​/​·​re-​read·​of·​a·​configuration·​file.​
75 ····​asio:​:​signal_set·​signals(io_context,​·​SIGINT,​·​SIGTERM)​;​72 ····​asio:​:​signal_set·​signals(io_context,​·​SIGINT,​·​SIGTERM)​;​
76 ····​signals.​async_wait(73 ····​signals.​async_wait(
77 ········boost:​:​bind(&asio:​:​io_context:​:​stop,​·&io_context)​)​;​74 ········[&](std:​:​error_code·/​*ec*/​,​·int·/​*signo*/​)​
75 ········​{
76 ··········​io_context.​stop()​;​
77 ········​})​;​
78 78
79 ····​/​/​·​Inform·​the·​io_context·​that·​we·​are·​about·​to·​become·​a·​daemon.​·​The79 ····​/​/​·​Inform·​the·​io_context·​that·​we·​are·​about·​to·​become·​a·​daemon.​·​The
80 ····​/​/​·​io_context·​cleans·​up·​any·​internal·​resources,​·​such·​as·​threads,​·​that·​may80 ····​/​/​·​io_context·​cleans·​up·​any·​internal·​resources,​·​such·​as·​threads,​·​that·​may
81 ····​/​/​·​interfere·​with·​forking.​81 ····​/​/​·​interfere·​with·​forking.​
82 ····​io_context.​notify_fork(asio:​:​io_context:​:​fork_prepare)​;​82 ····​io_context.​notify_fork(asio:​:​io_context:​:​fork_prepare)​;​
83 83
84 ····​/​/​·​Fork·​the·​process·​and·​have·​the·​parent·​exit.​·​If·​the·​process·​was·​started84 ····​/​/​·​Fork·​the·​process·​and·​have·​the·​parent·​exit.​·​If·​the·​process·​was·​started
85 ····​/​/​·​from·​a·​shell,​·​this·​returns·​control·​to·​the·​user.​·​Forking·​a·​new·​process·​is85 ····​/​/​·​from·​a·​shell,​·​this·​returns·​control·​to·​the·​user.​·​Forking·​a·​new·​process·​is
86 ····​/​/​·​also·​a·​prerequisite·​for·​the·​subsequent·​call·​to·​setsid()​.​86 ····​/​/​·​also·​a·​prerequisite·​for·​the·​subsequent·​call·​to·​setsid()​.​
87 ····​if·​(pid_t·​pid·​=·​fork()​)​87 ····​if·​(pid_t·​pid·​=·​fork()​)​
88 ····​{88 ····​{
89 ······​if·​(pid·​>·​0)​89 ······​if·​(pid·​>·​0)​
90 ······​{90 ······​{
91 ········​/​/​·​We're·​in·​the·​parent·​process·​and·​need·​to·​exit.​91 ········​/​/​·​We're·​in·​the·​parent·​process·​and·​need·​to·​exit.​
92 ········​/​/​92 ········​/​/​
93 ········​/​/​·​When·​the·​exit()​·​function·​is·​used,​·​the·​program·​terminates·​without93 ········​/​/​·​When·​the·​exit()​·​function·​is·​used,​·​the·​program·​terminates·​without
94 ········​/​/​·​invoking·​local·​variables'·​destructors.​·​Only·​global·​variables·​are94 ········​/​/​·​invoking·​local·​variables'·​destructors.​·​Only·​global·​variables·​are
95 ········​/​/​·​destroyed.​·​As·​the·​io_context·​object·​is·​a·​local·​variable,​·​this·​means95 ········​/​/​·​destroyed.​·​As·​the·​io_context·​object·​is·​a·​local·​variable,​·​this·​means
96 ········​/​/​·​we·​do·​not·​have·​to·​call:​96 ········​/​/​·​we·​do·​not·​have·​to·​call:​
97 ········​/​/​97 ········​/​/​
98 ········​/​/​···​io_context.​notify_fork(asio:​:​io_context:​:​fork_parent)​;​98 ········​/​/​···​io_context.​notify_fork(asio:​:​io_context:​:​fork_parent)​;​
99 ········​/​/​99 ········​/​/​
100 ········​/​/​·​However,​·​this·​line·​should·​be·​added·​before·​each·​call·​to·​exit()​·​if100 ········​/​/​·​However,​·​this·​line·​should·​be·​added·​before·​each·​call·​to·​exit()​·​if
101 ········​/​/​·​using·​a·​global·​io_context·​object.​·​An·​additional·​call:​101 ········​/​/​·​using·​a·​global·​io_context·​object.​·​An·​additional·​call:​
102 ········​/​/​102 ········​/​/​
103 ········​/​/​···​io_context.​notify_fork(asio:​:​io_context:​:​fork_prepare)​;​103 ········​/​/​···​io_context.​notify_fork(asio:​:​io_context:​:​fork_prepare)​;​
104 ········​/​/​104 ········​/​/​
105 ········​/​/​·​should·​also·​precede·​the·​second·​fork()​.​105 ········​/​/​·​should·​also·​precede·​the·​second·​fork()​.​
106 ········​exit(0)​;​106 ········​exit(0)​;​
107 ······​}107 ······​}
108 ······​else108 ······​else
109 ······​{109 ······​{
110 ········​syslog(LOG_ERR·​|·​LOG_USER,​·​"First·​fork·​failed:​·​%m")​;​110 ········​syslog(LOG_ERR·​|·​LOG_USER,​·​"First·​fork·​failed:​·​%m")​;​
111 ········​return·​1;​111 ········​return·​1;​
112 ······​}112 ······​}
113 ····​}113 ····​}
114 114
115 ····​/​/​·​Make·​the·​process·​a·​new·​session·​leader.​·​This·​detaches·​it·​from·​the115 ····​/​/​·​Make·​the·​process·​a·​new·​session·​leader.​·​This·​detaches·​it·​from·​the
116 ····​/​/​·​terminal.​116 ····​/​/​·​terminal.​
117 ····​setsid()​;​117 ····​setsid()​;​
118 118
119 ····​/​/​·​A·​process·​inherits·​its·​working·​directory·​from·​its·​parent.​·​This·​could·​be119 ····​/​/​·​A·​process·​inherits·​its·​working·​directory·​from·​its·​parent.​·​This·​could·​be
120 ····​/​/​·​on·​a·​mounted·​filesystem,​·​which·​means·​that·​the·​running·​daemon·​would120 ····​/​/​·​on·​a·​mounted·​filesystem,​·​which·​means·​that·​the·​running·​daemon·​would
121 ····​/​/​·​prevent·​this·​filesystem·​from·​being·​unmounted.​·​Changing·​to·​the·​root121 ····​/​/​·​prevent·​this·​filesystem·​from·​being·​unmounted.​·​Changing·​to·​the·​root
122 ····​/​/​·​directory·​avoids·​this·​problem.​122 ····​/​/​·​directory·​avoids·​this·​problem.​
123 ····​chdir("/​")​;​123 ····​chdir("/​")​;​
124 124
125 ····​/​/​·​The·​file·​mode·​creation·​mask·​is·​also·​inherited·​from·​the·​parent·​process.​125 ····​/​/​·​The·​file·​mode·​creation·​mask·​is·​also·​inherited·​from·​the·​parent·​process.​
126 ····​/​/​·​We·​don't·​want·​to·​restrict·​the·​permissions·​on·​files·​created·​by·​the126 ····​/​/​·​We·​don't·​want·​to·​restrict·​the·​permissions·​on·​files·​created·​by·​the
127 ····​/​/​·​daemon,​·​so·​the·​mask·​is·​cleared.​127 ····​/​/​·​daemon,​·​so·​the·​mask·​is·​cleared.​
128 ····​umask(0)​;​128 ····​umask(0)​;​
129 129
130 ····​/​/​·​A·​second·​fork·​ensures·​the·​process·​cannot·​acquire·​a·​controlling·​terminal.​130 ····​/​/​·​A·​second·​fork·​ensures·​the·​process·​cannot·​acquire·​a·​controlling·​terminal.​
131 ····​if·​(pid_t·​pid·​=·​fork()​)​131 ····​if·​(pid_t·​pid·​=·​fork()​)​
132 ····​{132 ····​{
133 ······​if·​(pid·​>·​0)​133 ······​if·​(pid·​>·​0)​
134 ······​{134 ······​{
135 ········​exit(0)​;​135 ········​exit(0)​;​
136 ······​}136 ······​}
137 ······​else137 ······​else
138 ······​{138 ······​{
139 ········​syslog(LOG_ERR·​|·​LOG_USER,​·​"Second·​fork·​failed:​·​%m")​;​139 ········​syslog(LOG_ERR·​|·​LOG_USER,​·​"Second·​fork·​failed:​·​%m")​;​
140 ········​return·​1;​140 ········​return·​1;​
141 ······​}141 ······​}
142 ····​}142 ····​}
143 143
144 ····​/​/​·​Close·​the·​standard·​streams.​·​This·​decouples·​the·​daemon·​from·​the·​terminal144 ····​/​/​·​Close·​the·​standard·​streams.​·​This·​decouples·​the·​daemon·​from·​the·​terminal
145 ····​/​/​·​that·​started·​it.​145 ····​/​/​·​that·​started·​it.​
146 ····​close(0)​;​146 ····​close(0)​;​
147 ····​close(1)​;​147 ····​close(1)​;​
148 ····​close(2)​;​148 ····​close(2)​;​
149 149
150 ····​/​/​·​We·​don't·​want·​the·​daemon·​to·​have·​any·​standard·​input.​150 ····​/​/​·​We·​don't·​want·​the·​daemon·​to·​have·​any·​standard·​input.​
151 ····​if·​(open("/​dev/​null",​·​O_RDONLY)​·​<·​0)​151 ····​if·​(open("/​dev/​null",​·​O_RDONLY)​·​<·​0)​
152 ····​{152 ····​{
153 ······​syslog(LOG_ERR·​|·​LOG_USER,​·​"Unable·​to·​open·​/​dev/​null:​·​%m")​;​153 ······​syslog(LOG_ERR·​|·​LOG_USER,​·​"Unable·​to·​open·​/​dev/​null:​·​%m")​;​
154 ······​return·​1;​154 ······​return·​1;​
155 ····​}155 ····​}
156 156
157 ····​/​/​·​Send·​standard·​output·​to·​a·​log·​file.​157 ····​/​/​·​Send·​standard·​output·​to·​a·​log·​file.​
158 ····​const·​char*·​output·​=·​"/​tmp/​asio.​daemon.​out";​158 ····​const·​char*·​output·​=·​"/​tmp/​asio.​daemon.​out";​
159 ····​const·​int·​flags·​=·​O_WRONLY·​|·​O_CREAT·​|·​O_APPEND;​159 ····​const·​int·​flags·​=·​O_WRONLY·​|·​O_CREAT·​|·​O_APPEND;​
160 ····​const·​mode_t·​mode·​=·​S_IRUSR·​|·​S_IWUSR·​|·​S_IRGRP·​|·​S_IROTH;​160 ····​const·​mode_t·​mode·​=·​S_IRUSR·​|·​S_IWUSR·​|·​S_IRGRP·​|·​S_IROTH;​
161 ····​if·​(open(output,​·​flags,​·​mode)​·​<·​0)​161 ····​if·​(open(output,​·​flags,​·​mode)​·​<·​0)​
162 ····​{162 ····​{
163 ······​syslog(LOG_ERR·​|·​LOG_USER,​·​"Unable·​to·​open·​output·​file·​%s:​·​%m",​·​output)​;​163 ······​syslog(LOG_ERR·​|·​LOG_USER,​·​"Unable·​to·​open·​output·​file·​%s:​·​%m",​·​output)​;​
164 ······​return·​1;​164 ······​return·​1;​
165 ····​}165 ····​}
166 166
167 ····​/​/​·​Also·​send·​standard·​error·​to·​the·​same·​log·​file.​167 ····​/​/​·​Also·​send·​standard·​error·​to·​the·​same·​log·​file.​
168 ····​if·​(dup(1)​·​<·​0)​168 ····​if·​(dup(1)​·​<·​0)​
169 ····​{169 ····​{
170 ······​syslog(LOG_ERR·​|·​LOG_USER,​·​"Unable·​to·​dup·​output·​descriptor:​·​%m")​;​170 ······​syslog(LOG_ERR·​|·​LOG_USER,​·​"Unable·​to·​dup·​output·​descriptor:​·​%m")​;​
171 ······​return·​1;​171 ······​return·​1;​
172 ····​}172 ····​}
173 173
174 ····​/​/​·​Inform·​the·​io_context·​that·​we·​have·​finished·​becoming·​a·​daemon.​·​The174 ····​/​/​·​Inform·​the·​io_context·​that·​we·​have·​finished·​becoming·​a·​daemon.​·​The
175 ····​/​/​·​io_context·​uses·​this·​opportunity·​to·​create·​any·​internal·​file·​descriptors175 ····​/​/​·​io_context·​uses·​this·​opportunity·​to·​create·​any·​internal·​file·​descriptors
176 ····​/​/​·​that·​need·​to·​be·​private·​to·​the·​new·​process.​176 ····​/​/​·​that·​need·​to·​be·​private·​to·​the·​new·​process.​
177 ····​io_context.​notify_fork(asio:​:​io_context:​:​fork_child)​;​177 ····​io_context.​notify_fork(asio:​:​io_context:​:​fork_child)​;​
178 178
179 ····​/​/​·​The·​io_context·​can·​now·​be·​used·​normally.​179 ····​/​/​·​The·​io_context·​can·​now·​be·​used·​normally.​
180 ····​syslog(LOG_INFO·​|·​LOG_USER,​·​"Daemon·​started")​;​180 ····​syslog(LOG_INFO·​|·​LOG_USER,​·​"Daemon·​started")​;​
181 ····​io_context.​run()​;​181 ····​io_context.​run()​;​
182 ····​syslog(LOG_INFO·​|·​LOG_USER,​·​"Daemon·​stopped")​;​182 ····​syslog(LOG_INFO·​|·​LOG_USER,​·​"Daemon·​stopped")​;​
183 ··​}183 ··​}
184 ··​catch·​(std:​:​exception&·​e)​184 ··​catch·​(std:​:​exception&·​e)​
185 ··​{185 ··​{
186 ····​syslog(LOG_ERR·​|·​LOG_USER,​·​"Exception:​·​%s",​·​e.​what()​)​;​186 ····​syslog(LOG_ERR·​|·​LOG_USER,​·​"Exception:​·​%s",​·​e.​what()​)​;​
187 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​std:​:​endl;​187 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​std:​:​endl;​
188 ··​}188 ··​}
189 }189 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/fork/process_per_connection.cpp.html000066400000000000000000006571571340672067200254150ustar00rootroot00000000000000 HTML Diff fork/process_per_connection.cpp
src/​examples/​cpp03/​fork/​process_per_connectio​n.​cppsrc/​examples/​cpp11/​fork/​process_per_connectio​n.​cpp
1 /​/​1 /​/​
2 /​/​·​process_per_connectio​n.​cpp2 /​/​·​process_per_connectio​n.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio/​io_context.​hpp>11 #include·​<asio/​io_context.​hpp>
12 #include·​<asio/​ip/​tcp.​hpp>12 #include·​<asio/​ip/​tcp.​hpp>
13 #include·​<asio/​signal_set.​hpp>13 #include·​<asio/​signal_set.​hpp>
14 #include·​<asio/​write.​hpp>14 #include·​<asio/​write.​hpp>
15 #include·​<boost/​array.​hpp>
16 #include·​<boost/​bind.​hpp>
17 #include·​<cstdlib>15 #include·​<cstdlib>
18 #include·​<iostream>16 #include·​<iostream>
19 #include·​<sys/​types.​h>17 #include·​<sys/​types.​h>
20 #include·​<sys/​wait.​h>18 #include·​<sys/​wait.​h>
21 #include·​<unistd.​h>19 #include·​<unistd.​h>
22 20
23 using·​asio:​:​ip:​:​tcp;​21 using·​asio:​:​ip:​:​tcp;​
24 22
25 class·​server23 class·​server
26 {24 {
27 public:​25 public:​
28 ··​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​26 ··​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​
29 ····​:​·​io_context_(io_contex​t)​,​27 ····​:​·​io_context_(io_contex​t)​,​
30 ······​signal_(io_context,​·​SIGCHLD)​,​28 ······​signal_(io_context,​·​SIGCHLD)​,​
31 ······​acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·​port)​)​,​29 ······​acceptor_(io_context,​·{tcp:​:​v4()​,​·​port})​,​
32 ······​socket_(io_context)​30 ······​socket_(io_context)​
33 ··​{31 ··​{
34 ····start_signal_wait()​;​32 ····wait_for_signal()​;​
35 ····start_accept()​;​33 ····​accept()​;​
36 ··​}34 ··​}
37 35
38 private:​36 private:​
39 ··​void·start_signal_wait()​37 ··​void·wait_for_signal()​
40 ··​{38 ··​{
41 ····​signal_.​async_wait(boost:​:​bind(&server:​:​handle_signal_wait,​·this)​)​;​39 ····​signal_.​async_wait(
40 ········​[this](std:​:​error_code·​/​*ec*/​,​·​int·​/​*signo*/​)​
41 ········​{
42 ··········​/​/​·​Only·​the·​parent·​process·​should·​check·​for·​this·​signal.​·​We·​can
43 ··········​/​/​·​determine·​whether·​we·​are·​in·​the·​parent·​by·​checking·​if·​the·​acceptor
44 ··········​/​/​·​is·​still·​open.​
45 ··········​if·​(acceptor_.​is_open()​)​
46 ··········​{
47 ············​/​/​·​Reap·​completed·​child·​processes·​so·​that·​we·​don't·​end·​up·​with
48 ············​/​/​·​zombies.​
49 ············​int·​status·​=·​0;​
50 ············​while·​(waitpid(-​1,​·​&status,​·​WNOHANG)​·​>·​0)​·​{}
51
52 ············​wait_for_signal()​;​
53 ··········​}
54 ········​})​;​
55 ··​}
56
57 ··​void·​accept()​
58 ··​{
59 ····​acceptor_.​async_accept(
60 ········​[this](std:​:​error_code·​ec,​·​tcp:​:​socket·​new_socket)​
61 ········​{
62 ··········​if·​(!ec)​
63 ··········​{
64 ············​/​/​·​Take·​ownership·​of·​the·​newly·​accepted·​socket.​
65 ············​socket_·​=·​std:​:​move(new_socket)​;​
66
67 ············​/​/​·​Inform·​the·​io_context·​that·​we·​are·​about·​to·​fork.​·​The·​io_context
68 ············​/​/​·​cleans·​up·​any·​internal·​resources,​·​such·​as·​threads,​·​that·​may
69 ············​/​/​·​interfere·​with·​forking.​
70 ············​io_context_.​notify_fork(asio:​:​io_context:​:​fork_prepare)​;​
71
72 ············​if·​(fork()​·​==·​0)​
73 ············​{
74 ··············​/​/​·​Inform·​the·​io_context·​that·​the·​fork·​is·​finished·​and·​that·​this
75 ··············​/​/​·​is·​the·​child·​process.​·​The·​io_context·​uses·​this·​opportunity·​to
76 ··············​/​/​·​create·​any·​internal·​file·​descriptors·​that·​must·​be·​private·​to
77 ··············​/​/​·​the·​new·​process.​
78 ··············​io_context_.​notify_fork(asio:​:​io_context:​:​fork_child)​;​
79
80 ··············​/​/​·​The·​child·​won't·​be·​accepting·​new·​connections,​·​so·​we·​can·​close
81 ··············​/​/​·​the·​acceptor.​·​It·​remains·​open·​in·​the·​parent.​
82 ··············​acceptor_.​close()​;​
83
84 ··············​/​/​·​The·​child·​process·​is·​not·​interested·​in·​processing·​the·​SIGCHLD
85 ··············​/​/​·​signal.​
86 ··············​signal_.​cancel()​;​
87
88 ··············​read()​;​
89 ············​}
90 ············​else
91 ············​{
92
93 ··············​/​/​·​Inform·​the·​io_context·​that·​the·​fork·​is·​finished·​(or·​failed)​
94 ··············​/​/​·​and·​that·​this·​is·​the·​parent·​process.​·​The·​io_context·​uses·​this
95 ··············​/​/​·​opportunity·​to·​recreate·​any·​internal·​resources·​that·​were
96 ··············​/​/​·​cleaned·​up·​during·​preparation·​for·​the·​fork.​
97 ··············​io_context_.​notify_fork(asio:​:​io_context:​:​fork_parent)​;​
98
99 ··············​/​/​·​The·​parent·​process·​can·​now·​close·​the·​newly·​accepted·​socket.​·​It
100 ··············​/​/​·​remains·​open·​in·​the·​child.​
101 ··············​socket_.​close()​;​
102
103 ··············​accept()​;​
104 ············​}
105 ··········​}
106 ··········​else
107 ··········​{
108 ············​std:​:​cerr·​<<·​"Accept·​error:​·​"·​<<·​ec.​message()​·​<<·​std:​:​endl;​
109 ············​accept()​;​
110 ··········​}
111 ········​})​;​
42 ··​}112 ··​}
43 113
44 ··​void·handle_signal_wait()​114 ··​void·read()​
45 ··{
46 ····/​/​·Only·the·parent·process·should·check·for·this·signal.​·We·can·determine
47 ····/​/​·whether·we·are·in·the·parent·by·checking·if·the·acceptor·is·still·open.​
48 ····if·(acceptor_.​is_open()​)​
49 ····{
50 ······/​/​·Reap·completed·child·processes·so·that·we·don't·end·up·with·zombies.​
51 ······int·status·=·0;​
52 ······while·(waitpid(-​1,​·&status,​·WNOHANG)​·>·0)​·{}
53
54 ······start_signal_wait()​;​
55 ····}
56 ··}
57
58 ··void·start_accept()​
59 ··{
60 ····acceptor_.​async_accept(socket_,​
61 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·_1)​)​;​
62 ··}
63
64 ··void·handle_accept(const·asio:​:​error_code&·ec)​
65 ··{
66 ····if·(!ec)​
67 ····{
68 ······/​/​·Inform·the·io_context·that·we·are·about·to·fork.​·The·io_context·cleans
69 ······/​/​·up·any·internal·resources,​·such·as·threads,​·that·may·interfere·with
70 ······/​/​·forking.​
71 ······io_context_.​notify_fork(asio:​:​io_context:​:​fork_prepare)​;​
72
73 ······if·(fork()​·==·0)​
74 ······{
75 ········/​/​·Inform·the·io_context·that·the·fork·is·finished·and·that·this·is·the
76 ········/​/​·child·process.​·The·io_context·uses·this·opportunity·to·create·any
77 ········/​/​·internal·file·descriptors·that·must·be·private·to·the·new·process.​
78 ········io_context_.​notify_fork(asio:​:​io_context:​:​fork_child)​;​
79
80 ········/​/​·The·child·won't·be·accepting·new·connections,​·so·we·can·close·the
81 ········/​/​·acceptor.​·It·remains·open·in·the·parent.​
82 ········acceptor_.​close()​;​
83
84 ········/​/​·The·child·process·is·not·interested·in·processing·the·SIGCHLD·signal.​
85 ········signal_.​cancel()​;​
86
87 ········start_read()​;​
88 ······}
89 ······else
90 ······{
91 ········/​/​·Inform·the·io_context·that·the·fork·is·finished·(or·failed)​·and·that
92 ········/​/​·this·is·the·parent·process.​·The·io_context·uses·this·opportunity·to
93 ········/​/​·recreate·any·internal·resources·that·were·cleaned·up·during
94 ········/​/​·preparation·for·the·fork.​
95 ········io_context_.​notify_fork(asio:​:​io_context:​:​fork_parent)​;​
96
97 ········socket_.​close()​;​
98 ········start_accept()​;​
99 ······}
100 ····}
101 ····else
102 ····{
103 ······std:​:​cerr·<<·"Accept·error:​·"·<<·ec.​message()​·<<·std:​:​endl;​
104 ······start_accept()​;​
105 ····}
106 ··}
107
108 ··void·start_read()​
109 ··​{115 ··​{
110 ····​socket_.​async_read_some(asio:​:​buffer(data_)​,​116 ····​socket_.​async_read_some(asio:​:​buffer(data_)​,​
111 ········boost:​:​bind(&server:​:​handle_read,​·​this,​·_1,​·_2)​)​;​117 ········[this](std:​:​error_code·ec,​·std:​:​size_t·length)​
118 ········​{
119 ··········​if·​(!ec)​
120 ············​write(length)​;​
121 ········​})​;​
112 ··​}122 ··​}
113 123
114 ··​void·handle_read(const·asio:​:​error_code&·ec,​·std:​:​size_t·​length)​124 ··​void·write(std:​:​size_t·​length)​
115 ··{
116 ····if·(!ec)​
117 ······start_write(length)​;​
118 ··}
119
120 ··void·start_write(std:​:​size_t·length)​
121 ··​{125 ··​{
122 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer(data_,​·​length)​,​126 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer(data_,​·​length)​,​
123 ········boost:​:​bind(&server:​:​handle_write,​·this,​·_1)​)​;​127 ········[this](std:​:​error_code·ec,​·std:​:​size_t·/​*length*/​)​
124 ··}128 ········{
125 129 ··········if·(!ec)​
126 ··void·handle_write(const·asio:​:​error_code&·ec)​130 ············read()​;​
127 ··{131 ········})​;​
128 ····if·(!ec)​
129 ······start_read()​;​
130 ··​}132 ··​}
131 133
132 ··​asio:​:​io_context&·​io_context_;​134 ··​asio:​:​io_context&·​io_context_;​
133 ··​asio:​:​signal_set·​signal_;​135 ··​asio:​:​signal_set·​signal_;​
134 ··​tcp:​:​acceptor·​acceptor_;​136 ··​tcp:​:​acceptor·​acceptor_;​
135 ··​tcp:​:​socket·​socket_;​137 ··​tcp:​:​socket·​socket_;​
136 ··boost:​:​array<char,​·​1024>·​data_;​138 ··​std:​:​array<char,​·​1024>·​data_;​
137 };​139 };​
138 140
139 int·​main(int·​argc,​·​char*·​argv[])​141 int·​main(int·​argc,​·​char*·​argv[])​
140 {142 {
141 ··​try143 ··​try
142 ··​{144 ··​{
143 ····​if·​(argc·​!=·​2)​145 ····​if·​(argc·​!=·​2)​
144 ····​{146 ····​{
145 ······​std:​:​cerr·​<<·​"Usage:​·​process_per_connectio​n·​<port>\n";​147 ······​std:​:​cerr·​<<·​"Usage:​·​process_per_connectio​n·​<port>\n";​
146 ······​return·​1;​148 ······​return·​1;​
147 ····​}149 ····​}
148 150
149 ····​asio:​:​io_context·​io_context;​151 ····​asio:​:​io_context·​io_context;​
150 152
151 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​153 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​
152 ····​server·​s(io_context,​·​atoi(argv[1])​)​;​154 ····​server·​s(io_context,​·​atoi(argv[1])​)​;​
153 155
154 ····​io_context.​run()​;​156 ····​io_context.​run()​;​
155 ··​}157 ··​}
156 ··​catch·​(std:​:​exception&·​e)​158 ··​catch·​(std:​:​exception&·​e)​
157 ··​{159 ··​{
158 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​std:​:​endl;​160 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​std:​:​endl;​
159 ··​}161 ··​}
160 }162 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/futures/000077500000000000000000000000001340672067200177125ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/futures/daytime_client.cpp.html000066400000000000000000000032731340672067200243600ustar00rootroot00000000000000 HTML Diff futures/daytime_client.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/handler_tracking/000077500000000000000000000000001340672067200215145ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/handler_tracking/custom_tracking.hpp.html000066400000000000000000000033051340672067200263650ustar00rootroot00000000000000 HTML Diff handler_tracking/custom_tracking.hpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/000077500000000000000000000000001340672067200171745ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/http/server/000077500000000000000000000000001340672067200205025ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/http/server/connection.cpp.html000066400000000000000000004155251340672067200243240ustar00rootroot00000000000000 HTML Diff http/server/connection.cpp
src/​examples/​cpp03/​http/​server/​connection.​cppsrc/​examples/​cpp11/​http/​server/​connection.​cpp
1 /​/​1 /​/​
2 /​/​·​connection.​cpp2 /​/​·​connection.​cpp
3 /​/​·​~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"connection.​hpp"11 #include·​"connection.​hpp"
12 #include·​<utility>
12 #include·​<vector>13 #include·​<vector>
13 #include·​<boost/​bind.​hpp>
14 #include·​"connection_manager.​hpp"14 #include·​"connection_manager.​hpp"
15 #include·​"request_handler.​hpp"15 #include·​"request_handler.​hpp"
16 16
17 namespace·​http·​{17 namespace·​http·​{
18 namespace·​server·​{18 namespace·​server·​{
19 19
20 connection:​:​connection(asio:​:​io_context&·io_context,​20 connection:​:​connection(asio:​:​ip:​:​tcp:​:​socket·socket,​
21 ····​connection_manager&·​manager,​·​request_handler&·​handler)​21 ····​connection_manager&·​manager,​·​request_handler&·​handler)​
22 ··​:​·​socket_(io_context)​,​22 ··​:​·​socket_(std:​:​move(socket)​)​,​
23 ····​connection_manager_(m​anager)​,​23 ····​connection_manager_(m​anager)​,​
24 ····​request_handler_(hand​ler)​24 ····​request_handler_(hand​ler)​
25 {25 {
26 }26 }
27 27
28 asio:​:​ip:​:​tcp:​:​socket&·​connection:​:​socket()​
29 {
30 ··​return·​socket_;​
31 }
32
33 void·​connection:​:​start()​28 void·​connection:​:​start()​
34 {29 {
35 ··socket_.​async_read_some(asio:​:​buffer(buffer_)​,​30 ··do_read()​;​
36 ······boost:​:​bind(&connection:​:​handle_read,​·shared_from_this()​,​
37 ········asio:​:​placeholders:​:​error,​
38 ········asio:​:​placeholders:​:​bytes_transferred)​)​;​
39 }31 }
40 32
41 void·​connection:​:​stop()​33 void·​connection:​:​stop()​
42 {34 {
43 ··​socket_.​close()​;​35 ··​socket_.​close()​;​
44 }36 }
45 37
46 void·​connection:​:​handle_read(const·asio:​:​error_code&·e,​38 void·​connection:​:​do_read()​
47 ····std:​:​size_t·bytes_transferred)​
48 {39 {
49 ··if·​(!e)​40 ··auto·self(shared_from_this​()​)​;​
50 ··{41 ··socket_.​async_read_some(asio:​:​buffer(buffer_)​,​
51 ····boost:​:​tribool·result;​42 ······[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·bytes_transferred)​
52 ····boost:​:​tie(result,​·boost:​:​tuples:​:​ignore)​·=·request_parser_.​parse(43 ······{
53 ········request_,​·buffer_.​data()​,​·buffer_.​data()​·+·bytes_transferred)​;​44 ········if·​(!ec)​
54 45 ········{
55 ····if·(result)​46 ··········request_parser:​:​result_type·result;​
56 ····{47 ··········std:​:​tie(result,​·std:​:​ignore)​·=·request_parser_.​parse(
57 ······​request_handler_.​handle_request(reques​t_,​·reply_)​;​48 ··············​request_,​·buffer_.​data()​,​·buffer_.​data()​·+·bytes_transferred)​;​
58 ······asio:​:​async_write(socket_,​·reply_.​to_buffers()​,​49
59 ··········boost:​:​bind(&connection:​:​handle_write,​·shared_from_this()​,​50 ··········​if·(result·==·request_parser:​:​good)​
60 ············asio:​:​placeholders:​:​error)​)​;​51 ··········{
61 ····}52 ············request_handler_.​handle_request(reques​t_,​·reply_)​;​
62 ····else·if·(!result)​53 ············do_write()​;​
63 ····{54 ··········}
64 ······reply_·=·​reply:​:​stock_reply(reply:​:​bad_request)​;​55 ··········else·if·(result·==·request_parser:​:​bad)​
65 ······asio:​:​async_write(socket_,​·reply_.​to_buffers()​,​56 ··········{
66 ··········boost:​:​bind(&connection:​:​handle_write,​·shared_from_this()​,​57 ············reply_·=·reply:​:​stock_reply(reply:​:​bad_request)​;​
67 ············asio:​:​placeholders:​:​error)​)​;​58 ············do_write()​;​
68 ····​}59 ··········​}
69 ····​else60 ··········​else
70 ····​{61 ··········​{
71 ······socket_.​async_read_some(asio:​:​buffer(buffer_)​,​62 ············do_read()​;​
72 ··········boost:​:​bind(&connection:​:​handle_read,​·shared_from_this()​,​63 ··········}
73 ············asio:​:​placeholders:​:​error,​64 ········}
74 ············​asio:​:​placeholders:​:​bytes_transferred)​)​;​65 ········else·if·(ec·!=·​asio:​:​error:​:​operation_aborted)​
75 ····}66 ········{
76 ··}67 ··········connection_manager_.​stop(shared_from_this​()​)​;​
77 ··else·if·(e·!=·asio:​:​error:​:​operation_aborted)​68 ········}
78 ··{69 ······})​;​
79 ····connection_manager_.​stop(shared_from_this​()​)​;​70 }
80 ··}71
81 }72 void·connection:​:​do_write()​
82 73 {
83 void·connection:​:​handle_write(const·asio:​:​error_code&·e)​74 ··auto·self(shared_from_this​()​)​;​
84 {75 ··asio:​:​async_write(socket_,​·reply_.​to_buffers()​,​
85 ··​if·(!e)​76 ······[this,​·self](std:​:​error_code·ec,​·std:​:​size_t)​
86 ··​{77 ······​{
87 ····/​/​·Initiate·graceful·connection·closure.​78 ········if·(!ec)​
88 ····asio:​:​error_code·ignored_ec;​79 ········{
89 ····socket_.​shutdown(asio:​:​ip:​:​tcp:​:​socket:​:​shutdown_both,​·ignored_ec)​;​80 ··········/​/​·Initiate·graceful·connection·closure.​
90 ··}81 ··········asio:​:​error_code·ignored_ec;​
91 82 ··········socket_.​shutdown(asio:​:​ip:​:​tcp:​:​socket:​:​shutdown_both,​
92 ··if·(e·!=·asio:​:​error:​:​operation_aborted)​83 ············ignored_ec)​;​
93 ··{84 ········}
94 ····connection_manager_.​stop(shared_from_this​()​)​;​85
95 ··}86 ········if·(ec·!=·asio:​:​error:​:​operation_aborted)​
87 ········​{
88 ··········​connection_manager_.​stop(shared_from_this​()​)​;​
89 ········​}
90 ······​})​;​
96 }91 }
97 92
98 }·​/​/​·​namespace·​server93 }·​/​/​·​namespace·​server
99 }·​/​/​·​namespace·​http94 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/connection.hpp.html000066400000000000000000001612471340672067200243300ustar00rootroot00000000000000 HTML Diff http/server/connection.hpp
src/​examples/​cpp03/​http/​server/​connection.​hppsrc/​examples/​cpp11/​http/​server/​connection.​hpp
1 /​/​1 /​/​
2 /​/​·​connection.​hpp2 /​/​·​connection.​hpp
3 /​/​·​~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​HTTP_CONNECTION_HPP11 #ifndef·​HTTP_CONNECTION_HPP
12 #define·​HTTP_CONNECTION_HPP12 #define·​HTTP_CONNECTION_HPP
13 13
14 #include·​<array>
15 #include·​<memory>
14 #include·​<asio.​hpp>16 #include·​<asio.​hpp>
15 #include·​<boost/​array.​hpp>
16 #include·​<boost/​noncopyable.​hpp>
17 #include·​<boost/​shared_ptr.​hpp>
18 #include·​<boost/​enable_shared_from_th​is.​hpp>
19 #include·​"reply.​hpp"17 #include·​"reply.​hpp"
20 #include·​"request.​hpp"18 #include·​"request.​hpp"
21 #include·​"request_handler.​hpp"19 #include·​"request_handler.​hpp"
22 #include·​"request_parser.​hpp"20 #include·​"request_parser.​hpp"
23 21
24 namespace·​http·​{22 namespace·​http·​{
25 namespace·​server·​{23 namespace·​server·​{
26 24
27 class·​connection_manager;​25 class·​connection_manager;​
28 26
29 /​/​/​·​Represents·​a·​single·​connection·​from·​a·​client.​27 /​/​/​·​Represents·​a·​single·​connection·​from·​a·​client.​
30 class·​connection28 class·​connection
31 ··​:​·​public·boost:​:​enable_shared_from_th​is<connection>,​29 ··​:​·​public·​std:​:​enable_shared_from_th​is<connection>
32 ····private·boost:​:​noncopyable
33 {30 {
34 public:​31 public:​
35 ··/​/​/​·Construct·a·​connection·with·the·given·io_context.​32 ··connection(const·​connection&)​·=·delete;​
36 ··explicit·connection(asio:​:​io_context&·io_context,​33 ··connection&·operator=(const·connection&)​·=·delete;​
37 ······connection_manager&·manager,​·request_handler&·handler)​;​
38 34
39 ··​/​/​/​·Get·the·socket·​associated·​with·​the·connection.​35 ··​/​/​/​·Construct·​a·connection·​with·​the·given·socket.​
40 ··​asio:​:​ip:​:​tcp:​:​socket&·​socket()​;​36 ··explicit·connection(asio:​:​ip:​:​tcp:​:​socket·​socket,​
37 ······​connection_manager&·​manager,​·​request_handler&·​handler)​;​
41 38
42 ··​/​/​/​·​Start·​the·​first·​asynchronous·​operation·​for·​the·​connection.​39 ··​/​/​/​·​Start·​the·​first·​asynchronous·​operation·​for·​the·​connection.​
43 ··​void·​start()​;​40 ··​void·​start()​;​
44 41
45 ··​/​/​/​·​Stop·​all·​asynchronous·​operations·​associated·​with·​the·​connection.​42 ··​/​/​/​·​Stop·​all·​asynchronous·​operations·​associated·​with·​the·​connection.​
46 ··​void·​stop()​;​43 ··​void·​stop()​;​
47 44
48 private:​45 private:​
49 ··​/​/​/​·Handle·completion·of·a·​read·​operation.​46 ··​/​/​/​·Perform·an·asynchronous·​read·​operation.​
50 ··​void·handle_read(const·asio:​:​error_code&·e,​47 ··​void·​do_read()​;​
51 ······std:​:​size_t·bytes_transferred)​;​
52 48
53 ··​/​/​/​·Handle·completion·of·a·​write·​operation.​49 ··​/​/​/​·Perform·an·asynchronous·​write·​operation.​
54 ··​void·handle_write(const·asio:​:​error_code&·e)​;​50 ··​void·​do_write()​;​
55 51
56 ··​/​/​/​·​Socket·​for·​the·​connection.​52 ··​/​/​/​·​Socket·​for·​the·​connection.​
57 ··​asio:​:​ip:​:​tcp:​:​socket·​socket_;​53 ··​asio:​:​ip:​:​tcp:​:​socket·​socket_;​
58 54
59 ··​/​/​/​·​The·​manager·​for·​this·​connection.​55 ··​/​/​/​·​The·​manager·​for·​this·​connection.​
60 ··​connection_manager&·​connection_manager_;​56 ··​connection_manager&·​connection_manager_;​
61 57
62 ··​/​/​/​·​The·​handler·​used·​to·​process·​the·​incoming·​request.​58 ··​/​/​/​·​The·​handler·​used·​to·​process·​the·​incoming·​request.​
63 ··​request_handler&·​request_handler_;​59 ··​request_handler&·​request_handler_;​
64 60
65 ··​/​/​/​·​Buffer·​for·​incoming·​data.​61 ··​/​/​/​·​Buffer·​for·​incoming·​data.​
66 ··boost:​:​array<char,​·​8192>·​buffer_;​62 ··​std:​:​array<char,​·​8192>·​buffer_;​
67 63
68 ··​/​/​/​·​The·​incoming·​request.​64 ··​/​/​/​·​The·​incoming·​request.​
69 ··​request·​request_;​65 ··​request·​request_;​
70 66
71 ··​/​/​/​·​The·​parser·​for·​the·​incoming·​request.​67 ··​/​/​/​·​The·​parser·​for·​the·​incoming·​request.​
72 ··​request_parser·​request_parser_;​68 ··​request_parser·​request_parser_;​
73 69
74 ··​/​/​/​·​The·​reply·​to·​be·​sent·​back·​to·​the·​client.​70 ··​/​/​/​·​The·​reply·​to·​be·​sent·​back·​to·​the·​client.​
75 ··​reply·​reply_;​71 ··​reply·​reply_;​
76 };​72 };​
77 73
78 typedef·boost:​:​shared_ptr<connection​>·​connection_ptr;​74 typedef·​std:​:​shared_ptr<connection​>·​connection_ptr;​
79 75
80 }·​/​/​·​namespace·​server76 }·​/​/​·​namespace·​server
81 }·​/​/​·​namespace·​http77 }·​/​/​·​namespace·​http
82 78
83 #endif·​/​/​·​HTTP_CONNECTION_HPP79 #endif·​/​/​·​HTTP_CONNECTION_HPP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/connection_manager.cpp.html000066400000000000000000000452621340672067200260130ustar00rootroot00000000000000 HTML Diff http/server/connection_manager.cpp
src/​examples/​cpp03/​http/​server/​connection_manager.​cppsrc/​examples/​cpp11/​http/​server/​connection_manager.​cpp
1 /​/​1 /​/​
2 /​/​·​connection_manager.​cpp2 /​/​·​connection_manager.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"connection_manager.​hpp"11 #include·​"connection_manager.​hpp"
12 #include·​<algorithm>
13 #include·​<boost/​bind.​hpp>
14 12
15 namespace·​http·​{13 namespace·​http·​{
16 namespace·​server·​{14 namespace·​server·​{
17 15
16 connection_manager:​:​connection_manager()​
17 {
18 }
19
18 void·​connection_manager:​:​start(connection_ptr·​c)​20 void·​connection_manager:​:​start(connection_ptr·​c)​
19 {21 {
20 ··​connections_.​insert(c)​;​22 ··​connections_.​insert(c)​;​
21 ··​c-​>start()​;​23 ··​c-​>start()​;​
22 }24 }
23 25
24 void·​connection_manager:​:​stop(connection_ptr·​c)​26 void·​connection_manager:​:​stop(connection_ptr·​c)​
25 {27 {
26 ··​connections_.​erase(c)​;​28 ··​connections_.​erase(c)​;​
27 ··​c-​>stop()​;​29 ··​c-​>stop()​;​
28 }30 }
29 31
30 void·​connection_manager:​:​stop_all()​32 void·​connection_manager:​:​stop_all()​
31 {33 {
32 ··std:​:​for_each(connections_​.​begin()​,​·​connections_.​end()​,​34 ··​for·(auto·c:​·​connections_)​
33 ······boost:​:​bind(&connection:​:​stop,​·_1)​)​;​35 ····​c-​>stop()​;​
34 ··​connections_.​clear()​;​36 ··​connections_.​clear()​;​
35 }37 }
36 38
37 }·​/​/​·​namespace·​server39 }·​/​/​·​namespace·​server
38 }·​/​/​·​namespace·​http40 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/connection_manager.hpp.html000066400000000000000000000550741340672067200260220ustar00rootroot00000000000000 HTML Diff http/server/connection_manager.hpp
src/​examples/​cpp03/​http/​server/​connection_manager.​hppsrc/​examples/​cpp11/​http/​server/​connection_manager.​hpp
1 /​/​1 /​/​
2 /​/​·​connection_manager.​hpp2 /​/​·​connection_manager.​hpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​HTTP_CONNECTION_MANAG​ER_HPP11 #ifndef·​HTTP_CONNECTION_MANAG​ER_HPP
12 #define·​HTTP_CONNECTION_MANAG​ER_HPP12 #define·​HTTP_CONNECTION_MANAG​ER_HPP
13 13
14 #include·​<set>14 #include·​<set>
15 #include·​<boost/​noncopyable.​hpp>
16 #include·​"connection.​hpp"15 #include·​"connection.​hpp"
17 16
18 namespace·​http·​{17 namespace·​http·​{
19 namespace·​server·​{18 namespace·​server·​{
20 19
21 /​/​/​·​Manages·​open·​connections·​so·​that·​they·​may·​be·​cleanly·​stopped·​when·​the·​server20 /​/​/​·​Manages·​open·​connections·​so·​that·​they·​may·​be·​cleanly·​stopped·​when·​the·​server
22 /​/​/​·​needs·​to·​shut·​down.​21 /​/​/​·​needs·​to·​shut·​down.​
23 class·​connection_manager22 class·​connection_manager
24 ··​:​·​private·​boost:​:​noncopyable
25 {23 {
26 public:​24 public:​
25 ··​connection_manager(co​nst·​connection_manager&)​·​=·​delete;​
26 ··​connection_manager&·​operator=(const·​connection_manager&)​·​=·​delete;​
27
28 ··​/​/​/​·​Construct·​a·​connection·​manager.​
29 ··​connection_manager()​;​
30
27 ··​/​/​/​·​Add·​the·​specified·​connection·​to·​the·​manager·​and·​start·​it.​31 ··​/​/​/​·​Add·​the·​specified·​connection·​to·​the·​manager·​and·​start·​it.​
28 ··​void·​start(connection_ptr·​c)​;​32 ··​void·​start(connection_ptr·​c)​;​
29 33
30 ··​/​/​/​·​Stop·​the·​specified·​connection.​34 ··​/​/​/​·​Stop·​the·​specified·​connection.​
31 ··​void·​stop(connection_ptr·​c)​;​35 ··​void·​stop(connection_ptr·​c)​;​
32 36
33 ··​/​/​/​·​Stop·​all·​connections.​37 ··​/​/​/​·​Stop·​all·​connections.​
34 ··​void·​stop_all()​;​38 ··​void·​stop_all()​;​
35 39
36 private:​40 private:​
37 ··​/​/​/​·​The·​managed·​connections.​41 ··​/​/​/​·​The·​managed·​connections.​
38 ··​std:​:​set<connection_ptr>·​connections_;​42 ··​std:​:​set<connection_ptr>·​connections_;​
39 };​43 };​
40 44
41 }·​/​/​·​namespace·​server45 }·​/​/​·​namespace·​server
42 }·​/​/​·​namespace·​http46 }·​/​/​·​namespace·​http
43 47
44 #endif·​/​/​·​HTTP_CONNECTION_MANAG​ER_HPP48 #endif·​/​/​·​HTTP_CONNECTION_MANAG​ER_HPP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/header.hpp.html000066400000000000000000000032671340672067200234160ustar00rootroot00000000000000 HTML Diff http/server/header.hpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/main.cpp.html000066400000000000000000000706411340672067200231050ustar00rootroot00000000000000 HTML Diff http/server/main.cpp
src/​examples/​cpp03/​http/​server/​main.​cppsrc/​examples/​cpp11/​http/​server/​main.​cpp
1 /​/​1 /​/​
2 /​/​·​main.​cpp2 /​/​·​main.​cpp
3 /​/​·​~~~~~~~~3 /​/​·​~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<iostream>11 #include·​<iostream>
12 #include·​<string>12 #include·​<string>
13 #include·​<asio.​hpp>13 #include·​<asio.​hpp>
14 #include·​<boost/​bind.​hpp>
15 #include·​"server.​hpp"14 #include·​"server.​hpp"
16 15
17 int·​main(int·​argc,​·​char*·​argv[])​16 int·​main(int·​argc,​·​char*·​argv[])​
18 {17 {
19 ··​try18 ··​try
20 ··​{19 ··​{
21 ····​/​/​·​Check·​command·​line·​arguments.​20 ····​/​/​·​Check·​command·​line·​arguments.​
22 ····​if·​(argc·​!=·​4)​21 ····​if·​(argc·​!=·​4)​
23 ····​{22 ····​{
24 ······​std:​:​cerr·​<<·​"Usage:​·​http_server·​<address>·​<port>·​<doc_root>\n";​23 ······​std:​:​cerr·​<<·​"Usage:​·​http_server·​<address>·​<port>·​<doc_root>\n";​
25 ······​std:​:​cerr·​<<·​"··​For·​IPv4,​·​try:​\n";​24 ······​std:​:​cerr·​<<·​"··​For·​IPv4,​·​try:​\n";​
26 ······​std:​:​cerr·​<<·​"····​receiver·​0.​0.​0.​0·​80·​.​\n";​25 ······​std:​:​cerr·​<<·​"····​receiver·​0.​0.​0.​0·​80·​.​\n";​
27 ······​std:​:​cerr·​<<·​"··​For·​IPv6,​·​try:​\n";​26 ······​std:​:​cerr·​<<·​"··​For·​IPv6,​·​try:​\n";​
28 ······​std:​:​cerr·​<<·​"····​receiver·​0:​:​0·​80·​.​\n";​27 ······​std:​:​cerr·​<<·​"····​receiver·​0:​:​0·​80·​.​\n";​
29 ······​return·​1;​28 ······​return·​1;​
30 ····​}29 ····​}
31 30
32 ····​/​/​·​Initialise·​the·​server.​31 ····​/​/​·​Initialise·​the·​server.​
33 ····​http:​:​server:​:​server·​s(argv[1],​·​argv[2],​·​argv[3])​;​32 ····​http:​:​server:​:​server·​s(argv[1],​·​argv[2],​·​argv[3])​;​
34 33
35 ····​/​/​·​Run·​the·​server·​until·​stopped.​34 ····​/​/​·​Run·​the·​server·​until·​stopped.​
36 ····​s.​run()​;​35 ····​s.​run()​;​
37 ··​}36 ··​}
38 ··​catch·​(std:​:​exception&·​e)​37 ··​catch·​(std:​:​exception&·​e)​
39 ··​{38 ··​{
40 ····​std:​:​cerr·​<<·​"exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​39 ····​std:​:​cerr·​<<·​"exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
41 ··​}40 ··​}
42 41
43 ··​return·​0;​42 ··​return·​0;​
44 }43 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/mime_types.cpp.html000066400000000000000000000611101340672067200243230ustar00rootroot00000000000000 HTML Diff http/server/mime_types.cpp
src/​examples/​cpp03/​http/​server/​mime_types.​cppsrc/​examples/​cpp11/​http/​server/​mime_types.​cpp
1 /​/​1 /​/​
2 /​/​·​mime_types.​cpp2 /​/​·​mime_types.​cpp
3 /​/​·​~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"mime_types.​hpp"11 #include·​"mime_types.​hpp"
12 12
13 namespace·​http·​{13 namespace·​http·​{
14 namespace·​server·​{14 namespace·​server·​{
15 namespace·​mime_types·​{15 namespace·​mime_types·​{
16 16
17 struct·​mapping17 struct·​mapping
18 {18 {
19 ··​const·​char*·​extension;​19 ··​const·​char*·​extension;​
20 ··​const·​char*·​mime_type;​20 ··​const·​char*·​mime_type;​
21 }·​mappings[]·​=21 }·​mappings[]·​=
22 {22 {
23 ··​{·​"gif",​·​"image/​gif"·​},​23 ··​{·​"gif",​·​"image/​gif"·​},​
24 ··​{·​"htm",​·​"text/​html"·​},​24 ··​{·​"htm",​·​"text/​html"·​},​
25 ··​{·​"html",​·​"text/​html"·​},​25 ··​{·​"html",​·​"text/​html"·​},​
26 ··​{·​"jpg",​·​"image/​jpeg"·​},​26 ··​{·​"jpg",​·​"image/​jpeg"·​},​
27 ··​{·​"png",​·​"image/​png"·​},​27 ··​{·​"png",​·​"image/​png"·​}
28 ··{·0,​·0·}·/​/​·Marks·end·of·list.​
29 };​28 };​
30 29
31 std:​:​string·​extension_to_type(con​st·​std:​:​string&·​extension)​30 std:​:​string·​extension_to_type(con​st·​std:​:​string&·​extension)​
32 {31 {
33 ··​for·​(mapping*·​m·=·​mappings;​·m-​>extension;​·++m)​32 ··​for·​(mapping·​m:​·​mappings)​
34 ··​{33 ··​{
35 ····​if·​(m-​>extension·​==·​extension)​34 ····​if·​(m.​extension·​==·​extension)​
36 ····​{35 ····​{
37 ······​return·​m-​>mime_type;​36 ······​return·​m.​mime_type;​
38 ····​}37 ····​}
39 ··​}38 ··​}
40 39
41 ··​return·​"text/​plain";​40 ··​return·​"text/​plain";​
42 }41 }
43 42
44 }·​/​/​·​namespace·​mime_types43 }·​/​/​·​namespace·​mime_types
45 }·​/​/​·​namespace·​server44 }·​/​/​·​namespace·​server
46 }·​/​/​·​namespace·​http45 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/mime_types.hpp.html000066400000000000000000000032731340672067200243360ustar00rootroot00000000000000 HTML Diff http/server/mime_types.hpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/reply.cpp.html000066400000000000000000004112741340672067200233150ustar00rootroot00000000000000 HTML Diff http/server/reply.cpp
src/​examples/​cpp03/​http/​server/​reply.​cppsrc/​examples/​cpp11/​http/​server/​reply.​cpp
1 /​/​1 /​/​
2 /​/​·​reply.​cpp2 /​/​·​reply.​cpp
3 /​/​·​~~~~~~~~~3 /​/​·​~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"reply.​hpp"11 #include·​"reply.​hpp"
12 #include·​<string>12 #include·​<string>
13 #include·​<boost/​lexical_cast.​hpp>
14 13
15 namespace·​http·​{14 namespace·​http·​{
16 namespace·​server·​{15 namespace·​server·​{
17 16
18 namespace·​status_strings·​{17 namespace·​status_strings·​{
19 18
20 const·​std:​:​string·​ok·​=19 const·​std:​:​string·​ok·​=
21 ··​"HTTP/​1.​0·​200·​OK\r\n";​20 ··​"HTTP/​1.​0·​200·​OK\r\n";​
22 const·​std:​:​string·​created·​=21 const·​std:​:​string·​created·​=
23 ··​"HTTP/​1.​0·​201·​Created\r\n";​22 ··​"HTTP/​1.​0·​201·​Created\r\n";​
24 const·​std:​:​string·​accepted·​=23 const·​std:​:​string·​accepted·​=
25 ··​"HTTP/​1.​0·​202·​Accepted\r\n";​24 ··​"HTTP/​1.​0·​202·​Accepted\r\n";​
26 const·​std:​:​string·​no_content·​=25 const·​std:​:​string·​no_content·​=
27 ··​"HTTP/​1.​0·​204·​No·​Content\r\n";​26 ··​"HTTP/​1.​0·​204·​No·​Content\r\n";​
28 const·​std:​:​string·​multiple_choices·​=27 const·​std:​:​string·​multiple_choices·​=
29 ··​"HTTP/​1.​0·​300·​Multiple·​Choices\r\n";​28 ··​"HTTP/​1.​0·​300·​Multiple·​Choices\r\n";​
30 const·​std:​:​string·​moved_permanently·​=29 const·​std:​:​string·​moved_permanently·​=
31 ··​"HTTP/​1.​0·​301·​Moved·​Permanently\r\n";​30 ··​"HTTP/​1.​0·​301·​Moved·​Permanently\r\n";​
32 const·​std:​:​string·​moved_temporarily·​=31 const·​std:​:​string·​moved_temporarily·​=
33 ··​"HTTP/​1.​0·​302·​Moved·​Temporarily\r\n";​32 ··​"HTTP/​1.​0·​302·​Moved·​Temporarily\r\n";​
34 const·​std:​:​string·​not_modified·​=33 const·​std:​:​string·​not_modified·​=
35 ··​"HTTP/​1.​0·​304·​Not·​Modified\r\n";​34 ··​"HTTP/​1.​0·​304·​Not·​Modified\r\n";​
36 const·​std:​:​string·​bad_request·​=35 const·​std:​:​string·​bad_request·​=
37 ··​"HTTP/​1.​0·​400·​Bad·​Request\r\n";​36 ··​"HTTP/​1.​0·​400·​Bad·​Request\r\n";​
38 const·​std:​:​string·​unauthorized·​=37 const·​std:​:​string·​unauthorized·​=
39 ··​"HTTP/​1.​0·​401·​Unauthorized\r\n";​38 ··​"HTTP/​1.​0·​401·​Unauthorized\r\n";​
40 const·​std:​:​string·​forbidden·​=39 const·​std:​:​string·​forbidden·​=
41 ··​"HTTP/​1.​0·​403·​Forbidden\r\n";​40 ··​"HTTP/​1.​0·​403·​Forbidden\r\n";​
42 const·​std:​:​string·​not_found·​=41 const·​std:​:​string·​not_found·​=
43 ··​"HTTP/​1.​0·​404·​Not·​Found\r\n";​42 ··​"HTTP/​1.​0·​404·​Not·​Found\r\n";​
44 const·​std:​:​string·​internal_server_error​·​=43 const·​std:​:​string·​internal_server_error​·​=
45 ··​"HTTP/​1.​0·​500·​Internal·​Server·​Error\r\n";​44 ··​"HTTP/​1.​0·​500·​Internal·​Server·​Error\r\n";​
46 const·​std:​:​string·​not_implemented·​=45 const·​std:​:​string·​not_implemented·​=
47 ··​"HTTP/​1.​0·​501·​Not·​Implemented\r\n";​46 ··​"HTTP/​1.​0·​501·​Not·​Implemented\r\n";​
48 const·​std:​:​string·​bad_gateway·​=47 const·​std:​:​string·​bad_gateway·​=
49 ··​"HTTP/​1.​0·​502·​Bad·​Gateway\r\n";​48 ··​"HTTP/​1.​0·​502·​Bad·​Gateway\r\n";​
50 const·​std:​:​string·​service_unavailable·​=49 const·​std:​:​string·​service_unavailable·​=
51 ··​"HTTP/​1.​0·​503·​Service·​Unavailable\r\n";​50 ··​"HTTP/​1.​0·​503·​Service·​Unavailable\r\n";​
52 51
53 asio:​:​const_buffer·​to_buffer(reply:​:​status_type·​status)​52 asio:​:​const_buffer·​to_buffer(reply:​:​status_type·​status)​
54 {53 {
55 ··​switch·​(status)​54 ··​switch·​(status)​
56 ··​{55 ··​{
57 ··​case·​reply:​:​ok:​56 ··​case·​reply:​:​ok:​
58 ····​return·​asio:​:​buffer(ok)​;​57 ····​return·​asio:​:​buffer(ok)​;​
59 ··​case·​reply:​:​created:​58 ··​case·​reply:​:​created:​
60 ····​return·​asio:​:​buffer(created)​;​59 ····​return·​asio:​:​buffer(created)​;​
61 ··​case·​reply:​:​accepted:​60 ··​case·​reply:​:​accepted:​
62 ····​return·​asio:​:​buffer(accepted)​;​61 ····​return·​asio:​:​buffer(accepted)​;​
63 ··​case·​reply:​:​no_content:​62 ··​case·​reply:​:​no_content:​
64 ····​return·​asio:​:​buffer(no_content)​;​63 ····​return·​asio:​:​buffer(no_content)​;​
65 ··​case·​reply:​:​multiple_choices:​64 ··​case·​reply:​:​multiple_choices:​
66 ····​return·​asio:​:​buffer(multiple_choic​es)​;​65 ····​return·​asio:​:​buffer(multiple_choic​es)​;​
67 ··​case·​reply:​:​moved_permanently:​66 ··​case·​reply:​:​moved_permanently:​
68 ····​return·​asio:​:​buffer(moved_permanen​tly)​;​67 ····​return·​asio:​:​buffer(moved_permanen​tly)​;​
69 ··​case·​reply:​:​moved_temporarily:​68 ··​case·​reply:​:​moved_temporarily:​
70 ····​return·​asio:​:​buffer(moved_temporar​ily)​;​69 ····​return·​asio:​:​buffer(moved_temporar​ily)​;​
71 ··​case·​reply:​:​not_modified:​70 ··​case·​reply:​:​not_modified:​
72 ····​return·​asio:​:​buffer(not_modified)​;​71 ····​return·​asio:​:​buffer(not_modified)​;​
73 ··​case·​reply:​:​bad_request:​72 ··​case·​reply:​:​bad_request:​
74 ····​return·​asio:​:​buffer(bad_request)​;​73 ····​return·​asio:​:​buffer(bad_request)​;​
75 ··​case·​reply:​:​unauthorized:​74 ··​case·​reply:​:​unauthorized:​
76 ····​return·​asio:​:​buffer(unauthorized)​;​75 ····​return·​asio:​:​buffer(unauthorized)​;​
77 ··​case·​reply:​:​forbidden:​76 ··​case·​reply:​:​forbidden:​
78 ····​return·​asio:​:​buffer(forbidden)​;​77 ····​return·​asio:​:​buffer(forbidden)​;​
79 ··​case·​reply:​:​not_found:​78 ··​case·​reply:​:​not_found:​
80 ····​return·​asio:​:​buffer(not_found)​;​79 ····​return·​asio:​:​buffer(not_found)​;​
81 ··​case·​reply:​:​internal_server_error​:​80 ··​case·​reply:​:​internal_server_error​:​
82 ····​return·​asio:​:​buffer(internal_serve​r_error)​;​81 ····​return·​asio:​:​buffer(internal_serve​r_error)​;​
83 ··​case·​reply:​:​not_implemented:​82 ··​case·​reply:​:​not_implemented:​
84 ····​return·​asio:​:​buffer(not_implemente​d)​;​83 ····​return·​asio:​:​buffer(not_implemente​d)​;​
85 ··​case·​reply:​:​bad_gateway:​84 ··​case·​reply:​:​bad_gateway:​
86 ····​return·​asio:​:​buffer(bad_gateway)​;​85 ····​return·​asio:​:​buffer(bad_gateway)​;​
87 ··​case·​reply:​:​service_unavailable:​86 ··​case·​reply:​:​service_unavailable:​
88 ····​return·​asio:​:​buffer(service_unavai​lable)​;​87 ····​return·​asio:​:​buffer(service_unavai​lable)​;​
89 ··​default:​88 ··​default:​
90 ····​return·​asio:​:​buffer(internal_serve​r_error)​;​89 ····​return·​asio:​:​buffer(internal_serve​r_error)​;​
91 ··​}90 ··​}
92 }91 }
93 92
94 }·​/​/​·​namespace·​status_strings93 }·​/​/​·​namespace·​status_strings
95 94
96 namespace·​misc_strings·​{95 namespace·​misc_strings·​{
97 96
98 const·​char·​name_value_separator[​]·​=·​{·​':​',​·​'·​'·​};​97 const·​char·​name_value_separator[​]·​=·​{·​':​',​·​'·​'·​};​
99 const·​char·​crlf[]·​=·​{·​'\r',​·​'\n'·​};​98 const·​char·​crlf[]·​=·​{·​'\r',​·​'\n'·​};​
100 99
101 }·​/​/​·​namespace·​misc_strings100 }·​/​/​·​namespace·​misc_strings
102 101
103 std:​:​vector<asio:​:​const_buffer>·​reply:​:​to_buffers()​102 std:​:​vector<asio:​:​const_buffer>·​reply:​:​to_buffers()​
104 {103 {
105 ··​std:​:​vector<asio:​:​const_buffer>·​buffers;​104 ··​std:​:​vector<asio:​:​const_buffer>·​buffers;​
106 ··​buffers.​push_back(status_stri​ngs:​:​to_buffer(status)​)​;​105 ··​buffers.​push_back(status_stri​ngs:​:​to_buffer(status)​)​;​
107 ··​for·​(std:​:​size_t·​i·​=·​0;​·​i·​<·​headers.​size()​;​·​++i)​106 ··​for·​(std:​:​size_t·​i·​=·​0;​·​i·​<·​headers.​size()​;​·​++i)​
108 ··​{107 ··​{
109 ····​header&·​h·​=·​headers[i];​108 ····​header&·​h·​=·​headers[i];​
110 ····​buffers.​push_back(asio:​:​buffer(h.​name)​)​;​109 ····​buffers.​push_back(asio:​:​buffer(h.​name)​)​;​
111 ····​buffers.​push_back(asio:​:​buffer(misc_strings:​:​name_value_separator)​)​;​110 ····​buffers.​push_back(asio:​:​buffer(misc_strings:​:​name_value_separator)​)​;​
112 ····​buffers.​push_back(asio:​:​buffer(h.​value)​)​;​111 ····​buffers.​push_back(asio:​:​buffer(h.​value)​)​;​
113 ····​buffers.​push_back(asio:​:​buffer(misc_strings:​:​crlf)​)​;​112 ····​buffers.​push_back(asio:​:​buffer(misc_strings:​:​crlf)​)​;​
114 ··​}113 ··​}
115 ··​buffers.​push_back(asio:​:​buffer(misc_strings:​:​crlf)​)​;​114 ··​buffers.​push_back(asio:​:​buffer(misc_strings:​:​crlf)​)​;​
116 ··​buffers.​push_back(asio:​:​buffer(content)​)​;​115 ··​buffers.​push_back(asio:​:​buffer(content)​)​;​
117 ··​return·​buffers;​116 ··​return·​buffers;​
118 }117 }
119 118
120 namespace·​stock_replies·​{119 namespace·​stock_replies·​{
121 120
122 const·​char·​ok[]·​=·​"";​121 const·​char·​ok[]·​=·​"";​
123 const·​char·​created[]·​=122 const·​char·​created[]·​=
124 ··​"<html>"123 ··​"<html>"
125 ··​"<head><title>Created​</​title></​head>"124 ··​"<head><title>Created​</​title></​head>"
126 ··​"<body><h1>201·​Created</​h1></​body>"125 ··​"<body><h1>201·​Created</​h1></​body>"
127 ··​"</​html>";​126 ··​"</​html>";​
128 const·​char·​accepted[]·​=127 const·​char·​accepted[]·​=
129 ··​"<html>"128 ··​"<html>"
130 ··​"<head><title>Accepte​d</​title></​head>"129 ··​"<head><title>Accepte​d</​title></​head>"
131 ··​"<body><h1>202·​Accepted</​h1></​body>"130 ··​"<body><h1>202·​Accepted</​h1></​body>"
132 ··​"</​html>";​131 ··​"</​html>";​
133 const·​char·​no_content[]·​=132 const·​char·​no_content[]·​=
134 ··​"<html>"133 ··​"<html>"
135 ··​"<head><title>No·​Content</​title></​head>"134 ··​"<head><title>No·​Content</​title></​head>"
136 ··​"<body><h1>204·​Content</​h1></​body>"135 ··​"<body><h1>204·​Content</​h1></​body>"
137 ··​"</​html>";​136 ··​"</​html>";​
138 const·​char·​multiple_choices[]·​=137 const·​char·​multiple_choices[]·​=
139 ··​"<html>"138 ··​"<html>"
140 ··​"<head><title>Multipl​e·​Choices</​title></​head>"139 ··​"<head><title>Multipl​e·​Choices</​title></​head>"
141 ··​"<body><h1>300·​Multiple·​Choices</​h1></​body>"140 ··​"<body><h1>300·​Multiple·​Choices</​h1></​body>"
142 ··​"</​html>";​141 ··​"</​html>";​
143 const·​char·​moved_permanently[]·​=142 const·​char·​moved_permanently[]·​=
144 ··​"<html>"143 ··​"<html>"
145 ··​"<head><title>Moved·​Permanently</​title></​head>"144 ··​"<head><title>Moved·​Permanently</​title></​head>"
146 ··​"<body><h1>301·​Moved·​Permanently</​h1></​body>"145 ··​"<body><h1>301·​Moved·​Permanently</​h1></​body>"
147 ··​"</​html>";​146 ··​"</​html>";​
148 const·​char·​moved_temporarily[]·​=147 const·​char·​moved_temporarily[]·​=
149 ··​"<html>"148 ··​"<html>"
150 ··​"<head><title>Moved·​Temporarily</​title></​head>"149 ··​"<head><title>Moved·​Temporarily</​title></​head>"
151 ··​"<body><h1>302·​Moved·​Temporarily</​h1></​body>"150 ··​"<body><h1>302·​Moved·​Temporarily</​h1></​body>"
152 ··​"</​html>";​151 ··​"</​html>";​
153 const·​char·​not_modified[]·​=152 const·​char·​not_modified[]·​=
154 ··​"<html>"153 ··​"<html>"
155 ··​"<head><title>Not·​Modified</​title></​head>"154 ··​"<head><title>Not·​Modified</​title></​head>"
156 ··​"<body><h1>304·​Not·​Modified</​h1></​body>"155 ··​"<body><h1>304·​Not·​Modified</​h1></​body>"
157 ··​"</​html>";​156 ··​"</​html>";​
158 const·​char·​bad_request[]·​=157 const·​char·​bad_request[]·​=
159 ··​"<html>"158 ··​"<html>"
160 ··​"<head><title>Bad·​Request</​title></​head>"159 ··​"<head><title>Bad·​Request</​title></​head>"
161 ··​"<body><h1>400·​Bad·​Request</​h1></​body>"160 ··​"<body><h1>400·​Bad·​Request</​h1></​body>"
162 ··​"</​html>";​161 ··​"</​html>";​
163 const·​char·​unauthorized[]·​=162 const·​char·​unauthorized[]·​=
164 ··​"<html>"163 ··​"<html>"
165 ··​"<head><title>Unautho​rized</​title></​head>"164 ··​"<head><title>Unautho​rized</​title></​head>"
166 ··​"<body><h1>401·​Unauthorized</​h1></​body>"165 ··​"<body><h1>401·​Unauthorized</​h1></​body>"
167 ··​"</​html>";​166 ··​"</​html>";​
168 const·​char·​forbidden[]·​=167 const·​char·​forbidden[]·​=
169 ··​"<html>"168 ··​"<html>"
170 ··​"<head><title>Forbidd​en</​title></​head>"169 ··​"<head><title>Forbidd​en</​title></​head>"
171 ··​"<body><h1>403·​Forbidden</​h1></​body>"170 ··​"<body><h1>403·​Forbidden</​h1></​body>"
172 ··​"</​html>";​171 ··​"</​html>";​
173 const·​char·​not_found[]·​=172 const·​char·​not_found[]·​=
174 ··​"<html>"173 ··​"<html>"
175 ··​"<head><title>Not·​Found</​title></​head>"174 ··​"<head><title>Not·​Found</​title></​head>"
176 ··​"<body><h1>404·​Not·​Found</​h1></​body>"175 ··​"<body><h1>404·​Not·​Found</​h1></​body>"
177 ··​"</​html>";​176 ··​"</​html>";​
178 const·​char·​internal_server_error​[]·​=177 const·​char·​internal_server_error​[]·​=
179 ··​"<html>"178 ··​"<html>"
180 ··​"<head><title>Interna​l·​Server·​Error</​title></​head>"179 ··​"<head><title>Interna​l·​Server·​Error</​title></​head>"
181 ··​"<body><h1>500·​Internal·​Server·​Error</​h1></​body>"180 ··​"<body><h1>500·​Internal·​Server·​Error</​h1></​body>"
182 ··​"</​html>";​181 ··​"</​html>";​
183 const·​char·​not_implemented[]·​=182 const·​char·​not_implemented[]·​=
184 ··​"<html>"183 ··​"<html>"
185 ··​"<head><title>Not·​Implemented</​title></​head>"184 ··​"<head><title>Not·​Implemented</​title></​head>"
186 ··​"<body><h1>501·​Not·​Implemented</​h1></​body>"185 ··​"<body><h1>501·​Not·​Implemented</​h1></​body>"
187 ··​"</​html>";​186 ··​"</​html>";​
188 const·​char·​bad_gateway[]·​=187 const·​char·​bad_gateway[]·​=
189 ··​"<html>"188 ··​"<html>"
190 ··​"<head><title>Bad·​Gateway</​title></​head>"189 ··​"<head><title>Bad·​Gateway</​title></​head>"
191 ··​"<body><h1>502·​Bad·​Gateway</​h1></​body>"190 ··​"<body><h1>502·​Bad·​Gateway</​h1></​body>"
192 ··​"</​html>";​191 ··​"</​html>";​
193 const·​char·​service_unavailable[]​·​=192 const·​char·​service_unavailable[]​·​=
194 ··​"<html>"193 ··​"<html>"
195 ··​"<head><title>Service​·​Unavailable</​title></​head>"194 ··​"<head><title>Service​·​Unavailable</​title></​head>"
196 ··​"<body><h1>503·​Service·​Unavailable</​h1></​body>"195 ··​"<body><h1>503·​Service·​Unavailable</​h1></​body>"
197 ··​"</​html>";​196 ··​"</​html>";​
198 197
199 std:​:​string·​to_string(reply:​:​status_type·​status)​198 std:​:​string·​to_string(reply:​:​status_type·​status)​
200 {199 {
201 ··​switch·​(status)​200 ··​switch·​(status)​
202 ··​{201 ··​{
203 ··​case·​reply:​:​ok:​202 ··​case·​reply:​:​ok:​
204 ····​return·​ok;​203 ····​return·​ok;​
205 ··​case·​reply:​:​created:​204 ··​case·​reply:​:​created:​
206 ····​return·​created;​205 ····​return·​created;​
207 ··​case·​reply:​:​accepted:​206 ··​case·​reply:​:​accepted:​
208 ····​return·​accepted;​207 ····​return·​accepted;​
209 ··​case·​reply:​:​no_content:​208 ··​case·​reply:​:​no_content:​
210 ····​return·​no_content;​209 ····​return·​no_content;​
211 ··​case·​reply:​:​multiple_choices:​210 ··​case·​reply:​:​multiple_choices:​
212 ····​return·​multiple_choices;​211 ····​return·​multiple_choices;​
213 ··​case·​reply:​:​moved_permanently:​212 ··​case·​reply:​:​moved_permanently:​
214 ····​return·​moved_permanently;​213 ····​return·​moved_permanently;​
215 ··​case·​reply:​:​moved_temporarily:​214 ··​case·​reply:​:​moved_temporarily:​
216 ····​return·​moved_temporarily;​215 ····​return·​moved_temporarily;​
217 ··​case·​reply:​:​not_modified:​216 ··​case·​reply:​:​not_modified:​
218 ····​return·​not_modified;​217 ····​return·​not_modified;​
219 ··​case·​reply:​:​bad_request:​218 ··​case·​reply:​:​bad_request:​
220 ····​return·​bad_request;​219 ····​return·​bad_request;​
221 ··​case·​reply:​:​unauthorized:​220 ··​case·​reply:​:​unauthorized:​
222 ····​return·​unauthorized;​221 ····​return·​unauthorized;​
223 ··​case·​reply:​:​forbidden:​222 ··​case·​reply:​:​forbidden:​
224 ····​return·​forbidden;​223 ····​return·​forbidden;​
225 ··​case·​reply:​:​not_found:​224 ··​case·​reply:​:​not_found:​
226 ····​return·​not_found;​225 ····​return·​not_found;​
227 ··​case·​reply:​:​internal_server_error​:​226 ··​case·​reply:​:​internal_server_error​:​
228 ····​return·​internal_server_error​;​227 ····​return·​internal_server_error​;​
229 ··​case·​reply:​:​not_implemented:​228 ··​case·​reply:​:​not_implemented:​
230 ····​return·​not_implemented;​229 ····​return·​not_implemented;​
231 ··​case·​reply:​:​bad_gateway:​230 ··​case·​reply:​:​bad_gateway:​
232 ····​return·​bad_gateway;​231 ····​return·​bad_gateway;​
233 ··​case·​reply:​:​service_unavailable:​232 ··​case·​reply:​:​service_unavailable:​
234 ····​return·​service_unavailable;​233 ····​return·​service_unavailable;​
235 ··​default:​234 ··​default:​
236 ····​return·​internal_server_error​;​235 ····​return·​internal_server_error​;​
237 ··​}236 ··​}
238 }237 }
239 238
240 }·​/​/​·​namespace·​stock_replies239 }·​/​/​·​namespace·​stock_replies
241 240
242 reply·​reply:​:​stock_reply(reply:​:​status_type·​status)​241 reply·​reply:​:​stock_reply(reply:​:​status_type·​status)​
243 {242 {
244 ··​reply·​rep;​243 ··​reply·​rep;​
245 ··​rep.​status·​=·​status;​244 ··​rep.​status·​=·​status;​
246 ··​rep.​content·​=·​stock_replies:​:​to_string(status)​;​245 ··​rep.​content·​=·​stock_replies:​:​to_string(status)​;​
247 ··​rep.​headers.​resize(2)​;​246 ··​rep.​headers.​resize(2)​;​
248 ··​rep.​headers[0].​name·​=·​"Content-​Length";​247 ··​rep.​headers[0].​name·​=·​"Content-​Length";​
249 ··​rep.​headers[0].​value·​=·boost:​:​lexical_cast<std:​:​string>(rep.​content.​size()​)​;​248 ··​rep.​headers[0].​value·​=·​std:​:​to_string(rep.​content.​size()​)​;​
250 ··​rep.​headers[1].​name·​=·​"Content-​Type";​249 ··​rep.​headers[1].​name·​=·​"Content-​Type";​
251 ··​rep.​headers[1].​value·​=·​"text/​html";​250 ··​rep.​headers[1].​value·​=·​"text/​html";​
252 ··​return·​rep;​251 ··​return·​rep;​
253 }252 }
254 253
255 }·​/​/​·​namespace·​server254 }·​/​/​·​namespace·​server
256 }·​/​/​·​namespace·​http255 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/reply.hpp.html000066400000000000000000000032661340672067200233200ustar00rootroot00000000000000 HTML Diff http/server/reply.hpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/request.hpp.html000066400000000000000000000032701340672067200236500ustar00rootroot00000000000000 HTML Diff http/server/request.hpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/request_handler.cpp.html000066400000000000000000002311061340672067200253410ustar00rootroot00000000000000 HTML Diff http/server/request_handler.cpp
src/​examples/​cpp03/​http/​server/​request_handler.​cppsrc/​examples/​cpp11/​http/​server/​request_handler.​cpp
1 /​/​1 /​/​
2 /​/​·​request_handler.​cpp2 /​/​·​request_handler.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"request_handler.​hpp"11 #include·​"request_handler.​hpp"
12 #include·​<fstream>12 #include·​<fstream>
13 #include·​<sstream>13 #include·​<sstream>
14 #include·​<string>14 #include·​<string>
15 #include·​<boost/​lexical_cast.​hpp>
16 #include·​"mime_types.​hpp"15 #include·​"mime_types.​hpp"
17 #include·​"reply.​hpp"16 #include·​"reply.​hpp"
18 #include·​"request.​hpp"17 #include·​"request.​hpp"
19 18
20 namespace·​http·​{19 namespace·​http·​{
21 namespace·​server·​{20 namespace·​server·​{
22 21
23 request_handler:​:​request_handler(const​·​std:​:​string&·​doc_root)​22 request_handler:​:​request_handler(const​·​std:​:​string&·​doc_root)​
24 ··​:​·​doc_root_(doc_root)​23 ··​:​·​doc_root_(doc_root)​
25 {24 {
26 }25 }
27 26
28 void·​request_handler:​:​handle_request(const·​request&·​req,​·​reply&·​rep)​27 void·​request_handler:​:​handle_request(const·​request&·​req,​·​reply&·​rep)​
29 {28 {
30 ··​/​/​·​Decode·​url·​to·​path.​29 ··​/​/​·​Decode·​url·​to·​path.​
31 ··​std:​:​string·​request_path;​30 ··​std:​:​string·​request_path;​
32 ··​if·​(!url_decode(req.​uri,​·​request_path)​)​31 ··​if·​(!url_decode(req.​uri,​·​request_path)​)​
33 ··​{32 ··​{
34 ····​rep·​=·​reply:​:​stock_reply(reply:​:​bad_request)​;​33 ····​rep·​=·​reply:​:​stock_reply(reply:​:​bad_request)​;​
35 ····​return;​34 ····​return;​
36 ··​}35 ··​}
37 36
38 ··​/​/​·​Request·​path·​must·​be·​absolute·​and·​not·​contain·​".​.​".​37 ··​/​/​·​Request·​path·​must·​be·​absolute·​and·​not·​contain·​".​.​".​
39 ··​if·​(request_path.​empty()​·​||·​request_path[0]·​!=·​'/​'38 ··​if·​(request_path.​empty()​·​||·​request_path[0]·​!=·​'/​'
40 ······​||·​request_path.​find(".​.​")​·​!=·​std:​:​string:​:​npos)​39 ······​||·​request_path.​find(".​.​")​·​!=·​std:​:​string:​:​npos)​
41 ··​{40 ··​{
42 ····​rep·​=·​reply:​:​stock_reply(reply:​:​bad_request)​;​41 ····​rep·​=·​reply:​:​stock_reply(reply:​:​bad_request)​;​
43 ····​return;​42 ····​return;​
44 ··​}43 ··​}
45 44
46 ··​/​/​·​If·​path·​ends·​in·​slash·​(i.​e.​·​is·​a·​directory)​·​then·​add·​"index.​html".​45 ··​/​/​·​If·​path·​ends·​in·​slash·​(i.​e.​·​is·​a·​directory)​·​then·​add·​"index.​html".​
47 ··​if·​(request_path[request​_path.​size()​·​-​·​1]·​==·​'/​')​46 ··​if·​(request_path[request​_path.​size()​·​-​·​1]·​==·​'/​')​
48 ··​{47 ··​{
49 ····​request_path·​+=·​"index.​html";​48 ····​request_path·​+=·​"index.​html";​
50 ··​}49 ··​}
51 50
52 ··​/​/​·​Determine·​the·​file·​extension.​51 ··​/​/​·​Determine·​the·​file·​extension.​
53 ··​std:​:​size_t·​last_slash_pos·​=·​request_path.​find_last_of("/​")​;​52 ··​std:​:​size_t·​last_slash_pos·​=·​request_path.​find_last_of("/​")​;​
54 ··​std:​:​size_t·​last_dot_pos·​=·​request_path.​find_last_of(".​")​;​53 ··​std:​:​size_t·​last_dot_pos·​=·​request_path.​find_last_of(".​")​;​
55 ··​std:​:​string·​extension;​54 ··​std:​:​string·​extension;​
56 ··​if·​(last_dot_pos·​!=·​std:​:​string:​:​npos·​&&·​last_dot_pos·​>·​last_slash_pos)​55 ··​if·​(last_dot_pos·​!=·​std:​:​string:​:​npos·​&&·​last_dot_pos·​>·​last_slash_pos)​
57 ··​{56 ··​{
58 ····​extension·​=·​request_path.​substr(last_dot_pos·​+·​1)​;​57 ····​extension·​=·​request_path.​substr(last_dot_pos·​+·​1)​;​
59 ··​}58 ··​}
60 59
61 ··​/​/​·​Open·​the·​file·​to·​send·​back.​60 ··​/​/​·​Open·​the·​file·​to·​send·​back.​
62 ··​std:​:​string·​full_path·​=·​doc_root_·​+·​request_path;​61 ··​std:​:​string·​full_path·​=·​doc_root_·​+·​request_path;​
63 ··​std:​:​ifstream·​is(full_path.​c_str()​,​·​std:​:​ios:​:​in·​|·​std:​:​ios:​:​binary)​;​62 ··​std:​:​ifstream·​is(full_path.​c_str()​,​·​std:​:​ios:​:​in·​|·​std:​:​ios:​:​binary)​;​
64 ··​if·​(!is)​63 ··​if·​(!is)​
65 ··​{64 ··​{
66 ····​rep·​=·​reply:​:​stock_reply(reply:​:​not_found)​;​65 ····​rep·​=·​reply:​:​stock_reply(reply:​:​not_found)​;​
67 ····​return;​66 ····​return;​
68 ··​}67 ··​}
69 68
70 ··​/​/​·​Fill·​out·​the·​reply·​to·​be·​sent·​to·​the·​client.​69 ··​/​/​·​Fill·​out·​the·​reply·​to·​be·​sent·​to·​the·​client.​
71 ··​rep.​status·​=·​reply:​:​ok;​70 ··​rep.​status·​=·​reply:​:​ok;​
72 ··​char·​buf[512];​71 ··​char·​buf[512];​
73 ··​while·​(is.​read(buf,​·​sizeof(buf)​)​.​gcount()​·​>·​0)​72 ··​while·​(is.​read(buf,​·​sizeof(buf)​)​.​gcount()​·​>·​0)​
74 ····​rep.​content.​append(buf,​·​is.​gcount()​)​;​73 ····​rep.​content.​append(buf,​·​is.​gcount()​)​;​
75 ··​rep.​headers.​resize(2)​;​74 ··​rep.​headers.​resize(2)​;​
76 ··​rep.​headers[0].​name·​=·​"Content-​Length";​75 ··​rep.​headers[0].​name·​=·​"Content-​Length";​
77 ··​rep.​headers[0].​value·​=·boost:​:​lexical_cast<std:​:​string>(rep.​content.​size()​)​;​76 ··​rep.​headers[0].​value·​=·​std:​:​to_string(rep.​content.​size()​)​;​
78 ··​rep.​headers[1].​name·​=·​"Content-​Type";​77 ··​rep.​headers[1].​name·​=·​"Content-​Type";​
79 ··​rep.​headers[1].​value·​=·​mime_types:​:​extension_to_type(ext​ension)​;​78 ··​rep.​headers[1].​value·​=·​mime_types:​:​extension_to_type(ext​ension)​;​
80 }79 }
81 80
82 bool·​request_handler:​:​url_decode(const·​std:​:​string&·​in,​·​std:​:​string&·​out)​81 bool·​request_handler:​:​url_decode(const·​std:​:​string&·​in,​·​std:​:​string&·​out)​
83 {82 {
84 ··​out.​clear()​;​83 ··​out.​clear()​;​
85 ··​out.​reserve(in.​size()​)​;​84 ··​out.​reserve(in.​size()​)​;​
86 ··​for·​(std:​:​size_t·​i·​=·​0;​·​i·​<·​in.​size()​;​·​++i)​85 ··​for·​(std:​:​size_t·​i·​=·​0;​·​i·​<·​in.​size()​;​·​++i)​
87 ··​{86 ··​{
88 ····​if·​(in[i]·​==·​'%')​87 ····​if·​(in[i]·​==·​'%')​
89 ····​{88 ····​{
90 ······​if·​(i·​+·​3·​<=·​in.​size()​)​89 ······​if·​(i·​+·​3·​<=·​in.​size()​)​
91 ······​{90 ······​{
92 ········​int·​value·​=·​0;​91 ········​int·​value·​=·​0;​
93 ········​std:​:​istringstream·​is(in.​substr(i·​+·​1,​·​2)​)​;​92 ········​std:​:​istringstream·​is(in.​substr(i·​+·​1,​·​2)​)​;​
94 ········​if·​(is·​>>·​std:​:​hex·​>>·​value)​93 ········​if·​(is·​>>·​std:​:​hex·​>>·​value)​
95 ········​{94 ········​{
96 ··········​out·​+=·​static_cast<char>(val​ue)​;​95 ··········​out·​+=·​static_cast<char>(val​ue)​;​
97 ··········​i·​+=·​2;​96 ··········​i·​+=·​2;​
98 ········​}97 ········​}
99 ········​else98 ········​else
100 ········​{99 ········​{
101 ··········​return·​false;​100 ··········​return·​false;​
102 ········​}101 ········​}
103 ······​}102 ······​}
104 ······​else103 ······​else
105 ······​{104 ······​{
106 ········​return·​false;​105 ········​return·​false;​
107 ······​}106 ······​}
108 ····​}107 ····​}
109 ····​else·​if·​(in[i]·​==·​'+')​108 ····​else·​if·​(in[i]·​==·​'+')​
110 ····​{109 ····​{
111 ······​out·​+=·​'·​';​110 ······​out·​+=·​'·​';​
112 ····​}111 ····​}
113 ····​else112 ····​else
114 ····​{113 ····​{
115 ······​out·​+=·​in[i];​114 ······​out·​+=·​in[i];​
116 ····​}115 ····​}
117 ··​}116 ··​}
118 ··​return·​true;​117 ··​return·​true;​
119 }118 }
120 119
121 }·​/​/​·​namespace·​server120 }·​/​/​·​namespace·​server
122 }·​/​/​·​namespace·​http121 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/request_handler.hpp.html000066400000000000000000000600111340672067200253410ustar00rootroot00000000000000 HTML Diff http/server/request_handler.hpp
src/​examples/​cpp03/​http/​server/​request_handler.​hppsrc/​examples/​cpp11/​http/​server/​request_handler.​hpp
1 /​/​1 /​/​
2 /​/​·​request_handler.​hpp2 /​/​·​request_handler.​hpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​HTTP_REQUEST_HANDLER_​HPP11 #ifndef·​HTTP_REQUEST_HANDLER_​HPP
12 #define·​HTTP_REQUEST_HANDLER_​HPP12 #define·​HTTP_REQUEST_HANDLER_​HPP
13 13
14 #include·​<string>14 #include·​<string>
15 #include·​<boost/​noncopyable.​hpp>
16 15
17 namespace·​http·​{16 namespace·​http·​{
18 namespace·​server·​{17 namespace·​server·​{
19 18
20 struct·​reply;​19 struct·​reply;​
21 struct·​request;​20 struct·​request;​
22 21
23 /​/​/​·​The·​common·​handler·​for·​all·​incoming·​requests.​22 /​/​/​·​The·​common·​handler·​for·​all·​incoming·​requests.​
24 class·​request_handler23 class·​request_handler
25 ··​:​·​private·​boost:​:​noncopyable
26 {24 {
27 public:​25 public:​
26 ··​request_handler(const​·​request_handler&)​·​=·​delete;​
27 ··​request_handler&·​operator=(const·​request_handler&)​·​=·​delete;​
28
28 ··​/​/​/​·​Construct·​with·​a·​directory·​containing·​files·​to·​be·​served.​29 ··​/​/​/​·​Construct·​with·​a·​directory·​containing·​files·​to·​be·​served.​
29 ··​explicit·​request_handler(const​·​std:​:​string&·​doc_root)​;​30 ··​explicit·​request_handler(const​·​std:​:​string&·​doc_root)​;​
30 31
31 ··​/​/​/​·​Handle·​a·​request·​and·​produce·​a·​reply.​32 ··​/​/​/​·​Handle·​a·​request·​and·​produce·​a·​reply.​
32 ··​void·​handle_request(const·​request&·​req,​·​reply&·​rep)​;​33 ··​void·​handle_request(const·​request&·​req,​·​reply&·​rep)​;​
33 34
34 private:​35 private:​
35 ··​/​/​/​·​The·​directory·​containing·​the·​files·​to·​be·​served.​36 ··​/​/​/​·​The·​directory·​containing·​the·​files·​to·​be·​served.​
36 ··​std:​:​string·​doc_root_;​37 ··​std:​:​string·​doc_root_;​
37 38
38 ··​/​/​/​·​Perform·​URL-​decoding·​on·​a·​string.​·​Returns·​false·​if·​the·​encoding·​was39 ··​/​/​/​·​Perform·​URL-​decoding·​on·​a·​string.​·​Returns·​false·​if·​the·​encoding·​was
39 ··​/​/​/​·​invalid.​40 ··​/​/​/​·​invalid.​
40 ··​static·​bool·​url_decode(const·​std:​:​string&·​in,​·​std:​:​string&·​out)​;​41 ··​static·​bool·​url_decode(const·​std:​:​string&·​in,​·​std:​:​string&·​out)​;​
41 };​42 };​
42 43
43 }·​/​/​·​namespace·​server44 }·​/​/​·​namespace·​server
44 }·​/​/​·​namespace·​http45 }·​/​/​·​namespace·​http
45 46
46 #endif·​/​/​·​HTTP_REQUEST_HANDLER_​HPP47 #endif·​/​/​·​HTTP_REQUEST_HANDLER_​HPP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/request_parser.cpp.html000066400000000000000000006517471340672067200252410ustar00rootroot00000000000000 HTML Diff http/server/request_parser.cpp
src/​examples/​cpp03/​http/​server/​request_parser.​cppsrc/​examples/​cpp11/​http/​server/​request_parser.​cpp
1 /​/​1 /​/​
2 /​/​·​request_parser.​cpp2 /​/​·​request_parser.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"request_parser.​hpp"11 #include·​"request_parser.​hpp"
12 #include·​"request.​hpp"12 #include·​"request.​hpp"
13 13
14 namespace·​http·​{14 namespace·​http·​{
15 namespace·​server·​{15 namespace·​server·​{
16 16
17 request_parser:​:​request_parser()​17 request_parser:​:​request_parser()​
18 ··​:​·​state_(method_start)​18 ··​:​·​state_(method_start)​
19 {19 {
20 }20 }
21 21
22 void·​request_parser:​:​reset()​22 void·​request_parser:​:​reset()​
23 {23 {
24 ··​state_·​=·​method_start;​24 ··​state_·​=·​method_start;​
25 }25 }
26 26
27 boost:​:​tribool·​request_parser:​:​consume(request&·​req,​·​char·​input)​27 request_parser:​:​result_type·​request_parser:​:​consume(request&·​req,​·​char·​input)​
28 {28 {
29 ··​switch·​(state_)​29 ··​switch·​(state_)​
30 ··​{30 ··​{
31 ··​case·​method_start:​31 ··​case·​method_start:​
32 ····​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​32 ····​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​
33 ····​{33 ····​{
34 ······​return·false;​34 ······​return·bad;​
35 ····​}35 ····​}
36 ····​else36 ····​else
37 ····​{37 ····​{
38 ······​state_·​=·​method;​38 ······​state_·​=·​method;​
39 ······​req.​method.​push_back(input)​;​39 ······​req.​method.​push_back(input)​;​
40 ······​return·boost:​:​indeterminate;​40 ······​return·​indeterminate;​
41 ····​}41 ····​}
42 ··​case·​method:​42 ··​case·​method:​
43 ····​if·​(input·​==·​'·​')​43 ····​if·​(input·​==·​'·​')​
44 ····​{44 ····​{
45 ······​state_·​=·​uri;​45 ······​state_·​=·​uri;​
46 ······​return·boost:​:​indeterminate;​46 ······​return·​indeterminate;​
47 ····​}47 ····​}
48 ····​else·​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​48 ····​else·​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​
49 ····​{49 ····​{
50 ······​return·false;​50 ······​return·bad;​
51 ····​}51 ····​}
52 ····​else52 ····​else
53 ····​{53 ····​{
54 ······​req.​method.​push_back(input)​;​54 ······​req.​method.​push_back(input)​;​
55 ······​return·boost:​:​indeterminate;​55 ······​return·​indeterminate;​
56 ····​}56 ····​}
57 ··​case·​uri:​57 ··​case·​uri:​
58 ····​if·​(input·​==·​'·​')​58 ····​if·​(input·​==·​'·​')​
59 ····​{59 ····​{
60 ······​state_·​=·​http_version_h;​60 ······​state_·​=·​http_version_h;​
61 ······​return·boost:​:​indeterminate;​61 ······​return·​indeterminate;​
62 ····​}62 ····​}
63 ····​else·​if·​(is_ctl(input)​)​63 ····​else·​if·​(is_ctl(input)​)​
64 ····​{64 ····​{
65 ······​return·false;​65 ······​return·bad;​
66 ····​}66 ····​}
67 ····​else67 ····​else
68 ····​{68 ····​{
69 ······​req.​uri.​push_back(input)​;​69 ······​req.​uri.​push_back(input)​;​
70 ······​return·boost:​:​indeterminate;​70 ······​return·​indeterminate;​
71 ····​}71 ····​}
72 ··​case·​http_version_h:​72 ··​case·​http_version_h:​
73 ····​if·​(input·​==·​'H')​73 ····​if·​(input·​==·​'H')​
74 ····​{74 ····​{
75 ······​state_·​=·​http_version_t_1;​75 ······​state_·​=·​http_version_t_1;​
76 ······​return·boost:​:​indeterminate;​76 ······​return·​indeterminate;​
77 ····​}77 ····​}
78 ····​else78 ····​else
79 ····​{79 ····​{
80 ······​return·false;​80 ······​return·bad;​
81 ····​}81 ····​}
82 ··​case·​http_version_t_1:​82 ··​case·​http_version_t_1:​
83 ····​if·​(input·​==·​'T')​83 ····​if·​(input·​==·​'T')​
84 ····​{84 ····​{
85 ······​state_·​=·​http_version_t_2;​85 ······​state_·​=·​http_version_t_2;​
86 ······​return·boost:​:​indeterminate;​86 ······​return·​indeterminate;​
87 ····​}87 ····​}
88 ····​else88 ····​else
89 ····​{89 ····​{
90 ······​return·false;​90 ······​return·bad;​
91 ····​}91 ····​}
92 ··​case·​http_version_t_2:​92 ··​case·​http_version_t_2:​
93 ····​if·​(input·​==·​'T')​93 ····​if·​(input·​==·​'T')​
94 ····​{94 ····​{
95 ······​state_·​=·​http_version_p;​95 ······​state_·​=·​http_version_p;​
96 ······​return·boost:​:​indeterminate;​96 ······​return·​indeterminate;​
97 ····​}97 ····​}
98 ····​else98 ····​else
99 ····​{99 ····​{
100 ······​return·false;​100 ······​return·bad;​
101 ····​}101 ····​}
102 ··​case·​http_version_p:​102 ··​case·​http_version_p:​
103 ····​if·​(input·​==·​'P')​103 ····​if·​(input·​==·​'P')​
104 ····​{104 ····​{
105 ······​state_·​=·​http_version_slash;​105 ······​state_·​=·​http_version_slash;​
106 ······​return·boost:​:​indeterminate;​106 ······​return·​indeterminate;​
107 ····​}107 ····​}
108 ····​else108 ····​else
109 ····​{109 ····​{
110 ······​return·false;​110 ······​return·bad;​
111 ····​}111 ····​}
112 ··​case·​http_version_slash:​112 ··​case·​http_version_slash:​
113 ····​if·​(input·​==·​'/​')​113 ····​if·​(input·​==·​'/​')​
114 ····​{114 ····​{
115 ······​req.​http_version_major·​=·​0;​115 ······​req.​http_version_major·​=·​0;​
116 ······​req.​http_version_minor·​=·​0;​116 ······​req.​http_version_minor·​=·​0;​
117 ······​state_·​=·​http_version_major_st​art;​117 ······​state_·​=·​http_version_major_st​art;​
118 ······​return·boost:​:​indeterminate;​118 ······​return·​indeterminate;​
119 ····​}119 ····​}
120 ····​else120 ····​else
121 ····​{121 ····​{
122 ······​return·false;​122 ······​return·bad;​
123 ····​}123 ····​}
124 ··​case·​http_version_major_st​art:​124 ··​case·​http_version_major_st​art:​
125 ····​if·​(is_digit(input)​)​125 ····​if·​(is_digit(input)​)​
126 ····​{126 ····​{
127 ······​req.​http_version_major·​=·​req.​http_version_major·​*·​10·​+·​input·​-​·​'0';​127 ······​req.​http_version_major·​=·​req.​http_version_major·​*·​10·​+·​input·​-​·​'0';​
128 ······​state_·​=·​http_version_major;​128 ······​state_·​=·​http_version_major;​
129 ······​return·boost:​:​indeterminate;​129 ······​return·​indeterminate;​
130 ····​}130 ····​}
131 ····​else131 ····​else
132 ····​{132 ····​{
133 ······​return·false;​133 ······​return·bad;​
134 ····​}134 ····​}
135 ··​case·​http_version_major:​135 ··​case·​http_version_major:​
136 ····​if·​(input·​==·​'.​')​136 ····​if·​(input·​==·​'.​')​
137 ····​{137 ····​{
138 ······​state_·​=·​http_version_minor_st​art;​138 ······​state_·​=·​http_version_minor_st​art;​
139 ······​return·boost:​:​indeterminate;​139 ······​return·​indeterminate;​
140 ····​}140 ····​}
141 ····​else·​if·​(is_digit(input)​)​141 ····​else·​if·​(is_digit(input)​)​
142 ····​{142 ····​{
143 ······​req.​http_version_major·​=·​req.​http_version_major·​*·​10·​+·​input·​-​·​'0';​143 ······​req.​http_version_major·​=·​req.​http_version_major·​*·​10·​+·​input·​-​·​'0';​
144 ······​return·boost:​:​indeterminate;​144 ······​return·​indeterminate;​
145 ····​}145 ····​}
146 ····​else146 ····​else
147 ····​{147 ····​{
148 ······​return·false;​148 ······​return·bad;​
149 ····​}149 ····​}
150 ··​case·​http_version_minor_st​art:​150 ··​case·​http_version_minor_st​art:​
151 ····​if·​(is_digit(input)​)​151 ····​if·​(is_digit(input)​)​
152 ····​{152 ····​{
153 ······​req.​http_version_minor·​=·​req.​http_version_minor·​*·​10·​+·​input·​-​·​'0';​153 ······​req.​http_version_minor·​=·​req.​http_version_minor·​*·​10·​+·​input·​-​·​'0';​
154 ······​state_·​=·​http_version_minor;​154 ······​state_·​=·​http_version_minor;​
155 ······​return·boost:​:​indeterminate;​155 ······​return·​indeterminate;​
156 ····​}156 ····​}
157 ····​else157 ····​else
158 ····​{158 ····​{
159 ······​return·false;​159 ······​return·bad;​
160 ····​}160 ····​}
161 ··​case·​http_version_minor:​161 ··​case·​http_version_minor:​
162 ····​if·​(input·​==·​'\r')​162 ····​if·​(input·​==·​'\r')​
163 ····​{163 ····​{
164 ······​state_·​=·​expecting_newline_1;​164 ······​state_·​=·​expecting_newline_1;​
165 ······​return·boost:​:​indeterminate;​165 ······​return·​indeterminate;​
166 ····​}166 ····​}
167 ····​else·​if·​(is_digit(input)​)​167 ····​else·​if·​(is_digit(input)​)​
168 ····​{168 ····​{
169 ······​req.​http_version_minor·​=·​req.​http_version_minor·​*·​10·​+·​input·​-​·​'0';​169 ······​req.​http_version_minor·​=·​req.​http_version_minor·​*·​10·​+·​input·​-​·​'0';​
170 ······​return·boost:​:​indeterminate;​170 ······​return·​indeterminate;​
171 ····​}171 ····​}
172 ····​else172 ····​else
173 ····​{173 ····​{
174 ······​return·false;​174 ······​return·bad;​
175 ····​}175 ····​}
176 ··​case·​expecting_newline_1:​176 ··​case·​expecting_newline_1:​
177 ····​if·​(input·​==·​'\n')​177 ····​if·​(input·​==·​'\n')​
178 ····​{178 ····​{
179 ······​state_·​=·​header_line_start;​179 ······​state_·​=·​header_line_start;​
180 ······​return·boost:​:​indeterminate;​180 ······​return·​indeterminate;​
181 ····​}181 ····​}
182 ····​else182 ····​else
183 ····​{183 ····​{
184 ······​return·false;​184 ······​return·bad;​
185 ····​}185 ····​}
186 ··​case·​header_line_start:​186 ··​case·​header_line_start:​
187 ····​if·​(input·​==·​'\r')​187 ····​if·​(input·​==·​'\r')​
188 ····​{188 ····​{
189 ······​state_·​=·​expecting_newline_3;​189 ······​state_·​=·​expecting_newline_3;​
190 ······​return·boost:​:​indeterminate;​190 ······​return·​indeterminate;​
191 ····​}191 ····​}
192 ····​else·​if·​(!req.​headers.​empty()​·​&&·​(input·​==·​'·​'·​||·​input·​==·​'\t')​)​192 ····​else·​if·​(!req.​headers.​empty()​·​&&·​(input·​==·​'·​'·​||·​input·​==·​'\t')​)​
193 ····​{193 ····​{
194 ······​state_·​=·​header_lws;​194 ······​state_·​=·​header_lws;​
195 ······​return·boost:​:​indeterminate;​195 ······​return·​indeterminate;​
196 ····​}196 ····​}
197 ····​else·​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​197 ····​else·​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​
198 ····​{198 ····​{
199 ······​return·false;​199 ······​return·bad;​
200 ····​}200 ····​}
201 ····​else201 ····​else
202 ····​{202 ····​{
203 ······​req.​headers.​push_back(header()​)​;​203 ······​req.​headers.​push_back(header()​)​;​
204 ······​req.​headers.​back()​.​name.​push_back(input)​;​204 ······​req.​headers.​back()​.​name.​push_back(input)​;​
205 ······​state_·​=·​header_name;​205 ······​state_·​=·​header_name;​
206 ······​return·boost:​:​indeterminate;​206 ······​return·​indeterminate;​
207 ····​}207 ····​}
208 ··​case·​header_lws:​208 ··​case·​header_lws:​
209 ····​if·​(input·​==·​'\r')​209 ····​if·​(input·​==·​'\r')​
210 ····​{210 ····​{
211 ······​state_·​=·​expecting_newline_2;​211 ······​state_·​=·​expecting_newline_2;​
212 ······​return·boost:​:​indeterminate;​212 ······​return·​indeterminate;​
213 ····​}213 ····​}
214 ····​else·​if·​(input·​==·​'·​'·​||·​input·​==·​'\t')​214 ····​else·​if·​(input·​==·​'·​'·​||·​input·​==·​'\t')​
215 ····​{215 ····​{
216 ······​return·boost:​:​indeterminate;​216 ······​return·​indeterminate;​
217 ····​}217 ····​}
218 ····​else·​if·​(is_ctl(input)​)​218 ····​else·​if·​(is_ctl(input)​)​
219 ····​{219 ····​{
220 ······​return·false;​220 ······​return·bad;​
221 ····​}221 ····​}
222 ····​else222 ····​else
223 ····​{223 ····​{
224 ······​state_·​=·​header_value;​224 ······​state_·​=·​header_value;​
225 ······​req.​headers.​back()​.​value.​push_back(input)​;​225 ······​req.​headers.​back()​.​value.​push_back(input)​;​
226 ······​return·boost:​:​indeterminate;​226 ······​return·​indeterminate;​
227 ····​}227 ····​}
228 ··​case·​header_name:​228 ··​case·​header_name:​
229 ····​if·​(input·​==·​':​')​229 ····​if·​(input·​==·​':​')​
230 ····​{230 ····​{
231 ······​state_·​=·​space_before_header_v​alue;​231 ······​state_·​=·​space_before_header_v​alue;​
232 ······​return·boost:​:​indeterminate;​232 ······​return·​indeterminate;​
233 ····​}233 ····​}
234 ····​else·​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​234 ····​else·​if·​(!is_char(input)​·​||·​is_ctl(input)​·​||·​is_tspecial(input)​)​
235 ····​{235 ····​{
236 ······​return·false;​236 ······​return·bad;​
237 ····​}237 ····​}
238 ····​else238 ····​else
239 ····​{239 ····​{
240 ······​req.​headers.​back()​.​name.​push_back(input)​;​240 ······​req.​headers.​back()​.​name.​push_back(input)​;​
241 ······​return·boost:​:​indeterminate;​241 ······​return·​indeterminate;​
242 ····​}242 ····​}
243 ··​case·​space_before_header_v​alue:​243 ··​case·​space_before_header_v​alue:​
244 ····​if·​(input·​==·​'·​')​244 ····​if·​(input·​==·​'·​')​
245 ····​{245 ····​{
246 ······​state_·​=·​header_value;​246 ······​state_·​=·​header_value;​
247 ······​return·boost:​:​indeterminate;​247 ······​return·​indeterminate;​
248 ····​}248 ····​}
249 ····​else249 ····​else
250 ····​{250 ····​{
251 ······​return·false;​251 ······​return·bad;​
252 ····​}252 ····​}
253 ··​case·​header_value:​253 ··​case·​header_value:​
254 ····​if·​(input·​==·​'\r')​254 ····​if·​(input·​==·​'\r')​
255 ····​{255 ····​{
256 ······​state_·​=·​expecting_newline_2;​256 ······​state_·​=·​expecting_newline_2;​
257 ······​return·boost:​:​indeterminate;​257 ······​return·​indeterminate;​
258 ····​}258 ····​}
259 ····​else·​if·​(is_ctl(input)​)​259 ····​else·​if·​(is_ctl(input)​)​
260 ····​{260 ····​{
261 ······​return·false;​261 ······​return·bad;​
262 ····​}262 ····​}
263 ····​else263 ····​else
264 ····​{264 ····​{
265 ······​req.​headers.​back()​.​value.​push_back(input)​;​265 ······​req.​headers.​back()​.​value.​push_back(input)​;​
266 ······​return·boost:​:​indeterminate;​266 ······​return·​indeterminate;​
267 ····​}267 ····​}
268 ··​case·​expecting_newline_2:​268 ··​case·​expecting_newline_2:​
269 ····​if·​(input·​==·​'\n')​269 ····​if·​(input·​==·​'\n')​
270 ····​{270 ····​{
271 ······​state_·​=·​header_line_start;​271 ······​state_·​=·​header_line_start;​
272 ······​return·boost:​:​indeterminate;​272 ······​return·​indeterminate;​
273 ····​}273 ····​}
274 ····​else274 ····​else
275 ····​{275 ····​{
276 ······​return·false;​276 ······​return·bad;​
277 ····​}277 ····​}
278 ··​case·​expecting_newline_3:​278 ··​case·​expecting_newline_3:​
279 ····​return·​(input·​==·​'\n')​;​279 ····​return·​(input·​==·​'\n')​·?·good·:​·bad;​
280 ··​default:​280 ··​default:​
281 ····​return·false;​281 ····​return·bad;​
282 ··​}282 ··​}
283 }283 }
284 284
285 bool·​request_parser:​:​is_char(int·​c)​285 bool·​request_parser:​:​is_char(int·​c)​
286 {286 {
287 ··​return·​c·​>=·​0·​&&·​c·​<=·​127;​287 ··​return·​c·​>=·​0·​&&·​c·​<=·​127;​
288 }288 }
289 289
290 bool·​request_parser:​:​is_ctl(int·​c)​290 bool·​request_parser:​:​is_ctl(int·​c)​
291 {291 {
292 ··​return·​(c·​>=·​0·​&&·​c·​<=·​31)​·​||·​(c·​==·​127)​;​292 ··​return·​(c·​>=·​0·​&&·​c·​<=·​31)​·​||·​(c·​==·​127)​;​
293 }293 }
294 294
295 bool·​request_parser:​:​is_tspecial(int·​c)​295 bool·​request_parser:​:​is_tspecial(int·​c)​
296 {296 {
297 ··​switch·​(c)​297 ··​switch·​(c)​
298 ··​{298 ··​{
299 ··​case·​'(':​·​case·​')​':​·​case·​'<':​·​case·​'>':​·​case·​'@':​299 ··​case·​'(':​·​case·​')​':​·​case·​'<':​·​case·​'>':​·​case·​'@':​
300 ··​case·​',​':​·​case·​';​':​·​case·​':​':​·​case·​'\\':​·​case·​'"':​300 ··​case·​',​':​·​case·​';​':​·​case·​':​':​·​case·​'\\':​·​case·​'"':​
301 ··​case·​'/​':​·​case·​'[':​·​case·​']':​·​case·​'?':​·​case·​'=':​301 ··​case·​'/​':​·​case·​'[':​·​case·​']':​·​case·​'?':​·​case·​'=':​
302 ··​case·​'{':​·​case·​'}':​·​case·​'·​':​·​case·​'\t':​302 ··​case·​'{':​·​case·​'}':​·​case·​'·​':​·​case·​'\t':​
303 ····​return·​true;​303 ····​return·​true;​
304 ··​default:​304 ··​default:​
305 ····​return·​false;​305 ····​return·​false;​
306 ··​}306 ··​}
307 }307 }
308 308
309 bool·​request_parser:​:​is_digit(int·​c)​309 bool·​request_parser:​:​is_digit(int·​c)​
310 {310 {
311 ··​return·​c·​>=·​'0'·​&&·​c·​<=·​'9';​311 ··​return·​c·​>=·​'0'·​&&·​c·​<=·​'9';​
312 }312 }
313 313
314 }·​/​/​·​namespace·​server314 }·​/​/​·​namespace·​server
315 }·​/​/​·​namespace·​http315 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/request_parser.hpp.html000066400000000000000000002234731340672067200252350ustar00rootroot00000000000000 HTML Diff http/server/request_parser.hpp
src/​examples/​cpp03/​http/​server/​request_parser.​hppsrc/​examples/​cpp11/​http/​server/​request_parser.​hpp
1 /​/​1 /​/​
2 /​/​·​request_parser.​hpp2 /​/​·​request_parser.​hpp
3 /​/​·​~~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​HTTP_REQUEST_PARSER_H​PP11 #ifndef·​HTTP_REQUEST_PARSER_H​PP
12 #define·​HTTP_REQUEST_PARSER_H​PP12 #define·​HTTP_REQUEST_PARSER_H​PP
13 13
14 #include·​<boost/​logic/​tribool.​hpp>14 #include·​<tuple>
15 #include·<boost/​tuple/​tuple.​hpp>
16 15
17 namespace·​http·​{16 namespace·​http·​{
18 namespace·​server·​{17 namespace·​server·​{
19 18
20 struct·​request;​19 struct·​request;​
21 20
22 /​/​/​·​Parser·​for·​incoming·​requests.​21 /​/​/​·​Parser·​for·​incoming·​requests.​
23 class·​request_parser22 class·​request_parser
24 {23 {
25 public:​24 public:​
26 ··​/​/​/​·​Construct·​ready·​to·​parse·​the·​request·​method.​25 ··​/​/​/​·​Construct·​ready·​to·​parse·​the·​request·​method.​
27 ··​request_parser()​;​26 ··​request_parser()​;​
28 27
29 ··​/​/​/​·​Reset·​to·​initial·​parser·​state.​28 ··​/​/​/​·​Reset·​to·​initial·​parser·​state.​
30 ··​void·​reset()​;​29 ··​void·​reset()​;​
31 30
32 ··​/​/​/​·Parse·some·data.​·The·tribool·return·value·is·true·when·a·complete·request31 ··​/​/​/​·Result·of·​parse.​
33 ··/​/​/​·has·been·parsed,​·false·if·the·data·is·invalid,​·​indeterminate·when·more32 ··​enum·result_type·{·good,​·bad,​·​indeterminate·};​
34 ··/​/​/​·data·is·required.​·The·InputIterator·return·value·indicates·how·much·of·the33
35 ··​/​/​/​·input·has·been·​consumed.​34 ··​/​/​/​·Parse·some·data.​·The·enum·return·value·is·good·when·a·​complete·request·has
35 ··​/​/​/​·​been·​parsed,​·​bad·​if·​the·​data·​is·​invalid,​·​indeterminate·​when·​more·​data·​is
36 ··​/​/​/​·​required.​·​The·​InputIterator·​return·​value·​indicates·​how·​much·​of·​the·​input
37 ··​/​/​/​·​has·​been·​consumed.​
36 ··​template·​<typename·​InputIterator>38 ··​template·​<typename·​InputIterator>
37 ··boost:​:​tuple<boost:​:​tribool,​·​InputIterator>·​parse(request&·​req,​39 ··​std:​:​tuple<result_type,​·​InputIterator>·​parse(request&·​req,​
38 ······​InputIterator·​begin,​·​InputIterator·​end)​40 ······​InputIterator·​begin,​·​InputIterator·​end)​
39 ··​{41 ··​{
40 ····​while·​(begin·​!=·​end)​42 ····​while·​(begin·​!=·​end)​
41 ····​{43 ····​{
42 ······boost:​:​tribool·​result·​=·​consume(req,​·​*begin++)​;​44 ······result_type·​result·​=·​consume(req,​·​*begin++)​;​
43 ······​if·​(result·​||·!result)​45 ······​if·​(result·==·good·​||·​result·==·bad)​
44 ········​return·boost:​:​make_tuple(result,​·​begin)​;​46 ········​return·​std:​:​make_tuple(result,​·​begin)​;​
45 ····​}47 ····​}
46 ····boost:​:​tribool·result·=·boost:​:​indeterminate;​48 ····return·std:​:​make_tuple(indetermin​ate,​·begin)​;​
47 ····return·boost:​:​make_tuple(result,​·begin)​;​
48 ··​}49 ··​}
49 50
50 private:​51 private:​
51 ··​/​/​/​·​Handle·​the·​next·​character·​of·​input.​52 ··​/​/​/​·​Handle·​the·​next·​character·​of·​input.​
52 ··boost:​:​tribool·​consume(request&·​req,​·​char·​input)​;​53 ··result_type·​consume(request&·​req,​·​char·​input)​;​
53 54
54 ··​/​/​/​·​Check·​if·​a·​byte·​is·​an·​HTTP·​character.​55 ··​/​/​/​·​Check·​if·​a·​byte·​is·​an·​HTTP·​character.​
55 ··​static·​bool·​is_char(int·​c)​;​56 ··​static·​bool·​is_char(int·​c)​;​
56 57
57 ··​/​/​/​·​Check·​if·​a·​byte·​is·​an·​HTTP·​control·​character.​58 ··​/​/​/​·​Check·​if·​a·​byte·​is·​an·​HTTP·​control·​character.​
58 ··​static·​bool·​is_ctl(int·​c)​;​59 ··​static·​bool·​is_ctl(int·​c)​;​
59 60
60 ··​/​/​/​·​Check·​if·​a·​byte·​is·​defined·​as·​an·​HTTP·​tspecial·​character.​61 ··​/​/​/​·​Check·​if·​a·​byte·​is·​defined·​as·​an·​HTTP·​tspecial·​character.​
61 ··​static·​bool·​is_tspecial(int·​c)​;​62 ··​static·​bool·​is_tspecial(int·​c)​;​
62 63
63 ··​/​/​/​·​Check·​if·​a·​byte·​is·​a·​digit.​64 ··​/​/​/​·​Check·​if·​a·​byte·​is·​a·​digit.​
64 ··​static·​bool·​is_digit(int·​c)​;​65 ··​static·​bool·​is_digit(int·​c)​;​
65 66
66 ··​/​/​/​·​The·​current·​state·​of·​the·​parser.​67 ··​/​/​/​·​The·​current·​state·​of·​the·​parser.​
67 ··​enum·​state68 ··​enum·​state
68 ··​{69 ··​{
69 ····​method_start,​70 ····​method_start,​
70 ····​method,​71 ····​method,​
71 ····​uri,​72 ····​uri,​
72 ····​http_version_h,​73 ····​http_version_h,​
73 ····​http_version_t_1,​74 ····​http_version_t_1,​
74 ····​http_version_t_2,​75 ····​http_version_t_2,​
75 ····​http_version_p,​76 ····​http_version_p,​
76 ····​http_version_slash,​77 ····​http_version_slash,​
77 ····​http_version_major_st​art,​78 ····​http_version_major_st​art,​
78 ····​http_version_major,​79 ····​http_version_major,​
79 ····​http_version_minor_st​art,​80 ····​http_version_minor_st​art,​
80 ····​http_version_minor,​81 ····​http_version_minor,​
81 ····​expecting_newline_1,​82 ····​expecting_newline_1,​
82 ····​header_line_start,​83 ····​header_line_start,​
83 ····​header_lws,​84 ····​header_lws,​
84 ····​header_name,​85 ····​header_name,​
85 ····​space_before_header_v​alue,​86 ····​space_before_header_v​alue,​
86 ····​header_value,​87 ····​header_value,​
87 ····​expecting_newline_2,​88 ····​expecting_newline_2,​
88 ····​expecting_newline_389 ····​expecting_newline_3
89 ··​}·​state_;​90 ··​}·​state_;​
90 };​91 };​
91 92
92 }·​/​/​·​namespace·​server93 }·​/​/​·​namespace·​server
93 }·​/​/​·​namespace·​http94 }·​/​/​·​namespace·​http
94 95
95 #endif·​/​/​·​HTTP_REQUEST_PARSER_H​PP96 #endif·​/​/​·​HTTP_REQUEST_PARSER_H​PP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/server.cpp.html000066400000000000000000003000061340672067200234560ustar00rootroot00000000000000 HTML Diff http/server/server.cpp
src/​examples/​cpp03/​http/​server/​server.​cppsrc/​examples/​cpp11/​http/​server/​server.​cpp
1 /​/​1 /​/​
2 /​/​·​server.​cpp2 /​/​·​server.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"server.​hpp"11 #include·​"server.​hpp"
12 #include·​<boost/​bind.​hpp>
13 #include·​<signal.​h>12 #include·​<signal.​h>
13 #include·​<utility>
14 14
15 namespace·​http·​{15 namespace·​http·​{
16 namespace·​server·​{16 namespace·​server·​{
17 17
18 server:​:​server(const·​std:​:​string&·​address,​·​const·​std:​:​string&·​port,​18 server:​:​server(const·​std:​:​string&·​address,​·​const·​std:​:​string&·​port,​
19 ····​const·​std:​:​string&·​doc_root)​19 ····​const·​std:​:​string&·​doc_root)​
20 ··​:​·​io_context_()​,​20 ··​:​·​io_context_(1)​,​
21 ····​signals_(io_context_)​,​21 ····​signals_(io_context_)​,​
22 ····​acceptor_(io_context_​)​,​22 ····​acceptor_(io_context_​)​,​
23 ····​connection_manager_()​,​23 ····​connection_manager_()​,​
24 ····​new_connection_()​,​
25 ····​request_handler_(doc_​root)​24 ····​request_handler_(doc_​root)​
26 {25 {
27 ··​/​/​·​Register·​to·​handle·​the·​signals·​that·​indicate·​when·​the·​server·​should·​exit.​26 ··​/​/​·​Register·​to·​handle·​the·​signals·​that·​indicate·​when·​the·​server·​should·​exit.​
28 ··​/​/​·​It·​is·​safe·​to·​register·​for·​the·​same·​signal·​multiple·​times·​in·​a·​program,​27 ··​/​/​·​It·​is·​safe·​to·​register·​for·​the·​same·​signal·​multiple·​times·​in·​a·​program,​
29 ··​/​/​·​provided·​all·​registration·​for·​the·​specified·​signal·​is·​made·​through·​Asio.​28 ··​/​/​·​provided·​all·​registration·​for·​the·​specified·​signal·​is·​made·​through·​Asio.​
30 ··​signals_.​add(SIGINT)​;​29 ··​signals_.​add(SIGINT)​;​
31 ··​signals_.​add(SIGTERM)​;​30 ··​signals_.​add(SIGTERM)​;​
32 #if·​defined(SIGQUIT)​31 #if·​defined(SIGQUIT)​
33 ··​signals_.​add(SIGQUIT)​;​32 ··​signals_.​add(SIGQUIT)​;​
34 #endif·​/​/​·​defined(SIGQUIT)​33 #endif·​/​/​·​defined(SIGQUIT)​
35 ··signals_.​async_wait(boost:​:​bind(&server:​:​handle_stop,​·this)​)​;​34
35 ··​do_await_stop()​;​
36 36
37 ··​/​/​·​Open·​the·​acceptor·​with·​the·​option·​to·​reuse·​the·​address·​(i.​e.​·​SO_REUSEADDR)​.​37 ··​/​/​·​Open·​the·​acceptor·​with·​the·​option·​to·​reuse·​the·​address·​(i.​e.​·​SO_REUSEADDR)​.​
38 ··​asio:​:​ip:​:​tcp:​:​resolver·​resolver(io_context_)​;​38 ··​asio:​:​ip:​:​tcp:​:​resolver·​resolver(io_context_)​;​
39 ··​asio:​:​ip:​:​tcp:​:​endpoint·​endpoint·​=39 ··​asio:​:​ip:​:​tcp:​:​endpoint·​endpoint·​=
40 ····​*resolver.​resolve(address,​·​port)​.​begin()​;​40 ····​*resolver.​resolve(address,​·​port)​.​begin()​;​
41 ··​acceptor_.​open(endpoint.​protocol()​)​;​41 ··​acceptor_.​open(endpoint.​protocol()​)​;​
42 ··​acceptor_.​set_option(asio:​:​ip:​:​tcp:​:​acceptor:​:​reuse_address(true)​)​;​42 ··​acceptor_.​set_option(asio:​:​ip:​:​tcp:​:​acceptor:​:​reuse_address(true)​)​;​
43 ··​acceptor_.​bind(endpoint)​;​43 ··​acceptor_.​bind(endpoint)​;​
44 ··​acceptor_.​listen()​;​44 ··​acceptor_.​listen()​;​
45 45
46 ··start_accept()​;​46 ··do_accept()​;​
47 }47 }
48 48
49 void·​server:​:​run()​49 void·​server:​:​run()​
50 {50 {
51 ··​/​/​·​The·​io_context:​:​run()​·​call·​will·​block·​until·​all·​asynchronous·​operations51 ··​/​/​·​The·​io_context:​:​run()​·​call·​will·​block·​until·​all·​asynchronous·​operations
52 ··​/​/​·​have·​finished.​·​While·​the·​server·​is·​running,​·​there·​is·​always·​at·​least·​one52 ··​/​/​·​have·​finished.​·​While·​the·​server·​is·​running,​·​there·​is·​always·​at·​least·​one
53 ··​/​/​·​asynchronous·​operation·​outstanding:​·​the·​asynchronous·​accept·​call·​waiting53 ··​/​/​·​asynchronous·​operation·​outstanding:​·​the·​asynchronous·​accept·​call·​waiting
54 ··​/​/​·​for·​new·​incoming·​connections.​54 ··​/​/​·​for·​new·​incoming·​connections.​
55 ··​io_context_.​run()​;​55 ··​io_context_.​run()​;​
56 }56 }
57 57
58 void·​server:​:​start_accept()​58 void·​server:​:​do_accept()​
59 {
60 ··new_connection_.​reset(new·connection(io_context​_,​
61 ········connection_manager_,​·request_handler_)​)​;​
62 ··acceptor_.​async_accept(new_conn​ection_-​>socket()​,​
63 ······boost:​:​bind(&server:​:​handle_accept,​·this,​
64 ········asio:​:​placeholders:​:​error)​)​;​
65 }
66
67 void·server:​:​handle_accept(const·asio:​:​error_code&·e)​
68 {59 {
69 ··/​/​·Check·whether·the·server·was·stopped·by·a·signal·before·this·completion60 ··acceptor_.​async_accept(
70 ··/​/​·​handler·had·​a·chance·to·run.​61 ······[this](std:​:​error_code·ec,​·​asio:​:​ip:​:​tcp:​:​socket·socket)​
71 ··if·(!acceptor_.​is_open()​)​62 ······{
72 ··{63 ········/​/​·Check·whether·the·server·was·stopped·by·a·signal·before·this
73 ····​return;​64 ········/​/​·completion·handler·had·a·chance·to·run.​
74 ··}65 ········if·(!acceptor_.​is_open()​)​
75 66 ········{
76 ··if·(!e)​67 ··········return;​
77 ··{68 ········}
78 ····connection_manager_.​start(new_connection_​)​;​69
79 ··}70 ········if·(!ec)​
71 ········​{
72 ··········​connection_manager_.​start(std:​:​make_shared<connectio​n>(
73 ··············​std:​:​move(socket)​,​·​connection_manager_,​·​request_handler_)​)​;​
74 ········​}
80 75
81 ··start_accept()​;​76 ········do_accept()​;​
77 ······​})​;​
82 }78 }
83 79
84 void·​server:​:​handle_stop()​80 void·​server:​:​do_await_stop()​
85 {81 {
86 ··/​/​·The·server·is·​stopped·by·cancelling·all·outstanding·asynchronous82 ··​signals_.​async_wait(
87 ··/​/​·operations.​·Once·all·operations·have·finished·the·​io_context:​:​run()​·call83 ······[this](std:​:​error_code·/​*ec*/​,​·​int·/​*signo*/​)​
88 ··/​/​·will·exit.​84 ······{
89 ··acceptor_.​close()​;​85 ········/​/​·The·server·is·stopped·by·cancelling·all·outstanding·asynchronous
90 ··connection_manager_.​stop_all()​;​86 ········/​/​·operations.​·Once·all·operations·have·finished·the·io_context:​:​run()​
87 ········​/​/​·​call·​will·​exit.​
88 ········​acceptor_.​close()​;​
89 ········​connection_manager_.​stop_all()​;​
90 ······​})​;​
91 }91 }
92 92
93 }·​/​/​·​namespace·​server93 }·​/​/​·​namespace·​server
94 }·​/​/​·​namespace·​http94 }·​/​/​·​namespace·​http

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/http/server/server.hpp.html000066400000000000000000001220371340672067200234710ustar00rootroot00000000000000 HTML Diff http/server/server.hpp
src/​examples/​cpp03/​http/​server/​server.​hppsrc/​examples/​cpp11/​http/​server/​server.​hpp
1 /​/​1 /​/​
2 /​/​·​server.​hpp2 /​/​·​server.​hpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​HTTP_SERVER_HPP11 #ifndef·​HTTP_SERVER_HPP
12 #define·​HTTP_SERVER_HPP12 #define·​HTTP_SERVER_HPP
13 13
14 #include·​<asio.​hpp>14 #include·​<asio.​hpp>
15 #include·​<string>15 #include·​<string>
16 #include·​<boost/​noncopyable.​hpp>
17 #include·​"connection.​hpp"16 #include·​"connection.​hpp"
18 #include·​"connection_manager.​hpp"17 #include·​"connection_manager.​hpp"
19 #include·​"request_handler.​hpp"18 #include·​"request_handler.​hpp"
20 19
21 namespace·​http·​{20 namespace·​http·​{
22 namespace·​server·​{21 namespace·​server·​{
23 22
24 /​/​/​·​The·​top-​level·​class·​of·​the·​HTTP·​server.​23 /​/​/​·​The·​top-​level·​class·​of·​the·​HTTP·​server.​
25 class·​server24 class·​server
26 ··​:​·​private·​boost:​:​noncopyable
27 {25 {
28 public:​26 public:​
27 ··​server(const·​server&)​·​=·​delete;​
28 ··​server&·​operator=(const·​server&)​·​=·​delete;​
29
29 ··​/​/​/​·​Construct·​the·​server·​to·​listen·​on·​the·​specified·​TCP·​address·​and·​port,​·​and30 ··​/​/​/​·​Construct·​the·​server·​to·​listen·​on·​the·​specified·​TCP·​address·​and·​port,​·​and
30 ··​/​/​/​·​serve·​up·​files·​from·​the·​given·​directory.​31 ··​/​/​/​·​serve·​up·​files·​from·​the·​given·​directory.​
31 ··​explicit·​server(const·​std:​:​string&·​address,​·​const·​std:​:​string&·​port,​32 ··​explicit·​server(const·​std:​:​string&·​address,​·​const·​std:​:​string&·​port,​
32 ······​const·​std:​:​string&·​doc_root)​;​33 ······​const·​std:​:​string&·​doc_root)​;​
33 34
34 ··​/​/​/​·​Run·​the·​server's·​io_context·​loop.​35 ··​/​/​/​·​Run·​the·​server's·​io_context·​loop.​
35 ··​void·​run()​;​36 ··​void·​run()​;​
36 37
37 private:​38 private:​
38 ··​/​/​/​·Initiate·​an·​asynchronous·​accept·​operation.​39 ··​/​/​/​·Perform·​an·​asynchronous·​accept·​operation.​
39 ··​void·start_accept()​;​40 ··​void·do_accept()​;​
40
41 ··/​/​/​·Handle·completion·of·an·asynchronous·accept·operation.​
42 ··void·handle_accept(const·asio:​:​error_code&·e)​;​
43 41
44 ··​/​/​/​·Handle·​a·​request·​to·​stop·​the·​server.​42 ··​/​/​/​·Wait·for·​a·​request·​to·​stop·​the·​server.​
45 ··​void·handle_stop()​;​43 ··​void·do_await_stop()​;​
46 44
47 ··​/​/​/​·​The·​io_context·​used·​to·​perform·​asynchronous·​operations.​45 ··​/​/​/​·​The·​io_context·​used·​to·​perform·​asynchronous·​operations.​
48 ··​asio:​:​io_context·​io_context_;​46 ··​asio:​:​io_context·​io_context_;​
49 47
50 ··​/​/​/​·​The·​signal_set·​is·​used·​to·​register·​for·​process·​termination·​notifications.​48 ··​/​/​/​·​The·​signal_set·​is·​used·​to·​register·​for·​process·​termination·​notifications.​
51 ··​asio:​:​signal_set·​signals_;​49 ··​asio:​:​signal_set·​signals_;​
52 50
53 ··​/​/​/​·​Acceptor·​used·​to·​listen·​for·​incoming·​connections.​51 ··​/​/​/​·​Acceptor·​used·​to·​listen·​for·​incoming·​connections.​
54 ··​asio:​:​ip:​:​tcp:​:​acceptor·​acceptor_;​52 ··​asio:​:​ip:​:​tcp:​:​acceptor·​acceptor_;​
55 53
56 ··​/​/​/​·​The·​connection·​manager·​which·​owns·​all·​live·​connections.​54 ··​/​/​/​·​The·​connection·​manager·​which·​owns·​all·​live·​connections.​
57 ··​connection_manager·​connection_manager_;​55 ··​connection_manager·​connection_manager_;​
58 56
59 ··​/​/​/​·​The·​next·​connection·​to·​be·​accepted.​
60 ··​connection_ptr·​new_connection_;​
61
62 ··​/​/​/​·​The·​handler·​for·​all·​incoming·​requests.​57 ··​/​/​/​·​The·​handler·​for·​all·​incoming·​requests.​
63 ··​request_handler·​request_handler_;​58 ··​request_handler·​request_handler_;​
64 };​59 };​
65 60
66 }·​/​/​·​namespace·​server61 }·​/​/​·​namespace·​server
67 }·​/​/​·​namespace·​http62 }·​/​/​·​namespace·​http
68 63
69 #endif·​/​/​·​HTTP_SERVER_HPP64 #endif·​/​/​·​HTTP_SERVER_HPP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/invocation/000077500000000000000000000000001340672067200203665ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/invocation/prioritised_handlers.cpp.html000066400000000000000000004011511340672067200262540ustar00rootroot00000000000000 HTML Diff invocation/prioritised_handlers.cpp
src/​examples/​cpp03/​invocation/​prioritised_handlers.​cppsrc/​examples/​cpp11/​invocation/​prioritised_handlers.​cpp
1 /​/​1 /​/​
2 /​/​·​prioritised_handlers.​cpp2 /​/​·​prioritised_handlers.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"asio.​hpp"11 #include·​"asio.​hpp"
12 #include·​<boost/​function.​hpp>
13 #include·​<iostream>12 #include·​<iostream>
13 #include·​<memory>
14 #include·​<queue>14 #include·​<queue>
15 15
16 using·​asio:​:​ip:​:​tcp;​16 using·​asio:​:​ip:​:​tcp;​
17 17
18 class·​handler_priority_queu​e·​:​·public·​asio:​:​execution_context18 class·​handler_priority_queu​e·​:​·​asio:​:​execution_context
19 {19 {
20 public:​20 public:​
21 ··void·add(int·priority,​·boost:​:​function<void()​>·function)​21 ··​template·<typename·Function>
22 ··​void·​add(int·​priority,​·​Function·​function)​
22 ··​{23 ··​{
23 ····handlers_.​push(queued_handler(p​riority,​·function)​)​;​24 ····std:​:​unique_ptr<queued_han​dler_base>·handler(
25 ········​new·​queued_handler<Functi​on>(
26 ··········​priority,​·​std:​:​move(function)​)​)​;​
27
28 ····​handlers_.​push(std:​:​move(handler)​)​;​
24 ··​}29 ··​}
25 30
26 ··​void·​execute_all()​31 ··​void·​execute_all()​
27 ··​{32 ··​{
28 ····​while·​(!handlers_.​empty()​)​33 ····​while·​(!handlers_.​empty()​)​
29 ····​{34 ····​{
30 ······queued_handler·handler·=·handlers_.​top()​;​35 ······​handlers_.​top()​-​>execute()​;​
31 ······handler.​execute()​;​
32 ······​handlers_.​pop()​;​36 ······​handlers_.​pop()​;​
33 ····​}37 ····​}
34 ··​}38 ··​}
35 39
36 ··​class·​executor40 ··​class·​executor
37 ··​{41 ··​{
38 ··​public:​42 ··​public:​
39 ····​executor(handler_prio​rity_queue&·​q,​·​int·​p)​43 ····​executor(handler_prio​rity_queue&·​q,​·​int·​p)​
40 ······​:​·​context_(q)​,​·​priority_(p)​44 ······​:​·​context_(q)​,​·​priority_(p)​
41 ····​{45 ····​{
42 ····​}46 ····​}
43 47
44 ····​handler_priority_queu​e&·​context()​·​const48 ····​handler_priority_queu​e&·​context()​·​const·noexcept
45 ····​{49 ····​{
46 ······​return·​context_;​50 ······​return·​context_;​
47 ····​}51 ····​}
48 52
49 ····​template·​<typename·​Function,​·​typename·​Allocator>53 ····​template·​<typename·​Function,​·​typename·​Allocator>
50 ····​void·​dispatch(const·Function&·​f,​·​const·​Allocator&)​·​const54 ····​void·​dispatch(Function·​f,​·​const·​Allocator&)​·​const
51 ····​{55 ····​{
52 ······​context_.​add(priority_,​·​f)​;​56 ······​context_.​add(priority_,​·std:​:​move(f)​)​;​
53 ····​}57 ····​}
54 58
55 ····​template·​<typename·​Function,​·​typename·​Allocator>59 ····​template·​<typename·​Function,​·​typename·​Allocator>
56 ····​void·​post(const·Function&·​f,​·​const·​Allocator&)​·​const60 ····​void·​post(Function·​f,​·​const·​Allocator&)​·​const
57 ····​{61 ····​{
58 ······​context_.​add(priority_,​·​f)​;​62 ······​context_.​add(priority_,​·std:​:​move(f)​)​;​
59 ····​}63 ····​}
60 64
61 ····​template·​<typename·​Function,​·​typename·​Allocator>65 ····​template·​<typename·​Function,​·​typename·​Allocator>
62 ····​void·​defer(const·Function&·​f,​·​const·​Allocator&)​·​const66 ····​void·​defer(Function·​f,​·​const·​Allocator&)​·​const
63 ····​{67 ····​{
64 ······​context_.​add(priority_,​·​f)​;​68 ······​context_.​add(priority_,​·std:​:​move(f)​)​;​
65 ····​}69 ····​}
66 70
67 ····​void·​on_work_started()​·​const·​{}71 ····​void·​on_work_started()​·​const·noexcept·​{}
68 ····​void·​on_work_finished()​·​const·​{}72 ····​void·​on_work_finished()​·​const·noexcept·​{}
69 73
70 ····​bool·​operator==(const·​executor&·​other)​·​const74 ····​bool·​operator==(const·​executor&·​other)​·​const·noexcept
71 ····​{75 ····​{
72 ······​return·​&context_·​==·​&other.​context_·​&&·​priority_·​==·​other.​priority_;​76 ······​return·​&context_·​==·​&other.​context_·​&&·​priority_·​==·​other.​priority_;​
73 ····​}77 ····​}
74 78
75 ····​bool·​operator!=(const·​executor&·​other)​·​const79 ····​bool·​operator!=(const·​executor&·​other)​·​const·noexcept
76 ····​{80 ····​{
77 ······​return·​!operator==(other)​;​81 ······​return·​!operator==(other)​;​
78 ····​}82 ····​}
79 83
80 ··​private:​84 ··​private:​
81 ····​handler_priority_queu​e&·​context_;​85 ····​handler_priority_queu​e&·​context_;​
82 ····​int·​priority_;​86 ····​int·​priority_;​
83 ··​};​87 ··​};​
84 88
85 ··​template·​<typename·​Handler>89 ··​template·​<typename·​Handler>
86 ··​asio:​:​executor_binder<Handl​er,​·​executor>90 ··​asio:​:​executor_binder<Handl​er,​·​executor>
87 ··​wrap(int·​priority,​·​Handler·​handler)​91 ··​wrap(int·​priority,​·​Handler·​handler)​
88 ··​{92 ··​{
89 ····​return·​asio:​:​bind_executor(executo​r(*this,​·priority)​,​·handler)​;​93 ····​return·​asio:​:​bind_executor(
94 ········​executor(*this,​·​priority)​,​·​std:​:​move(handler)​)​;​
90 ··​}95 ··​}
91 96
92 private:​97 private:​
93 ··​class·​queued_handler98 ··​class·​queued_handler_base
94 ··​{99 ··​{
95 ··​public:​100 ··​public:​
96 ····​queued_handler(int·p,​·boost:​:​function<void()​>·f)​101 ····​queued_handler_base(i​nt·p)​
97 ······​:​·​priority_(p)​,​·function_(f)​102 ······​:​·​priority_(p)​
98 ····​{103 ····​{
99 ····​}104 ····​}
100 105
101 ····​void·​execute()​106 ····​virtual·~queued_handler_base(​)​
102 ····​{107 ····​{
103 ······​function_()​;​
104 ····​}108 ····​}
105 109
106 ····friend·bool·operator<(const·queued_handler&·a,​110 ····virtual·void·​execute()​·=·0;​
107 ········const·queued_handler&·b)​111
112 ····​friend·​bool·​operator<(const·​std:​:​unique_ptr<queued_han​dler_base>&·​a,​
113 ········​const·​std:​:​unique_ptr<queued_han​dler_base>&·​b)​·​noexcept
108 ····​{114 ····​{
109 ······​return·​a.​priority_·​<·​b.​priority_;​115 ······​return·​a-​>priority_·​<·​b-​>priority_;​
110 ····​}116 ····​}
111 117
112 ··​private:​118 ··​private:​
113 ····​int·​priority_;​119 ····​int·​priority_;​
114 ····​boost:​:​function<void()​>·​function_;​
115 ··​};​120 ··​};​
116 121
117 ··std:​:​priority_queue<queued​_handler>·handlers_;​122 ··​template·<typename·Function>
123 ··​class·​queued_handler·​:​·​public·​queued_handler_base
124 ··​{
125 ··​public:​
126 ····​queued_handler(int·​p,​·​Function·​f)​
127 ······​:​·​queued_handler_base(p​)​,​·​function_(std:​:​move(f)​)​
128 ····​{
129 ····​}
130
131 ····​void·​execute()​·​override
132 ····​{
133 ······​function_()​;​
134 ····​}
135
136 ··​private:​
137 ····​Function·​function_;​
138 ··​};​
139
140 ··​std:​:​priority_queue<std:​:​unique_ptr<queued_han​dler_base>>·​handlers_;​
118 };​141 };​
119 142
120 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​143 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
121 144
122 void·​high_priority_handler​(const·​asio:​:​error_code&·​/​*ec*/​)​145 void·​high_priority_handler​(const·​asio:​:​error_code&·​/​*ec*/​,​
146 ····​tcp:​:​socket·​/​*socket*/​)​
123 {147 {
124 ··​std:​:​cout·​<<·​"High·​priority·​handler\n";​148 ··​std:​:​cout·​<<·​"High·​priority·​handler\n";​
125 }149 }
126 150
127 void·​middle_priority_handl​er(const·​asio:​:​error_code&·​/​*ec*/​)​151 void·​middle_priority_handl​er(const·​asio:​:​error_code&·​/​*ec*/​)​
128 {152 {
129 ··​std:​:​cout·​<<·​"Middle·​priority·​handler\n";​153 ··​std:​:​cout·​<<·​"Middle·​priority·​handler\n";​
130 }154 }
131 155
132 void·​low_priority_handler(​)​156 struct·​low_priority_handler
133 {157 {
134 ··std:​:​cout·<<·"Low·priority·handler\n";​158 ··/​/​·Make·the·handler·a·move-​only·type.​
135 }159 ··low_priority_handler(​)​·=·default;​
160 ··​low_priority_handler(​const·​low_priority_handler&​)​·​=·​delete;​
161 ··​low_priority_handler(​low_priority_handler&​&)​·​=·​default;​
162
163 ··​void·​operator()​()​
164 ··​{
165 ····​std:​:​cout·​<<·​"Low·​priority·​handler\n";​
166 ··​}
167 };​
136 168
137 int·​main()​169 int·​main()​
138 {170 {
139 ··​asio:​:​io_context·​io_context;​171 ··​asio:​:​io_context·​io_context;​
140 172
141 ··​handler_priority_queu​e·​pri_queue;​173 ··​handler_priority_queu​e·​pri_queue;​
142 174
143 ··​/​/​·​Post·​a·​completion·​handler·​to·​be·​run·​immediately.​175 ··​/​/​·​Post·​a·​completion·​handler·​to·​be·​run·​immediately.​
144 ··​asio:​:​post(io_context,​·​pri_queue.​wrap(0,​·​low_priority_handler)​)​;​176 ··​asio:​:​post(io_context,​·​pri_queue.​wrap(0,​·​low_priority_handler(​)​)​)​;​
145 177
146 ··​/​/​·​Start·​an·​asynchronous·​accept·​that·​will·​complete·​immediately.​178 ··​/​/​·​Start·​an·​asynchronous·​accept·​that·​will·​complete·​immediately.​
147 ··​tcp:​:​endpoint·​endpoint(asio:​:​ip:​:​address_v4:​:​loopback()​,​·​0)​;​179 ··​tcp:​:​endpoint·​endpoint(asio:​:​ip:​:​address_v4:​:​loopback()​,​·​0)​;​
148 ··​tcp:​:​acceptor·​acceptor(io_context,​·​endpoint)​;​180 ··​tcp:​:​acceptor·​acceptor(io_context,​·​endpoint)​;​
149 ··​tcp:​:​socket·​server_socket(io_cont​ext)​;​181 ··​tcp:​:​socket·​server_socket(io_cont​ext)​;​
150 ··​acceptor.​async_accept(server_s​ocket,​182 ··​acceptor.​async_accept(pri_queu​e.​wrap(100,​·high_priority_handler​)​)​;​
151 ······pri_queue.​wrap(100,​·high_priority_handler​)​)​;​
152 ··​tcp:​:​socket·​client_socket(io_cont​ext)​;​183 ··​tcp:​:​socket·​client_socket(io_cont​ext)​;​
153 ··​client_socket.​connect(acceptor.​local_endpoint()​)​;​184 ··​client_socket.​connect(acceptor.​local_endpoint()​)​;​
154 185
155 ··​/​/​·​Set·​a·​deadline·​timer·​to·​expire·​immediately.​186 ··​/​/​·​Set·​a·​deadline·​timer·​to·​expire·​immediately.​
156 ··​asio:​:​steady_timer·​timer(io_context)​;​187 ··​asio:​:​steady_timer·​timer(io_context)​;​
157 ··​timer.​expires_at(asio:​:​steady_timer:​:​time_point:​:​min()​)​;​188 ··​timer.​expires_at(asio:​:​steady_timer:​:​clock_type:​:​time_point:​:​min()​)​;​
158 ··​timer.​async_wait(pri_queue.​wrap(42,​·​middle_priority_handl​er)​)​;​189 ··​timer.​async_wait(pri_queue.​wrap(42,​·​middle_priority_handl​er)​)​;​
159 190
160 ··​while·​(io_context.​run_one()​)​191 ··​while·​(io_context.​run_one()​)​
161 ··​{192 ··​{
162 ····​/​/​·​The·​custom·​invocation·​hook·​adds·​the·​handlers·​to·​the·​priority·​queue193 ····​/​/​·​The·​custom·​invocation·​hook·​adds·​the·​handlers·​to·​the·​priority·​queue
163 ····​/​/​·​rather·​than·​executing·​them·​from·​within·​the·​poll_one()​·​call.​194 ····​/​/​·​rather·​than·​executing·​them·​from·​within·​the·​poll_one()​·​call.​
164 ····​while·​(io_context.​poll_one()​)​195 ····​while·​(io_context.​poll_one()​)​
165 ······​;​196 ······​;​
166 197
167 ····​pri_queue.​execute_all()​;​198 ····​pri_queue.​execute_all()​;​
168 ··​}199 ··​}
169 200
170 ··​return·​0;​201 ··​return·​0;​
171 }202 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/iostreams/000077500000000000000000000000001340672067200202235ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/iostreams/http_client.cpp.html000066400000000000000000002135531340672067200242200ustar00rootroot00000000000000 HTML Diff iostreams/http_client.cpp
src/​examples/​cpp03/​iostreams/​http_client.​cppsrc/​examples/​cpp11/​iostreams/​http_client.​cpp
1 /​/​1 /​/​
2 /​/​·​http_client.​cpp2 /​/​·​http_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<iostream>11 #include·​<iostream>
12 #include·​<istream>12 #include·​<istream>
13 #include·​<ostream>13 #include·​<ostream>
14 #include·​<string>14 #include·​<string>
15 #include·​<asio/​ip/​tcp.​hpp>15 #include·​<asio/​ip/​tcp.​hpp>
16 16
17 using·​asio:​:​ip:​:​tcp;​17 using·​asio:​:​ip:​:​tcp;​
18 18
19 int·​main(int·​argc,​·​char*·​argv[])​19 int·​main(int·​argc,​·​char*·​argv[])​
20 {20 {
21 ··​try21 ··​try
22 ··​{22 ··​{
23 ····​if·​(argc·​!=·​3)​23 ····​if·​(argc·​!=·​3)​
24 ····​{24 ····​{
25 ······​std:​:​cout·​<<·​"Usage:​·​http_client·​<server>·​<path>\n";​25 ······​std:​:​cout·​<<·​"Usage:​·​http_client·​<server>·​<path>\n";​
26 ······​std:​:​cout·​<<·​"Example:​\n";​26 ······​std:​:​cout·​<<·​"Example:​\n";​
27 ······​std:​:​cout·​<<·​"··​http_client·​www.​boost.​org·​/​LICENSE_1_0.​txt\n";​27 ······​std:​:​cout·​<<·​"··​http_client·​www.​boost.​org·​/​LICENSE_1_0.​txt\n";​
28 ······​return·​1;​28 ······​return·​1;​
29 ····​}29 ····​}
30 30
31 ····​asio:​:​ip:​:​tcp:​:​iostream·​s;​31 ····​asio:​:​ip:​:​tcp:​:​iostream·​s;​
32 32
33 ····​/​/​·​The·​entire·​sequence·​of·​I/​O·​operations·​must·​complete·​within·​60·​seconds.​33 ····​/​/​·​The·​entire·​sequence·​of·​I/​O·​operations·​must·​complete·​within·​60·​seconds.​
34 ····​/​/​·​If·​an·​expiry·​occurs,​·​the·​socket·​is·​automatically·​closed·​and·​the·​stream34 ····​/​/​·​If·​an·​expiry·​occurs,​·​the·​socket·​is·​automatically·​closed·​and·​the·​stream
35 ····​/​/​·​becomes·​bad.​35 ····​/​/​·​becomes·​bad.​
36 ····​s.​expires_after(asio:​:​chrono:​:​seconds(60)​)​;​36 ····​s.​expires_after(std:​:​chrono:​:​seconds(60)​)​;​
37 37
38 ····​/​/​·​Establish·​a·​connection·​to·​the·​server.​38 ····​/​/​·​Establish·​a·​connection·​to·​the·​server.​
39 ····​s.​connect(argv[1],​·​"http")​;​39 ····​s.​connect(argv[1],​·​"http")​;​
40 ····​if·​(!s)​40 ····​if·​(!s)​
41 ····​{41 ····​{
42 ······​std:​:​cout·​<<·​"Unable·​to·​connect:​·​"·​<<·​s.​error()​.​message()​·​<<·​"\n";​42 ······​std:​:​cout·​<<·​"Unable·​to·​connect:​·​"·​<<·​s.​error()​.​message()​·​<<·​"\n";​
43 ······​return·​1;​43 ······​return·​1;​
44 ····​}44 ····​}
45 45
46 ····​/​/​·​Send·​the·​request.​·​We·​specify·​the·​"Connection:​·​close"·​header·​so·​that·​the46 ····​/​/​·​Send·​the·​request.​·​We·​specify·​the·​"Connection:​·​close"·​header·​so·​that·​the
47 ····​/​/​·​server·​will·​close·​the·​socket·​after·​transmitting·​the·​response.​·​This·​will47 ····​/​/​·​server·​will·​close·​the·​socket·​after·​transmitting·​the·​response.​·​This·​will
48 ····​/​/​·​allow·​us·​to·​treat·​all·​data·​up·​until·​the·​EOF·​as·​the·​content.​48 ····​/​/​·​allow·​us·​to·​treat·​all·​data·​up·​until·​the·​EOF·​as·​the·​content.​
49 ····​s·​<<·​"GET·​"·​<<·​argv[2]·​<<·​"·​HTTP/​1.​0\r\n";​49 ····​s·​<<·​"GET·​"·​<<·​argv[2]·​<<·​"·​HTTP/​1.​0\r\n";​
50 ····​s·​<<·​"Host:​·​"·​<<·​argv[1]·​<<·​"\r\n";​50 ····​s·​<<·​"Host:​·​"·​<<·​argv[1]·​<<·​"\r\n";​
51 ····​s·​<<·​"Accept:​·​*/​*\r\n";​51 ····​s·​<<·​"Accept:​·​*/​*\r\n";​
52 ····​s·​<<·​"Connection:​·​close\r\n\r\n";​52 ····​s·​<<·​"Connection:​·​close\r\n\r\n";​
53 53
54 ····​/​/​·​By·​default,​·​the·​stream·​is·​tied·​with·​itself.​·​This·​means·​that·​the·​stream54 ····​/​/​·​By·​default,​·​the·​stream·​is·​tied·​with·​itself.​·​This·​means·​that·​the·​stream
55 ····​/​/​·​automatically·​flush·​the·​buffered·​output·​before·​attempting·​a·​read.​·​It·​is55 ····​/​/​·​automatically·​flush·​the·​buffered·​output·​before·​attempting·​a·​read.​·​It·​is
56 ····​/​/​·​not·​necessary·​not·​explicitly·​flush·​the·​stream·​at·​this·​point.​56 ····​/​/​·​not·​necessary·​not·​explicitly·​flush·​the·​stream·​at·​this·​point.​
57 57
58 ····​/​/​·​Check·​that·​response·​is·​OK.​58 ····​/​/​·​Check·​that·​response·​is·​OK.​
59 ····​std:​:​string·​http_version;​59 ····​std:​:​string·​http_version;​
60 ····​s·​>>·​http_version;​60 ····​s·​>>·​http_version;​
61 ····​unsigned·​int·​status_code;​61 ····​unsigned·​int·​status_code;​
62 ····​s·​>>·​status_code;​62 ····​s·​>>·​status_code;​
63 ····​std:​:​string·​status_message;​63 ····​std:​:​string·​status_message;​
64 ····​std:​:​getline(s,​·​status_message)​;​64 ····​std:​:​getline(s,​·​status_message)​;​
65 ····​if·​(!s·​||·​http_version.​substr(0,​·​5)​·​!=·​"HTTP/​")​65 ····​if·​(!s·​||·​http_version.​substr(0,​·​5)​·​!=·​"HTTP/​")​
66 ····​{66 ····​{
67 ······​std:​:​cout·​<<·​"Invalid·​response\n";​67 ······​std:​:​cout·​<<·​"Invalid·​response\n";​
68 ······​return·​1;​68 ······​return·​1;​
69 ····​}69 ····​}
70 ····​if·​(status_code·​!=·​200)​70 ····​if·​(status_code·​!=·​200)​
71 ····​{71 ····​{
72 ······​std:​:​cout·​<<·​"Response·​returned·​with·​status·​code·​"·​<<·​status_code·​<<·​"\n";​72 ······​std:​:​cout·​<<·​"Response·​returned·​with·​status·​code·​"·​<<·​status_code·​<<·​"\n";​
73 ······​return·​1;​73 ······​return·​1;​
74 ····​}74 ····​}
75 75
76 ····​/​/​·​Process·​the·​response·​headers,​·​which·​are·​terminated·​by·​a·​blank·​line.​76 ····​/​/​·​Process·​the·​response·​headers,​·​which·​are·​terminated·​by·​a·​blank·​line.​
77 ····​std:​:​string·​header;​77 ····​std:​:​string·​header;​
78 ····​while·​(std:​:​getline(s,​·​header)​·​&&·​header·​!=·​"\r")​78 ····​while·​(std:​:​getline(s,​·​header)​·​&&·​header·​!=·​"\r")​
79 ······​std:​:​cout·​<<·​header·​<<·​"\n";​79 ······​std:​:​cout·​<<·​header·​<<·​"\n";​
80 ····​std:​:​cout·​<<·​"\n";​80 ····​std:​:​cout·​<<·​"\n";​
81 81
82 ····​/​/​·​Write·​the·​remaining·​data·​to·​output.​82 ····​/​/​·​Write·​the·​remaining·​data·​to·​output.​
83 ····​std:​:​cout·​<<·​s.​rdbuf()​;​83 ····​std:​:​cout·​<<·​s.​rdbuf()​;​
84 ··​}84 ··​}
85 ··​catch·​(std:​:​exception&·​e)​85 ··​catch·​(std:​:​exception&·​e)​
86 ··​{86 ··​{
87 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​87 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
88 ··​}88 ··​}
89 89
90 ··​return·​0;​90 ··​return·​0;​
91 }91 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/local/000077500000000000000000000000001340672067200173075ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/local/connect_pair.cpp.html000066400000000000000000004441671340672067200234420ustar00rootroot00000000000000 HTML Diff local/connect_pair.cpp
src/​examples/​cpp03/​local/​connect_pair.​cppsrc/​examples/​cpp11/​local/​connect_pair.​cpp
1 /​/​1 /​/​
2 /​/​·​connect_pair.​cpp2 /​/​·​connect_pair.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<array>
11 #include·​<iostream>12 #include·​<iostream>
12 #include·​<string>13 #include·​<string>
13 #include·​<cctype>14 #include·​<cctype>
14 #include·​<asio.​hpp>15 #include·​<asio.​hpp>
15 #include·​<boost/​array.​hpp>
16 #include·​<boost/​bind.​hpp>
17 16
18 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​17 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
19 18
20 using·​asio:​:​local:​:​stream_protocol;​19 using·​asio:​:​local:​:​stream_protocol;​
21 20
22 class·​uppercase_filter21 class·​uppercase_filter
23 {22 {
24 public:​23 public:​
25 ··​uppercase_filter(asio​:​:​io_context&·io_context)​24 ··​uppercase_filter(stre​am_protocol:​:​socket·sock)​
26 ····​:​·​socket_(io_context)​25 ····​:​·​socket_(std:​:​move(sock)​)​
27 ··​{26 ··​{
28 ··}27 ····read()​;​
29
30 ··stream_protocol:​:​socket&·socket()​
31 ··{
32 ····return·socket_;​
33 ··}
34
35 ··void·start()​
36 ··{
37 ····/​/​·Wait·for·request.​
38 ····socket_.​async_read_some(asio:​:​buffer(data_)​,​
39 ········boost:​:​bind(&uppercase_filte​r:​:​handle_read,​
40 ··········this,​·asio:​:​placeholders:​:​error,​
41 ··········asio:​:​placeholders:​:​bytes_transferred)​)​;​
42 ··​}28 ··​}
43 29
44 private:​30 private:​
45 ··​void·handle_read(const·asio:​:​error_code&·ec,​·std:​:​size_t·size)​31 ··​void·​read()​
46 ··​{32 ··​{
47 ····​if·(!ec)​33 ····socket_.​async_read_some(asio:​:​buffer(data_)​,​
48 ····{34 ········[this](std:​:​error_code·ec,​·std:​:​size_t·size)​
49 ······/​/​·Compute·result.​35 ········{
50 ······for·(std:​:​size_t·i·=·0;​·​i·<·size;​·++i)​36 ··········​if·(!ec)​
51 ········data_[i]·=·std:​:​toupper(data_[i])​;​37 ··········{
52 38 ············/​/​·Compute·result.​
53 ······/​/​·Send·result.​39 ············for·(std:​:​size_t·i·=·0;​·i·<·size;​·++i)​
54 ······asio:​:​async_write(socket_,​·asio:​:​buffer(data_,​·size)​,​40 ··············data_[i]·=·​std:​:​toupper(data_[i])​;​
55 ··········boost:​:​bind(&uppercase_filte​r:​:​handle_write,​41
56 ············this,​·asio:​:​placeholders:​:​error)​)​;​42 ············/​/​·Send·result.​
57 ····}43 ············write(size)​;​
58 ····else44 ··········}
59 ····{45 ··········else
60 ······throw·asio:​:​system_error(ec)​;​46 ··········{
61 ····}47 ············throw·asio:​:​system_error(ec)​;​
62 ··​}48 ··········​}
63 49 ········})​;​
64 ··void·handle_write(const·asio:​:​error_code&·ec)​50 ··}
65 ··{51
66 ····if·(!ec)​52 ··void·write(std:​:​size_t·size)​
67 ····​{53 ··​{
68 ······/​/​·Wait·for·request.​54 ····asio:​:​async_write(socket_,​·asio:​:​buffer(data_,​·size)​,​
69 ······socket_.​async_read_some(asio:​:​buffer(data_)​,​55 ········[this](std:​:​error_code·ec,​·std:​:​size_t·/​*size*/​)​
70 ··········boost:​:​bind(&uppercase_filte​r:​:​handle_read,​56 ········{
71 ············this,​·asio:​:​placeholders:​:​error,​57 ··········​if·(!ec)​
72 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​58 ··········{
73 ····}59 ············/​/​·Wait·for·request.​
74 ····​else60 ············read()​;​
75 ····{61 ··········}
76 ······throw·asio:​:​system_error(ec)​;​62 ··········else
77 ····}63 ··········{
64 ············​throw·​asio:​:​system_error(ec)​;​
65 ··········​}
66 ········​})​;​
78 ··​}67 ··​}
79 68
80 ··​stream_protocol:​:​socket·​socket_;​69 ··​stream_protocol:​:​socket·​socket_;​
81 ··boost:​:​array<char,​·​512>·​data_;​70 ··​std:​:​array<char,​·​512>·​data_;​
82 };​71 };​
83 72
84 void·​run(asio:​:​io_context*·​io_context)​
85 {
86 ··​try
87 ··​{
88 ····​io_context-​>run()​;​
89 ··​}
90 ··​catch·​(std:​:​exception&·​e)​
91 ··​{
92 ····​std:​:​cerr·​<<·​"Exception·​in·​thread:​·​"·​<<·​e.​what()​·​<<·​"\n";​
93 ····​std:​:​exit(1)​;​
94 ··​}
95 }
96
97 int·​main()​73 int·​main()​
98 {74 {
99 ··​try75 ··​try
100 ··​{76 ··​{
101 ····​asio:​:​io_context·​io_context;​77 ····​asio:​:​io_context·​io_context;​
102 78
103 ····​/​/​·​Create·filter·​and·establish·a·connection·to·it.​79 ····​/​/​·​Create·a·connected·pair·and·pass·one·end·to·a·filter.​
104 ····uppercase_filter·filter(io_context)​;​
105 ····​stream_protocol:​:​socket·​socket(io_context)​;​80 ····​stream_protocol:​:​socket·​socket(io_context)​;​
106 ····asio:​:​local:​:​connect_pair(socket,​·​filter.​socket()​)​;​81 ····​stream_protocol:​:​socket·​filter_socket(io_cont​ext)​;​
107 ····​filter.​start()​;​82 ····asio:​:​local:​:​connect_pair(socket,​·​filter_socket)​;​
83 ····​uppercase_filter·​filter(std:​:​move(filter_socket)​)​;​
108 84
109 ····​/​/​·​The·​io_context·​runs·​in·​a·​background·​thread·​to·​perform·​filtering.​85 ····​/​/​·​The·​io_context·​runs·​in·​a·​background·​thread·​to·​perform·​filtering.​
110 ····​asio:​:​thread·​thread(boost:​:​bind(run,​·&io_context)​)​;​86 ····​asio:​:​thread·​thread(
87 ········​[&io_context]()​
88 ········​{
89 ··········​try
90 ··········​{
91 ············​io_context.​run()​;​
92 ··········​}
93 ··········​catch·​(std:​:​exception&·​e)​
94 ··········​{
95 ············​std:​:​cerr·​<<·​"Exception·​in·​thread:​·​"·​<<·​e.​what()​·​<<·​"\n";​
96 ············​std:​:​exit(1)​;​
97 ··········​}
98 ········​})​;​
111 99
112 ····​for·​(;​;​)​100 ····​for·​(;​;​)​
113 ····​{101 ····​{
114 ······​/​/​·​Collect·​request·​from·​user.​102 ······​/​/​·​Collect·​request·​from·​user.​
115 ······​std:​:​cout·​<<·​"Enter·​a·​string:​·​";​103 ······​std:​:​cout·​<<·​"Enter·​a·​string:​·​";​
116 ······​std:​:​string·​request;​104 ······​std:​:​string·​request;​
117 ······​std:​:​getline(std:​:​cin,​·​request)​;​105 ······​std:​:​getline(std:​:​cin,​·​request)​;​
118 106
119 ······​/​/​·​Send·​request·​to·​filter.​107 ······​/​/​·​Send·​request·​to·​filter.​
120 ······​asio:​:​write(socket,​·​asio:​:​buffer(request)​)​;​108 ······​asio:​:​write(socket,​·​asio:​:​buffer(request)​)​;​
121 109
122 ······​/​/​·​Wait·​for·​reply·​from·​filter.​110 ······​/​/​·​Wait·​for·​reply·​from·​filter.​
123 ······​std:​:​vector<char>·​reply(request.​size()​)​;​111 ······​std:​:​vector<char>·​reply(request.​size()​)​;​
124 ······​asio:​:​read(socket,​·​asio:​:​buffer(reply)​)​;​112 ······​asio:​:​read(socket,​·​asio:​:​buffer(reply)​)​;​
125 113
126 ······​/​/​·​Show·​reply·​to·​user.​114 ······​/​/​·​Show·​reply·​to·​user.​
127 ······​std:​:​cout·​<<·​"Result:​·​";​115 ······​std:​:​cout·​<<·​"Result:​·​";​
128 ······​std:​:​cout.​write(&reply[0],​·​request.​size()​)​;​116 ······​std:​:​cout.​write(&reply[0],​·​request.​size()​)​;​
129 ······​std:​:​cout·​<<·​std:​:​endl;​117 ······​std:​:​cout·​<<·​std:​:​endl;​
130 ····​}118 ····​}
131 ··​}119 ··​}
132 ··​catch·​(std:​:​exception&·​e)​120 ··​catch·​(std:​:​exception&·​e)​
133 ··​{121 ··​{
134 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​122 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
135 ····​std:​:​exit(1)​;​123 ····​std:​:​exit(1)​;​
136 ··​}124 ··​}
137 }125 }
138 126
139 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​127 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
140 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​128 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​
141 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​129 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/local/iostream_client.cpp.html000066400000000000000000001103771340672067200241500ustar00rootroot00000000000000 HTML Diff local/iostream_client.cpp
src/​examples/​cpp03/​local/​iostream_client.​cppsrc/​examples/​cpp11/​local/​iostream_client.​cpp
1 /​/​1 /​/​
2 /​/​·​stream_client.​cpp2 /​/​·​stream_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstring>11 #include·​<cstring>
12 #include·​<iostream>12 #include·​<iostream>
13 #include·​"asio.​hpp"13 #include·​"asio.​hpp"
14 14
15 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​15 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
16 16
17 using·​asio:​:​local:​:​stream_protocol;​17 using·​asio:​:​local:​:​stream_protocol;​
18 18
19 enum·{·​max_length·​=·​1024·};​19 constexpr·std:​:​size_t·​max_length·​=·​1024;​
20 20
21 int·​main(int·​argc,​·​char*·​argv[])​21 int·​main(int·​argc,​·​char*·​argv[])​
22 {22 {
23 ··​try23 ··​try
24 ··​{24 ··​{
25 ····​if·​(argc·​!=·​2)​25 ····​if·​(argc·​!=·​2)​
26 ····​{26 ····​{
27 ······​std:​:​cerr·​<<·​"Usage:​·​iostream_client·​<file>\n";​27 ······​std:​:​cerr·​<<·​"Usage:​·​iostream_client·​<file>\n";​
28 ······​return·​1;​28 ······​return·​1;​
29 ····​}29 ····​}
30 30
31 ····​stream_protocol:​:​endpoint·​ep(argv[1])​;​31 ····​stream_protocol:​:​endpoint·​ep(argv[1])​;​
32 ····​stream_protocol:​:​iostream·​s(ep)​;​32 ····​stream_protocol:​:​iostream·​s(ep)​;​
33 ····​if·​(!s)​33 ····​if·​(!s)​
34 ····​{34 ····​{
35 ······​std:​:​cerr·​<<·​"Unable·​to·​connect:​·​"·​<<·​s.​error()​.​message()​·​<<·​std:​:​endl;​35 ······​std:​:​cerr·​<<·​"Unable·​to·​connect:​·​"·​<<·​s.​error()​.​message()​·​<<·​std:​:​endl;​
36 ······​return·​1;​36 ······​return·​1;​
37 ····​}37 ····​}
38 38
39 ····​using·​namespace·​std;​·​/​/​·​For·​strlen.​
40 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​39 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​
41 ····​char·​request[max_length];​40 ····​char·​request[max_length];​
42 ····​std:​:​cin.​getline(request,​·​max_length)​;​41 ····​std:​:​cin.​getline(request,​·​max_length)​;​
43 ····​size_t·​length·​=·​strlen(request)​;​42 ····​size_t·​length·​=·std:​:​strlen(request)​;​
44 ····​s·​<<·​request;​43 ····​s·​<<·​request;​
45 44
46 ····​char·​reply[max_length];​45 ····​char·​reply[max_length];​
47 ····​s.​read(reply,​·​length)​;​46 ····​s.​read(reply,​·​length)​;​
48 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​47 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​
49 ····​std:​:​cout.​write(reply,​·​length)​;​48 ····​std:​:​cout.​write(reply,​·​length)​;​
50 ····​std:​:​cout·​<<·​"\n";​49 ····​std:​:​cout·​<<·​"\n";​
51 ··​}50 ··​}
52 ··​catch·​(std:​:​exception&·​e)​51 ··​catch·​(std:​:​exception&·​e)​
53 ··​{52 ··​{
54 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​53 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
55 ··​}54 ··​}
56 55
57 ··​return·​0;​56 ··​return·​0;​
58 }57 }
59 58
60 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​59 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
61 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​60 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​
62 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​61 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/local/stream_client.cpp.html000066400000000000000000001051341340672067200236130ustar00rootroot00000000000000 HTML Diff local/stream_client.cpp
src/​examples/​cpp03/​local/​stream_client.​cppsrc/​examples/​cpp11/​local/​stream_client.​cpp
1 /​/​1 /​/​
2 /​/​·​stream_client.​cpp2 /​/​·​stream_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<cstring>12 #include·​<cstring>
13 #include·​<iostream>13 #include·​<iostream>
14 #include·​"asio.​hpp"14 #include·​"asio.​hpp"
15 15
16 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​16 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
17 17
18 using·​asio:​:​local:​:​stream_protocol;​18 using·​asio:​:​local:​:​stream_protocol;​
19 19
20 enum·{·​max_length·​=·​1024·};​20 constexpr·std:​:​size_t·​max_length·​=·​1024;​
21 21
22 int·​main(int·​argc,​·​char*·​argv[])​22 int·​main(int·​argc,​·​char*·​argv[])​
23 {23 {
24 ··​try24 ··​try
25 ··​{25 ··​{
26 ····​if·​(argc·​!=·​2)​26 ····​if·​(argc·​!=·​2)​
27 ····​{27 ····​{
28 ······​std:​:​cerr·​<<·​"Usage:​·​stream_client·​<file>\n";​28 ······​std:​:​cerr·​<<·​"Usage:​·​stream_client·​<file>\n";​
29 ······​return·​1;​29 ······​return·​1;​
30 ····​}30 ····​}
31 31
32 ····​asio:​:​io_context·​io_context;​32 ····​asio:​:​io_context·​io_context;​
33 33
34 ····​stream_protocol:​:​socket·​s(io_context)​;​34 ····​stream_protocol:​:​socket·​s(io_context)​;​
35 ····​s.​connect(stream_protoc​ol:​:​endpoint(argv[1])​)​;​35 ····​s.​connect(stream_protoc​ol:​:​endpoint(argv[1])​)​;​
36 36
37 ····​using·​namespace·​std;​·​/​/​·​For·​strlen.​
38 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​37 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​
39 ····​char·​request[max_length];​38 ····​char·​request[max_length];​
40 ····​std:​:​cin.​getline(request,​·​max_length)​;​39 ····​std:​:​cin.​getline(request,​·​max_length)​;​
41 ····​size_t·​request_length·​=·​strlen(request)​;​40 ····​size_t·​request_length·​=·std:​:​strlen(request)​;​
42 ····​asio:​:​write(s,​·​asio:​:​buffer(request,​·​request_length)​)​;​41 ····​asio:​:​write(s,​·​asio:​:​buffer(request,​·​request_length)​)​;​
43 42
44 ····​char·​reply[max_length];​43 ····​char·​reply[max_length];​
45 ····​size_t·​reply_length·​=·​asio:​:​read(s,​44 ····​size_t·​reply_length·​=·​asio:​:​read(s,​
46 ········​asio:​:​buffer(reply,​·​request_length)​)​;​45 ········​asio:​:​buffer(reply,​·​request_length)​)​;​
47 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​46 ····​std:​:​cout·​<<·​"Reply·​is:​·​";​
48 ····​std:​:​cout.​write(reply,​·​reply_length)​;​47 ····​std:​:​cout.​write(reply,​·​reply_length)​;​
49 ····​std:​:​cout·​<<·​"\n";​48 ····​std:​:​cout·​<<·​"\n";​
50 ··​}49 ··​}
51 ··​catch·​(std:​:​exception&·​e)​50 ··​catch·​(std:​:​exception&·​e)​
52 ··​{51 ··​{
53 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​52 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
54 ··​}53 ··​}
55 54
56 ··​return·​0;​55 ··​return·​0;​
57 }56 }
58 57
59 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​58 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
60 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​59 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​
61 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​60 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/local/stream_server.cpp.html000066400000000000000000004150371340672067200236510ustar00rootroot00000000000000 HTML Diff local/stream_server.cpp
src/​examples/​cpp03/​local/​stream_server.​cppsrc/​examples/​cpp11/​local/​stream_server.​cpp
1 /​/​1 /​/​
2 /​/​·​stream_server.​cpp2 /​/​·​stream_server.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<array>
11 #include·​<cstdio>12 #include·​<cstdio>
12 #include·​<iostream>13 #include·​<iostream>
13 #include·​<boost/​array.​hpp>14 #include·​<memory>
14 #include·<boost/​bind.​hpp>
15 #include·<boost/​enable_shared_from_th​is.​hpp>
16 #include·<boost/​shared_ptr.​hpp>
17 #include·​"asio.​hpp"15 #include·​"asio.​hpp"
18 16
19 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​17 #if·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
20 18
21 using·​asio:​:​local:​:​stream_protocol;​19 using·​asio:​:​local:​:​stream_protocol;​
22 20
23 class·​session21 class·​session
24 ··​:​·​public·boost:​:​enable_shared_from_th​is<session>22 ··​:​·​public·​std:​:​enable_shared_from_th​is<session>
25 {23 {
26 public:​24 public:​
27 ··​session(asio:​:​io_context&·io_context)​25 ··​session(stream_protoc​ol:​:​socket·sock)​
28 ····​:​·​socket_(io_context)​26 ····​:​·​socket_(std:​:​move(sock)​)​
29 ··​{27 ··​{
30 ··​}28 ··​}
31 29
32 ··​stream_protocol:​:​socket&·​socket()​
33 ··​{
34 ····​return·​socket_;​
35 ··​}
36
37 ··​void·​start()​30 ··​void·​start()​
38 ··​{31 ··​{
39 ····socket_.​async_read_some(asio:​:​buffer(data_)​,​32 ····do_read()​;​
40 ········boost:​:​bind(&session:​:​handle_read,​
41 ··········shared_from_this()​,​
42 ··········asio:​:​placeholders:​:​error,​
43 ··········asio:​:​placeholders:​:​bytes_transferred)​)​;​
44 ··}
45
46 ··void·handle_read(const·asio:​:​error_code&·error,​
47 ······size_t·bytes_transferred)​
48 ··{
49 ····if·(!error)​
50 ····{
51 ······asio:​:​async_write(socket_,​
52 ··········asio:​:​buffer(data_,​·bytes_transferred)​,​
53 ··········boost:​:​bind(&session:​:​handle_write,​
54 ············shared_from_this()​,​
55 ············asio:​:​placeholders:​:​error)​)​;​
56 ····}
57 ··​}33 ··​}
58 34
59 ··void·handle_write(const·asio:​:​error_code&·error)​35 private:​
36 ··​void·​do_read()​
60 ··​{37 ··​{
61 ····if·​(!error)​38 ····auto·self(shared_from_this​()​)​;​
62 ····{39 ····socket_.​async_read_some(asio:​:​buffer(data_)​,​
63 ······​socket_.​async_read_some(asio:​:​buffer(data_)​,​40 ········[this,​·self](std:​:​error_code·ec,​·std:​:​size_t·length)​
64 ··········boost:​:​bind(&session:​:​handle_read,​41 ········{
65 ············shared_from_this()​,​42 ··········if·(!ec)​
66 ············asio:​:​placeholders:​:​error,​43 ············do_write(length)​;​
67 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​44 ········})​;​
68 ····​}45 ··​}
46
47 ··​void·​do_write(std:​:​size_t·​length)​
48 ··​{
49 ····​auto·​self(shared_from_this​()​)​;​
50 ····​asio:​:​async_write(socket_,​
51 ········​asio:​:​buffer(data_,​·​length)​,​
52 ········​[this,​·​self](std:​:​error_code·​ec,​·​std:​:​size_t·​/​*length*/​)​
53 ········​{
54 ··········​if·​(!ec)​
55 ············​do_read()​;​
56 ········​})​;​
69 ··​}57 ··​}
70 58
71 private:​
72 ··​/​/​·​The·​socket·​used·​to·​communicate·​with·​the·​client.​59 ··​/​/​·​The·​socket·​used·​to·​communicate·​with·​the·​client.​
73 ··​stream_protocol:​:​socket·​socket_;​60 ··​stream_protocol:​:​socket·​socket_;​
74 61
75 ··​/​/​·​Buffer·​used·​to·​store·​data·​received·​from·​the·​client.​62 ··​/​/​·​Buffer·​used·​to·​store·​data·​received·​from·​the·​client.​
76 ··boost:​:​array<char,​·​1024>·​data_;​63 ··​std:​:​array<char,​·​1024>·​data_;​
77 };​64 };​
78 65
79 typedef·​boost:​:​shared_ptr<session>·​session_ptr;​
80
81 class·​server66 class·​server
82 {67 {
83 public:​68 public:​
84 ··​server(asio:​:​io_context&·​io_context,​·​const·​std:​:​string&·​file)​69 ··​server(asio:​:​io_context&·​io_context,​·​const·​std:​:​string&·​file)​
85 ····​:​·​io_context_(io_contex​t)​,​70 ····​:​·acceptor_(io_context,​·stream_protocol:​:​endpoint(file)​)​
86 ······acceptor_(io_context,​·stream_protocol:​:​endpoint(file)​)​
87 ··​{71 ··​{
88 ····session_ptr·new_session(new·session(io_context_)​)​;​72 ····do_accept()​;​
89 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​
90 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​
91 ··········asio:​:​placeholders:​:​error)​)​;​
92 ··​}73 ··​}
93 74
94 ··void·handle_accept(session​_ptr·new_session,​75 private:​
95 ······const·asio:​:​error_code&·error)​76 ··void·do_accept()​
96 ··​{77 ··​{
97 ····if·(!error)​78 ····acceptor_.​async_accept(
98 ····{79 ········[this](std:​:​error_code·ec,​·stream_protocol:​:​socket·socket)​
99 ······new_session-​>start()​;​80 ········{
100 ····}81 ··········if·(!ec)​
82 ··········​{
83 ············​std:​:​make_shared<session>(​std:​:​move(socket)​)​-​>start()​;​
84 ··········​}
101 85
102 ····new_session.​reset(new·session(io_context_)​)​;​86 ··········do_accept()​;​
103 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​87 ········})​;​
104 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​
105 ··········asio:​:​placeholders:​:​error)​)​;​
106 ··​}88 ··​}
107 89
108 private:​
109 ··​asio:​:​io_context&·​io_context_;​
110 ··​stream_protocol:​:​acceptor·​acceptor_;​90 ··​stream_protocol:​:​acceptor·​acceptor_;​
111 };​91 };​
112 92
113 int·​main(int·​argc,​·​char*·​argv[])​93 int·​main(int·​argc,​·​char*·​argv[])​
114 {94 {
115 ··​try95 ··​try
116 ··​{96 ··​{
117 ····​if·​(argc·​!=·​2)​97 ····​if·​(argc·​!=·​2)​
118 ····​{98 ····​{
119 ······​std:​:​cerr·​<<·​"Usage:​·​stream_server·​<file>\n";​99 ······​std:​:​cerr·​<<·​"Usage:​·​stream_server·​<file>\n";​
120 ······​std:​:​cerr·​<<·​"***·​WARNING:​·​existing·​file·​is·​removed·​***\n";​100 ······​std:​:​cerr·​<<·​"***·​WARNING:​·​existing·​file·​is·​removed·​***\n";​
121 ······​return·​1;​101 ······​return·​1;​
122 ····​}102 ····​}
123 103
124 ····​asio:​:​io_context·​io_context;​104 ····​asio:​:​io_context·​io_context;​
125 105
126 ····​std:​:​remove(argv[1])​;​106 ····​std:​:​remove(argv[1])​;​
127 ····​server·​s(io_context,​·​argv[1])​;​107 ····​server·​s(io_context,​·​argv[1])​;​
128 108
129 ····​io_context.​run()​;​109 ····​io_context.​run()​;​
130 ··​}110 ··​}
131 ··​catch·​(std:​:​exception&·​e)​111 ··​catch·​(std:​:​exception&·​e)​
132 ··​{112 ··​{
133 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​113 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
134 ··​}114 ··​}
135 115
136 ··​return·​0;​116 ··​return·​0;​
137 }117 }
138 118
139 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​119 #else·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​
140 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​120 #·​error·​Local·​sockets·​not·​available·​on·​this·​platform.​
141 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​121 #endif·​/​/​·​defined(ASIO_HAS_LOCA​L_SOCKETS)​

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/multicast/000077500000000000000000000000001340672067200202225ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/multicast/receiver.cpp.html000066400000000000000000002544221340672067200235060ustar00rootroot00000000000000 HTML Diff multicast/receiver.cpp
src/​examples/​cpp03/​multicast/​receiver.​cppsrc/​examples/​cpp11/​multicast/​receiver.​cpp
1 /​/​1 /​/​
2 /​/​·​receiver.​cpp2 /​/​·​receiver.​cpp
3 /​/​·​~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<array>
11 #include·​<iostream>12 #include·​<iostream>
12 #include·​<string>13 #include·​<string>
13 #include·​"asio.​hpp"14 #include·​"asio.​hpp"
14 #include·​"boost/​bind.​hpp"
15 15
16 const·​short·​multicast_port·​=·​30001;​16 constexpr·​short·​multicast_port·​=·​30001;​
17 17
18 class·​receiver18 class·​receiver
19 {19 {
20 public:​20 public:​
21 ··​receiver(asio:​:​io_context&·​io_context,​21 ··​receiver(asio:​:​io_context&·​io_context,​
22 ······​const·​asio:​:​ip:​:​address&·​listen_address,​22 ······​const·​asio:​:​ip:​:​address&·​listen_address,​
23 ······​const·​asio:​:​ip:​:​address&·​multicast_address)​23 ······​const·​asio:​:​ip:​:​address&·​multicast_address)​
24 ····​:​·​socket_(io_context)​24 ····​:​·​socket_(io_context)​
25 ··​{25 ··​{
26 ····​/​/​·​Create·​the·​socket·​so·​that·​multiple·​may·​be·​bound·​to·​the·​same·​address.​26 ····​/​/​·​Create·​the·​socket·​so·​that·​multiple·​may·​be·​bound·​to·​the·​same·​address.​
27 ····​asio:​:​ip:​:​udp:​:​endpoint·​listen_endpoint(27 ····​asio:​:​ip:​:​udp:​:​endpoint·​listen_endpoint(
28 ········​listen_address,​·​multicast_port)​;​28 ········​listen_address,​·​multicast_port)​;​
29 ····​socket_.​open(listen_endpoint.​protocol()​)​;​29 ····​socket_.​open(listen_endpoint.​protocol()​)​;​
30 ····​socket_.​set_option(asio:​:​ip:​:​udp:​:​socket:​:​reuse_address(true)​)​;​30 ····​socket_.​set_option(asio:​:​ip:​:​udp:​:​socket:​:​reuse_address(true)​)​;​
31 ····​socket_.​bind(listen_endpoint)​;​31 ····​socket_.​bind(listen_endpoint)​;​
32 32
33 ····​/​/​·​Join·​the·​multicast·​group.​33 ····​/​/​·​Join·​the·​multicast·​group.​
34 ····​socket_.​set_option(34 ····​socket_.​set_option(
35 ········​asio:​:​ip:​:​multicast:​:​join_group(multicast_​address)​)​;​35 ········​asio:​:​ip:​:​multicast:​:​join_group(multicast_​address)​)​;​
36 36
37 ····socket_.​async_receive_from(37 ····do_receive()​;​
38 ········asio:​:​buffer(data_,​·max_length)​,​·sender_endpoint_,​
39 ········boost:​:​bind(&receiver:​:​handle_receive_from,​·this,​
40 ··········asio:​:​placeholders:​:​error,​
41 ··········asio:​:​placeholders:​:​bytes_transferred)​)​;​
42 ··​}38 ··​}
43 39
44 ··void·handle_receive_from(c​onst·asio:​:​error_code&·error,​40 private:​
45 ······size_t·bytes_recvd)​41 ··void·do_receive()​
46 ··​{42 ··​{
47 ····if·(!error)​43 ····socket_.​async_receive_from(
48 ····{44 ········asio:​:​buffer(data_)​,​·sender_endpoint_,​
49 ······​std:​:​cout.​write(data_,​·bytes_recvd)​;​45 ········[this](std:​:​error_code·ec,​·std:​:​size_t·length)​
50 ······std:​:​cout·<<·std:​:​endl;​46 ········{
51 47 ··········if·(!ec)​
52 ······socket_.​async_receive_from(48 ··········{
53 ··········asio:​:​buffer(data_,​·max_length)​,​·sender_endpoint_,​49 ············std:​:​cout.​write(data_.​data()​,​·length)​;​
54 ··········boost:​:​bind(&receiver:​:​handle_receive_from,​·this,​50 ············std:​:​cout·<<·std:​:​endl;​
55 ············asio:​:​placeholders:​:​error,​51
56 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​52 ············​do_receive()​;​
57 ····​}53 ··········​}
54 ········​})​;​
58 ··​}55 ··​}
59 56
60 private:​
61 ··​asio:​:​ip:​:​udp:​:​socket·​socket_;​57 ··​asio:​:​ip:​:​udp:​:​socket·​socket_;​
62 ··​asio:​:​ip:​:​udp:​:​endpoint·​sender_endpoint_;​58 ··​asio:​:​ip:​:​udp:​:​endpoint·​sender_endpoint_;​
63 ··enum·{·max_length·=·​1024·};​59 ··std:​:​array<char,​·​1024>·data_;​
64 ··char·data_[max_length];​
65 };​60 };​
66 61
67 int·​main(int·​argc,​·​char*·​argv[])​62 int·​main(int·​argc,​·​char*·​argv[])​
68 {63 {
69 ··​try64 ··​try
70 ··​{65 ··​{
71 ····​if·​(argc·​!=·​3)​66 ····​if·​(argc·​!=·​3)​
72 ····​{67 ····​{
73 ······​std:​:​cerr·​<<·​"Usage:​·​receiver·​<listen_address>·​<multicast_address>\n​";​68 ······​std:​:​cerr·​<<·​"Usage:​·​receiver·​<listen_address>·​<multicast_address>\n​";​
74 ······​std:​:​cerr·​<<·​"··​For·​IPv4,​·​try:​\n";​69 ······​std:​:​cerr·​<<·​"··​For·​IPv4,​·​try:​\n";​
75 ······​std:​:​cerr·​<<·​"····​receiver·​0.​0.​0.​0·​239.​255.​0.​1\n";​70 ······​std:​:​cerr·​<<·​"····​receiver·​0.​0.​0.​0·​239.​255.​0.​1\n";​
76 ······​std:​:​cerr·​<<·​"··​For·​IPv6,​·​try:​\n";​71 ······​std:​:​cerr·​<<·​"··​For·​IPv6,​·​try:​\n";​
77 ······​std:​:​cerr·​<<·​"····​receiver·​0:​:​0·​ff31:​:​8000:​1234\n";​72 ······​std:​:​cerr·​<<·​"····​receiver·​0:​:​0·​ff31:​:​8000:​1234\n";​
78 ······​return·​1;​73 ······​return·​1;​
79 ····​}74 ····​}
80 75
81 ····​asio:​:​io_context·​io_context;​76 ····​asio:​:​io_context·​io_context;​
82 ····​receiver·​r(io_context,​77 ····​receiver·​r(io_context,​
83 ········​asio:​:​ip:​:​make_address(argv[1])​,​78 ········​asio:​:​ip:​:​make_address(argv[1])​,​
84 ········​asio:​:​ip:​:​make_address(argv[2])​)​;​79 ········​asio:​:​ip:​:​make_address(argv[2])​)​;​
85 ····​io_context.​run()​;​80 ····​io_context.​run()​;​
86 ··​}81 ··​}
87 ··​catch·​(std:​:​exception&·​e)​82 ··​catch·​(std:​:​exception&·​e)​
88 ··​{83 ··​{
89 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​84 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
90 ··​}85 ··​}
91 86
92 ··​return·​0;​87 ··​return·​0;​
93 }88 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/multicast/sender.cpp.html000066400000000000000000002515371340672067200231660ustar00rootroot00000000000000 HTML Diff multicast/sender.cpp
src/​examples/​cpp03/​multicast/​sender.​cppsrc/​examples/​cpp11/​multicast/​sender.​cpp
1 /​/​1 /​/​
2 /​/​·​sender.​cpp2 /​/​·​sender.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<iostream>11 #include·​<iostream>
12 #include·​<sstream>12 #include·​<sstream>
13 #include·​<string>13 #include·​<string>
14 #include·​"asio.​hpp"14 #include·​"asio.​hpp"
15 #include·​"boost/​bind.​hpp"
16 15
17 const·​short·​multicast_port·​=·​30001;​16 constexpr·​short·​multicast_port·​=·​30001;​
18 const·​int·​max_message_count·​=·​10;​17 constexpr·​int·​max_message_count·​=·​10;​
19 18
20 class·​sender19 class·​sender
21 {20 {
22 public:​21 public:​
23 ··​sender(asio:​:​io_context&·​io_context,​22 ··​sender(asio:​:​io_context&·​io_context,​
24 ······​const·​asio:​:​ip:​:​address&·​multicast_address)​23 ······​const·​asio:​:​ip:​:​address&·​multicast_address)​
25 ····​:​·​endpoint_(multicast_a​ddress,​·​multicast_port)​,​24 ····​:​·​endpoint_(multicast_a​ddress,​·​multicast_port)​,​
26 ······​socket_(io_context,​·​endpoint_.​protocol()​)​,​25 ······​socket_(io_context,​·​endpoint_.​protocol()​)​,​
27 ······​timer_(io_context)​,​26 ······​timer_(io_context)​,​
28 ······​message_count_(0)​27 ······​message_count_(0)​
29 ··​{28 ··​{
29 ····​do_send()​;​
30 ··​}
31
32 private:​
33 ··​void·​do_send()​
34 ··​{
30 ····​std:​:​ostringstream·​os;​35 ····​std:​:​ostringstream·​os;​
31 ····​os·​<<·​"Message·​"·​<<·​message_count_++;​36 ····​os·​<<·​"Message·​"·​<<·​message_count_++;​
32 ····​message_·​=·​os.​str()​;​37 ····​message_·​=·​os.​str()​;​
33 38
34 ····​socket_.​async_send_to(39 ····​socket_.​async_send_to(
35 ········​asio:​:​buffer(message_)​,​·​endpoint_,​40 ········​asio:​:​buffer(message_)​,​·​endpoint_,​
36 ········boost:​:​bind(&sender:​:​handle_send_to,​·this,​41 ········[this](std:​:​error_code·ec,​·std:​:​size_t·/​*length*/​)​
37 ··········asio:​:​placeholders:​:​error)​)​;​42 ········{
43 ··········​if·​(!ec·​&&·​message_count_·​<·​max_message_count)​
44 ············​do_timeout()​;​
45 ········​})​;​
38 ··​}46 ··​}
39 47
40 ··​void·handle_send_to(const·asio:​:​error_code&·error)​48 ··​void·​do_timeout()​
41 ··​{49 ··​{
42 ····if·(!error·&&·message_count_·<·max_message_count)​50 ····timer_.​expires_after(std:​:​chrono:​:​seconds(1)​)​;​
43 ····{51 ····timer_.​async_wait(
44 ······timer_.​expires_after(asio:​:​chrono:​:​seconds(1)​)​;​52 ········[this](std:​:​error_code·ec)​
45 ······timer_.​async_wait(53 ········{
46 ··········boost:​:​bind(&sender:​:​handle_timeout,​·this,​54 ··········​if·(!ec)​
47 ············asio:​:​placeholders:​:​error)​)​;​55 ············​do_send()​;​
48 ····​}56 ········​})​;​
49 ··}
50
51 ··void·handle_timeout(const·asio:​:​error_code&·error)​
52 ··{
53 ····if·(!error)​
54 ····{
55 ······std:​:​ostringstream·os;​
56 ······os·<<·"Message·"·<<·message_count_++;​
57 ······message_·=·os.​str()​;​
58
59 ······socket_.​async_send_to(
60 ··········asio:​:​buffer(message_)​,​·endpoint_,​
61 ··········boost:​:​bind(&sender:​:​handle_send_to,​·this,​
62 ············asio:​:​placeholders:​:​error)​)​;​
63 ····}
64 ··​}57 ··​}
65 58
66 private:​59 private:​
67 ··​asio:​:​ip:​:​udp:​:​endpoint·​endpoint_;​60 ··​asio:​:​ip:​:​udp:​:​endpoint·​endpoint_;​
68 ··​asio:​:​ip:​:​udp:​:​socket·​socket_;​61 ··​asio:​:​ip:​:​udp:​:​socket·​socket_;​
69 ··​asio:​:​steady_timer·​timer_;​62 ··​asio:​:​steady_timer·​timer_;​
70 ··​int·​message_count_;​63 ··​int·​message_count_;​
71 ··​std:​:​string·​message_;​64 ··​std:​:​string·​message_;​
72 };​65 };​
73 66
74 int·​main(int·​argc,​·​char*·​argv[])​67 int·​main(int·​argc,​·​char*·​argv[])​
75 {68 {
76 ··​try69 ··​try
77 ··​{70 ··​{
78 ····​if·​(argc·​!=·​2)​71 ····​if·​(argc·​!=·​2)​
79 ····​{72 ····​{
80 ······​std:​:​cerr·​<<·​"Usage:​·​sender·​<multicast_address>\n​";​73 ······​std:​:​cerr·​<<·​"Usage:​·​sender·​<multicast_address>\n​";​
81 ······​std:​:​cerr·​<<·​"··​For·​IPv4,​·​try:​\n";​74 ······​std:​:​cerr·​<<·​"··​For·​IPv4,​·​try:​\n";​
82 ······​std:​:​cerr·​<<·​"····​sender·​239.​255.​0.​1\n";​75 ······​std:​:​cerr·​<<·​"····​sender·​239.​255.​0.​1\n";​
83 ······​std:​:​cerr·​<<·​"··​For·​IPv6,​·​try:​\n";​76 ······​std:​:​cerr·​<<·​"··​For·​IPv6,​·​try:​\n";​
84 ······​std:​:​cerr·​<<·​"····​sender·​ff31:​:​8000:​1234\n";​77 ······​std:​:​cerr·​<<·​"····​sender·​ff31:​:​8000:​1234\n";​
85 ······​return·​1;​78 ······​return·​1;​
86 ····​}79 ····​}
87 80
88 ····​asio:​:​io_context·​io_context;​81 ····​asio:​:​io_context·​io_context;​
89 ····​sender·​s(io_context,​·​asio:​:​ip:​:​make_address(argv[1])​)​;​82 ····​sender·​s(io_context,​·​asio:​:​ip:​:​make_address(argv[1])​)​;​
90 ····​io_context.​run()​;​83 ····​io_context.​run()​;​
91 ··​}84 ··​}
92 ··​catch·​(std:​:​exception&·​e)​85 ··​catch·​(std:​:​exception&·​e)​
93 ··​{86 ··​{
94 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​87 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
95 ··​}88 ··​}
96 89
97 ··​return·​0;​90 ··​return·​0;​
98 }91 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/nonblocking/000077500000000000000000000000001340672067200205205ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/nonblocking/third_party_lib.cpp.html000066400000000000000000006330101340672067200253510ustar00rootroot00000000000000 HTML Diff nonblocking/third_party_lib.cpp
src/​examples/​cpp03/​nonblocking/​third_party_lib.​cppsrc/​examples/​cpp11/​nonblocking/​third_party_lib.​cpp
1 /​/​1 /​/​
2 /​/​·​third_party_lib.​cpp2 /​/​·​third_party_lib.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio.​hpp>11 #include·​<asio.​hpp>
12 #include·​<boost/​array.​hpp>12 #include·​<array>
13 #include·<boost/​bind.​hpp>
14 #include·<boost/​shared_ptr.​hpp>
15 #include·<boost/​enable_shared_from_th​is.​hpp>
16 #include·​<iostream>13 #include·​<iostream>
14 #include·​<memory>
17 15
18 using·​asio:​:​ip:​:​tcp;​16 using·​asio:​:​ip:​:​tcp;​
19 17
20 namespace·​third_party_lib·​{18 namespace·​third_party_lib·​{
21 19
22 /​/​·​Simulation·​of·​a·​third·​party·​library·​that·​wants·​to·​perform·​read·​and·​write20 /​/​·​Simulation·​of·​a·​third·​party·​library·​that·​wants·​to·​perform·​read·​and·​write
23 /​/​·​operations·​directly·​on·​a·​socket.​·​It·​needs·​to·​be·​polled·​to·​determine·​whether21 /​/​·​operations·​directly·​on·​a·​socket.​·​It·​needs·​to·​be·​polled·​to·​determine·​whether
24 /​/​·​it·​requires·​a·​read·​or·​write·​operation,​·​and·​notified·​when·​the·​socket·​is·​ready22 /​/​·​it·​requires·​a·​read·​or·​write·​operation,​·​and·​notified·​when·​the·​socket·​is·​ready
25 /​/​·​for·​reading·​or·​writing.​23 /​/​·​for·​reading·​or·​writing.​
26 class·​session24 class·​session
27 {25 {
28 public:​26 public:​
29 ··​session(tcp:​:​socket&·​socket)​27 ··​session(tcp:​:​socket&·​socket)​
30 ····​:​·​socket_(socket)​,​28 ····​:​·​socket_(socket)​
31 ······state_(reading)​
32 ··​{29 ··​{
33 ··​}30 ··​}
34 31
35 ··​/​/​·​Returns·​true·​if·​the·​third·​party·​library·​wants·​to·​be·​notified·​when·​the32 ··​/​/​·​Returns·​true·​if·​the·​third·​party·​library·​wants·​to·​be·​notified·​when·​the
36 ··​/​/​·​socket·​is·​ready·​for·​reading.​33 ··​/​/​·​socket·​is·​ready·​for·​reading.​
37 ··​bool·​want_read()​·​const34 ··​bool·​want_read()​·​const
38 ··​{35 ··​{
39 ····​return·​state_·​==·​reading;​36 ····​return·​state_·​==·​reading;​
40 ··​}37 ··​}
41 38
42 ··​/​/​·​Notify·​that·​third·​party·​library·​that·​it·​should·​perform·​its·​read·​operation.​39 ··​/​/​·​Notify·​that·​third·​party·​library·​that·​it·​should·​perform·​its·​read·​operation.​
43 ··​void·​do_read(asio:​:​error_code&·​ec)​40 ··​void·​do_read(std:​:​error_code&·​ec)​
44 ··​{41 ··​{
45 ····​if·​(std:​:​size_t·​len·​=·​socket_.​read_some(asio:​:​buffer(data_)​,​·​ec)​)​42 ····​if·​(std:​:​size_t·​len·​=·​socket_.​read_some(asio:​:​buffer(data_)​,​·​ec)​)​
46 ····​{43 ····​{
47 ······​write_buffer_·​=·​asio:​:​buffer(data_,​·​len)​;​44 ······​write_buffer_·​=·​asio:​:​buffer(data_,​·​len)​;​
48 ······​state_·​=·​writing;​45 ······​state_·​=·​writing;​
49 ····​}46 ····​}
50 ··​}47 ··​}
51 48
52 ··​/​/​·​Returns·​true·​if·​the·​third·​party·​library·​wants·​to·​be·​notified·​when·​the49 ··​/​/​·​Returns·​true·​if·​the·​third·​party·​library·​wants·​to·​be·​notified·​when·​the
53 ··​/​/​·​socket·​is·​ready·​for·​writing.​50 ··​/​/​·​socket·​is·​ready·​for·​writing.​
54 ··​bool·​want_write()​·​const51 ··​bool·​want_write()​·​const
55 ··​{52 ··​{
56 ····​return·​state_·​==·​writing;​53 ····​return·​state_·​==·​writing;​
57 ··​}54 ··​}
58 55
59 ··​/​/​·​Notify·​that·​third·​party·​library·​that·​it·​should·​perform·​its·​write·​operation.​56 ··​/​/​·​Notify·​that·​third·​party·​library·​that·​it·​should·​perform·​its·​write·​operation.​
60 ··​void·​do_write(asio:​:​error_code&·​ec)​57 ··​void·​do_write(std:​:​error_code&·​ec)​
61 ··​{58 ··​{
62 ····​if·​(std:​:​size_t·​len·​=·​socket_.​write_some(59 ····​if·​(std:​:​size_t·​len·​=·​socket_.​write_some(
63 ··········​asio:​:​buffer(write_buffer_)​,​·​ec)​)​60 ··········​asio:​:​buffer(write_buffer_)​,​·​ec)​)​
64 ····​{61 ····​{
65 ······​write_buffer_·​=·​write_buffer_·​+·​len;​62 ······​write_buffer_·​=·​write_buffer_·​+·​len;​
66 ······​state_·​=·​asio:​:​buffer_size(write_buf​fer_)​·​>·​0·​?·​writing·​:​·​reading;​63 ······​state_·​=·​asio:​:​buffer_size(write_buf​fer_)​·​>·​0·​?·​writing·​:​·​reading;​
67 ····​}64 ····​}
68 ··​}65 ··​}
69 66
70 private:​67 private:​
71 ··​tcp:​:​socket&·​socket_;​68 ··​tcp:​:​socket&·​socket_;​
72 ··​enum·​{·​reading,​·​writing·​}·​state_;​69 ··​enum·​{·​reading,​·​writing·​}·​state_·=·reading;​
73 ··boost:​:​array<char,​·​128>·​data_;​70 ··​std:​:​array<char,​·​128>·​data_;​
74 ··​asio:​:​const_buffer·​write_buffer_;​71 ··​asio:​:​const_buffer·​write_buffer_;​
75 };​72 };​
76 73
77 }·​/​/​·​namespace·​third_party_lib74 }·​/​/​·​namespace·​third_party_lib
78 75
79 /​/​·​The·​glue·​between·​asio's·​sockets·​and·​the·​third·​party·​library.​76 /​/​·​The·​glue·​between·​asio's·​sockets·​and·​the·​third·​party·​library.​
80 class·​connection77 class·​connection
81 ··​:​·​public·boost:​:​enable_shared_from_th​is<connection>78 ··​:​·​public·​std:​:​enable_shared_from_th​is<connection>
82 {79 {
83 public:​80 public:​
84 ··typedef·boost:​:​shared_ptr<connection​>·pointer;​81 ··connection(tcp:​:​socket·socket)​
85 82 ····:​·socket_(std:​:​move(socket)​)​
86 ··static·pointer·create(asio:​:​io_context&·io_context)​
87 ··{
88 ····return·pointer(new·connection(io_context​)​)​;​
89 ··}
90
91 ··tcp:​:​socket&·socket()​
92 ··​{83 ··​{
93 ····​return·​socket_;​
94 ··​}84 ··​}
95 85
96 ··​void·​start()​86 ··​void·​start()​
97 ··​{87 ··​{
98 ····​/​/​·​Put·​the·​socket·​into·​non-​blocking·​mode.​88 ····​/​/​·​Put·​the·​socket·​into·​non-​blocking·​mode.​
99 ····​socket_.​non_blocking(true)​;​89 ····​socket_.​non_blocking(true)​;​
100 90
101 ····start_operations()​;​91 ····do_operations()​;​
102 ··​}92 ··​}
103 93
104 private:​94 private:​
105 ··connection(asio:​:​io_context&·io_context)​95 ··void·do_operations()​
106 ····:​·socket_(io_context)​,​
107 ······session_impl_(socket_​)​,​
108 ······read_in_progress_(fal​se)​,​
109 ······write_in_progress_(fa​lse)​
110 ··​{96 ··​{
111 ··}97 ····auto·self(shared_from_this​()​)​;​
112 98
113 ··​void·​start_operations()​
114 ··​{
115 ····​/​/​·​Start·​a·​read·​operation·​if·​the·​third·​party·​library·​wants·​one.​99 ····​/​/​·​Start·​a·​read·​operation·​if·​the·​third·​party·​library·​wants·​one.​
116 ····​if·​(session_impl_.​want_read()​·​&&·​!read_in_progress_)​100 ····​if·​(session_impl_.​want_read()​·​&&·​!read_in_progress_)​
117 ····​{101 ····​{
118 ······​read_in_progress_·​=·​true;​102 ······​read_in_progress_·​=·​true;​
119 ······​socket_.​async_wait(tcp:​:​socket:​:​wait_read,​103 ······​socket_.​async_wait(tcp:​:​socket:​:​wait_read,​
120 ··········boost:​:​bind(&connection:​:​handle_read,​104 ··········[this,​·self](std:​:​error_code·ec)​
121 ············shared_from_this()​,​105 ··········{
122 ············asio:​:​placeholders:​:​error)​)​;​106 ············read_in_progress_·=·false;​
107
108 ············​/​/​·​Notify·​third·​party·​library·​that·​it·​can·​perform·​a·​read.​
109 ············​if·​(!ec)​
110 ··············​session_impl_.​do_read(ec)​;​
111
112 ············​/​/​·​The·​third·​party·​library·​successfully·​performed·​a·​read·​on·​the
113 ············​/​/​·​socket.​·​Start·​new·​read·​or·​write·​operations·​based·​on·​what·​it·​now
114 ············​/​/​·​wants.​
115 ············​if·​(!ec·​||·​ec·​==·​asio:​:​error:​:​would_block)​
116 ··············​do_operations()​;​
117
118 ············​/​/​·​Otherwise,​·​an·​error·​occurred.​·​Closing·​the·​socket·​cancels·​any
119 ············​/​/​·​outstanding·​asynchronous·​read·​or·​write·​operations.​·​The
120 ············​/​/​·​connection·​object·​will·​be·​destroyed·​automatically·​once·​those
121 ············​/​/​·​outstanding·​operations·​complete.​
122 ············​else
123 ··············​socket_.​close()​;​
124 ··········​})​;​
123 ····​}125 ····​}
124 126
125 ····​/​/​·​Start·​a·​write·​operation·​if·​the·​third·​party·​library·​wants·​one.​127 ····​/​/​·​Start·​a·​write·​operation·​if·​the·​third·​party·​library·​wants·​one.​
126 ····​if·​(session_impl_.​want_write()​·​&&·​!write_in_progress_)​128 ····​if·​(session_impl_.​want_write()​·​&&·​!write_in_progress_)​
127 ····​{129 ····​{
128 ······​write_in_progress_·​=·​true;​130 ······​write_in_progress_·​=·​true;​
129 ······​socket_.​async_wait(tcp:​:​socket:​:​wait_write,​131 ······​socket_.​async_wait(tcp:​:​socket:​:​wait_write,​
130 ··········boost:​:​bind(&connection:​:​handle_write,​132 ··········[this,​·self](std:​:​error_code·ec)​
131 ············shared_from_this()​,​133 ··········{
132 ············asio:​:​placeholders:​:​error)​)​;​134 ············write_in_progress_·=·false;​
135
136 ············​/​/​·​Notify·​third·​party·​library·​that·​it·​can·​perform·​a·​write.​
137 ············​if·​(!ec)​
138 ··············​session_impl_.​do_write(ec)​;​
139
140 ············​/​/​·​The·​third·​party·​library·​successfully·​performed·​a·​write·​on·​the
141 ············​/​/​·​socket.​·​Start·​new·​read·​or·​write·​operations·​based·​on·​what·​it·​now
142 ············​/​/​·​wants.​
143 ············​if·​(!ec·​||·​ec·​==·​asio:​:​error:​:​would_block)​
144 ··············​do_operations()​;​
145
146 ············​/​/​·​Otherwise,​·​an·​error·​occurred.​·​Closing·​the·​socket·​cancels·​any
147 ············​/​/​·​outstanding·​asynchronous·​read·​or·​write·​operations.​·​The
148 ············​/​/​·​connection·​object·​will·​be·​destroyed·​automatically·​once·​those
149 ············​/​/​·​outstanding·​operations·​complete.​
150 ············​else
151 ··············​socket_.​close()​;​
152 ··········​})​;​
133 ····​}153 ····​}
134 ··​}154 ··​}
135 155
136 ··​void·​handle_read(asio:​:​error_code·​ec)​
137 ··​{
138 ····​read_in_progress_·​=·​false;​
139
140 ····​/​/​·​Notify·​third·​party·​library·​that·​it·​can·​perform·​a·​read.​
141 ····​if·​(!ec)​
142 ······​session_impl_.​do_read(ec)​;​
143
144 ····​/​/​·​The·​third·​party·​library·​successfully·​performed·​a·​read·​on·​the·​socket.​
145 ····​/​/​·​Start·​new·​read·​or·​write·​operations·​based·​on·​what·​it·​now·​wants.​
146 ····​if·​(!ec·​||·​ec·​==·​asio:​:​error:​:​would_block)​
147 ······​start_operations()​;​
148
149 ····​/​/​·​Otherwise,​·​an·​error·​occurred.​·​Closing·​the·​socket·​cancels·​any·​outstanding
150 ····​/​/​·​asynchronous·​read·​or·​write·​operations.​·​The·​connection·​object·​will·​be
151 ····​/​/​·​destroyed·​automatically·​once·​those·​outstanding·​operations·​complete.​
152 ····​else
153 ······​socket_.​close()​;​
154 ··​}
155
156 ··​void·​handle_write(asio:​:​error_code·​ec)​
157 ··​{
158 ····​write_in_progress_·​=·​false;​
159
160 ····​/​/​·​Notify·​third·​party·​library·​that·​it·​can·​perform·​a·​write.​
161 ····​if·​(!ec)​
162 ······​session_impl_.​do_write(ec)​;​
163
164 ····​/​/​·​The·​third·​party·​library·​successfully·​performed·​a·​write·​on·​the·​socket.​
165 ····​/​/​·​Start·​new·​read·​or·​write·​operations·​based·​on·​what·​it·​now·​wants.​
166 ····​if·​(!ec·​||·​ec·​==·​asio:​:​error:​:​would_block)​
167 ······​start_operations()​;​
168
169 ····​/​/​·​Otherwise,​·​an·​error·​occurred.​·​Closing·​the·​socket·​cancels·​any·​outstanding
170 ····​/​/​·​asynchronous·​read·​or·​write·​operations.​·​The·​connection·​object·​will·​be
171 ····​/​/​·​destroyed·​automatically·​once·​those·​outstanding·​operations·​complete.​
172 ····​else
173 ······​socket_.​close()​;​
174 ··​}
175
176 private:​156 private:​
177 ··​tcp:​:​socket·​socket_;​157 ··​tcp:​:​socket·​socket_;​
178 ··​third_party_lib:​:​session·​session_impl_;​158 ··​third_party_lib:​:​session·​session_impl_{socket_​};​
179 ··​bool·​read_in_progress_;​159 ··​bool·​read_in_progress_·=·false;​
180 ··​bool·​write_in_progress_;​160 ··​bool·​write_in_progress_·=·false;​
181 };​161 };​
182 162
183 class·​server163 class·​server
184 {164 {
185 public:​165 public:​
186 ··​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​166 ··​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​
187 ····​:​·​acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·​port)​)​167 ····​:​·​acceptor_(io_context,​·{tcp:​:​v4()​,​·​port})​
188 ··​{168 ··​{
189 ····start_accept()​;​169 ····do_accept()​;​
190 ··​}170 ··​}
191 171
192 private:​172 private:​
193 ··​void·start_accept()​173 ··​void·do_accept()​
194 ··​{174 ··​{
195 ····connection:​:​pointer·new_connection·=175 ····acceptor_.​async_accept(
196 ······connection:​:​create(acceptor_.​get_executor()​.​context()​)​;​176 ········[this](std:​:​error_code·ec,​·tcp:​:​socket·socket)​
197 177 ········{
198 ····acceptor_.​async_accept(new_conn​ection-​>socket()​,​178 ··········if·(!ec)​
199 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_connection,​179 ··········{
200 ··········asio:​:​placeholders:​:​error)​)​;​180 ············std:​:​make_shared<connectio​n>(std:​:​move(socket)​)​-​>start()​;​
201 ··​}181 ··········​}
202
203 ··void·handle_accept(connect​ion:​:​pointer·new_connection,​
204 ······const·asio:​:​error_code&·error)​
205 ··{
206 ····if·(!error)​
207 ····{
208 ······new_connection-​>start()​;​
209 ····}
210 182
211 ····start_accept()​;​183 ··········do_accept()​;​
184 ········​})​;​
212 ··​}185 ··​}
213 186
214 ··​tcp:​:​acceptor·​acceptor_;​187 ··​tcp:​:​acceptor·​acceptor_;​
215 };​188 };​
216 189
217 int·​main(int·​argc,​·​char*·​argv[])​190 int·​main(int·​argc,​·​char*·​argv[])​
218 {191 {
219 ··​try192 ··​try
220 ··​{193 ··​{
221 ····​if·​(argc·​!=·​2)​194 ····​if·​(argc·​!=·​2)​
222 ····​{195 ····​{
223 ······​std:​:​cerr·​<<·​"Usage:​·​third_party_lib·​<port>\n";​196 ······​std:​:​cerr·​<<·​"Usage:​·​third_party_lib·​<port>\n";​
224 ······​return·​1;​197 ······​return·​1;​
225 ····​}198 ····​}
226 199
227 ····​asio:​:​io_context·​io_context;​200 ····​asio:​:​io_context·​io_context;​
228 201
229 ····using·namespace·​std;​·/​/​·For·atoi.​202 ····server·s(io_context,​·​std:​:​atoi(argv[1])​)​;​
230 ····server·s(io_context,​·atoi(argv[1])​)​;​
231 203
232 ····​io_context.​run()​;​204 ····​io_context.​run()​;​
233 ··​}205 ··​}
234 ··​catch·​(std:​:​exception&·​e)​206 ··​catch·​(std:​:​exception&·​e)​
235 ··​{207 ··​{
236 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​208 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
237 ··​}209 ··​}
238 210
239 ··​return·​0;​211 ··​return·​0;​
240 }212 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/operations/000077500000000000000000000000001340672067200204005ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/operations/composed_1.cpp.html000066400000000000000000000032721340672067200241040ustar00rootroot00000000000000 HTML Diff operations/composed_1.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/operations/composed_2.cpp.html000066400000000000000000000032721340672067200241050ustar00rootroot00000000000000 HTML Diff operations/composed_2.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/operations/composed_3.cpp.html000066400000000000000000000032721340672067200241060ustar00rootroot00000000000000 HTML Diff operations/composed_3.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/operations/composed_4.cpp.html000066400000000000000000000032721340672067200241070ustar00rootroot00000000000000 HTML Diff operations/composed_4.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/operations/composed_5.cpp.html000066400000000000000000000032721340672067200241100ustar00rootroot00000000000000 HTML Diff operations/composed_5.cpp

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/socks4/000077500000000000000000000000001340672067200174235ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/socks4/socks4.hpp.html000066400000000000000000002523011340672067200223100ustar00rootroot00000000000000 HTML Diff socks4/socks4.hpp
src/​examples/​cpp03/​socks4/​socks4.​hppsrc/​examples/​cpp11/​socks4/​socks4.​hpp
1 /​/​1 /​/​
2 /​/​·​socks4.​hpp2 /​/​·​socks4.​hpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #ifndef·​SOCKS4_HPP11 #ifndef·​SOCKS4_HPP
12 #define·​SOCKS4_HPP12 #define·​SOCKS4_HPP
13 13
14 #include·​<array>
14 #include·​<string>15 #include·​<string>
15 #include·​<asio.​hpp>16 #include·​<asio/​buffer.​hpp>
16 #include·​<boost/​array.​hpp>17 #include·​<asio/​ip/​tcp.​hpp>
17 18
18 namespace·​socks4·​{19 namespace·​socks4·​{
19 20
20 const·​unsigned·​char·​version·​=·​0x04;​21 const·​unsigned·​char·​version·​=·​0x04;​
21 22
22 class·​request23 class·​request
23 {24 {
24 public:​25 public:​
25 ··​enum·​command_type26 ··​enum·​command_type
26 ··​{27 ··​{
27 ····​connect·​=·​0x01,​28 ····​connect·​=·​0x01,​
28 ····​bind·​=·​0x0229 ····​bind·​=·​0x02
29 ··​};​30 ··​};​
30 31
31 ··​request(command_type·​cmd,​·​const·​asio:​:​ip:​:​tcp:​:​endpoint&·​endpoint,​32 ··​request(command_type·​cmd,​·​const·​asio:​:​ip:​:​tcp:​:​endpoint&·​endpoint,​
32 ······​const·​std:​:​string&·​user_id)​33 ······​const·​std:​:​string&·​user_id)​
33 ····​:​·​version_(version)​,​34 ····​:​·​version_(version)​,​
34 ······​command_(cmd)​,​35 ······​command_(cmd)​,​
35 ······​user_id_(user_id)​,​36 ······​user_id_(user_id)​,​
36 ······​null_byte_(0)​37 ······​null_byte_(0)​
37 ··​{38 ··​{
38 ····​/​/​·​Only·​IPv4·​is·​supported·​by·​the·​SOCKS·​4·​protocol.​39 ····​/​/​·​Only·​IPv4·​is·​supported·​by·​the·​SOCKS·​4·​protocol.​
39 ····​if·​(endpoint.​protocol()​·​!=·​asio:​:​ip:​:​tcp:​:​v4()​)​40 ····​if·​(endpoint.​protocol()​·​!=·​asio:​:​ip:​:​tcp:​:​v4()​)​
40 ····​{41 ····​{
41 ······​throw·​asio:​:​system_error(42 ······​throw·​asio:​:​system_error(
42 ··········​asio:​:​error:​:​address_family_not_su​pported)​;​43 ··········​asio:​:​error:​:​address_family_not_su​pported)​;​
43 ····​}44 ····​}
44 45
45 ····​/​/​·​Convert·​port·​number·​to·​network·​byte·​order.​46 ····​/​/​·​Convert·​port·​number·​to·​network·​byte·​order.​
46 ····​unsigned·​short·​port·​=·​endpoint.​port()​;​47 ····​unsigned·​short·​port·​=·​endpoint.​port()​;​
47 ····​port_high_byte_·​=·​(port·​>>·​8)​·​&·​0xff;​48 ····​port_high_byte_·​=·​(port·​>>·​8)​·​&·​0xff;​
48 ····​port_low_byte_·​=·​port·​&·​0xff;​49 ····​port_low_byte_·​=·​port·​&·​0xff;​
49 50
50 ····​/​/​·​Save·​IP·​address·​in·​network·​byte·​order.​51 ····​/​/​·​Save·​IP·​address·​in·​network·​byte·​order.​
51 ····​address_·​=·​endpoint.​address()​.​to_v4()​.​to_bytes()​;​52 ····​address_·​=·​endpoint.​address()​.​to_v4()​.​to_bytes()​;​
52 ··​}53 ··​}
53 54
54 ··boost:​:​array<asio:​:​const_buffer,​·​7>·​buffers()​·​const55 ··​std:​:​array<asio:​:​const_buffer,​·​7>·​buffers()​·​const
55 ··​{56 ··​{
56 ····boost:​:​array<asio:​:​const_buffer,​·7>·bufs·=57 ····​return
57 ····​{58 ····​{
58 ······​{59 ······​{
59 ········​asio:​:​buffer(&version_,​·​1)​,​60 ········​asio:​:​buffer(&version_,​·​1)​,​
60 ········​asio:​:​buffer(&command_,​·​1)​,​61 ········​asio:​:​buffer(&command_,​·​1)​,​
61 ········​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​62 ········​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​
62 ········​asio:​:​buffer(&port_low_byte​_,​·​1)​,​63 ········​asio:​:​buffer(&port_low_byte​_,​·​1)​,​
63 ········​asio:​:​buffer(address_)​,​64 ········​asio:​:​buffer(address_)​,​
64 ········​asio:​:​buffer(user_id_)​,​65 ········​asio:​:​buffer(user_id_)​,​
65 ········​asio:​:​buffer(&null_byte_,​·​1)​66 ········​asio:​:​buffer(&null_byte_,​·​1)​
66 ······​}67 ······​}
67 ····​};​68 ····​};​
68 ····​return·​bufs;​
69 ··​}69 ··​}
70 70
71 private:​71 private:​
72 ··​unsigned·​char·​version_;​72 ··​unsigned·​char·​version_;​
73 ··​unsigned·​char·​command_;​73 ··​unsigned·​char·​command_;​
74 ··​unsigned·​char·​port_high_byte_;​74 ··​unsigned·​char·​port_high_byte_;​
75 ··​unsigned·​char·​port_low_byte_;​75 ··​unsigned·​char·​port_low_byte_;​
76 ··​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​76 ··​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​
77 ··​std:​:​string·​user_id_;​77 ··​std:​:​string·​user_id_;​
78 ··​unsigned·​char·​null_byte_;​78 ··​unsigned·​char·​null_byte_;​
79 };​79 };​
80 80
81 class·​reply81 class·​reply
82 {82 {
83 public:​83 public:​
84 ··​enum·​status_type84 ··​enum·​status_type
85 ··​{85 ··​{
86 ····​request_granted·​=·​0x5a,​86 ····​request_granted·​=·​0x5a,​
87 ····​request_failed·​=·​0x5b,​87 ····​request_failed·​=·​0x5b,​
88 ····​request_failed_no_ide​ntd·​=·​0x5c,​88 ····​request_failed_no_ide​ntd·​=·​0x5c,​
89 ····​request_failed_bad_us​er_id·​=·​0x5d89 ····​request_failed_bad_us​er_id·​=·​0x5d
90 ··​};​90 ··​};​
91 91
92 ··​reply()​92 ··​reply()​
93 ····​:​·​null_byte_(0)​,​93 ····​:​·​null_byte_(0)​,​
94 ······​status_()​94 ······​status_()​
95 ··​{95 ··​{
96 ··​}96 ··​}
97 97
98 ··boost:​:​array<asio:​:​mutable_buffer,​·​5>·​buffers()​98 ··​std:​:​array<asio:​:​mutable_buffer,​·​5>·​buffers()​
99 ··​{99 ··​{
100 ····boost:​:​array<asio:​:​mutable_buffer,​·5>·bufs·=100 ····​return
101 ····​{101 ····​{
102 ······​{102 ······​{
103 ········​asio:​:​buffer(&null_byte_,​·​1)​,​103 ········​asio:​:​buffer(&null_byte_,​·​1)​,​
104 ········​asio:​:​buffer(&status_,​·​1)​,​104 ········​asio:​:​buffer(&status_,​·​1)​,​
105 ········​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​105 ········​asio:​:​buffer(&port_high_byt​e_,​·​1)​,​
106 ········​asio:​:​buffer(&port_low_byte​_,​·​1)​,​106 ········​asio:​:​buffer(&port_low_byte​_,​·​1)​,​
107 ········​asio:​:​buffer(address_)​107 ········​asio:​:​buffer(address_)​
108 ······​}108 ······​}
109 ····​};​109 ····​};​
110 ····​return·​bufs;​
111 ··​}110 ··​}
112 111
113 ··​bool·​success()​·​const112 ··​bool·​success()​·​const
114 ··​{113 ··​{
115 ····​return·​null_byte_·​==·​0·​&&·​status_·​==·​request_granted;​114 ····​return·​null_byte_·​==·​0·​&&·​status_·​==·​request_granted;​
116 ··​}115 ··​}
117 116
118 ··​unsigned·​char·​status()​·​const117 ··​unsigned·​char·​status()​·​const
119 ··​{118 ··​{
120 ····​return·​status_;​119 ····​return·​status_;​
121 ··​}120 ··​}
122 121
123 ··​asio:​:​ip:​:​tcp:​:​endpoint·​endpoint()​·​const122 ··​asio:​:​ip:​:​tcp:​:​endpoint·​endpoint()​·​const
124 ··​{123 ··​{
125 ····​unsigned·​short·​port·​=·​port_high_byte_;​124 ····​unsigned·​short·​port·​=·​port_high_byte_;​
126 ····​port·​=·​(port·​<<·​8)​·​&·​0xff00;​125 ····​port·​=·​(port·​<<·​8)​·​&·​0xff00;​
127 ····​port·​=·​port·​|·​port_low_byte_;​126 ····​port·​=·​port·​|·​port_low_byte_;​
128 127
129 ····​asio:​:​ip:​:​address_v4·​address(address_)​;​128 ····​asio:​:​ip:​:​address_v4·​address(address_)​;​
130 129
131 ····​return·​asio:​:​ip:​:​tcp:​:​endpoint(address,​·​port)​;​130 ····​return·​asio:​:​ip:​:​tcp:​:​endpoint(address,​·​port)​;​
132 ··​}131 ··​}
133 132
134 private:​133 private:​
135 ··​unsigned·​char·​null_byte_;​134 ··​unsigned·​char·​null_byte_;​
136 ··​unsigned·​char·​status_;​135 ··​unsigned·​char·​status_;​
137 ··​unsigned·​char·​port_high_byte_;​136 ··​unsigned·​char·​port_high_byte_;​
138 ··​unsigned·​char·​port_low_byte_;​137 ··​unsigned·​char·​port_low_byte_;​
139 ··​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​138 ··​asio:​:​ip:​:​address_v4:​:​bytes_type·​address_;​
140 };​139 };​
141 140
142 }·​/​/​·​namespace·​socks4141 }·​/​/​·​namespace·​socks4
143 142
144 #endif·​/​/​·​SOCKS4_HPP143 #endif·​/​/​·​SOCKS4_HPP

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/socks4/sync_client.cpp.html000066400000000000000000002316221340672067200234120ustar00rootroot00000000000000 HTML Diff socks4/sync_client.cpp
src/​examples/​cpp03/​socks4/​sync_client.​cppsrc/​examples/​cpp11/​socks4/​sync_client.​cpp
1 /​/​1 /​/​
2 /​/​·​sync_client.​cpp2 /​/​·​sync_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<array>
11 #include·​<iostream>12 #include·​<iostream>
12 #include·​<iomanip>13 #include·​<iomanip>
13 #include·​<ostream>14 #include·​<ostream>
14 #include·​<string>15 #include·​<string>
15 #include·​<asio.​hpp>16 #include·​<asio.​hpp>
16 #include·​<boost/​array.​hpp>
17 #include·​"socks4.​hpp"17 #include·​"socks4.​hpp"
18 18
19 using·​asio:​:​ip:​:​tcp;​19 using·​asio:​:​ip:​:​tcp;​
20 20
21 int·​main(int·​argc,​·​char*·​argv[])​21 int·​main(int·​argc,​·​char*·​argv[])​
22 {22 {
23 ··​try23 ··​try
24 ··​{24 ··​{
25 ····​if·​(argc·​!=·​4)​25 ····​if·​(argc·​!=·​4)​
26 ····​{26 ····​{
27 ······​std:​:​cout·​<<·​"Usage:​·​sync_client·​<socks4server>·​<socks4port>·​<user>\n";​27 ······​std:​:​cout·​<<·​"Usage:​·​sync_client·​<socks4server>·​<socks4port>·​<user>\n";​
28 ······​std:​:​cout·​<<·​"Examples:​\n";​28 ······​std:​:​cout·​<<·​"Examples:​\n";​
29 ······​std:​:​cout·​<<·​"··​sync_client·​127.​0.​0.​1·​1080·​chris\n";​29 ······​std:​:​cout·​<<·​"··​sync_client·​127.​0.​0.​1·​1080·​chris\n";​
30 ······​std:​:​cout·​<<·​"··​sync_client·​localhost·​socks·​chris\n";​30 ······​std:​:​cout·​<<·​"··​sync_client·​localhost·​socks·​chris\n";​
31 ······​return·​1;​31 ······​return·​1;​
32 ····​}32 ····​}
33 33
34 ····​asio:​:​io_context·​io_context;​34 ····​asio:​:​io_context·​io_context;​
35 35
36 ····​/​/​·​Get·​a·​list·​of·​endpoints·​corresponding·​to·​the·​SOCKS·​4·​server·​name.​36 ····​/​/​·​Get·​a·​list·​of·​endpoints·​corresponding·​to·​the·​SOCKS·​4·​server·​name.​
37 ····​tcp:​:​resolver·​resolver(io_context)​;​37 ····​tcp:​:​resolver·​resolver(io_context)​;​
38 ····tcp:​:​resolver:​:​results_type·​endpoints·​=·​resolver.​resolve(argv[1],​·​argv[2])​;​38 ····auto·​endpoints·​=·​resolver.​resolve(argv[1],​·​argv[2])​;​
39 39
40 ····​/​/​·​Try·​each·​endpoint·​until·​we·​successfully·​establish·​a·​connection·​to·​the40 ····​/​/​·​Try·​each·​endpoint·​until·​we·​successfully·​establish·​a·​connection·​to·​the
41 ····​/​/​·​SOCKS·​4·​server.​41 ····​/​/​·​SOCKS·​4·​server.​
42 ····​tcp:​:​socket·​socket(io_context)​;​42 ····​tcp:​:​socket·​socket(io_context)​;​
43 ····​asio:​:​connect(socket,​·​endpoints)​;​43 ····​asio:​:​connect(socket,​·​endpoints)​;​
44 44
45 ····​/​/​·​Get·​an·​endpoint·​for·​the·​Boost·​website.​·​This·​will·​be·​passed·​to·​the·​SOCKS45 ····​/​/​·​Get·​an·​endpoint·​for·​the·​Boost·​website.​·​This·​will·​be·​passed·​to·​the·​SOCKS
46 ····​/​/​·​4·​server.​·​Explicitly·​specify·​IPv4·​since·​SOCKS·​4·​does·​not·​support·​IPv6.​46 ····​/​/​·​4·​server.​·​Explicitly·​specify·​IPv4·​since·​SOCKS·​4·​does·​not·​support·​IPv6.​
47 ····​tcp:​:​endpoint·http_endpoint·=47 ····auto·http_endpoint·=·*resolver.​resolve(tcp:​:​v4()​,​·"www.​boost.​org",​·"http")​;​
48 ······*resolver.​resolve(tcp:​:​v4()​,​·"www.​boost.​org",​·"http")​.​begin()​;​
49 48
50 ····​/​/​·​Send·​the·​request·​to·​the·​SOCKS·​4·​server.​49 ····​/​/​·​Send·​the·​request·​to·​the·​SOCKS·​4·​server.​
51 ····​socks4:​:​request·​socks_request(50 ····​socks4:​:​request·​socks_request(
52 ········​socks4:​:​request:​:​connect,​·​http_endpoint,​·​argv[3])​;​51 ········​socks4:​:​request:​:​connect,​·​http_endpoint,​·​argv[3])​;​
53 ····​asio:​:​write(socket,​·​socks_request.​buffers()​)​;​52 ····​asio:​:​write(socket,​·​socks_request.​buffers()​)​;​
54 53
55 ····​/​/​·​Receive·​a·​response·​from·​the·​SOCKS·​4·​server.​54 ····​/​/​·​Receive·​a·​response·​from·​the·​SOCKS·​4·​server.​
56 ····​socks4:​:​reply·​socks_reply;​55 ····​socks4:​:​reply·​socks_reply;​
57 ····​asio:​:​read(socket,​·​socks_reply.​buffers()​)​;​56 ····​asio:​:​read(socket,​·​socks_reply.​buffers()​)​;​
58 57
59 ····​/​/​·​Check·​whether·​we·​successfully·​negotiated·​with·​the·​SOCKS·​4·​server.​58 ····​/​/​·​Check·​whether·​we·​successfully·​negotiated·​with·​the·​SOCKS·​4·​server.​
60 ····​if·​(!socks_reply.​success()​)​59 ····​if·​(!socks_reply.​success()​)​
61 ····​{60 ····​{
62 ······​std:​:​cout·​<<·​"Connection·​failed.​\n";​61 ······​std:​:​cout·​<<·​"Connection·​failed.​\n";​
63 ······​std:​:​cout·​<<·​"status·​=·​0x"·​<<·​std:​:​hex·​<<·​socks_reply.​status()​;​62 ······​std:​:​cout·​<<·​"status·​=·​0x"·​<<·​std:​:​hex·​<<·​socks_reply.​status()​;​
64 ······​return·​1;​63 ······​return·​1;​
65 ····​}64 ····​}
66 65
67 ····​/​/​·​Form·​the·​HTTP·​request.​·​We·​specify·​the·​"Connection:​·​close"·​header·​so·​that66 ····​/​/​·​Form·​the·​HTTP·​request.​·​We·​specify·​the·​"Connection:​·​close"·​header·​so·​that
68 ····​/​/​·​the·​server·​will·​close·​the·​socket·​after·​transmitting·​the·​response.​·​This67 ····​/​/​·​the·​server·​will·​close·​the·​socket·​after·​transmitting·​the·​response.​·​This
69 ····​/​/​·​will·​allow·​us·​to·​treat·​all·​data·​up·​until·​the·​EOF·​as·​the·​response.​68 ····​/​/​·​will·​allow·​us·​to·​treat·​all·​data·​up·​until·​the·​EOF·​as·​the·​response.​
70 ····​std:​:​string·​request·​=69 ····​std:​:​string·​request·​=
71 ······​"GET·​/​·​HTTP/​1.​0\r\n"70 ······​"GET·​/​·​HTTP/​1.​0\r\n"
72 ······​"Host:​·​www.​boost.​org\r\n"71 ······​"Host:​·​www.​boost.​org\r\n"
73 ······​"Accept:​·​*/​*\r\n"72 ······​"Accept:​·​*/​*\r\n"
74 ······​"Connection:​·​close\r\n\r\n";​73 ······​"Connection:​·​close\r\n\r\n";​
75 74
76 ····​/​/​·​Send·​the·​HTTP·​request.​75 ····​/​/​·​Send·​the·​HTTP·​request.​
77 ····​asio:​:​write(socket,​·​asio:​:​buffer(request)​)​;​76 ····​asio:​:​write(socket,​·​asio:​:​buffer(request)​)​;​
78 77
79 ····​/​/​·​Read·​until·​EOF,​·​writing·​data·​to·​output·​as·​we·​go.​78 ····​/​/​·​Read·​until·​EOF,​·​writing·​data·​to·​output·​as·​we·​go.​
80 ····boost:​:​array<char,​·​512>·​response;​79 ····​std:​:​array<char,​·​512>·​response;​
81 ····asio:​:​error_code·​error;​80 ····​std:​:​error_code·​error;​
82 ····​while·​(std:​:​size_t·​s·​=·​socket.​read_some(81 ····​while·​(std:​:​size_t·​s·​=·​socket.​read_some(
83 ··········​asio:​:​buffer(response)​,​·​error)​)​82 ··········​asio:​:​buffer(response)​,​·​error)​)​
84 ······​std:​:​cout.​write(response.​data()​,​·​s)​;​83 ······​std:​:​cout.​write(response.​data()​,​·​s)​;​
85 ····​if·​(error·​!=·​asio:​:​error:​:​eof)​84 ····​if·​(error·​!=·​asio:​:​error:​:​eof)​
86 ······​throw·asio:​:​system_error(error)​;​85 ······​throw·​std:​:​system_error(error)​;​
87 ··​}86 ··​}
88 ··​catch·​(std:​:​exception&·​e)​87 ··​catch·​(std:​:​exception&·​e)​
89 ··​{88 ··​{
90 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​89 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
91 ··​}90 ··​}
92 91
93 ··​return·​0;​92 ··​return·​0;​
94 }93 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/spawn/000077500000000000000000000000001340672067200173455ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/spawn/echo_server.cpp.html000066400000000000000000002610751340672067200233330ustar00rootroot00000000000000 HTML Diff spawn/echo_server.cpp
src/​examples/​cpp03/​spawn/​echo_server.​cppsrc/​examples/​cpp11/​spawn/​echo_server.​cpp
1 /​/​1 /​/​
2 /​/​·​echo_server.​cpp2 /​/​·​echo_server.​cpp
3 /​/​·​~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio/​io_context.​hpp>11 #include·​<asio/​io_context.​hpp>
12 #include·​<asio/​ip/​tcp.​hpp>12 #include·​<asio/​ip/​tcp.​hpp>
13 #include·​<asio/​spawn.​hpp>13 #include·​<asio/​spawn.​hpp>
14 #include·​<asio/​steady_timer.​hpp>14 #include·​<asio/​steady_timer.​hpp>
15 #include·​<asio/​write.​hpp>15 #include·​<asio/​write.​hpp>
16 #include·​<boost/​bind.​hpp>
17 #include·​<boost/​shared_ptr.​hpp>
18 #include·​<boost/​enable_shared_from_th​is.​hpp>
19 #include·​<iostream>16 #include·​<iostream>
17 #include·​<memory>
20 18
21 using·​asio:​:​ip:​:​tcp;​19 using·​asio:​:​ip:​:​tcp;​
22 20
23 class·​session·​:​·​public·boost:​:​enable_shared_from_th​is<session>21 class·​session·​:​·​public·​std:​:​enable_shared_from_th​is<session>
24 {22 {
25 public:​23 public:​
26 ··​explicit·​session(asio:​:​io_context&·io_context)​24 ··​explicit·​session(tcp:​:​socket·socket)​
27 ····​:​·​strand_(io_context)​,​25 ····​:​·​socket_(std:​:​move(socket)​)​,​
28 ······​socket_(io_context)​,​26 ······timer_(socket_.​get_io_context()​)​,​
29 ······​timer_(io_context)​27 ······strand_(socket_.​get_io_context()​)​
30 ··​{28 ··​{
31 ··​}29 ··​}
32 30
33 ··​tcp:​:​socket&·​socket()​
34 ··​{
35 ····​return·​socket_;​
36 ··​}
37
38 ··​void·​go()​31 ··​void·​go()​
39 ··​{32 ··​{
33 ····​auto·​self(shared_from_this​()​)​;​
40 ····​asio:​:​spawn(strand_,​34 ····​asio:​:​spawn(strand_,​
41 ········boost:​:​bind(&session:​:​echo,​35 ········[this,​·self](asio:​:​yield_context·yield)​
42 ··········shared_from_this()​,​·_1)​)​;​36 ········{
37 ··········​try
38 ··········​{
39 ············​char·​data[128];​
40 ············​for·​(;​;​)​
41 ············​{
42 ··············​timer_.​expires_from_now(std:​:​chrono:​:​seconds(10)​)​;​
43 ··············​std:​:​size_t·​n·​=·​socket_.​async_read_some(asio:​:​buffer(data)​,​·​yield)​;​
44 ··············​asio:​:​async_write(socket_,​·​asio:​:​buffer(data,​·​n)​,​·​yield)​;​
45 ············​}
46 ··········​}
47 ··········​catch·​(std:​:​exception&·​e)​
48 ··········​{
49 ············​socket_.​close()​;​
50 ············​timer_.​cancel()​;​
51 ··········​}
52 ········​})​;​
53
43 ····​asio:​:​spawn(strand_,​54 ····​asio:​:​spawn(strand_,​
44 ········boost:​:​bind(&session:​:​timeout,​55 ········[this,​·self](asio:​:​yield_context·yield)​
45 ··········shared_from_this()​,​·_1)​)​;​56 ········{
57 ··········​while·​(socket_.​is_open()​)​
58 ··········​{
59 ············​asio:​:​error_code·​ignored_ec;​
60 ············​timer_.​async_wait(yield[igno​red_ec])​;​
61 ············​if·​(timer_.​expires_from_now()​·​<=·​std:​:​chrono:​:​seconds(0)​)​
62 ··············​socket_.​close()​;​
63 ··········​}
64 ········​})​;​
46 ··​}65 ··​}
47 66
48 private:​67 private:​
49 ··​void·​echo(asio:​:​yield_context·​yield)​
50 ··​{
51 ····​try
52 ····​{
53 ······​char·​data[128];​
54 ······​for·​(;​;​)​
55 ······​{
56 ········​timer_.​expires_after(asio:​:​chrono:​:​seconds(10)​)​;​
57 ········​std:​:​size_t·​n·​=·​socket_.​async_read_some(asio:​:​buffer(data)​,​·​yield)​;​
58 ········​asio:​:​async_write(socket_,​·​asio:​:​buffer(data,​·​n)​,​·​yield)​;​
59 ······​}
60 ····​}
61 ····​catch·​(std:​:​exception&·​e)​
62 ····​{
63 ······​socket_.​close()​;​
64 ······​timer_.​cancel()​;​
65 ····​}
66 ··​}
67
68 ··​void·​timeout(asio:​:​yield_context·​yield)​
69 ··​{
70 ····​while·​(socket_.​is_open()​)​
71 ····​{
72 ······​asio:​:​error_code·​ignored_ec;​
73 ······​timer_.​async_wait(yield[igno​red_ec])​;​
74 ······​if·​(timer_.​expiry()​·​<=·​asio:​:​steady_timer:​:​clock_type:​:​now()​)​
75 ········​socket_.​close()​;​
76 ····​}
77 ··​}
78
79 ··​asio:​:​io_context:​:​strand·​strand_;​
80 ··​tcp:​:​socket·​socket_;​68 ··​tcp:​:​socket·​socket_;​
81 ··​asio:​:​steady_timer·​timer_;​69 ··​asio:​:​steady_timer·​timer_;​
70 ··​asio:​:​io_context:​:​strand·​strand_;​
82 };​71 };​
83 72
84 void·​do_accept(asio:​:​io_context&·​io_context,​
85 ····​unsigned·​short·​port,​·​asio:​:​yield_context·​yield)​
86 {
87 ··​tcp:​:​acceptor·​acceptor(io_context,​·​tcp:​:​endpoint(tcp:​:​v4()​,​·​port)​)​;​
88
89 ··​for·​(;​;​)​
90 ··​{
91 ····​asio:​:​error_code·​ec;​
92 ····​boost:​:​shared_ptr<session>·​new_session(new·​session(io_context)​)​;​
93 ····​acceptor.​async_accept(new_sess​ion-​>socket()​,​·​yield[ec])​;​
94 ····​if·​(!ec)​·​new_session-​>go()​;​
95 ··​}
96 }
97
98 int·​main(int·​argc,​·​char*·​argv[])​73 int·​main(int·​argc,​·​char*·​argv[])​
99 {74 {
100 ··​try75 ··​try
101 ··​{76 ··​{
102 ····​if·​(argc·​!=·​2)​77 ····​if·​(argc·​!=·​2)​
103 ····​{78 ····​{
104 ······​std:​:​cerr·​<<·​"Usage:​·​echo_server·​<port>\n";​79 ······​std:​:​cerr·​<<·​"Usage:​·​echo_server·​<port>\n";​
105 ······​return·​1;​80 ······​return·​1;​
106 ····​}81 ····​}
107 82
108 ····​asio:​:​io_context·​io_context;​83 ····​asio:​:​io_context·​io_context;​
109 84
110 ····​asio:​:​spawn(io_context,​85 ····​asio:​:​spawn(io_context,​
111 ········boost:​:​bind(do_accept,​86 ········[&](asio:​:​yield_context·yield)​
112 ··········boost:​:​ref(io_context)​,​·atoi(argv[1])​,​·_1)​)​;​87 ········{
88 ··········​tcp:​:​acceptor·​acceptor(io_context,​
89 ············​tcp:​:​endpoint(tcp:​:​v4()​,​·​std:​:​atoi(argv[1])​)​)​;​
90
91 ··········​for·​(;​;​)​
92 ··········​{
93 ············​asio:​:​error_code·​ec;​
94 ············​tcp:​:​socket·​socket(io_context)​;​
95 ············​acceptor.​async_accept(socket,​·​yield[ec])​;​
96 ············​if·​(!ec)​·​std:​:​make_shared<session>(​std:​:​move(socket)​)​-​>go()​;​
97 ··········​}
98 ········​})​;​
113 99
114 ····​io_context.​run()​;​100 ····​io_context.​run()​;​
115 ··​}101 ··​}
116 ··​catch·​(std:​:​exception&·​e)​102 ··​catch·​(std:​:​exception&·​e)​
117 ··​{103 ··​{
118 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​104 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
119 ··​}105 ··​}
120 106
121 ··​return·​0;​107 ··​return·​0;​
122 }108 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/spawn/parallel_grep.cpp.html000066400000000000000000002076601340672067200236400ustar00rootroot00000000000000 HTML Diff spawn/parallel_grep.cpp
src/​examples/​cpp03/​spawn/​parallel_grep.​cppsrc/​examples/​cpp11/​spawn/​parallel_grep.​cpp
1 /​/​1 /​/​
2 /​/​·​parallel_grep.​cpp2 /​/​·​parallel_grep.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio/​dispatch.​hpp>11 #include·​<asio/​dispatch.​hpp>
12 #include·​<asio/​post.​hpp>12 #include·​<asio/​post.​hpp>
13 #include·​<asio/​spawn.​hpp>13 #include·​<asio/​spawn.​hpp>
14 #include·​<asio/​strand.​hpp>14 #include·​<asio/​strand.​hpp>
15 #include·​<asio/​thread_pool.​hpp>15 #include·​<asio/​thread_pool.​hpp>
16 #include·​<boost/​bind.​hpp>
17 #include·​<fstream>16 #include·​<fstream>
18 #include·​<iostream>17 #include·​<iostream>
19 #include·​<string>18 #include·​<string>
20 19
21 using·​asio:​:​dispatch;​20 using·​asio:​:​dispatch;​
22 using·​asio:​:​spawn;​21 using·​asio:​:​spawn;​
23 using·​asio:​:​strand;​22 using·​asio:​:​strand;​
24 using·​asio:​:​thread_pool;​23 using·​asio:​:​thread_pool;​
25 using·​asio:​:​yield_context;​24 using·​asio:​:​yield_context;​
26 25
27 void·​print_match(std:​:​string·​input_file,​·​std:​:​string·​line)​
28 {
29 ··​std:​:​cout·​<<·​input_file·​<<·​':​'·​<<·​line·​<<·​std:​:​endl;​
30 }
31
32 void·​search_file(std:​:​string·​search_string,​·​std:​:​string·​input_file,​
33 ····​strand<thread_pool:​:​executor_type>·​output_strand,​·​yield_context·​yield)​
34 {
35 ··​std:​:​ifstream·​is(input_file.​c_str()​)​;​
36 ··​std:​:​string·​line;​
37 ··​std:​:​size_t·​line_num·​=·​0;​
38 ··​while·​(std:​:​getline(is,​·​line)​)​
39 ··​{
40 ····​/​/​·​If·​we·​find·​a·​match,​·​send·​a·​message·​to·​the·​output.​
41 ····​if·​(line.​find(search_string)​·​!=·​std:​:​string:​:​npos)​
42 ····​{
43 ······​dispatch(output_stran​d,​·​boost:​:​bind(&print_match,​·​input_file,​·​line)​)​;​
44 ····​}
45
46 ····​/​/​·​Every·​so·​often·​we·​yield·​control·​to·​another·​coroutine.​
47 ····​if·​(++line_num·​%·​10·​==·​0)​
48 ······​post(yield)​;​
49 ··​}
50 }
51
52 int·​main(int·​argc,​·​char*·​argv[])​26 int·​main(int·​argc,​·​char*·​argv[])​
53 {27 {
54 ··​try28 ··​try
55 ··​{29 ··​{
56 ····​if·​(argc·​<·​2)​30 ····​if·​(argc·​<·​2)​
57 ····​{31 ····​{
58 ······​std:​:​cerr·​<<·​"Usage:​·​parallel_grep·​<string>·​<files.​.​.​>\n";​32 ······​std:​:​cerr·​<<·​"Usage:​·​parallel_grep·​<string>·​<files.​.​.​>\n";​
59 ······​return·​1;​33 ······​return·​1;​
60 ····​}34 ····​}
61 35
62 ····​/​/​·​We·​use·​a·​fixed·​size·​pool·​of·​threads·​for·​reading·​the·​input·​files.​·​The36 ····​/​/​·​We·​use·​a·​fixed·​size·​pool·​of·​threads·​for·​reading·​the·​input·​files.​·​The
63 ····​/​/​·​number·​of·​threads·​is·​automatically·​determined·​based·​on·​the·​number·​of37 ····​/​/​·​number·​of·​threads·​is·​automatically·​determined·​based·​on·​the·​number·​of
64 ····​/​/​·​CPUs·​available·​in·​the·​system.​38 ····​/​/​·​CPUs·​available·​in·​the·​system.​
65 ····​thread_pool·​pool;​39 ····​thread_pool·​pool;​
66 40
67 ····​/​/​·​To·​prevent·​the·​output·​from·​being·​garbled,​·​we·​use·​a·​strand·​to·​synchronise41 ····​/​/​·​To·​prevent·​the·​output·​from·​being·​garbled,​·​we·​use·​a·​strand·​to·​synchronise
68 ····​/​/​·​printing.​42 ····​/​/​·​printing.​
69 ····​strand<thread_pool:​:​executor_type>·​output_strand(pool.​get_executor()​)​;​43 ····​strand<thread_pool:​:​executor_type>·​output_strand(pool.​get_executor()​)​;​
70 44
71 ····​/​/​·​Spawn·​a·​new·​coroutine·​for·​each·​file·​specified·​on·​the·​command·​line.​45 ····​/​/​·​Spawn·​a·​new·​coroutine·​for·​each·​file·​specified·​on·​the·​command·​line.​
72 ····​std:​:​string·​search_string·​=·​argv[1];​46 ····​std:​:​string·​search_string·​=·​argv[1];​
73 ····​for·​(int·​argn·​=·​2;​·​argn·​<·​argc;​·​++argn)​47 ····​for·​(int·​argn·​=·​2;​·​argn·​<·​argc;​·​++argn)​
74 ····​{48 ····​{
75 ······​std:​:​string·​input_file·​=·​argv[argn];​49 ······​std:​:​string·​input_file·​=·​argv[argn];​
76 ······​spawn(pool,​·boost:​:​bind(&search_file,​50 ······​spawn(pool,​
77 ············search_string,​·input_file,​·output_strand,​·_1)​)​;​51 ········[=](yield_context·yield)​
52 ········​{
53 ··········​std:​:​ifstream·​is(input_file.​c_str()​)​;​
54 ··········​std:​:​string·​line;​
55 ··········​std:​:​size_t·​line_num·​=·​0;​
56 ··········​while·​(std:​:​getline(is,​·​line)​)​
57 ··········​{
58 ············​/​/​·​If·​we·​find·​a·​match,​·​send·​a·​message·​to·​the·​output.​
59 ············​if·​(line.​find(search_string)​·​!=·​std:​:​string:​:​npos)​
60 ············​{
61 ··············​dispatch(output_stran​d,​
62 ··················​[=]
63 ··················​{
64 ····················​std:​:​cout·​<<·​input_file·​<<·​':​'·​<<·​line·​<<·​std:​:​endl;​
65 ··················​})​;​
66 ············​}
67
68 ············​/​/​·​Every·​so·​often·​we·​yield·​control·​to·​another·​coroutine.​
69 ············​if·​(++line_num·​%·​10·​==·​0)​
70 ··············​post(yield)​;​
71 ··········​}
72 ········​})​;​
78 ····​}73 ····​}
79 74
80 ····​/​/​·​Join·​the·​thread·​pool·​to·​wait·​for·​all·​the·​spawned·​tasks·​to·​complete.​75 ····​/​/​·​Join·​the·​thread·​pool·​to·​wait·​for·​all·​the·​spawned·​tasks·​to·​complete.​
81 ····​pool.​join()​;​76 ····​pool.​join()​;​
82 ··​}77 ··​}
83 ··​catch·​(std:​:​exception&·​e)​78 ··​catch·​(std:​:​exception&·​e)​
84 ··​{79 ··​{
85 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​80 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
86 ··​}81 ··​}
87 82
88 ··​return·​0;​83 ··​return·​0;​
89 }84 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/ssl/000077500000000000000000000000001340672067200170165ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/ssl/client.cpp.html000066400000000000000000005661711340672067200217630ustar00rootroot00000000000000 HTML Diff ssl/client.cpp
src/​examples/​cpp03/​ssl/​client.​cppsrc/​examples/​cpp11/​ssl/​client.​cpp
1 /​/​1 /​/​
2 /​/​·​client.​cpp2 /​/​·​client.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<cstring>
13 #include·​<functional>
12 #include·​<iostream>14 #include·​<iostream>
13 #include·​<boost/​bind.​hpp>
14 #include·​"asio.​hpp"15 #include·​"asio.​hpp"
15 #include·​"asio/​ssl.​hpp"16 #include·​"asio/​ssl.​hpp"
16 17
18 using·​asio:​:​ip:​:​tcp;​
19 using·​std:​:​placeholders:​:​_1;​
20 using·​std:​:​placeholders:​:​_2;​
21
17 enum·​{·​max_length·​=·​1024·​};​22 enum·​{·​max_length·​=·​1024·​};​
18 23
19 class·​client24 class·​client
20 {25 {
21 public:​26 public:​
22 ··​client(asio:​:​io_context&·​io_context,​27 ··​client(asio:​:​io_context&·​io_context,​
23 ······​asio:​:​ssl:​:​context&·​context,​28 ······​asio:​:​ssl:​:​context&·​context,​
24 ······asio:​:​ip:​:​tcp:​:​resolver:​:​results_type·​endpoints)​29 ······const·tcp:​:​resolver:​:​results_type&·​endpoints)​
25 ····​:​·​socket_(io_context,​·​context)​30 ····​:​·​socket_(io_context,​·​context)​
26 ··​{31 ··​{
27 ····​socket_.​set_verify_mode(asio:​:​ssl:​:​verify_peer)​;​32 ····​socket_.​set_verify_mode(asio:​:​ssl:​:​verify_peer)​;​
28 ····​socket_.​set_verify_callback(33 ····​socket_.​set_verify_callback(
29 ········boost:​:​bind(&client:​:​verify_certificate,​·​this,​·​_1,​·​_2)​)​;​34 ········​std:​:​bind(&client:​:​verify_certificate,​·​this,​·​_1,​·​_2)​)​;​
30 35
31 ····asio:​:​async_connect(socket_​.​lowest_layer()​,​·endpoints,​36 ····​connect(endpoints)​;​
32 ········boost:​:​bind(&client:​:​handle_connect,​·this,​
33 ··········asio:​:​placeholders:​:​error)​)​;​
34 ··​}37 ··​}
35 38
39 private:​
36 ··​bool·​verify_certificate(bo​ol·​preverified,​40 ··​bool·​verify_certificate(bo​ol·​preverified,​
37 ······​asio:​:​ssl:​:​verify_context&·​ctx)​41 ······​asio:​:​ssl:​:​verify_context&·​ctx)​
38 ··​{42 ··​{
39 ····​/​/​·​The·​verify·​callback·​can·​be·​used·​to·​check·​whether·​the·​certificate·​that·​is43 ····​/​/​·​The·​verify·​callback·​can·​be·​used·​to·​check·​whether·​the·​certificate·​that·​is
40 ····​/​/​·​being·​presented·​is·​valid·​for·​the·​peer.​·​For·​example,​·​RFC·​2818·​describes44 ····​/​/​·​being·​presented·​is·​valid·​for·​the·​peer.​·​For·​example,​·​RFC·​2818·​describes
41 ····​/​/​·​the·​steps·​involved·​in·​doing·​this·​for·​HTTPS.​·​Consult·​the·​OpenSSL45 ····​/​/​·​the·​steps·​involved·​in·​doing·​this·​for·​HTTPS.​·​Consult·​the·​OpenSSL
42 ····​/​/​·​documentation·​for·​more·​details.​·​Note·​that·​the·​callback·​is·​called·​once46 ····​/​/​·​documentation·​for·​more·​details.​·​Note·​that·​the·​callback·​is·​called·​once
43 ····​/​/​·​for·​each·​certificate·​in·​the·​certificate·​chain,​·​starting·​from·​the·​root47 ····​/​/​·​for·​each·​certificate·​in·​the·​certificate·​chain,​·​starting·​from·​the·​root
44 ····​/​/​·​certificate·​authority.​48 ····​/​/​·​certificate·​authority.​
45 49
46 ····​/​/​·​In·​this·​example·​we·​will·​simply·​print·​the·​certificate's·​subject·​name.​50 ····​/​/​·​In·​this·​example·​we·​will·​simply·​print·​the·​certificate's·​subject·​name.​
47 ····​char·​subject_name[256];​51 ····​char·​subject_name[256];​
48 ····​X509*·​cert·​=·​X509_STORE_CTX_get_cu​rrent_cert(ctx.​native_handle()​)​;​52 ····​X509*·​cert·​=·​X509_STORE_CTX_get_cu​rrent_cert(ctx.​native_handle()​)​;​
49 ····​X509_NAME_oneline(X50​9_get_subject_name(ce​rt)​,​·​subject_name,​·​256)​;​53 ····​X509_NAME_oneline(X50​9_get_subject_name(ce​rt)​,​·​subject_name,​·​256)​;​
50 ····​std:​:​cout·​<<·​"Verifying·​"·​<<·​subject_name·​<<·​"\n";​54 ····​std:​:​cout·​<<·​"Verifying·​"·​<<·​subject_name·​<<·​"\n";​
51 55
52 ····​return·​preverified;​56 ····​return·​preverified;​
53 ··​}57 ··​}
54 58
55 ··​void·handle_connect(const·asio:​:​error_code&·​error)​59 ··​void·​connect(const·tcp:​:​resolver:​:​results_type&·​endpoints)​
56 ··{
57 ····if·(!error)​
58 ····{
59 ······socket_.​async_handshake(asio:​:​ssl:​:​stream_base:​:​client,​
60 ··········boost:​:​bind(&client:​:​handle_handshake,​·this,​
61 ············asio:​:​placeholders:​:​error)​)​;​
62 ····}
63 ····else
64 ····{
65 ······std:​:​cout·<<·"Connect·failed:​·"·<<·error.​message()​·<<·"\n";​
66 ····}
67 ··}
68
69 ··void·handle_handshake(cons​t·asio:​:​error_code&·error)​
70 ··{
71 ····if·(!error)​
72 ····{
73 ······std:​:​cout·<<·"Enter·message:​·";​
74 ······std:​:​cin.​getline(request_,​·max_length)​;​
75 ······size_t·request_length·=·strlen(request_)​;​
76
77 ······asio:​:​async_write(socket_,​
78 ··········asio:​:​buffer(request_,​·request_length)​,​
79 ··········boost:​:​bind(&client:​:​handle_write,​·this,​
80 ············asio:​:​placeholders:​:​error,​
81 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​
82 ····}
83 ····else
84 ····{
85 ······std:​:​cout·<<·"Handshake·failed:​·"·<<·error.​message()​·<<·"\n";​
86 ····}
87 ··}
88
89 ··void·handle_write(const·asio:​:​error_code&·error,​
90 ······size_t·bytes_transferred)​
91 ··​{60 ··​{
92 ····​if·(!error)​61 ····asio:​:​async_connect(socket_​.​lowest_layer()​,​·endpoints,​
93 ····{62 ········[this](const·std:​:​error_code&·error,​
94 ······asio:​:​async_read(socket_,​63 ··········const·tcp:​:​endpoint&·/​*endpoint*/​)​
95 ··········asio:​:​buffer(reply_,​·bytes_transferred)​,​64 ········{
96 ··········boost:​:​bind(&client:​:​handle_read,​·this,​65 ··········​if·(!error)​
97 ············asio:​:​placeholders:​:​error,​66 ··········{
98 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​67 ············​handshake()​;​
99 ····​}68 ··········​}
100 ····​else69 ··········​else
101 ····​{70 ··········​{
102 ······​std:​:​cout·​<<·​"Write·​failed:​·​"·​<<·​error.​message()​·​<<·​"\n";​71 ············​std:​:​cout·​<<·​"Connect·​failed:​·​"·​<<·​error.​message()​·​<<·​"\n";​
103 ····​}72 ··········​}
104 ··​}73 ········​})​;​
105 74 ··}
106 ··void·handle_read(const·asio:​:​error_code&·error,​75
107 ······size_t·bytes_transferred)​76 ··void·handshake()​
108 ··​{77 ··​{
109 ····if·(!error)​78 ····socket_.​async_handshake(asio:​:​ssl:​:​stream_base:​:​client,​
110 ····{79 ········[this](const·std:​:​error_code&·error)​
111 ······std:​:​cout·<<·"Reply:​·";​80 ········{
112 ······std:​:​cout.​write(reply_,​·bytes_transferred)​;​81 ··········if·(!error)​
113 ······std:​:​cout·<<·"\n";​82 ··········{
114 ····}83 ············send_request()​;​
115 ····else84 ··········}
116 ····{85 ··········else
117 ······std:​:​cout·<<·"Read·failed:​·"·<<·error.​message()​·<<·"\n";​86 ··········{
118 ····}87 ············std:​:​cout·<<·"Handshake·failed:​·"·<<·error.​message()​·<<·"\n";​
88 ··········​}
89 ········​})​;​
90 ··​}
91
92 ··​void·​send_request()​
93 ··​{
94 ····​std:​:​cout·​<<·​"Enter·​message:​·​";​
95 ····​std:​:​cin.​getline(request_,​·​max_length)​;​
96 ····​size_t·​request_length·​=·​std:​:​strlen(request_)​;​
97
98 ····​asio:​:​async_write(socket_,​
99 ········​asio:​:​buffer(request_,​·​request_length)​,​
100 ········​[this](const·​std:​:​error_code&·​error,​·​std:​:​size_t·​length)​
101 ········​{
102 ··········​if·​(!error)​
103 ··········​{
104 ············​receive_response(leng​th)​;​
105 ··········​}
106 ··········​else
107 ··········​{
108 ············​std:​:​cout·​<<·​"Write·​failed:​·​"·​<<·​error.​message()​·​<<·​"\n";​
109 ··········​}
110 ········​})​;​
111 ··​}
112
113 ··​void·​receive_response(std:​:​size_t·​length)​
114 ··​{
115 ····​asio:​:​async_read(socket_,​
116 ········​asio:​:​buffer(reply_,​·​length)​,​
117 ········​[this](const·​std:​:​error_code&·​error,​·​std:​:​size_t·​length)​
118 ········​{
119 ··········​if·​(!error)​
120 ··········​{
121 ············​std:​:​cout·​<<·​"Reply:​·​";​
122 ············​std:​:​cout.​write(reply_,​·​length)​;​
123 ············​std:​:​cout·​<<·​"\n";​
124 ··········​}
125 ··········​else
126 ··········​{
127 ············​std:​:​cout·​<<·​"Read·​failed:​·​"·​<<·​error.​message()​·​<<·​"\n";​
128 ··········​}
129 ········​})​;​
119 ··​}130 ··​}
120 131
121 private:​132 ··asio:​:​ssl:​:​stream<tcp:​:​socket>·socket_;​
122 ··asio:​:​ssl:​:​stream<asio:​:​ip:​:​tcp:​:​socket>·socket_;​
123 ··​char·​request_[max_length];​133 ··​char·​request_[max_length];​
124 ··​char·​reply_[max_length];​134 ··​char·​reply_[max_length];​
125 };​135 };​
126 136
127 int·​main(int·​argc,​·​char*·​argv[])​137 int·​main(int·​argc,​·​char*·​argv[])​
128 {138 {
129 ··​try139 ··​try
130 ··​{140 ··​{
131 ····​if·​(argc·​!=·​3)​141 ····​if·​(argc·​!=·​3)​
132 ····​{142 ····​{
133 ······​std:​:​cerr·​<<·​"Usage:​·​client·​<host>·​<port>\n";​143 ······​std:​:​cerr·​<<·​"Usage:​·​client·​<host>·​<port>\n";​
134 ······​return·​1;​144 ······​return·​1;​
135 ····​}145 ····​}
136 146
137 ····​asio:​:​io_context·​io_context;​147 ····​asio:​:​io_context·​io_context;​
138 148
139 ····asio:​:​ip:​:​tcp:​:​resolver·​resolver(io_context)​;​149 ····​tcp:​:​resolver·​resolver(io_context)​;​
140 ····​asio:​:​ip:​:​tcp:​:​resolver:​:​results_type·endpoints·=150 ····​auto·endpoints·=·resolver.​resolve(argv[1],​·argv[2])​;​
141 ······resolver.​resolve(argv[1],​·argv[2])​;​
142 151
143 ····​asio:​:​ssl:​:​context·​ctx(asio:​:​ssl:​:​context:​:​sslv23)​;​152 ····​asio:​:​ssl:​:​context·​ctx(asio:​:​ssl:​:​context:​:​sslv23)​;​
144 ····​ctx.​load_verify_file("ca.​pem")​;​153 ····​ctx.​load_verify_file("ca.​pem")​;​
145 154
146 ····​client·​c(io_context,​·​ctx,​·​endpoints)​;​155 ····​client·​c(io_context,​·​ctx,​·​endpoints)​;​
147 156
148 ····​io_context.​run()​;​157 ····​io_context.​run()​;​
149 ··​}158 ··​}
150 ··​catch·​(std:​:​exception&·​e)​159 ··​catch·​(std:​:​exception&·​e)​
151 ··​{160 ··​{
152 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​161 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
153 ··​}162 ··​}
154 163
155 ··​return·​0;​164 ··​return·​0;​
156 }165 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/ssl/server.cpp.html000066400000000000000000005264401340672067200220060ustar00rootroot00000000000000 HTML Diff ssl/server.cpp
src/​examples/​cpp03/​ssl/​server.​cppsrc/​examples/​cpp11/​ssl/​server.​cpp
1 /​/​1 /​/​
2 /​/​·​server.​cpp2 /​/​·​server.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<cstdlib>11 #include·​<cstdlib>
12 #include·​<functional>
12 #include·​<iostream>13 #include·​<iostream>
13 #include·​<boost/​bind.​hpp>
14 #include·​"asio.​hpp"14 #include·​"asio.​hpp"
15 #include·​"asio/​ssl.​hpp"15 #include·​"asio/​ssl.​hpp"
16 16
17 typedef·asio:​:​ssl:​:​stream<asio:​:​ip:​:​tcp:​:​socket>·ssl_socket;​17 using·asio:​:​ip:​:​tcp;​
18 18
19 class·​session19 class·session·:​·public·std:​:​enable_shared_from_th​is<session>
20 {20 {
21 public:​21 public:​
22 ··​session(asio:​:​io_context&·io_context,​22 ··​session(tcp:​:​socket·socket,​·asio:​:​ssl:​:​context&·​context)​
23 ······asio:​:​ssl:​:​context&·​context)​23 ····:​·socket_(std:​:​move(socket)​,​·​context)​
24 ····:​·socket_(io_context,​·context)​
25 ··​{24 ··​{
26 ··​}25 ··​}
27 26
28 ··​ssl_socket:​:​lowest_layer_type&·​socket()​
29 ··​{
30 ····​return·​socket_.​lowest_layer()​;​
31 ··​}
32
33 ··​void·​start()​27 ··​void·​start()​
34 ··​{28 ··​{
35 ····socket_.​async_handshake(asio:​:​ssl:​:​stream_base:​:​server,​29 ····do_handshake()​;​
36 ········boost:​:​bind(&session:​:​handle_handshake,​·this,​
37 ··········asio:​:​placeholders:​:​error)​)​;​
38 ··}
39
40 ··void·handle_handshake(cons​t·asio:​:​error_code&·error)​
41 ··{
42 ····if·(!error)​
43 ····{
44 ······socket_.​async_read_some(asio:​:​buffer(data_,​·max_length)​,​
45 ··········boost:​:​bind(&session:​:​handle_read,​·this,​
46 ············asio:​:​placeholders:​:​error,​
47 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​
48 ····}
49 ····else
50 ····{
51 ······delete·this;​
52 ····}
53 ··}
54
55 ··void·handle_read(const·asio:​:​error_code&·error,​
56 ······size_t·bytes_transferred)​
57 ··{
58 ····if·(!error)​
59 ····{
60 ······asio:​:​async_write(socket_,​
61 ··········asio:​:​buffer(data_,​·bytes_transferred)​,​
62 ··········boost:​:​bind(&session:​:​handle_write,​·this,​
63 ············asio:​:​placeholders:​:​error)​)​;​
64 ····}
65 ····else
66 ····{
67 ······delete·this;​
68 ····}
69 ··​}30 ··​}
70 31
71 ··void·handle_write(const·asio:​:​error_code&·error)​32 private:​
33 ··​void·​do_handshake()​
72 ··​{34 ··​{
73 ····if·​(!error)​35 ····auto·self(shared_from_this​()​)​;​
74 ····{36 ····socket_.​async_handshake(asio:​:​ssl:​:​stream_base:​:​server,​·
75 ······socket_.​async_read_some(asio:​:​buffer(data_,​·max_length)​,​37 ········[this,​·self](const·std:​:​error_code&·error)​
76 ··········boost:​:​bind(&session:​:​handle_read,​·this,​38 ········{
77 ············asio:​:​placeholders:​:​error,​39 ··········​if·(!error)​
78 ············asio:​:​placeholders:​:​bytes_transferred)​)​;​40 ··········{
79 ····}41 ············do_read()​;​
80 ····else42 ··········}
81 ····{43 ········})​;​
82 ······delete·this;​44 ··}
83 ····}45
46 ··​void·​do_read()​
47 ··​{
48 ····​auto·​self(shared_from_this​()​)​;​
49 ····​socket_.​async_read_some(asio:​:​buffer(data_)​,​
50 ········​[this,​·​self](const·​std:​:​error_code&·​ec,​·​std:​:​size_t·​length)​
51 ········​{
52 ··········​if·​(!ec)​
53 ··········​{
54 ············​do_write(length)​;​
55 ··········​}
56 ········​})​;​
57 ··​}
58
59 ··​void·​do_write(std:​:​size_t·​length)​
60 ··​{
61 ····​auto·​self(shared_from_this​()​)​;​
62 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer(data_,​·​length)​,​
63 ········​[this,​·​self](const·​std:​:​error_code&·​ec,​
64 ··········​std:​:​size_t·​/​*length*/​)​
65 ········​{
66 ··········​if·​(!ec)​
67 ··········​{
68 ············​do_read()​;​
69 ··········​}
70 ········​})​;​
84 ··​}71 ··​}
85 72
86 private:​73 ··asio:​:​ssl:​:​stream<tcp:​:​socket>·socket_;​
87 ··ssl_socket·socket_;​74 ··char·data_[1024];​
88 ··enum·{·max_length·=·1024·};​
89 ··char·data_[max_length];​
90 };​75 };​
91 76
92 class·​server77 class·​server
93 {78 {
94 public:​79 public:​
95 ··​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​80 ··​server(asio:​:​io_context&·​io_context,​·​unsigned·​short·​port)​
96 ····​:​·​io_context_(io_contex​t)​,​81 ····​:​·acceptor_(io_context,​·tcp:​:​endpoint(tcp:​:​v4()​,​·port)​)​,​
97 ······acceptor_(io_context,​
98 ··········asio:​:​ip:​:​tcp:​:​endpoint(asio:​:​ip:​:​tcp:​:​v4()​,​·port)​)​,​
99 ······​context_(asio:​:​ssl:​:​context:​:​sslv23)​82 ······​context_(asio:​:​ssl:​:​context:​:​sslv23)​
100 ··​{83 ··​{
101 ····​context_.​set_options(84 ····​context_.​set_options(
102 ········​asio:​:​ssl:​:​context:​:​default_workarounds85 ········​asio:​:​ssl:​:​context:​:​default_workarounds
103 ········​|·​asio:​:​ssl:​:​context:​:​no_sslv286 ········​|·​asio:​:​ssl:​:​context:​:​no_sslv2
104 ········​|·​asio:​:​ssl:​:​context:​:​single_dh_use)​;​87 ········​|·​asio:​:​ssl:​:​context:​:​single_dh_use)​;​
105 ····​context_.​set_password_callback​(boost:​:​bind(&server:​:​get_password,​·​this)​)​;​88 ····​context_.​set_password_callback​(std:​:​bind(&server:​:​get_password,​·​this)​)​;​
106 ····​context_.​use_certificate_chain​_file("server.​pem")​;​89 ····​context_.​use_certificate_chain​_file("server.​pem")​;​
107 ····​context_.​use_private_key_file(​"server.​pem",​·​asio:​:​ssl:​:​context:​:​pem)​;​90 ····​context_.​use_private_key_file(​"server.​pem",​·​asio:​:​ssl:​:​context:​:​pem)​;​
108 ····​context_.​use_tmp_dh_file("dh20​48.​pem")​;​91 ····​context_.​use_tmp_dh_file("dh20​48.​pem")​;​
109 92
110 ····start_accept()​;​93 ····do_accept()​;​
111 ··​}94 ··​}
112 95
96 private:​
113 ··​std:​:​string·​get_password()​·​const97 ··​std:​:​string·​get_password()​·​const
114 ··​{98 ··​{
115 ····​return·​"test";​99 ····​return·​"test";​
116 ··​}100 ··​}
117 101
118 ··​void·start_accept()​102 ··​void·do_accept()​
119 ··​{103 ··​{
120 ····session*·new_session·=·new·session(io_context_,​·context_)​;​104 ····acceptor_.​async_accept(
121 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​105 ········[this](const·std:​:​error_code&·error,​·tcp:​:​socket·socket)​
122 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​106 ········{
123 ··········asio:​:​placeholders:​:​error)​)​;​107 ··········​if·(!error)​
124 ··}108 ··········{
125 109 ············std:​:​make_shared<session>(​std:​:​move(socket)​,​·context_)​-​>start()​;​
126 ··void·handle_accept(session​*·new_session,​110 ··········}
127 ······const·asio:​:​error_code&·error)​
128 ··{
129 ····if·(!error)​
130 ····{
131 ······new_session-​>start()​;​
132 ····}
133 ····else
134 ····{
135 ······delete·new_session;​
136 ····}
137 111
138 ····start_accept()​;​112 ··········do_accept()​;​
113 ········​})​;​
139 ··​}114 ··​}
140 115
141 private:​116 ··tcp:​:​acceptor·acceptor_;​
142 ··asio:​:​io_context&·io_context_;​
143 ··asio:​:​ip:​:​tcp:​:​acceptor·acceptor_;​
144 ··​asio:​:​ssl:​:​context·​context_;​117 ··​asio:​:​ssl:​:​context·​context_;​
145 };​118 };​
146 119
147 int·​main(int·​argc,​·​char*·​argv[])​120 int·​main(int·​argc,​·​char*·​argv[])​
148 {121 {
149 ··​try122 ··​try
150 ··​{123 ··​{
151 ····​if·​(argc·​!=·​2)​124 ····​if·​(argc·​!=·​2)​
152 ····​{125 ····​{
153 ······​std:​:​cerr·​<<·​"Usage:​·​server·​<port>\n";​126 ······​std:​:​cerr·​<<·​"Usage:​·​server·​<port>\n";​
154 ······​return·​1;​127 ······​return·​1;​
155 ····​}128 ····​}
156 129
157 ····​asio:​:​io_context·​io_context;​130 ····​asio:​:​io_context·​io_context;​
158 131
159 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​132 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​
160 ····​server·​s(io_context,​·​atoi(argv[1])​)​;​133 ····​server·​s(io_context,​·​atoi(argv[1])​)​;​
161 134
162 ····​io_context.​run()​;​135 ····​io_context.​run()​;​
163 ··​}136 ··​}
164 ··​catch·​(std:​:​exception&·​e)​137 ··​catch·​(std:​:​exception&·​e)​
165 ··​{138 ··​{
166 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​139 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
167 ··​}140 ··​}
168 141
169 ··​return·​0;​142 ··​return·​0;​
170 }143 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/timeouts/000077500000000000000000000000001340672067200200665ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/timeouts/async_tcp_client.cpp.html000066400000000000000000010577041340672067200250740ustar00rootroot00000000000000 HTML Diff timeouts/async_tcp_client.cpp
src/​examples/​cpp03/​timeouts/​async_tcp_client.​cppsrc/​examples/​cpp11/​timeouts/​async_tcp_client.​cpp
1 /​/​1 /​/​
2 /​/​·​async_tcp_client.​cpp2 /​/​·​async_tcp_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"asio/​buffer.​hpp"11 #include·​"asio/​buffer.​hpp"
12 #include·​"asio/​io_context.​hpp"12 #include·​"asio/​io_context.​hpp"
13 #include·​"asio/​ip/​tcp.​hpp"13 #include·​"asio/​ip/​tcp.​hpp"
14 #include·​"asio/​read_until.​hpp"14 #include·​"asio/​read_until.​hpp"
15 #include·​"asio/​steady_timer.​hpp"15 #include·​"asio/​steady_timer.​hpp"
16 #include·​"asio/​write.​hpp"16 #include·​"asio/​write.​hpp"
17 #include·​<boost/​bind.​hpp>17 #include·​<functional>
18 #include·​<iostream>18 #include·​<iostream>
19 #include·​<string>19 #include·​<string>
20 20
21 using·​asio:​:​steady_timer;​21 using·​asio:​:​steady_timer;​
22 using·​asio:​:​ip:​:​tcp;​22 using·​asio:​:​ip:​:​tcp;​
23 using·​std:​:​placeholders:​:​_1;​
24 using·​std:​:​placeholders:​:​_2;​
23 25
24 /​/​26 /​/​
25 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​applying·​the·​concept·​of·​a·​deadline.​27 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​applying·​the·​concept·​of·​a·​deadline.​
26 /​/​·​Some·​asynchronous·​operations·​are·​given·​deadlines·​by·​which·​they·​must·​complete.​28 /​/​·​Some·​asynchronous·​operations·​are·​given·​deadlines·​by·​which·​they·​must·​complete.​
27 /​/​·​Deadlines·​are·​enforced·​by·​an·​"actor"·​that·​persists·​for·​the·​lifetime·​of·​the29 /​/​·​Deadlines·​are·​enforced·​by·​an·​"actor"·​that·​persists·​for·​the·​lifetime·​of·​the
28 /​/​·​client·​object:​30 /​/​·​client·​object:​
29 /​/​31 /​/​
30 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+32 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
31 /​/​··​|················​|33 /​/​··​|················​|
32 /​/​··​|·​check_deadline·​|<-​-​-​+34 /​/​··​|·​check_deadline·​|<-​-​-​+
33 /​/​··​|················​|····​|35 /​/​··​|················​|····​|
34 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|·​async_wait()​36 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|·​async_wait()​
35 /​/​··············​|·········​|37 /​/​··············​|·········​|
36 /​/​··············​+-​-​-​-​-​-​-​-​-​+38 /​/​··············​+-​-​-​-​-​-​-​-​-​+
37 /​/​39 /​/​
38 /​/​·​If·​the·​deadline·​actor·​determines·​that·​the·​deadline·​has·​expired,​·​the·​socket40 /​/​·​If·​the·​deadline·​actor·​determines·​that·​the·​deadline·​has·​expired,​·​the·​socket
39 /​/​·​is·​closed·​and·​any·​outstanding·​operations·​are·​consequently·​cancelled.​41 /​/​·​is·​closed·​and·​any·​outstanding·​operations·​are·​consequently·​cancelled.​
40 /​/​42 /​/​
41 /​/​·​Connection·​establishment·​involves·​trying·​each·​endpoint·​in·​turn·​until·​a43 /​/​·​Connection·​establishment·​involves·​trying·​each·​endpoint·​in·​turn·​until·​a
42 /​/​·​connection·​is·​successful,​·​or·​the·​available·​endpoints·​are·​exhausted.​·​If·​the44 /​/​·​connection·​is·​successful,​·​or·​the·​available·​endpoints·​are·​exhausted.​·​If·​the
43 /​/​·​deadline·​actor·​closes·​the·​socket,​·​the·​connect·​actor·​is·​woken·​up·​and·​moves·​to45 /​/​·​deadline·​actor·​closes·​the·​socket,​·​the·​connect·​actor·​is·​woken·​up·​and·​moves·​to
44 /​/​·​the·​next·​endpoint.​46 /​/​·​the·​next·​endpoint.​
45 /​/​47 /​/​
46 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+48 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
47 /​/​··​|···············​|49 /​/​··​|···············​|
48 /​/​··​|·​start_connect·​|<-​-​-​+50 /​/​··​|·​start_connect·​|<-​-​-​+
49 /​/​··​|···············​|····​|51 /​/​··​|···············​|····​|
50 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|52 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|
51 /​/​···········​|···········​|53 /​/​···········​|···········​|
52 /​/​··​async_-​··​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+54 /​/​··​async_-​··​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
53 /​/​·​connect()​·​|····​|················​|55 /​/​·​connect()​·​|····​|················​|
54 /​/​···········​+-​-​-​>|·​handle_connect·​|56 /​/​···········​+-​-​-​>|·​handle_connect·​|
55 /​/​················​|················​|57 /​/​················​|················​|
56 /​/​················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+58 /​/​················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
57 /​/​··························​:​59 /​/​··························​:​
58 /​/​·​Once·​a·​connection·​is·····​:​60 /​/​·​Once·​a·​connection·​is·····​:​
59 /​/​·​made,​·​the·​connect········​:​61 /​/​·​made,​·​the·​connect········​:​
60 /​/​·​actor·​forks·​in·​two·​-​·····​:​62 /​/​·​actor·​forks·​in·​two·​-​·····​:​
61 /​/​··························​:​63 /​/​··························​:​
62 /​/​·​an·​actor·​for·​reading·····​:​·······​and·​an·​actor·​for64 /​/​·​an·​actor·​for·​reading·····​:​·······​and·​an·​actor·​for
63 /​/​·​inbound·​messages:​········​:​·······​sending·​heartbeats:​65 /​/​·​inbound·​messages:​········​:​·······​sending·​heartbeats:​
64 /​/​··························​:​66 /​/​··························​:​
65 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​+··········​:​··········​+-​-​-​-​-​-​-​-​-​-​-​-​-​+67 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​+··········​:​··········​+-​-​-​-​-​-​-​-​-​-​-​-​-​+
66 /​/​··​|············​|<-​·​-​·​-​·​-​·​-​+-​·​-​·​-​·​-​·​-​>|·············​|68 /​/​··​|············​|<-​·​-​·​-​·​-​·​-​+-​·​-​·​-​·​-​·​-​>|·············​|
67 /​/​··​|·​start_read·​|·····················​|·​start_write·​|<-​-​-​+69 /​/​··​|·​start_read·​|·····················​|·​start_write·​|<-​-​-​+
68 /​/​··​|············​|<-​-​-​+················​|·············​|····​|70 /​/​··​|············​|<-​-​-​+················​|·············​|····​|
69 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​+····​|················​+-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|·​async_wait()​71 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​+····​|················​+-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|·​async_wait()​
70 /​/​··········​|·········​|························​|··········​|72 /​/​··········​|·········​|························​|··········​|
71 /​/​··​async_-​·​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​async_-​·​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+73 /​/​··​async_-​·​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​+·······​async_-​·​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
72 /​/​···​read_-​·​|····​|·············​|·······​write()​·​|····​|··············​|74 /​/​···​read_-​·​|····​|·············​|·······​write()​·​|····​|··············​|
73 /​/​··​until()​·​+-​-​-​>|·​handle_read·​|···············​+-​-​-​>|·​handle_write·​|75 /​/​··​until()​·​+-​-​-​>|·​handle_read·​|···············​+-​-​-​>|·​handle_write·​|
74 /​/​···············​|·············​|····················​|··············​|76 /​/​···············​|·············​|····················​|··············​|
75 /​/​···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​+····················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+77 /​/​···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​+····················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
76 /​/​78 /​/​
77 /​/​·​The·​input·​actor·​reads·​messages·​from·​the·​socket,​·​where·​messages·​are·​delimited79 /​/​·​The·​input·​actor·​reads·​messages·​from·​the·​socket,​·​where·​messages·​are·​delimited
78 /​/​·​by·​the·​newline·​character.​·​The·​deadline·​for·​a·​complete·​message·​is·​30·​seconds.​80 /​/​·​by·​the·​newline·​character.​·​The·​deadline·​for·​a·​complete·​message·​is·​30·​seconds.​
79 /​/​81 /​/​
80 /​/​·​The·​heartbeat·​actor·​sends·​a·​heartbeat·​(a·​message·​that·​consists·​of·​a·​single82 /​/​·​The·​heartbeat·​actor·​sends·​a·​heartbeat·​(a·​message·​that·​consists·​of·​a·​single
81 /​/​·​newline·​character)​·​every·​10·​seconds.​·​In·​this·​example,​·​no·​deadline·​is·​applied83 /​/​·​newline·​character)​·​every·​10·​seconds.​·​In·​this·​example,​·​no·​deadline·​is·​applied
82 /​/​·​to·​message·​sending.​84 /​/​·​to·​message·​sending.​
83 /​/​85 /​/​
84 class·​client86 class·​client
85 {87 {
86 public:​88 public:​
87 ··​client(asio:​:​io_context&·​io_context)​89 ··​client(asio:​:​io_context&·​io_context)​
88 ····​:​·​stopped_(false)​,​90 ····​:​·​socket_(io_context)​,​
89 ······socket_(io_context)​,​
90 ······​deadline_(io_context)​,​91 ······​deadline_(io_context)​,​
91 ······​heartbeat_timer_(io_c​ontext)​92 ······​heartbeat_timer_(io_c​ontext)​
92 ··​{93 ··​{
93 ··​}94 ··​}
94 95
95 ··​/​/​·​Called·​by·​the·​user·​of·​the·​client·​class·​to·​initiate·​the·​connection·​process.​96 ··​/​/​·​Called·​by·​the·​user·​of·​the·​client·​class·​to·​initiate·​the·​connection·​process.​
96 ··​/​/​·​The·​endpoints·​will·​have·​been·​obtained·​using·​a·​tcp:​:​resolver.​97 ··​/​/​·​The·​endpoints·​will·​have·​been·​obtained·​using·​a·​tcp:​:​resolver.​
97 ··​void·​start(tcp:​:​resolver:​:​results_type·​endpoints)​98 ··​void·​start(tcp:​:​resolver:​:​results_type·​endpoints)​
98 ··​{99 ··​{
99 ····​/​/​·​Start·​the·​connect·​actor.​100 ····​/​/​·​Start·​the·​connect·​actor.​
100 ····​endpoints_·​=·​endpoints;​101 ····​endpoints_·​=·​endpoints;​
101 ····​start_connect(endpoin​ts_.​begin()​)​;​102 ····​start_connect(endpoin​ts_.​begin()​)​;​
102 103
103 ····​/​/​·​Start·​the·​deadline·​actor.​·​You·​will·​note·​that·​we're·​not·​setting·​any104 ····​/​/​·​Start·​the·​deadline·​actor.​·​You·​will·​note·​that·​we're·​not·​setting·​any
104 ····​/​/​·​particular·​deadline·​here.​·​Instead,​·​the·​connect·​and·​input·​actors·​will105 ····​/​/​·​particular·​deadline·​here.​·​Instead,​·​the·​connect·​and·​input·​actors·​will
105 ····​/​/​·​update·​the·​deadline·​prior·​to·​each·​asynchronous·​operation.​106 ····​/​/​·​update·​the·​deadline·​prior·​to·​each·​asynchronous·​operation.​
106 ····​deadline_.​async_wait(boost:​:​bind(&client:​:​check_deadline,​·​this)​)​;​107 ····​deadline_.​async_wait(std:​:​bind(&client:​:​check_deadline,​·​this)​)​;​
107 ··​}108 ··​}
108 109
109 ··​/​/​·​This·​function·​terminates·​all·​the·​actors·​to·​shut·​down·​the·​connection.​·​It110 ··​/​/​·​This·​function·​terminates·​all·​the·​actors·​to·​shut·​down·​the·​connection.​·​It
110 ··​/​/​·​may·​be·​called·​by·​the·​user·​of·​the·​client·​class,​·​or·​by·​the·​class·​itself·​in111 ··​/​/​·​may·​be·​called·​by·​the·​user·​of·​the·​client·​class,​·​or·​by·​the·​class·​itself·​in
111 ··​/​/​·​response·​to·​graceful·​termination·​or·​an·​unrecoverable·​error.​112 ··​/​/​·​response·​to·​graceful·​termination·​or·​an·​unrecoverable·​error.​
112 ··​void·​stop()​113 ··​void·​stop()​
113 ··​{114 ··​{
114 ····​stopped_·​=·​true;​115 ····​stopped_·​=·​true;​
115 ····asio:​:​error_code·​ignored_ec;​116 ····​std:​:​error_code·​ignored_error;​
116 ····​socket_.​close(ignored_ec)​;​117 ····​socket_.​close(ignored_error)​;​
117 ····​deadline_.​cancel()​;​118 ····​deadline_.​cancel()​;​
118 ····​heartbeat_timer_.​cancel()​;​119 ····​heartbeat_timer_.​cancel()​;​
119 ··​}120 ··​}
120 121
121 private:​122 private:​
122 ··​void·​start_connect(tcp:​:​resolver:​:​results_type:​:​iterator·​endpoint_iter)​123 ··​void·​start_connect(tcp:​:​resolver:​:​results_type:​:​iterator·​endpoint_iter)​
123 ··​{124 ··​{
124 ····​if·​(endpoint_iter·​!=·​endpoints_.​end()​)​125 ····​if·​(endpoint_iter·​!=·​endpoints_.​end()​)​
125 ····​{126 ····​{
126 ······​std:​:​cout·​<<·​"Trying·​"·​<<·​endpoint_iter-​>endpoint()​·​<<·​".​.​.​\n";​127 ······​std:​:​cout·​<<·​"Trying·​"·​<<·​endpoint_iter-​>endpoint()​·​<<·​".​.​.​\n";​
127 128
128 ······​/​/​·​Set·​a·​deadline·​for·​the·​connect·​operation.​129 ······​/​/​·​Set·​a·​deadline·​for·​the·​connect·​operation.​
129 ······​deadline_.​expires_after(asio:​:​chrono:​:​seconds(60)​)​;​130 ······​deadline_.​expires_after(std:​:​chrono:​:​seconds(60)​)​;​
130 131
131 ······​/​/​·​Start·​the·​asynchronous·​connect·​operation.​132 ······​/​/​·​Start·​the·​asynchronous·​connect·​operation.​
132 ······​socket_.​async_connect(endpoin​t_iter-​>endpoint()​,​133 ······​socket_.​async_connect(endpoin​t_iter-​>endpoint()​,​
133 ··········boost:​:​bind(&client:​:​handle_connect,​134 ··········​std:​:​bind(&client:​:​handle_connect,​
134 ············​this,​·​_1,​·​endpoint_iter)​)​;​135 ············​this,​·​_1,​·​endpoint_iter)​)​;​
135 ····​}136 ····​}
136 ····​else137 ····​else
137 ····​{138 ····​{
138 ······​/​/​·​There·​are·​no·​more·​endpoints·​to·​try.​·​Shut·​down·​the·​client.​139 ······​/​/​·​There·​are·​no·​more·​endpoints·​to·​try.​·​Shut·​down·​the·​client.​
139 ······​stop()​;​140 ······​stop()​;​
140 ····​}141 ····​}
141 ··​}142 ··​}
142 143
143 ··​void·​handle_connect(const·asio:​:​error_code&·​ec,​144 ··​void·​handle_connect(const·​std:​:​error_code&·​error,​
144 ······​tcp:​:​resolver:​:​results_type:​:​iterator·​endpoint_iter)​145 ······​tcp:​:​resolver:​:​results_type:​:​iterator·​endpoint_iter)​
145 ··​{146 ··​{
146 ····​if·​(stopped_)​147 ····​if·​(stopped_)​
147 ······​return;​148 ······​return;​
148 149
149 ····​/​/​·​The·​async_connect()​·​function·​automatically·​opens·​the·​socket·​at·​the·​start150 ····​/​/​·​The·​async_connect()​·​function·​automatically·​opens·​the·​socket·​at·​the·​start
150 ····​/​/​·​of·​the·​asynchronous·​operation.​·​If·​the·​socket·​is·​closed·​at·​this·​time·​then151 ····​/​/​·​of·​the·​asynchronous·​operation.​·​If·​the·​socket·​is·​closed·​at·​this·​time·​then
151 ····​/​/​·​the·​timeout·​handler·​must·​have·​run·​first.​152 ····​/​/​·​the·​timeout·​handler·​must·​have·​run·​first.​
152 ····​if·​(!socket_.​is_open()​)​153 ····​if·​(!socket_.​is_open()​)​
153 ····​{154 ····​{
154 ······​std:​:​cout·​<<·​"Connect·​timed·​out\n";​155 ······​std:​:​cout·​<<·​"Connect·​timed·​out\n";​
155 156
156 ······​/​/​·​Try·​the·​next·​available·​endpoint.​157 ······​/​/​·​Try·​the·​next·​available·​endpoint.​
157 ······​start_connect(++endpo​int_iter)​;​158 ······​start_connect(++endpo​int_iter)​;​
158 ····​}159 ····​}
159 160
160 ····​/​/​·​Check·​if·​the·​connect·​operation·​failed·​before·​the·​deadline·​expired.​161 ····​/​/​·​Check·​if·​the·​connect·​operation·​failed·​before·​the·​deadline·​expired.​
161 ····​else·​if·​(ec)​162 ····​else·​if·​(error)​
162 ····​{163 ····​{
163 ······​std:​:​cout·​<<·​"Connect·​error:​·​"·​<<·​ec.​message()​·​<<·​"\n";​164 ······​std:​:​cout·​<<·​"Connect·​error:​·​"·​<<·​error.​message()​·​<<·​"\n";​
164 165
165 ······​/​/​·​We·​need·​to·​close·​the·​socket·​used·​in·​the·​previous·​connection·​attempt166 ······​/​/​·​We·​need·​to·​close·​the·​socket·​used·​in·​the·​previous·​connection·​attempt
166 ······​/​/​·​before·​starting·​a·​new·​one.​167 ······​/​/​·​before·​starting·​a·​new·​one.​
167 ······​socket_.​close()​;​168 ······​socket_.​close()​;​
168 169
169 ······​/​/​·​Try·​the·​next·​available·​endpoint.​170 ······​/​/​·​Try·​the·​next·​available·​endpoint.​
170 ······​start_connect(++endpo​int_iter)​;​171 ······​start_connect(++endpo​int_iter)​;​
171 ····​}172 ····​}
172 173
173 ····​/​/​·​Otherwise·​we·​have·​successfully·​established·​a·​connection.​174 ····​/​/​·​Otherwise·​we·​have·​successfully·​established·​a·​connection.​
174 ····​else175 ····​else
175 ····​{176 ····​{
176 ······​std:​:​cout·​<<·​"Connected·​to·​"·​<<·​endpoint_iter-​>endpoint()​·​<<·​"\n";​177 ······​std:​:​cout·​<<·​"Connected·​to·​"·​<<·​endpoint_iter-​>endpoint()​·​<<·​"\n";​
177 178
178 ······​/​/​·​Start·​the·​input·​actor.​179 ······​/​/​·​Start·​the·​input·​actor.​
179 ······​start_read()​;​180 ······​start_read()​;​
180 181
181 ······​/​/​·​Start·​the·​heartbeat·​actor.​182 ······​/​/​·​Start·​the·​heartbeat·​actor.​
182 ······​start_write()​;​183 ······​start_write()​;​
183 ····​}184 ····​}
184 ··​}185 ··​}
185 186
186 ··​void·​start_read()​187 ··​void·​start_read()​
187 ··​{188 ··​{
188 ····​/​/​·​Set·​a·​deadline·​for·​the·​read·​operation.​189 ····​/​/​·​Set·​a·​deadline·​for·​the·​read·​operation.​
189 ····​deadline_.​expires_after(asio:​:​chrono:​:​seconds(30)​)​;​190 ····​deadline_.​expires_after(std:​:​chrono:​:​seconds(30)​)​;​
190 191
191 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​read·​a·​newline-​delimited·​message.​192 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​read·​a·​newline-​delimited·​message.​
192 ····​asio:​:​async_read_until(sock​et_,​193 ····​asio:​:​async_read_until(sock​et_,​
193 ········​asio:​:​dynamic_buffer(input_​buffer_)​,​·​'\n',​194 ········​asio:​:​dynamic_buffer(input_​buffer_)​,​·​'\n',​
194 ········boost:​:​bind(&client:​:​handle_read,​·​this,​·​_1,​·​_2)​)​;​195 ········​std:​:​bind(&client:​:​handle_read,​·​this,​·​_1,​·​_2)​)​;​
195 ··​}196 ··​}
196 197
197 ··​void·​handle_read(const·asio:​:​error_code&·​ec,​·​std:​:​size_t·​n)​198 ··​void·​handle_read(const·​std:​:​error_code&·​error,​·​std:​:​size_t·​n)​
198 ··​{199 ··​{
199 ····​if·​(stopped_)​200 ····​if·​(stopped_)​
200 ······​return;​201 ······​return;​
201 202
202 ····​if·​(!ec)​203 ····​if·​(!error)​
203 ····​{204 ····​{
204 ······​/​/​·​Extract·​the·​newline-​delimited·​message·​from·​the·​buffer.​205 ······​/​/​·​Extract·​the·​newline-​delimited·​message·​from·​the·​buffer.​
205 ······​std:​:​string·​line(input_buffer_.​substr(0,​·​n·​-​·​1)​)​;​206 ······​std:​:​string·​line(input_buffer_.​substr(0,​·​n·​-​·​1)​)​;​
206 ······​input_buffer_.​erase(0,​·​n)​;​207 ······​input_buffer_.​erase(0,​·​n)​;​
207 208
208 ······​/​/​·​Empty·​messages·​are·​heartbeats·​and·​so·​ignored.​209 ······​/​/​·​Empty·​messages·​are·​heartbeats·​and·​so·​ignored.​
209 ······​if·​(!line.​empty()​)​210 ······​if·​(!line.​empty()​)​
210 ······​{211 ······​{
211 ········​std:​:​cout·​<<·​"Received:​·​"·​<<·​line·​<<·​"\n";​212 ········​std:​:​cout·​<<·​"Received:​·​"·​<<·​line·​<<·​"\n";​
212 ······​}213 ······​}
213 214
214 ······​start_read()​;​215 ······​start_read()​;​
215 ····​}216 ····​}
216 ····​else217 ····​else
217 ····​{218 ····​{
218 ······​std:​:​cout·​<<·​"Error·​on·​receive:​·​"·​<<·​ec.​message()​·​<<·​"\n";​219 ······​std:​:​cout·​<<·​"Error·​on·​receive:​·​"·​<<·​error.​message()​·​<<·​"\n";​
219 220
220 ······​stop()​;​221 ······​stop()​;​
221 ····​}222 ····​}
222 ··​}223 ··​}
223 224
224 ··​void·​start_write()​225 ··​void·​start_write()​
225 ··​{226 ··​{
226 ····​if·​(stopped_)​227 ····​if·​(stopped_)​
227 ······​return;​228 ······​return;​
228 229
229 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​send·​a·​heartbeat·​message.​230 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​send·​a·​heartbeat·​message.​
230 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer("\n",​·​1)​,​231 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer("\n",​·​1)​,​
231 ········boost:​:​bind(&client:​:​handle_write,​·​this,​·​_1)​)​;​232 ········​std:​:​bind(&client:​:​handle_write,​·​this,​·​_1)​)​;​
232 ··​}233 ··​}
233 234
234 ··​void·​handle_write(const·asio:​:​error_code&·​ec)​235 ··​void·​handle_write(const·​std:​:​error_code&·​error)​
235 ··​{236 ··​{
236 ····​if·​(stopped_)​237 ····​if·​(stopped_)​
237 ······​return;​238 ······​return;​
238 239
239 ····​if·​(!ec)​240 ····​if·​(!error)​
240 ····​{241 ····​{
241 ······​/​/​·​Wait·​10·​seconds·​before·​sending·​the·​next·​heartbeat.​242 ······​/​/​·​Wait·​10·​seconds·​before·​sending·​the·​next·​heartbeat.​
242 ······​heartbeat_timer_.​expires_after(asio:​:​chrono:​:​seconds(10)​)​;​243 ······​heartbeat_timer_.​expires_after(std:​:​chrono:​:​seconds(10)​)​;​
243 ······​heartbeat_timer_.​async_wait(boost:​:​bind(&client:​:​start_write,​·​this)​)​;​244 ······​heartbeat_timer_.​async_wait(std:​:​bind(&client:​:​start_write,​·​this)​)​;​
244 ····​}245 ····​}
245 ····​else246 ····​else
246 ····​{247 ····​{
247 ······​std:​:​cout·​<<·​"Error·​on·​heartbeat:​·​"·​<<·​ec.​message()​·​<<·​"\n";​248 ······​std:​:​cout·​<<·​"Error·​on·​heartbeat:​·​"·​<<·​error.​message()​·​<<·​"\n";​
248 249
249 ······​stop()​;​250 ······​stop()​;​
250 ····​}251 ····​}
251 ··​}252 ··​}
252 253
253 ··​void·​check_deadline()​254 ··​void·​check_deadline()​
254 ··​{255 ··​{
255 ····​if·​(stopped_)​256 ····​if·​(stopped_)​
256 ······​return;​257 ······​return;​
257 258
258 ····​/​/​·​Check·​whether·​the·​deadline·​has·​passed.​·​We·​compare·​the·​deadline·​against259 ····​/​/​·​Check·​whether·​the·​deadline·​has·​passed.​·​We·​compare·​the·​deadline·​against
259 ····​/​/​·​the·​current·​time·​since·​a·​new·​asynchronous·​operation·​may·​have·​moved·​the260 ····​/​/​·​the·​current·​time·​since·​a·​new·​asynchronous·​operation·​may·​have·​moved·​the
260 ····​/​/​·​deadline·​before·​this·​actor·​had·​a·​chance·​to·​run.​261 ····​/​/​·​deadline·​before·​this·​actor·​had·​a·​chance·​to·​run.​
261 ····​if·​(deadline_.​expiry()​·​<=·​steady_timer:​:​clock_type:​:​now()​)​262 ····​if·​(deadline_.​expiry()​·​<=·​steady_timer:​:​clock_type:​:​now()​)​
262 ····​{263 ····​{
263 ······​/​/​·​The·​deadline·​has·​passed.​·​The·​socket·​is·​closed·​so·​that·​any·​outstanding264 ······​/​/​·​The·​deadline·​has·​passed.​·​The·​socket·​is·​closed·​so·​that·​any·​outstanding
264 ······​/​/​·​asynchronous·​operations·​are·​cancelled.​265 ······​/​/​·​asynchronous·​operations·​are·​cancelled.​
265 ······​socket_.​close()​;​266 ······​socket_.​close()​;​
266 267
267 ······​/​/​·​There·​is·​no·​longer·​an·​active·​deadline.​·​The·​expiry·​is·​set·​to·​the268 ······​/​/​·​There·​is·​no·​longer·​an·​active·​deadline.​·​The·​expiry·​is·​set·​to·​the
268 ······​/​/​·​maximum·​time·​point·​so·​that·​the·​actor·​takes·​no·​action·​until·​a·​new269 ······​/​/​·​maximum·​time·​point·​so·​that·​the·​actor·​takes·​no·​action·​until·​a·​new
269 ······​/​/​·​deadline·​is·​set.​270 ······​/​/​·​deadline·​is·​set.​
270 ······​deadline_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​271 ······​deadline_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​
271 ····​}272 ····​}
272 273
273 ····​/​/​·​Put·​the·​actor·​back·​to·​sleep.​274 ····​/​/​·​Put·​the·​actor·​back·​to·​sleep.​
274 ····​deadline_.​async_wait(boost:​:​bind(&client:​:​check_deadline,​·​this)​)​;​275 ····​deadline_.​async_wait(std:​:​bind(&client:​:​check_deadline,​·​this)​)​;​
275 ··​}276 ··​}
276 277
277 private:​278 private:​
278 ··​bool·​stopped_;​279 ··​bool·​stopped_·=·false;​
279 ··​tcp:​:​resolver:​:​results_type·​endpoints_;​280 ··​tcp:​:​resolver:​:​results_type·​endpoints_;​
280 ··​tcp:​:​socket·​socket_;​281 ··​tcp:​:​socket·​socket_;​
281 ··​std:​:​string·​input_buffer_;​282 ··​std:​:​string·​input_buffer_;​
282 ··​steady_timer·​deadline_;​283 ··​steady_timer·​deadline_;​
283 ··​steady_timer·​heartbeat_timer_;​284 ··​steady_timer·​heartbeat_timer_;​
284 };​285 };​
285 286
286 int·​main(int·​argc,​·​char*·​argv[])​287 int·​main(int·​argc,​·​char*·​argv[])​
287 {288 {
288 ··​try289 ··​try
289 ··​{290 ··​{
290 ····​if·​(argc·​!=·​3)​291 ····​if·​(argc·​!=·​3)​
291 ····​{292 ····​{
292 ······​std:​:​cerr·​<<·​"Usage:​·​client·​<host>·​<port>\n";​293 ······​std:​:​cerr·​<<·​"Usage:​·​client·​<host>·​<port>\n";​
293 ······​return·​1;​294 ······​return·​1;​
294 ····​}295 ····​}
295 296
296 ····​asio:​:​io_context·​io_context;​297 ····​asio:​:​io_context·​io_context;​
297 ····​tcp:​:​resolver·​r(io_context)​;​298 ····​tcp:​:​resolver·​r(io_context)​;​
298 ····​client·​c(io_context)​;​299 ····​client·​c(io_context)​;​
299 300
300 ····​c.​start(r.​resolve(argv[1],​·​argv[2])​)​;​301 ····​c.​start(r.​resolve(argv[1],​·​argv[2])​)​;​
301 302
302 ····​io_context.​run()​;​303 ····​io_context.​run()​;​
303 ··​}304 ··​}
304 ··​catch·​(std:​:​exception&·​e)​305 ··​catch·​(std:​:​exception&·​e)​
305 ··​{306 ··​{
306 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​307 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
307 ··​}308 ··​}
308 309
309 ··​return·​0;​310 ··​return·​0;​
310 }311 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/timeouts/blocking_tcp_client.cpp.html000066400000000000000000005661671340672067200255560ustar00rootroot00000000000000 HTML Diff timeouts/blocking_tcp_client.cpp
src/​examples/​cpp03/​timeouts/​blocking_tcp_client.​cppsrc/​examples/​cpp11/​timeouts/​blocking_tcp_client.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_tcp_client.​cpp2 /​/​·​blocking_tcp_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"asio/​buffer.​hpp"11 #include·​"asio/​buffer.​hpp"
12 #include·​"asio/​connect.​hpp"12 #include·​"asio/​connect.​hpp"
13 #include·​"asio/​io_context.​hpp"13 #include·​"asio/​io_context.​hpp"
14 #include·​"asio/​ip/​tcp.​hpp"14 #include·​"asio/​ip/​tcp.​hpp"
15 #include·​"asio/​read_until.​hpp"15 #include·​"asio/​read_until.​hpp"
16 #include·​"asio/​system_error.​hpp"16 #include·​"asio/​system_error.​hpp"
17 #include·​"asio/​write.​hpp"17 #include·​"asio/​write.​hpp"
18 #include·​<cstdlib>18 #include·​<cstdlib>
19 #include·​<iostream>19 #include·​<iostream>
20 #include·​<string>20 #include·​<string>
21 #include·​<boost/​lambda/​bind.​hpp>
22 #include·​<boost/​lambda/​lambda.​hpp>
23 21
24 using·​asio:​:​ip:​:​tcp;​22 using·​asio:​:​ip:​:​tcp;​
25 using·​boost:​:​lambda:​:​bind;​
26 using·​boost:​:​lambda:​:​var;​
27 using·​boost:​:​lambda:​:​_1;​
28 using·​boost:​:​lambda:​:​_2;​
29 23
30 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​24 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
31 25
32 /​/​26 /​/​
33 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​running·​the·​io_context·​using·​the·​timed27 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​running·​the·​io_context·​using·​the·​timed
34 /​/​·​io_context:​:​run_for()​·​member·​function.​·​Each·​asynchronous·​operation·​is·​given28 /​/​·​io_context:​:​run_for()​·​member·​function.​·​Each·​asynchronous·​operation·​is·​given
35 /​/​·​a·​timeout·​within·​which·​it·​must·​complete.​·​The·​socket·​operations·​themselves29 /​/​·​a·​timeout·​within·​which·​it·​must·​complete.​·​The·​socket·​operations·​themselves
36 /​/​·​use·boost:​:​lambda·function·objects·​as·​completion·​handlers.​·​For·​a·​given30 /​/​·​use·​lambdas·​as·​completion·​handlers.​·​For·​a·​given·socket·operation,​·the·client
37 /​/​·socket·operation,​·​the·​client·​object·runs·the·io_context·​to·block·thread31 /​/​·​object·​runs·​the·io_context·to·block·thread·execution·until·​the·operation
38 /​/​·execution·until·​the·operation·completes·or·​the·timeout·is·reached.​·If·the32 /​/​·​completes·or·​the·timeout·is·reached.​·If·​the·io_context:​:​run_for()​·function
39 /​/​·​io_context:​:​run_for()​·function·​times·​out,​·the·​socket·is·closed·and·the33 /​/​·times·out,​·the·socket·is·closed·and·​the·​outstanding·asynchronous·​operation
40 /​/​·outstanding·asynchronous·operation·​is·​cancelled.​34 /​/​·​is·​cancelled.​
41 /​/​35 /​/​
42 class·​client36 class·​client
43 {37 {
44 public:​38 public:​
45 ··​client()​
46 ····​:​·​socket_(io_context_)​
47 ··​{
48 ··​}
49
50 ··​void·​connect(const·​std:​:​string&·​host,​·​const·​std:​:​string&·​service,​39 ··​void·​connect(const·​std:​:​string&·​host,​·​const·​std:​:​string&·​service,​
51 ······asio:​:​chrono:​:​steady_clock:​:​duration·​timeout)​40 ······​std:​:​chrono:​:​steady_clock:​:​duration·​timeout)​
52 ··​{41 ··​{
53 ····​/​/​·​Resolve·​the·​host·​name·​and·​service·​to·​a·​list·​of·​endpoints.​42 ····​/​/​·​Resolve·​the·​host·​name·​and·​service·​to·​a·​list·​of·​endpoints.​
54 ····​tcp:​:​resolver:​:​results_type·endpoints·=43 ····auto·endpoints·=·​tcp:​:​resolver(io_context_)​.​resolve(host,​·service)​;​
55 ······tcp:​:​resolver(io_context_)​.​resolve(host,​·service)​;​
56 44
57 ····​/​/​·​Start·​the·​asynchronous·​operation·​itself.​·​The·boost:​:​lambda·function45 ····​/​/​·​Start·​the·​asynchronous·​operation·​itself.​·​The·lambda·that·is·used·as·a
58 ····​/​/​·object·is·used·as·a·​callback·and·​will·​update·​the·​ec·​variable·​when·​the46 ····​/​/​·​callback·​will·​update·​the·​error·​variable·​when·​the·operation·completes.​
59 ····​/​/​·operation·completes.​·​The·​blocking_udp_client.​cpp·​example·​shows·​how·​you47 ····​/​/​·​The·​blocking_udp_client.​cpp·​example·​shows·​how·​you·can·use·std:​:​bind
60 ····​/​/​·can·use·boost:​:​bind·​rather·​than·boost:​:​lambda.​48 ····​/​/​·​rather·​than·a·lambda.​
61 ····asio:​:​error_code·​ec;​49 ····​std:​:​error_code·​error;​
62 ····​asio:​:​async_connect(socket_​,​·​endpoints,​·var(ec)​·=·_1)​;​50 ····​asio:​:​async_connect(socket_​,​·​endpoints,​
51 ········​[&](const·​std:​:​error_code&·​result_error,​
52 ············​const·​tcp:​:​endpoint&·​/​*result_endpoint*/​)​
53 ········​{
54 ··········​error·​=·​result_error;​
55 ········​})​;​
63 56
64 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​57 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​
65 ····​run(timeout)​;​58 ····​run(timeout)​;​
66 59
67 ····​/​/​·​Determine·​whether·​a·​connection·​was·​successfully·​established.​60 ····​/​/​·​Determine·​whether·​a·​connection·​was·​successfully·​established.​
68 ····​if·​(ec)​61 ····​if·​(error)​
69 ······​throw·asio:​:​system_error(ec)​;​62 ······​throw·​std:​:​system_error(error)​;​
70 ··​}63 ··​}
71 64
72 ··​std:​:​string·​read_line(asio:​:​chrono:​:​steady_clock:​:​duration·​timeout)​65 ··​std:​:​string·​read_line(std:​:​chrono:​:​steady_clock:​:​duration·​timeout)​
73 ··​{66 ··​{
74 ····​/​/​·​Start·​the·​asynchronous·​operation.​·​The·boost:​:​lambda·function·object·is67 ····​/​/​·​Start·​the·​asynchronous·​operation.​·​The·lambda·that·is·​used·as·a·callback
75 ····​/​/​·used·as·a·callback·and·​will·​update·​the·​ec·​variable·​when·​the·​operation68 ····​/​/​·​will·​update·​the·​error·and·n·​variables·​when·​the·​operation·completes.​·The
76 ····​/​/​·completes.​·The·​blocking_udp_client.​cpp·​example·​shows·​how·​you·​can·​use69 ····​/​/​·​blocking_udp_client.​cpp·​example·​shows·​how·​you·​can·​use·std:​:​bind·rather
77 ····​/​/​·boost:​:​bind·rather·​than·boost:​:​lambda.​70 ····​/​/​·​than·a·lambda.​
78 ····asio:​:​error_code·​ec;​71 ····​std:​:​error_code·​error;​
79 ····​std:​:​size_t·​n·​=·​0;​72 ····​std:​:​size_t·​n·​=·​0;​
80 ····​asio:​:​async_read_until(sock​et_,​73 ····​asio:​:​async_read_until(sock​et_,​
81 ········​asio:​:​dynamic_buffer(input_​buffer_)​,​74 ········​asio:​:​dynamic_buffer(input_​buffer_)​,​·'\n',​
82 ········'\n',​·(var(ec)​·=·_1,​·var(n)​·=·_2)​)​;​75 ········[&](const·std:​:​error_code&·result_error,​
76 ············​std:​:​size_t·​result_n)​
77 ········​{
78 ··········​error·​=·​result_error;​
79 ··········​n·​=·​result_n;​
80 ········​})​;​
83 81
84 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​82 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​
85 ····​run(timeout)​;​83 ····​run(timeout)​;​
86 84
87 ····​/​/​·​Determine·​whether·​the·​read·​completed·​successfully.​85 ····​/​/​·​Determine·​whether·​the·​read·​completed·​successfully.​
88 ····​if·​(ec)​86 ····​if·​(error)​
89 ······​throw·asio:​:​system_error(ec)​;​87 ······​throw·​std:​:​system_error(error)​;​
90 88
91 ····​std:​:​string·​line(input_buffer_.​substr(0,​·​n·​-​·​1)​)​;​89 ····​std:​:​string·​line(input_buffer_.​substr(0,​·​n·​-​·​1)​)​;​
92 ····​input_buffer_.​erase(0,​·​n)​;​90 ····​input_buffer_.​erase(0,​·​n)​;​
93 ····​return·​line;​91 ····​return·​line;​
94 ··​}92 ··​}
95 93
96 ··​void·​write_line(const·​std:​:​string&·​line,​94 ··​void·​write_line(const·​std:​:​string&·​line,​
97 ······asio:​:​chrono:​:​steady_clock:​:​duration·​timeout)​95 ······​std:​:​chrono:​:​steady_clock:​:​duration·​timeout)​
98 ··​{96 ··​{
99 ····​std:​:​string·​data·​=·​line·​+·​"\n";​97 ····​std:​:​string·​data·​=·​line·​+·​"\n";​
100 98
101 ····​/​/​·​Start·​the·​asynchronous·​operation.​·The·boost:​:​lambda·function·object·is99 ····​/​/​·​Start·​the·​asynchronous·​operation·itself.​·The·lambda·that·is·used·as·a
102 ····​/​/​·used·as·a·​callback·and·​will·​update·​the·​ec·​variable·​when·​the·​operation100 ····​/​/​·​callback·​will·​update·​the·​error·​variable·​when·​the·​operation·completes.​
103 ····​/​/​·completes.​·​The·​blocking_udp_client.​cpp·​example·​shows·​how·​you·​can·​use101 ····​/​/​·​The·​blocking_udp_client.​cpp·​example·​shows·​how·​you·​can·​use·std:​:​bind
104 ····​/​/​·boost:​:​bind·​rather·​than·boost:​:​lambda.​102 ····​/​/​·​rather·​than·a·lambda.​
105 ····asio:​:​error_code·​ec;​103 ····​std:​:​error_code·​error;​
106 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer(data)​,​·var(ec)​·=·_1)​;​104 ····​asio:​:​async_write(socket_,​·​asio:​:​buffer(data)​,​
105 ········​[&](const·​std:​:​error_code&·​result_error,​
106 ············​std:​:​size_t·​/​*result_n*/​)​
107 ········​{
108 ··········​error·​=·​result_error;​
109 ········​})​;​
107 110
108 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​111 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​
109 ····​run(timeout)​;​112 ····​run(timeout)​;​
110 113
111 ····​/​/​·​Determine·​whether·​the·​read·​completed·​successfully.​114 ····​/​/​·​Determine·​whether·​the·​read·​completed·​successfully.​
112 ····​if·​(ec)​115 ····​if·​(error)​
113 ······​throw·asio:​:​system_error(ec)​;​116 ······​throw·​std:​:​system_error(error)​;​
114 ··​}117 ··​}
115 118
116 private:​119 private:​
117 ··​void·​run(asio:​:​chrono:​:​steady_clock:​:​duration·​timeout)​120 ··​void·​run(std:​:​chrono:​:​steady_clock:​:​duration·​timeout)​
118 ··​{121 ··​{
119 ····​/​/​·​Restart·​the·​io_context,​·​as·​it·​may·​have·​been·​left·​in·​the·​"stopped"·​state122 ····​/​/​·​Restart·​the·​io_context,​·​as·​it·​may·​have·​been·​left·​in·​the·​"stopped"·​state
120 ····​/​/​·​by·​a·​previous·​operation.​123 ····​/​/​·​by·​a·​previous·​operation.​
121 ····​io_context_.​restart()​;​124 ····​io_context_.​restart()​;​
122 125
123 ····​/​/​·​Block·​until·​the·​asynchronous·​operation·​has·​completed,​·​or·​timed·​out.​·​If126 ····​/​/​·​Block·​until·​the·​asynchronous·​operation·​has·​completed,​·​or·​timed·​out.​·​If
124 ····​/​/​·​the·​pending·​asynchronous·​operation·​is·​a·​composed·​operation,​·​the·​deadline127 ····​/​/​·​the·​pending·​asynchronous·​operation·​is·​a·​composed·​operation,​·​the·​deadline
125 ····​/​/​·​applies·​to·​the·​entire·​operation,​·​rather·​than·​individual·​operations·​on128 ····​/​/​·​applies·​to·​the·​entire·​operation,​·​rather·​than·​individual·​operations·​on
126 ····​/​/​·​the·​socket.​129 ····​/​/​·​the·​socket.​
127 ····​io_context_.​run_for(timeout)​;​130 ····​io_context_.​run_for(timeout)​;​
128 131
129 ····​/​/​·​If·​the·​asynchronous·​operation·​completed·​successfully·​then·​the·​io_context132 ····​/​/​·​If·​the·​asynchronous·​operation·​completed·​successfully·​then·​the·​io_context
130 ····​/​/​·​would·​have·​been·​stopped·​due·​to·​running·​out·​of·​work.​·​If·​it·​was·​not133 ····​/​/​·​would·​have·​been·​stopped·​due·​to·​running·​out·​of·​work.​·​If·​it·​was·​not
131 ····​/​/​·​stopped,​·​then·​the·​io_context:​:​run_for·​call·​must·​have·​timed·​out.​134 ····​/​/​·​stopped,​·​then·​the·​io_context:​:​run_for·​call·​must·​have·​timed·​out.​
132 ····​if·​(!io_context_.​stopped()​)​135 ····​if·​(!io_context_.​stopped()​)​
133 ····​{136 ····​{
134 ······​/​/​·​Close·​the·​socket·​to·​cancel·​the·​outstanding·​asynchronous·​operation.​137 ······​/​/​·​Close·​the·​socket·​to·​cancel·​the·​outstanding·​asynchronous·​operation.​
135 ······​socket_.​close()​;​138 ······​socket_.​close()​;​
136 139
137 ······​/​/​·​Run·​the·​io_context·​again·​until·​the·​operation·​completes.​140 ······​/​/​·​Run·​the·​io_context·​again·​until·​the·​operation·​completes.​
138 ······​io_context_.​run()​;​141 ······​io_context_.​run()​;​
139 ····​}142 ····​}
140 ··​}143 ··​}
141 144
142 ··​asio:​:​io_context·​io_context_;​145 ··​asio:​:​io_context·​io_context_;​
143 ··​tcp:​:​socket·​socket_;​146 ··​tcp:​:​socket·​socket_{io_context_};​
144 ··​std:​:​string·​input_buffer_;​147 ··​std:​:​string·​input_buffer_;​
145 };​148 };​
146 149
147 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​150 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
148 151
149 int·​main(int·​argc,​·​char*·​argv[])​152 int·​main(int·​argc,​·​char*·​argv[])​
150 {153 {
151 ··​try154 ··​try
152 ··​{155 ··​{
153 ····​if·​(argc·​!=·​4)​156 ····​if·​(argc·​!=·​4)​
154 ····​{157 ····​{
155 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_client·​<host>·​<port>·​<message>\n";​158 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_client·​<host>·​<port>·​<message>\n";​
156 ······​return·​1;​159 ······​return·​1;​
157 ····​}160 ····​}
158 161
159 ····​client·​c;​162 ····​client·​c;​
160 ····​c.​connect(argv[1],​·​argv[2],​·asio:​:​chrono:​:​seconds(10)​)​;​163 ····​c.​connect(argv[1],​·​argv[2],​·​std:​:​chrono:​:​seconds(10)​)​;​
161 164
162 ····​asio:​:​chrono:​:​steady_clock:​:​time_point·time_sent·=165 ····​auto·time_sent·=·std:​:​chrono:​:​steady_clock:​:​now()​;​
163 ······asio:​:​chrono:​:​steady_clock:​:​now()​;​
164 166
165 ····​c.​write_line(argv[3],​·asio:​:​chrono:​:​seconds(10)​)​;​167 ····​c.​write_line(argv[3],​·​std:​:​chrono:​:​seconds(10)​)​;​
166 168
167 ····​for·​(;​;​)​169 ····​for·​(;​;​)​
168 ····​{170 ····​{
169 ······​std:​:​string·​line·​=·​c.​read_line(asio:​:​chrono:​:​seconds(10)​)​;​171 ······​std:​:​string·​line·​=·​c.​read_line(std:​:​chrono:​:​seconds(10)​)​;​
170 172
171 ······​/​/​·​Keep·​going·​until·​we·​get·​back·​the·​line·​that·​was·​sent.​173 ······​/​/​·​Keep·​going·​until·​we·​get·​back·​the·​line·​that·​was·​sent.​
172 ······​if·​(line·​==·​argv[3])​174 ······​if·​(line·​==·​argv[3])​
173 ········​break;​175 ········​break;​
174 ····​}176 ····​}
175 177
176 ····​asio:​:​chrono:​:​steady_clock:​:​time_point·time_received·=178 ····​auto·time_received·=·std:​:​chrono:​:​steady_clock:​:​now()​;​
177 ······asio:​:​chrono:​:​steady_clock:​:​now()​;​
178 179
179 ····​std:​:​cout·​<<·​"Round·​trip·​time:​·​";​180 ····​std:​:​cout·​<<·​"Round·​trip·​time:​·​";​
180 ····​std:​:​cout·​<<·asio:​:​chrono:​:​duration_cast<181 ····​std:​:​cout·​<<·​std:​:​chrono:​:​duration_cast<
181 ······asio:​:​chrono:​:​microseconds>(182 ······​std:​:​chrono:​:​microseconds>(
182 ········​time_received·​-​·​time_sent)​.​count()​;​183 ········​time_received·​-​·​time_sent)​.​count()​;​
183 ····​std:​:​cout·​<<·​"·​microseconds\n";​184 ····​std:​:​cout·​<<·​"·​microseconds\n";​
184 ··​}185 ··​}
185 ··​catch·​(std:​:​exception&·​e)​186 ··​catch·​(std:​:​exception&·​e)​
186 ··​{187 ··​{
187 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​188 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
188 ··​}189 ··​}
189 190
190 ··​return·​0;​191 ··​return·​0;​
191 }192 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/timeouts/blocking_token_tcp_client.cpp.html000066400000000000000000004503611340672067200267420ustar00rootroot00000000000000 HTML Diff timeouts/blocking_token_tcp_client.cpp
src/​examples/​cpp03/​timeouts/​blocking_token_tcp_cl​ient.​cppsrc/​examples/​cpp11/​timeouts/​blocking_token_tcp_cl​ient.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_token_tcp_cl​ient.​cpp2 /​/​·​blocking_token_tcp_cl​ient.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"asio/​connect.​hpp"11 #include·​"asio/​connect.​hpp"
12 #include·​"asio/​io_context.​hpp"12 #include·​"asio/​io_context.​hpp"
13 #include·​"asio/​ip/​tcp.​hpp"13 #include·​"asio/​ip/​tcp.​hpp"
14 #include·​"asio/​read_until.​hpp"14 #include·​"asio/​read_until.​hpp"
15 #include·​"asio/​streambuf.​hpp"15 #include·​"asio/​streambuf.​hpp"
16 #include·​"asio/​system_error.​hpp"16 #include·​"asio/​system_error.​hpp"
17 #include·​"asio/​write.​hpp"17 #include·​"asio/​write.​hpp"
18 #include·​<cstdlib>18 #include·​<cstdlib>
19 #include·​<iostream>19 #include·​<iostream>
20 #include·​<memory>20 #include·​<memory>
21 #include·​<string>21 #include·​<string>
22 22
23 using·​asio:​:​ip:​:​tcp;​23 using·​asio:​:​ip:​:​tcp;​
24 24
25 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​25 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
26 26
27 /​/​·​A·​custom·​completion·​token·​that·​makes·​asynchronous·​operations·​behave·​as27 /​/​·​A·​custom·​completion·​token·​that·​makes·​asynchronous·​operations·​behave·​as
28 /​/​·​though·​they·​are·​blocking·​calls·​with·​a·​timeout.​28 /​/​·​though·​they·​are·​blocking·​calls·​with·​a·​timeout.​
29 struct·​close_after29 struct·​close_after
30 {30 {
31 ··​close_after(asio:​:​chrono:​:​steady_clock:​:​duration·​t,​·​tcp:​:​socket&·​s)​31 ··​close_after(std:​:​chrono:​:​steady_clock:​:​duration·​t,​·​tcp:​:​socket&·​s)​
32 ····​:​·​timeout_(t)​,​·​socket_(s)​32 ····​:​·​timeout_(t)​,​·​socket_(s)​
33 ··​{33 ··​{
34 ··​}34 ··​}
35 35
36 ··​/​/​·​The·​maximum·​time·​to·​wait·​for·​an·​asynchronous·​operation·​to·​complete.​36 ··​/​/​·​The·​maximum·​time·​to·​wait·​for·​an·​asynchronous·​operation·​to·​complete.​
37 ··asio:​:​chrono:​:​steady_clock:​:​duration·​timeout_;​37 ··​std:​:​chrono:​:​steady_clock:​:​duration·​timeout_;​
38 38
39 ··​/​/​·​The·​socket·​to·​be·​closed·​if·​the·​operation·​does·​not·​complete·​in·​time.​39 ··​/​/​·​The·​socket·​to·​be·​closed·​if·​the·​operation·​does·​not·​complete·​in·​time.​
40 ··​tcp:​:​socket&·​socket_;​40 ··​tcp:​:​socket&·​socket_;​
41 };​41 };​
42 42
43 namespace·​asio·​{43 namespace·​asio·​{
44 44
45 /​/​·​The·​async_result·​template·​is·​specialised·​to·​allow·​the·​close_after·​token·​to45 /​/​·​The·​async_result·​template·​is·​specialised·​to·​allow·​the·​close_after·​token·​to
46 /​/​·​be·​used·​with·​asynchronous·​operations·​that·​have·​a·​completion·​signature·​of46 /​/​·​be·​used·​with·​asynchronous·​operations·​that·​have·​a·​completion·​signature·​of
47 /​/​·​void(error_code,​·​T)​.​·​Generalising·​this·​for·​all·​completion·​signature·​forms·​is47 /​/​·​void(error_code,​·​T)​.​·​Generalising·​this·​for·​all·​completion·​signature·​forms·​is
48 /​/​·​left·​as·​an·​exercise·​for·​the·​reader.​48 /​/​·​left·​as·​an·​exercise·​for·​the·​reader.​
49 template·​<typename·​T>49 template·​<typename·​T>
50 class·​async_result<close_af​ter,​·​void(asio:​:​error_code,​·​T)​>50 class·​async_result<close_af​ter,​·​void(std:​:​error_code,​·​T)​>
51 {51 {
52 public:​52 public:​
53 ··​/​/​·​An·​asynchronous·​operation's·​initiating·​function·​automatically·​creates·​an53 ··​/​/​·​An·​asynchronous·​operation's·​initiating·​function·​automatically·​creates·​an
54 ··​/​/​·​completion_handler_ty​pe·​object·​from·​the·​token.​·​This·​function·​object·​is54 ··​/​/​·​completion_handler_ty​pe·​object·​from·​the·​token.​·​This·​function·​object·​is
55 ··​/​/​·​then·​called·​on·​completion·​of·​the·​asynchronous·​operation.​55 ··​/​/​·​then·​called·​on·​completion·​of·​the·​asynchronous·​operation.​
56 ··​class·​completion_handler_ty​pe56 ··​class·​completion_handler_ty​pe
57 ··​{57 ··​{
58 ··​public:​58 ··​public:​
59 ····​completion_handler_ty​pe(const·​close_after&·​token)​59 ····​completion_handler_ty​pe(const·​close_after&·​token)​
60 ······​:​·​token_(token)​60 ······​:​·​token_(token)​
61 ····​{61 ····​{
62 ····​}62 ····​}
63 63
64 ····​void·​operator()​(asio:​:​error_code·​ec,​·​T·​t)​64 ····​void·​operator()​(const·std:​:​error_code&·​error,​·​T·​t)​
65 ····​{65 ····​{
66 ······​*ec_·​=·​ec;​66 ······​*error_·​=·​error;​
67 ······​*t_·​=·​t;​67 ······​*t_·​=·​t;​
68 ····​}68 ····​}
69 69
70 ··​private:​70 ··​private:​
71 ····​friend·​class·​async_result;​71 ····​friend·​class·​async_result;​
72 ····​close_after·​token_;​72 ····​close_after·​token_;​
73 ····asio:​:​error_code*·​ec_;​73 ····​std:​:​error_code*·​error_;​
74 ····​T*·​t_;​74 ····​T*·​t_;​
75 ··​};​75 ··​};​
76 76
77 ··​/​/​·​The·​async_result·​constructor·​associates·​the·​completion·​handler·​object·​with77 ··​/​/​·​The·​async_result·​constructor·​associates·​the·​completion·​handler·​object·​with
78 ··​/​/​·​the·​result·​of·​the·​initiating·​function.​78 ··​/​/​·​the·​result·​of·​the·​initiating·​function.​
79 ··​explicit·​async_result(completi​on_handler_type&·​h)​79 ··​explicit·​async_result(completi​on_handler_type&·​h)​
80 ····​:​·​timeout_(h.​token_.​timeout_)​,​80 ····​:​·​timeout_(h.​token_.​timeout_)​,​
81 ······​socket_(h.​token_.​socket_)​81 ······​socket_(h.​token_.​socket_)​
82 ··​{82 ··​{
83 ····​h.​ec_·​=·​&ec_;​83 ····​h.​error_·​=·​&error_;​
84 ····​h.​t_·​=·​&t_;​84 ····​h.​t_·​=·​&t_;​
85 ··​}85 ··​}
86 86
87 ··​/​/​·​The·​return_type·​typedef·​determines·​the·​result·​type·​of·​the·​asynchronous87 ··​/​/​·​The·​return_type·​typedef·​determines·​the·​result·​type·​of·​the·​asynchronous
88 ··​/​/​·​operation's·​initiating·​function.​88 ··​/​/​·​operation's·​initiating·​function.​
89 ··​typedef·​T·​return_type;​89 ··​typedef·​T·​return_type;​
90 90
91 ··​/​/​·​The·​get()​·​function·​is·​used·​to·​obtain·​the·​result·​of·​the·​asynchronous91 ··​/​/​·​The·​get()​·​function·​is·​used·​to·​obtain·​the·​result·​of·​the·​asynchronous
92 ··​/​/​·​operation's·​initiating·​function.​·​For·​the·​close_after·​completion·​token,​·​we92 ··​/​/​·​operation's·​initiating·​function.​·​For·​the·​close_after·​completion·​token,​·​we
93 ··​/​/​·​use·​this·​function·​to·​run·​the·​io_context·​until·​the·​operation·​is·​complete.​93 ··​/​/​·​use·​this·​function·​to·​run·​the·​io_context·​until·​the·​operation·​is·​complete.​
94 ··​return_type·​get()​94 ··​return_type·​get()​
95 ··​{95 ··​{
96 ····​asio:​:​io_context&·​io_context·​=·​socket_.​get_executor()​.​context()​;​96 ····​asio:​:​io_context&·​io_context·​=·​socket_.​get_executor()​.​context()​;​
97 97
98 ····​/​/​·​Restart·​the·​io_context,​·​as·​it·​may·​have·​been·​left·​in·​the·​"stopped"·​state98 ····​/​/​·​Restart·​the·​io_context,​·​as·​it·​may·​have·​been·​left·​in·​the·​"stopped"·​state
99 ····​/​/​·​by·​a·​previous·​operation.​99 ····​/​/​·​by·​a·​previous·​operation.​
100 ····​io_context.​restart()​;​100 ····​io_context.​restart()​;​
101 101
102 ····​/​/​·​Block·​until·​the·​asynchronous·​operation·​has·​completed,​·​or·​timed·​out.​·​If102 ····​/​/​·​Block·​until·​the·​asynchronous·​operation·​has·​completed,​·​or·​timed·​out.​·​If
103 ····​/​/​·​the·​pending·​asynchronous·​operation·​is·​a·​composed·​operation,​·​the·​deadline103 ····​/​/​·​the·​pending·​asynchronous·​operation·​is·​a·​composed·​operation,​·​the·​deadline
104 ····​/​/​·​applies·​to·​the·​entire·​operation,​·​rather·​than·​individual·​operations·​on104 ····​/​/​·​applies·​to·​the·​entire·​operation,​·​rather·​than·​individual·​operations·​on
105 ····​/​/​·​the·​socket.​105 ····​/​/​·​the·​socket.​
106 ····​io_context.​run_for(timeout_)​;​106 ····​io_context.​run_for(timeout_)​;​
107 107
108 ····​/​/​·​If·​the·​asynchronous·​operation·​completed·​successfully·​then·​the·​io_context108 ····​/​/​·​If·​the·​asynchronous·​operation·​completed·​successfully·​then·​the·​io_context
109 ····​/​/​·​would·​have·​been·​stopped·​due·​to·​running·​out·​of·​work.​·​If·​it·​was·​not109 ····​/​/​·​would·​have·​been·​stopped·​due·​to·​running·​out·​of·​work.​·​If·​it·​was·​not
110 ····​/​/​·​stopped,​·​then·​the·​io_context:​:​run_for·​call·​must·​have·​timed·​out·​and·​the110 ····​/​/​·​stopped,​·​then·​the·​io_context:​:​run_for·​call·​must·​have·​timed·​out·​and·​the
111 ····​/​/​·​operation·​is·​still·​incomplete.​111 ····​/​/​·​operation·​is·​still·​incomplete.​
112 ····​if·​(!io_context.​stopped()​)​112 ····​if·​(!io_context.​stopped()​)​
113 ····​{113 ····​{
114 ······​/​/​·​Close·​the·​socket·​to·​cancel·​the·​outstanding·​asynchronous·​operation.​114 ······​/​/​·​Close·​the·​socket·​to·​cancel·​the·​outstanding·​asynchronous·​operation.​
115 ······​socket_.​close()​;​115 ······​socket_.​close()​;​
116 116
117 ······​/​/​·​Run·​the·​io_context·​again·​until·​the·​operation·​completes.​117 ······​/​/​·​Run·​the·​io_context·​again·​until·​the·​operation·​completes.​
118 ······​io_context.​run()​;​118 ······​io_context.​run()​;​
119 ····​}119 ····​}
120 120
121 ····​/​/​·​If·​the·​operation·​failed,​·​throw·​an·​exception.​·​Otherwise·​return·​the·​result.​121 ····​/​/​·​If·​the·​operation·​failed,​·​throw·​an·​exception.​·​Otherwise·​return·​the·​result.​
122 ····​return·​ec_·​?·​throw·asio:​:​system_error(ec_)​·​:​·​t_;​122 ····​return·​error_·​?·​throw·​std:​:​system_error(error_)​·​:​·​t_;​
123 ··​}123 ··​}
124 124
125 private:​125 private:​
126 ··asio:​:​chrono:​:​steady_clock:​:​duration·​timeout_;​126 ··​std:​:​chrono:​:​steady_clock:​:​duration·​timeout_;​
127 ··​tcp:​:​socket&·​socket_;​127 ··​tcp:​:​socket&·​socket_;​
128 ··asio:​:​error_code·​ec_;​128 ··​std:​:​error_code·​error_;​
129 ··​T·​t_;​129 ··​T·​t_;​
130 };​130 };​
131 131
132 }·​/​/​·​namespace·​asio132 }·​/​/​·​namespace·​asio
133 133
134 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​134 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
135 135
136 int·​main(int·​argc,​·​char*·​argv[])​136 int·​main(int·​argc,​·​char*·​argv[])​
137 {137 {
138 ··​try138 ··​try
139 ··​{139 ··​{
140 ····​if·​(argc·​!=·​4)​140 ····​if·​(argc·​!=·​4)​
141 ····​{141 ····​{
142 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_client·​<host>·​<port>·​<message>\n";​142 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_tcp_client·​<host>·​<port>·​<message>\n";​
143 ······​return·​1;​143 ······​return·​1;​
144 ····​}144 ····​}
145 145
146 ····​asio:​:​io_context·​io_context;​146 ····​asio:​:​io_context·​io_context;​
147 147
148 ····​/​/​·​Resolve·​the·​host·​name·​and·​service·​to·​a·​list·​of·​endpoints.​148 ····​/​/​·​Resolve·​the·​host·​name·​and·​service·​to·​a·​list·​of·​endpoints.​
149 ····​tcp:​:​resolver:​:​results_type·endpoints·=149 ····auto·endpoints·=·​tcp:​:​resolver(io_context)​.​resolve(argv[1],​·argv[2])​;​
150 ······tcp:​:​resolver(io_context)​.​resolve(argv[1],​·argv[2])​;​
151 150
152 ····​tcp:​:​socket·​socket(io_context)​;​151 ····​tcp:​:​socket·​socket(io_context)​;​
153 152
154 ····​/​/​·​Run·​an·​asynchronous·​connect·​operation·​with·​a·​timeout.​153 ····​/​/​·​Run·​an·​asynchronous·​connect·​operation·​with·​a·​timeout.​
155 ····​asio:​:​async_connect(socket,​·​endpoints,​154 ····​asio:​:​async_connect(socket,​·​endpoints,​
156 ········​close_after(asio:​:​chrono:​:​seconds(10)​,​·​socket)​)​;​155 ········​close_after(std:​:​chrono:​:​seconds(10)​,​·​socket)​)​;​
157 156
158 ····​asio:​:​chrono:​:​steady_clock:​:​time_point·time_sent·=157 ····​auto·time_sent·=·std:​:​chrono:​:​steady_clock:​:​now()​;​
159 ······asio:​:​chrono:​:​steady_clock:​:​now()​;​
160 158
161 ····​/​/​·​Run·​an·​asynchronous·​write·​operation·​with·​a·​timeout.​159 ····​/​/​·​Run·​an·​asynchronous·​write·​operation·​with·​a·​timeout.​
162 ····​std:​:​string·​msg·​=·​argv[3]·​+·​std:​:​string("\n")​;​160 ····​std:​:​string·​msg·​=·​argv[3]·​+·​std:​:​string("\n")​;​
163 ····​asio:​:​async_write(socket,​·​asio:​:​buffer(msg)​,​161 ····​asio:​:​async_write(socket,​·​asio:​:​buffer(msg)​,​
164 ········​close_after(asio:​:​chrono:​:​seconds(10)​,​·​socket)​)​;​162 ········​close_after(std:​:​chrono:​:​seconds(10)​,​·​socket)​)​;​
165 163
166 ····​for·​(std:​:​string·​input_buffer;​;​)​164 ····​for·​(std:​:​string·​input_buffer;​;​)​
167 ····​{165 ····​{
168 ······​/​/​·​Run·​an·​asynchronous·​read·​operation·​with·​a·​timeout.​166 ······​/​/​·​Run·​an·​asynchronous·​read·​operation·​with·​a·​timeout.​
169 ······​std:​:​size_t·​n·​=·​asio:​:​async_read_until(sock​et,​167 ······​std:​:​size_t·​n·​=·​asio:​:​async_read_until(sock​et,​
170 ··········​asio:​:​dynamic_buffer(input_​buffer)​,​·​'\n',​168 ··········​asio:​:​dynamic_buffer(input_​buffer)​,​·​'\n',​
171 ··········​close_after(asio:​:​chrono:​:​seconds(10)​,​·​socket)​)​;​169 ··········​close_after(std:​:​chrono:​:​seconds(10)​,​·​socket)​)​;​
172 170
173 ······​std:​:​string·​line(input_buffer.​substr(0,​·​n·​-​·​1)​)​;​171 ······​std:​:​string·​line(input_buffer.​substr(0,​·​n·​-​·​1)​)​;​
174 ······​input_buffer.​erase(0,​·​n)​;​172 ······​input_buffer.​erase(0,​·​n)​;​
175 173
176 ······​/​/​·​Keep·​going·​until·​we·​get·​back·​the·​line·​that·​was·​sent.​174 ······​/​/​·​Keep·​going·​until·​we·​get·​back·​the·​line·​that·​was·​sent.​
177 ······​if·​(line·​==·​argv[3])​175 ······​if·​(line·​==·​argv[3])​
178 ········​break;​176 ········​break;​
179 ····​}177 ····​}
180 178
181 ····​asio:​:​chrono:​:​steady_clock:​:​time_point·time_received·=179 ····​auto·time_received·=·std:​:​chrono:​:​steady_clock:​:​now()​;​
182 ······asio:​:​chrono:​:​steady_clock:​:​now()​;​
183 180
184 ····​std:​:​cout·​<<·​"Round·​trip·​time:​·​";​181 ····​std:​:​cout·​<<·​"Round·​trip·​time:​·​";​
185 ····​std:​:​cout·​<<·asio:​:​chrono:​:​duration_cast<182 ····​std:​:​cout·​<<·​std:​:​chrono:​:​duration_cast<
186 ······asio:​:​chrono:​:​microseconds>(183 ······​std:​:​chrono:​:​microseconds>(
187 ········​time_received·​-​·​time_sent)​.​count()​;​184 ········​time_received·​-​·​time_sent)​.​count()​;​
188 ····​std:​:​cout·​<<·​"·​microseconds\n";​185 ····​std:​:​cout·​<<·​"·​microseconds\n";​
189 ··​}186 ··​}
190 ··​catch·​(std:​:​exception&·​e)​187 ··​catch·​(std:​:​exception&·​e)​
191 ··​{188 ··​{
192 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​189 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
193 ··​}190 ··​}
194 191
195 ··​return·​0;​192 ··​return·​0;​
196 }193 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/timeouts/blocking_udp_client.cpp.html000066400000000000000000003543321340672067200255450ustar00rootroot00000000000000 HTML Diff timeouts/blocking_udp_client.cpp
src/​examples/​cpp03/​timeouts/​blocking_udp_client.​cppsrc/​examples/​cpp11/​timeouts/​blocking_udp_client.​cpp
1 /​/​1 /​/​
2 /​/​·​blocking_udp_client.​cpp2 /​/​·​blocking_udp_client.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~3 /​/​·​~~~~~~~~~~~~~~~~~~~~~​~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​"asio/​buffer.​hpp"11 #include·​"asio/​buffer.​hpp"
12 #include·​"asio/​io_context.​hpp"12 #include·​"asio/​io_context.​hpp"
13 #include·​"asio/​ip/​udp.​hpp"13 #include·​"asio/​ip/​udp.​hpp"
14 #include·​<cstdlib>14 #include·​<cstdlib>
15 #include·​<boost/​bind.​hpp>15 #include·​<functional>
16 #include·​<iostream>16 #include·​<iostream>
17 17
18 using·​asio:​:​ip:​:​udp;​18 using·​asio:​:​ip:​:​udp;​
19 using·​std:​:​placeholders:​:​_1;​
20 using·​std:​:​placeholders:​:​_2;​
19 21
20 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​22 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
21 23
22 /​/​24 /​/​
23 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​running·​the·​io_context·​using·​the·​timed25 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​running·​the·​io_context·​using·​the·​timed
24 /​/​·​io_context:​:​run_for()​·​member·​function.​·​Each·​asynchronous·​operation·​is·​given26 /​/​·​io_context:​:​run_for()​·​member·​function.​·​Each·​asynchronous·​operation·​is·​given
25 /​/​·​a·​timeout·​within·​which·​it·​must·​complete.​·​The·​socket·​operations·​themselves27 /​/​·​a·​timeout·​within·​which·​it·​must·​complete.​·​The·​socket·​operations·​themselves
26 /​/​·​use·boost:​:​bind·​to·​specify·​the·​completion·​handler:​28 /​/​·​use·​std:​:​bind·​to·​specify·​the·​completion·​handler:​
27 /​/​29 /​/​
28 /​/​···​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+30 /​/​···​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
29 /​/​···​|···············​|31 /​/​···​|···············​|
30 /​/​···​|····​receive····​|32 /​/​···​|····​receive····​|
31 /​/​···​|···············​|33 /​/​···​|···············​|
32 /​/​···​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+34 /​/​···​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
33 /​/​···········​|35 /​/​···········​|
34 /​/​··​async_-​··​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+36 /​/​··​async_-​··​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
35 /​/​·​receive()​·​|····​|················​|37 /​/​·​receive()​·​|····​|················​|
36 /​/​···········​+-​-​-​>|·​handle_receive·​|38 /​/​···········​+-​-​-​>|·​handle_receive·​|
37 /​/​················​|················​|39 /​/​················​|················​|
38 /​/​················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+40 /​/​················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
39 /​/​41 /​/​
40 /​/​·​For·​a·​given·​socket·​operation,​·​the·​client·​object·​runs·​the·​io_context·​to·​block42 /​/​·​For·​a·​given·​socket·​operation,​·​the·​client·​object·​runs·​the·​io_context·​to·​block
41 /​/​·​thread·​execution·​until·​the·​operation·​completes·​or·​the·​timeout·​is·​reached.​·​If43 /​/​·​thread·​execution·​until·​the·​operation·​completes·​or·​the·​timeout·​is·​reached.​·​If
42 /​/​·​the·​io_context:​:​run_for()​·​function·​times·​out,​·​the·​socket·​is·​closed·​and·​the44 /​/​·​the·​io_context:​:​run_for()​·​function·​times·​out,​·​the·​socket·​is·​closed·​and·​the
43 /​/​·​outstanding·​asynchronous·​operation·​is·​cancelled.​45 /​/​·​outstanding·​asynchronous·​operation·​is·​cancelled.​
44 /​/​46 /​/​
45 class·​client47 class·​client
46 {48 {
47 public:​49 public:​
48 ··​client(const·​udp:​:​endpoint&·​listen_endpoint)​50 ··​client(const·​udp:​:​endpoint&·​listen_endpoint)​
49 ····​:​·​socket_(io_context_,​·​listen_endpoint)​51 ····​:​·​socket_(io_context_,​·​listen_endpoint)​
50 ··​{52 ··​{
51 ··​}53 ··​}
52 54
53 ··​std:​:​size_t·​receive(const·​asio:​:​mutable_buffer&·​buffer,​55 ··​std:​:​size_t·​receive(const·​asio:​:​mutable_buffer&·​buffer,​
54 ······asio:​:​chrono:​:​steady_clock:​:​duration·​timeout,​56 ······​std:​:​chrono:​:​steady_clock:​:​duration·​timeout,​
55 ······asio:​:​error_code&·​ec)​57 ······​std:​:​error_code&·​error)​
56 ··​{58 ··​{
57 ····​/​/​·​Start·​the·​asynchronous·​operation.​·​The·​handle_receive·​function·​used·​as·​a59 ····​/​/​·​Start·​the·​asynchronous·​operation.​·​The·​handle_receive·​function·​used·​as·​a
58 ····​/​/​·​callback·​will·​update·​the·​ec·​and·​length·​variables.​60 ····​/​/​·​callback·​will·​update·​the·​error·​and·​length·​variables.​
59 ····​std:​:​size_t·​length·​=·​0;​61 ····​std:​:​size_t·​length·​=·​0;​
60 ····​socket_.​async_receive(asio:​:​buffer(buffer)​,​62 ····​socket_.​async_receive(asio:​:​buffer(buffer)​,​
61 ········boost:​:​bind(&client:​:​handle_receive,​·​_1,​·​_2,​·​&ec,​·​&length)​)​;​63 ········​std:​:​bind(&client:​:​handle_receive,​·​_1,​·​_2,​·​&error,​·​&length)​)​;​
62 64
63 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​65 ····​/​/​·​Run·​the·​operation·​until·​it·​completes,​·​or·​until·​the·​timeout.​
64 ····​run(timeout)​;​66 ····​run(timeout)​;​
65 67
66 ····​return·​length;​68 ····​return·​length;​
67 ··​}69 ··​}
68 70
69 private:​71 private:​
70 ··​void·​run(asio:​:​chrono:​:​steady_clock:​:​duration·​timeout)​72 ··​void·​run(std:​:​chrono:​:​steady_clock:​:​duration·​timeout)​
71 ··​{73 ··​{
72 ····​/​/​·​Restart·​the·​io_context,​·​as·​it·​may·​have·​been·​left·​in·​the·​"stopped"·​state74 ····​/​/​·​Restart·​the·​io_context,​·​as·​it·​may·​have·​been·​left·​in·​the·​"stopped"·​state
73 ····​/​/​·​by·​a·​previous·​operation.​75 ····​/​/​·​by·​a·​previous·​operation.​
74 ····​io_context_.​restart()​;​76 ····​io_context_.​restart()​;​
75 77
76 ····​/​/​·​Block·​until·​the·​asynchronous·​operation·​has·​completed,​·​or·​timed·​out.​·​If78 ····​/​/​·​Block·​until·​the·​asynchronous·​operation·​has·​completed,​·​or·​timed·​out.​·​If
77 ····​/​/​·​the·​pending·​asynchronous·​operation·​is·​a·​composed·​operation,​·​the·​deadline79 ····​/​/​·​the·​pending·​asynchronous·​operation·​is·​a·​composed·​operation,​·​the·​deadline
78 ····​/​/​·​applies·​to·​the·​entire·​operation,​·​rather·​than·​individual·​operations·​on80 ····​/​/​·​applies·​to·​the·​entire·​operation,​·​rather·​than·​individual·​operations·​on
79 ····​/​/​·​the·​socket.​81 ····​/​/​·​the·​socket.​
80 ····​io_context_.​run_for(timeout)​;​82 ····​io_context_.​run_for(timeout)​;​
81 83
82 ····​/​/​·​If·​the·​asynchronous·​operation·​completed·​successfully·​then·​the·​io_context84 ····​/​/​·​If·​the·​asynchronous·​operation·​completed·​successfully·​then·​the·​io_context
83 ····​/​/​·​would·​have·​been·​stopped·​due·​to·​running·​out·​of·​work.​·​If·​it·​was·​not85 ····​/​/​·​would·​have·​been·​stopped·​due·​to·​running·​out·​of·​work.​·​If·​it·​was·​not
84 ····​/​/​·​stopped,​·​then·​the·​io_context:​:​run_for·​call·​must·​have·​timed·​out.​86 ····​/​/​·​stopped,​·​then·​the·​io_context:​:​run_for·​call·​must·​have·​timed·​out.​
85 ····​if·​(!io_context_.​stopped()​)​87 ····​if·​(!io_context_.​stopped()​)​
86 ····​{88 ····​{
87 ······​/​/​·​Cancel·​the·​outstanding·​asynchronous·​operation.​89 ······​/​/​·​Cancel·​the·​outstanding·​asynchronous·​operation.​
88 ······​socket_.​cancel()​;​90 ······​socket_.​cancel()​;​
89 91
90 ······​/​/​·​Run·​the·​io_context·​again·​until·​the·​operation·​completes.​92 ······​/​/​·​Run·​the·​io_context·​again·​until·​the·​operation·​completes.​
91 ······​io_context_.​run()​;​93 ······​io_context_.​run()​;​
92 ····​}94 ····​}
93 ··​}95 ··​}
94 96
95 ··​static·​void·​handle_receive(97 ··​static·​void·​handle_receive(
96 ······​const·asio:​:​error_code&·​ec,​·​std:​:​size_t·​length,​98 ······​const·​std:​:​error_code&·​error,​·​std:​:​size_t·​length,​
97 ······asio:​:​error_code*·​out_ec,​·​std:​:​size_t*·​out_length)​99 ······​std:​:​error_code*·​out_error,​·​std:​:​size_t*·​out_length)​
98 ··​{100 ··​{
99 ····​*out_ec·​=·​ec;​101 ····​*out_error·​=·​error;​
100 ····​*out_length·​=·​length;​102 ····​*out_length·​=·​length;​
101 ··​}103 ··​}
102 104
103 private:​105 private:​
104 ··​asio:​:​io_context·​io_context_;​106 ··​asio:​:​io_context·​io_context_;​
105 ··​udp:​:​socket·​socket_;​107 ··​udp:​:​socket·​socket_;​
106 };​108 };​
107 109
108 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​110 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
109 111
110 int·​main(int·​argc,​·​char*·​argv[])​112 int·​main(int·​argc,​·​char*·​argv[])​
111 {113 {
112 ··​try114 ··​try
113 ··​{115 ··​{
114 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​116 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​
115 117
116 ····​if·​(argc·​!=·​3)​118 ····​if·​(argc·​!=·​3)​
117 ····​{119 ····​{
118 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_udp_client·​<listen_addr>·​<listen_port>\n";​120 ······​std:​:​cerr·​<<·​"Usage:​·​blocking_udp_client·​<listen_addr>·​<listen_port>\n";​
119 ······​return·​1;​121 ······​return·​1;​
120 ····​}122 ····​}
121 123
122 ····​udp:​:​endpoint·​listen_endpoint(124 ····​udp:​:​endpoint·​listen_endpoint(
123 ········​asio:​:​ip:​:​make_address(argv[1])​,​125 ········​asio:​:​ip:​:​make_address(argv[1])​,​
124 ········​std:​:​atoi(argv[2])​)​;​126 ········​std:​:​atoi(argv[2])​)​;​
125 127
126 ····​client·​c(listen_endpoint)​;​128 ····​client·​c(listen_endpoint)​;​
127 129
128 ····​for·​(;​;​)​130 ····​for·​(;​;​)​
129 ····​{131 ····​{
130 ······​char·​data[1024];​132 ······​char·​data[1024];​
131 ······asio:​:​error_code·​ec;​133 ······​std:​:​error_code·​error;​
132 ······​std:​:​size_t·​n·​=·​c.​receive(asio:​:​buffer(data)​,​134 ······​std:​:​size_t·​n·​=·​c.​receive(asio:​:​buffer(data)​,​
133 ··········asio:​:​chrono:​:​seconds(10)​,​·​ec)​;​135 ··········​std:​:​chrono:​:​seconds(10)​,​·​error)​;​
134 136
135 ······​if·​(ec)​137 ······​if·​(error)​
136 ······​{138 ······​{
137 ········​std:​:​cout·​<<·​"Receive·​error:​·​"·​<<·​ec.​message()​·​<<·​"\n";​·139 ········​std:​:​cout·​<<·​"Receive·​error:​·​"·​<<·​error.​message()​·​<<·​"\n";​·
138 ······​}140 ······​}
139 ······​else141 ······​else
140 ······​{142 ······​{
141 ········​std:​:​cout·​<<·​"Received:​·​";​143 ········​std:​:​cout·​<<·​"Received:​·​";​
142 ········​std:​:​cout.​write(data,​·​n)​;​144 ········​std:​:​cout.​write(data,​·​n)​;​
143 ········​std:​:​cout·​<<·​"\n";​145 ········​std:​:​cout·​<<·​"\n";​
144 ······​}146 ······​}
145 ····​}147 ····​}
146 ··​}148 ··​}
147 ··​catch·​(std:​:​exception&·​e)​149 ··​catch·​(std:​:​exception&·​e)​
148 ··​{150 ··​{
149 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​151 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
150 ··​}152 ··​}
151 153
152 ··​return·​0;​154 ··​return·​0;​
153 }155 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/timeouts/server.cpp.html000066400000000000000000021101411340672067200230430ustar00rootroot00000000000000 HTML Diff timeouts/server.cpp
src/​examples/​cpp03/​timeouts/​server.​cppsrc/​examples/​cpp11/​timeouts/​server.​cpp
1 /​/​1 /​/​
2 /​/​·​server.​cpp2 /​/​·​server.​cpp
3 /​/​·​~~~~~~~~~~3 /​/​·​~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<algorithm>11 #include·​<algorithm>
12 #include·​<cstdlib>12 #include·​<cstdlib>
13 #include·​<deque>13 #include·​<deque>
14 #include·​<iostream>14 #include·​<iostream>
15 #include·​<memory>
15 #include·​<set>16 #include·​<set>
16 #include·​<string>17 #include·​<string>
17 #include·​<boost/​bind.​hpp>
18 #include·​<boost/​shared_ptr.​hpp>
19 #include·​<boost/​enable_shared_from_th​is.​hpp>
20 #include·​"asio/​buffer.​hpp"18 #include·​"asio/​buffer.​hpp"
21 #include·​"asio/​io_context.​hpp"19 #include·​"asio/​io_context.​hpp"
22 #include·​"asio/​ip/​tcp.​hpp"20 #include·​"asio/​ip/​tcp.​hpp"
23 #include·​"asio/​ip/​udp.​hpp"21 #include·​"asio/​ip/​udp.​hpp"
24 #include·​"asio/​read_until.​hpp"22 #include·​"asio/​read_until.​hpp"
25 #include·​"asio/​steady_timer.​hpp"23 #include·​"asio/​steady_timer.​hpp"
26 #include·​"asio/​write.​hpp"24 #include·​"asio/​write.​hpp"
27 25
28 using·​asio:​:​steady_timer;​26 using·​asio:​:​steady_timer;​
29 using·​asio:​:​ip:​:​tcp;​27 using·​asio:​:​ip:​:​tcp;​
30 using·​asio:​:​ip:​:​udp;​28 using·​asio:​:​ip:​:​udp;​
31 29
32 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​30 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
33 31
34 class·​subscriber32 class·​subscriber
35 {33 {
36 public:​34 public:​
37 ··​virtual·​~subscriber()​·{}35 ··​virtual·​~subscriber()​·=·default;​
38 ··​virtual·​void·​deliver(const·​std:​:​string&·​msg)​·​=·​0;​36 ··​virtual·​void·​deliver(const·​std:​:​string&·​msg)​·​=·​0;​
39 };​37 };​
40 38
41 typedef·boost:​:​shared_ptr<subscriber​>·​subscriber_ptr;​39 typedef·​std:​:​shared_ptr<subscriber​>·​subscriber_ptr;​
42 40
43 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​41 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
44 42
45 class·​channel43 class·​channel
46 {44 {
47 public:​45 public:​
48 ··​void·​join(subscriber_ptr·​subscriber)​46 ··​void·​join(subscriber_ptr·​subscriber)​
49 ··​{47 ··​{
50 ····​subscribers_.​insert(subscriber)​;​48 ····​subscribers_.​insert(subscriber)​;​
51 ··​}49 ··​}
52 50
53 ··​void·​leave(subscriber_ptr·​subscriber)​51 ··​void·​leave(subscriber_ptr·​subscriber)​
54 ··​{52 ··​{
55 ····​subscribers_.​erase(subscriber)​;​53 ····​subscribers_.​erase(subscriber)​;​
56 ··​}54 ··​}
57 55
58 ··​void·​deliver(const·​std:​:​string&·​msg)​56 ··​void·​deliver(const·​std:​:​string&·​msg)​
59 ··​{57 ··​{
60 ····std:​:​for_each(subscribers_​.​begin()​,​·​subscribers_.​end()​,​58 ····​for·(const·auto&·s·:​·​subscribers_)​
61 ········boost:​:​bind(&subscriber:​:​deliver,​·_1,​·boost:​:​ref(msg)​)​)​;​59 ····{
60 ······​s-​>deliver(msg)​;​
61 ····​}
62 ··​}62 ··​}
63 63
64 private:​64 private:​
65 ··​std:​:​set<subscriber_ptr>·​subscribers_;​65 ··​std:​:​set<subscriber_ptr>·​subscribers_;​
66 };​66 };​
67 67
68 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​68 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
69 69
70 /​/​70 /​/​
71 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​applying·​the·​concept·​of·​a·​deadline.​71 /​/​·​This·​class·​manages·​socket·​timeouts·​by·​applying·​the·​concept·​of·​a·​deadline.​
72 /​/​·​Some·​asynchronous·​operations·​are·​given·​deadlines·​by·​which·​they·​must·​complete.​72 /​/​·​Some·​asynchronous·​operations·​are·​given·​deadlines·​by·​which·​they·​must·​complete.​
73 /​/​·​Deadlines·​are·​enforced·​by·​two·​"actors"·​that·​persist·​for·​the·​lifetime·​of·​the73 /​/​·​Deadlines·​are·​enforced·​by·​two·​"actors"·​that·​persist·​for·​the·​lifetime·​of·​the
74 /​/​·​session·​object,​·​one·​for·​input·​and·​one·​for·​output:​74 /​/​·​session·​object,​·​one·​for·​input·​and·​one·​for·​output:​
75 /​/​75 /​/​
76 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+·····················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+76 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
77 /​/​··​|················​|·····················​|················​|77 /​/​··​|················​|······················​|················​|
78 /​/​··​|·​check_deadline·​|<-​-​-​+················​|·​check_deadline·​|<-​-​-​+78 /​/​··​|·​check_deadline·​|<-​-​-​-​-​-​-​+·············​|·​check_deadline·​|<-​-​-​-​-​-​-​+
79 /​/​··​|················​|····|·async_wait()​···​|················​|····|·async_wait()​79 /​/​··​|················​|········|·············​|················​|········|
80 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····|··on·input······​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····|··on·output80 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+········|·············​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+········|
81 /​/​··············​|·········|··deadline··················​|·········|··deadline81 /​/​···············​|············|··························​|············|
82 /​/​··············​+-​-​-​-​-​-​-​-​-​+····························+-​-​-​-​-​-​-​-​-​+82 /​/​··async_wait()​·|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····async_wait()​·|····+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
83 /​/​···​on·​input····​|····​|·····​lambda·····​|·····​on·​output···​|····​|·····​lambda·····​|
84 /​/​···​deadline····​+-​-​-​>|·······​in·······​|·····​deadline····​+-​-​-​>|·······​in·······​|
85 /​/​····················​|·​check_deadline·​|······················​|·​check_deadline·​|
86 /​/​····················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+······················​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
83 /​/​87 /​/​
84 /​/​·​If·​either·​deadline·​actor·​determines·​that·​the·​corresponding·​deadline·​has88 /​/​·​If·​either·​deadline·​actor·​determines·​that·​the·​corresponding·​deadline·​has
85 /​/​·​expired,​·​the·​socket·​is·​closed·​and·​any·​outstanding·​operations·​are·​cancelled.​89 /​/​·​expired,​·​the·​socket·​is·​closed·​and·​any·​outstanding·​operations·​are·​cancelled.​
86 /​/​90 /​/​
87 /​/​·​The·​input·​actor·​reads·​messages·​from·​the·​socket,​·​where·​messages·​are·​delimited91 /​/​·​The·​input·​actor·​reads·​messages·​from·​the·​socket,​·​where·​messages·​are·​delimited
88 /​/​·​by·​the·​newline·​character:​92 /​/​·​by·​the·​newline·​character:​
89 /​/​93 /​/​
90 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​+94 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​+
91 /​/​··​|············​|95 /​/​··​|·············​|
92 /​/​··​|·start_read·​|<-​-​-​+96 /​/​··​|··read_line··​|<-​-​-​-​+
93 /​/​··​|············​|····​|97 /​/​··​|·············​|·····​|
94 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​+····​|98 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​+·····​|
95 /​/​··········​|·········​|99 /​/​··········​|···········​|
96 /​/​··​async_-​·​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​+100 /​/​··​async_-​·​|····​+-​-​-​-​-​-​-​-​-​-​-​-​-​+
97 /​/​···​read_-​·​|····​|·············​|101 /​/​···​read_-​·​|····​|···lambda····​|
98 /​/​··​until()​·​+-​-​-​>|·handle_read·​|102 /​/​··​until()​·​+-​-​-​>|·····in······​|
99 /​/​···············​|·············​|103 /​/​···············​|··read_line··​|
100 /​/​···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​+104 /​/​···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​+
101 /​/​105 /​/​
102 /​/​·​The·​deadline·​for·​receiving·​a·​complete·​message·​is·​30·​seconds.​·​If·​a·​non-​empty106 /​/​·​The·​deadline·​for·​receiving·​a·​complete·​message·​is·​30·​seconds.​·​If·​a·​non-​empty
103 /​/​·​message·​is·​received,​·​it·​is·​delivered·​to·​all·​subscribers.​·​If·​a·​heartbeat·​(a107 /​/​·​message·​is·​received,​·​it·​is·​delivered·​to·​all·​subscribers.​·​If·​a·​heartbeat·​(a
104 /​/​·​message·​that·​consists·​of·​a·​single·​newline·​character)​·​is·​received,​·​a·​heartbeat108 /​/​·​message·​that·​consists·​of·​a·​single·​newline·​character)​·​is·​received,​·​a·​heartbeat
105 /​/​·​is·​enqueued·​for·​the·​client,​·​provided·​there·​are·​no·​other·​messages·​waiting·​to109 /​/​·​is·​enqueued·​for·​the·​client,​·​provided·​there·​are·​no·​other·​messages·​waiting·​to
106 /​/​·​be·​sent.​110 /​/​·​be·​sent.​
107 /​/​111 /​/​
108 /​/​·​The·​output·​actor·​is·​responsible·​for·​sending·​messages·​to·​the·​client:​112 /​/​·​The·​output·​actor·​is·​responsible·​for·​sending·​messages·​to·​the·​client:​
109 /​/​113 /​/​
110 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+114 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
111 /​/​··​|··············​|<-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+115 /​/​··​|················​|<-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
112 /​/​··​|·​await_output·​|······················​|116 /​/​··​|··​await_output··​|······················​|
113 /​/​··​|··············​|<-​-​-​+·················​|117 /​/​··​|················​|<-​-​-​-​-​-​-​+·············​|
114 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····|·················​|118 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+········|·············​|
115 /​/​······|······|········|·async_wait()​····​|119 /​/​····|············|··········|·············​|
116 /​/​······|······​+-​-​-​-​-​-​-​-​+·················​|120 /​/​····|····async_-​·|··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|
117 /​/​······V·································​|121 /​/​····|·····wait()​·|··|·····lambda·····|····​|
118 /​/​··+-​-​-​-​-​-​-​-​-​-​-​-​-​+···············+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+122 /​/​····|············+-​>|·······in·······|····|
119 /​/​··|·············|·async_write()​·|··············​|123 /​/​····|···············|··await_output··|····​|
120 /​/​··​|·start_write·|-​-​-​-​-​-​-​-​-​-​-​-​-​-​>|·handle_write·​|124 /​/​····​|···············+-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​+····​|
121 /​/​··|·············|···············|··············​|125 /​/​····V·····································​|
122 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​+···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+126 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
127 /​/​··​|··············​|·​async_write()​·​|····​lambda····​|
128 /​/​··​|··​write_line··​|-​-​-​-​-​-​-​-​-​-​-​-​-​-​>|······​in······​|
129 /​/​··​|··············​|···············​|··​write_line··​|
130 /​/​··​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+···············​+-​-​-​-​-​-​-​-​-​-​-​-​-​-​+
123 /​/​131 /​/​
124 /​/​·​The·​output·​actor·​first·​waits·​for·​an·​output·​message·​to·​be·​enqueued.​·​It·​does132 /​/​·​The·​output·​actor·​first·​waits·​for·​an·​output·​message·​to·​be·​enqueued.​·​It·​does
125 /​/​·​this·​by·​using·​a·​steady_timer·​as·​an·​asynchronous·​condition·​variable.​·​The133 /​/​·​this·​by·​using·​a·​steady_timer·​as·​an·​asynchronous·​condition·​variable.​·​The
126 /​/​·​steady_timer·​will·​be·​signalled·​whenever·​the·​output·​queue·​is·​non-​empty.​134 /​/​·​steady_timer·​will·​be·​signalled·​whenever·​the·​output·​queue·​is·​non-​empty.​
127 /​/​135 /​/​
128 /​/​·​Once·​a·​message·​is·​available,​·​it·​is·​sent·​to·​the·​client.​·​The·​deadline·​for136 /​/​·​Once·​a·​message·​is·​available,​·​it·​is·​sent·​to·​the·​client.​·​The·​deadline·​for
129 /​/​·​sending·​a·​complete·​message·​is·​30·​seconds.​·​After·​the·​message·​is·​successfully137 /​/​·​sending·​a·​complete·​message·​is·​30·​seconds.​·​After·​the·​message·​is·​successfully
130 /​/​·​sent,​·​the·​output·​actor·​again·​waits·​for·​the·​output·​queue·​to·​become·​non-​empty.​138 /​/​·​sent,​·​the·​output·​actor·​again·​waits·​for·​the·​output·​queue·​to·​become·​non-​empty.​
131 /​/​139 /​/​
132 class·​tcp_session140 class·​tcp_session
133 ··​:​·​public·​subscriber,​141 ··​:​·​public·​subscriber,​
134 ····​public·boost:​:​enable_shared_from_th​is<tcp_session>142 ····​public·​std:​:​enable_shared_from_th​is<tcp_session>
135 {143 {
136 public:​144 public:​
137 ··​tcp_session(asio:​:​io_context&·io_context,​·​channel&·​ch)​145 ··​tcp_session(tcp:​:​socket·socket,​·​channel&·​ch)​
138 ····​:​·​channel_(ch)​,​146 ····​:​·​channel_(ch)​,​
139 ······​socket_(io_context)​,​147 ······​socket_(std:​:​move(socket)​)​
140 ······input_deadline_(io_co​ntext)​,​
141 ······non_empty_output_queu​e_(io_context)​,​
142 ······output_deadline_(io_c​ontext)​
143 ··​{148 ··​{
144 ····​input_deadline_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​149 ····​input_deadline_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​
145 ····​output_deadline_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​150 ····​output_deadline_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​
146 151
147 ····​/​/​·​The·​non_empty_output_queu​e_·​steady_timer·​is·​set·​to·​the·​maximum·​time152 ····​/​/​·​The·​non_empty_output_queu​e_·​steady_timer·​is·​set·​to·​the·​maximum·​time
148 ····​/​/​·​point·​whenever·​the·​output·​queue·​is·​empty.​·​This·​ensures·​that·​the·​output153 ····​/​/​·​point·​whenever·​the·​output·​queue·​is·​empty.​·​This·​ensures·​that·​the·​output
149 ····​/​/​·​actor·​stays·​asleep·​until·​a·​message·​is·​put·​into·​the·​queue.​154 ····​/​/​·​actor·​stays·​asleep·​until·​a·​message·​is·​put·​into·​the·​queue.​
150 ····​non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​155 ····​non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​
151 ··​}156 ··​}
152 157
153 ··​tcp:​:​socket&·​socket()​
154 ··​{
155 ····​return·​socket_;​
156 ··​}
157
158 ··​/​/​·​Called·​by·​the·​server·​object·​to·​initiate·​the·​four·​actors.​158 ··​/​/​·​Called·​by·​the·​server·​object·​to·​initiate·​the·​four·​actors.​
159 ··​void·​start()​159 ··​void·​start()​
160 ··​{160 ··​{
161 ····​channel_.​join(shared_from_this​()​)​;​161 ····​channel_.​join(shared_from_this​()​)​;​
162 162
163 ····start_read()​;​163 ····read_line()​;​
164 164 ····check_deadline(input_​deadline_)​;​
165 ····input_deadline_.​async_wait(
166 ········boost:​:​bind(&tcp_session:​:​check_deadline,​
167 ········shared_from_this()​,​·&input_deadline_)​)​;​
168 165
169 ····​await_output()​;​166 ····​await_output()​;​
170 167 ····check_deadline(output​_deadline_)​;​
171 ····output_deadline_.​async_wait(
172 ········boost:​:​bind(&tcp_session:​:​check_deadline,​
173 ········shared_from_this()​,​·&output_deadline_)​)​;​
174 ··​}168 ··​}
175 169
176 private:​170 private:​
177 ··​void·​stop()​171 ··​void·​stop()​
178 ··​{172 ··​{
179 ····​channel_.​leave(shared_from_thi​s()​)​;​173 ····​channel_.​leave(shared_from_thi​s()​)​;​
180 174
181 ····asio:​:​error_code·​ignored_ec;​175 ····​std:​:​error_code·​ignored_error;​
182 ····​socket_.​close(ignored_ec)​;​176 ····​socket_.​close(ignored_error)​;​
183 ····​input_deadline_.​cancel()​;​177 ····​input_deadline_.​cancel()​;​
184 ····​non_empty_output_queu​e_.​cancel()​;​178 ····​non_empty_output_queu​e_.​cancel()​;​
185 ····​output_deadline_.​cancel()​;​179 ····​output_deadline_.​cancel()​;​
186 ··​}180 ··​}
187 181
188 ··​bool·​stopped()​·​const182 ··​bool·​stopped()​·​const
189 ··​{183 ··​{
190 ····​return·​!socket_.​is_open()​;​184 ····​return·​!socket_.​is_open()​;​
191 ··​}185 ··​}
192 186
193 ··​void·​deliver(const·​std:​:​string&·​msg)​187 ··​void·​deliver(const·​std:​:​string&·​msg)​·override
194 ··​{188 ··​{
195 ····​output_queue_.​push_back(msg·​+·​"\n")​;​189 ····​output_queue_.​push_back(msg·​+·​"\n")​;​
196 190
197 ····​/​/​·​Signal·​that·​the·​output·​queue·​contains·​messages.​·​Modifying·​the·​expiry191 ····​/​/​·​Signal·​that·​the·​output·​queue·​contains·​messages.​·​Modifying·​the·​expiry
198 ····​/​/​·​will·​wake·​the·​output·​actor,​·​if·​it·​is·​waiting·​on·​the·​timer.​192 ····​/​/​·​will·​wake·​the·​output·​actor,​·​if·​it·​is·​waiting·​on·​the·​timer.​
199 ····​non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​min()​)​;​193 ····​non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​min()​)​;​
200 ··​}194 ··​}
201 195
202 ··​void·start_read()​196 ··​void·read_line()​
203 ··​{197 ··​{
204 ····​/​/​·​Set·​a·​deadline·​for·​the·​read·​operation.​198 ····​/​/​·​Set·​a·​deadline·​for·​the·​read·​operation.​
205 ····​input_deadline_.​expires_after(asio:​:​chrono:​:​seconds(30)​)​;​199 ····​input_deadline_.​expires_after(std:​:​chrono:​:​seconds(30)​)​;​
206 200
207 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​read·​a·​newline-​delimited·​message.​201 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​read·​a·​newline-​delimited·​message.​
202 ····​auto·​self(shared_from_this​()​)​;​
208 ····​asio:​:​async_read_until(sock​et_,​203 ····​asio:​:​async_read_until(sock​et_,​
209 ········​asio:​:​dynamic_buffer(input_​buffer_)​,​·​'\n',​204 ········​asio:​:​dynamic_buffer(input_​buffer_)​,​·​'\n',​
210 ········boost:​:​bind(&tcp_session:​:​handle_read,​·shared_from_this()​,​·_1,​·_2)​)​;​205 ········[this,​·self](const·std:​:​error_code&·error,​·std:​:​size_t·n)​
211 ··}
212
213 ··void·handle_read(const·asio:​:​error_code&·ec,​·std:​:​size_t·n)​
214 ··{
215 ····if·(stopped()​)​
216 ······return;​
217
218 ····if·(!ec)​
219 ····{
220 ······/​/​·Extract·the·newline-​delimited·message·from·the·buffer.​
221 ······std:​:​string·msg(input_buffer_.​substr(0,​·n·-​·1)​)​;​
222 ······input_buffer_.​erase(0,​·n)​;​
223
224 ······if·(!msg.​empty()​)​
225 ······{
226 ········channel_.​deliver(msg)​;​
227 ······}
228 ······else
229 ······{
230 ········/​/​·We·received·a·heartbeat·message·from·the·client.​·If·there's·nothing
231 ········/​/​·else·being·sent·or·ready·to·be·sent,​·send·a·heartbeat·right·back.​
232 ········if·(output_queue_.​empty()​)​
233 ········​{206 ········​{
234 ··········​output_queue_.​push_back("\n")​;​207 ··········/​/​·Check·if·the·session·was·stopped·while·the·operation·was·pending.​
235 208 ··········if·(stopped()​)​
236 ··········/​/​·Signal·that·the·output·queue·contains·messages.​·Modifying·the209 ············return;​
237 ··········/​/​·expiry·will·wake·the·output·actor,​·if·it·is·waiting·on·the·timer.​210
238 ··········non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​min()​)​;​211 ··········​if·(!error)​
239 ········}212 ··········{
240 ······}213 ············/​/​·Extract·the·newline-​delimited·message·from·the·buffer.​
241 214 ············std:​:​string·msg(input_buffer_.​substr(0,​·n·-​·1)​)​;​
242 ······start_read()​;​215 ············input_buffer_.​erase(0,​·n)​;​
243 ····}216
244 ····else217 ············if·(!msg.​empty()​)​
245 ····​{218 ············​{
246 ······stop()​;​219 ··············channel_.​deliver(msg)​;​
247 ····​}220 ············​}
221 ············​else
222 ············​{
223
224 ··············​/​/​·​We·​received·​a·​heartbeat·​message·​from·​the·​client.​·​If·​there's
225 ··············​/​/​·​nothing·​else·​being·​sent·​or·​ready·​to·​be·​sent,​·​send·​a·​heartbeat
226 ··············​/​/​·​right·​back.​
227 ··············​if·​(output_queue_.​empty()​)​
228 ··············​{
229 ················​output_queue_.​push_back("\n")​;​
230
231 ················​/​/​·​Signal·​that·​the·​output·​queue·​contains·​messages.​·​Modifying
232 ················​/​/​·​the·​expiry·​will·​wake·​the·​output·​actor,​·​if·​it·​is·​waiting·​on
233 ················​/​/​·​the·​timer.​
234 ················​non_empty_output_queu​e_.​expires_at(
235 ····················​steady_timer:​:​time_point:​:​min()​)​;​
236 ··············​}
237 ············​}
238
239 ············​read_line()​;​
240 ··········​}
241 ··········​else
242 ··········​{
243 ············​stop()​;​
244 ··········​}
245 ········​})​;​
248 ··​}246 ··​}
249 247
250 ··​void·​await_output()​248 ··​void·​await_output()​
251 ··​{249 ··​{
252 ····if·​(stopped()​)​250 ····auto·self(shared_from_this​()​)​;​
253 ······return;​251 ····non_empty_output_queu​e_.​async_wait(
254 252 ········[this,​·self](const·std:​:​error_code&·/​*error*/​)​
255 ····if·(output_queue_.​empty()​)​253 ········{
256 ····{254 ··········/​/​·Check·if·the·session·was·stopped·while·the·operation·was·pending.​
257 ······/​/​·There·are·no·messages·that·are·ready·to·be·sent.​·The·actor·goes·to255 ··········if·(stopped()​)​
258 ······/​/​·sleep·by·waiting·on·the·non_empty_output_queu​e_·timer.​·When·a·new256 ············return;​
259 ······/​/​·message·is·added,​·the·timer·will·be·modified·and·the·actor·will·wake.​257
260 ······non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​258 ··········if·(output_queue_.​empty()​)​
261 ······non_empty_output_queu​e_.​async_wait(259 ··········{
262 ··········boost:​:​bind(&tcp_session:​:​await_output,​·shared_from_this()​)​)​;​260 ············/​/​·There·are·no·messages·that·are·ready·to·be·sent.​·The·actor·goes
263 ····}261 ············/​/​·to·sleep·by·waiting·on·the·non_empty_output_queu​e_·timer.​·When·a
264 ····​else262 ············/​/​·new·message·is·added,​·the·timer·will·be·modified·and·the·actor
265 ····{263 ············/​/​·will·wake.​
266 ······​start_write()​;​264 ············non_empty_output_queu​e_.​expires_at(steady_tim​er:​:​time_point:​:​max()​)​;​
267 ····}265 ············await_output()​;​
266 ··········​}
267 ··········​else
268 ··········​{
269 ············​write_line()​;​
270 ··········​}
271 ········​})​;​
268 ··​}272 ··​}
269 273
270 ··​void·start_write()​274 ··​void·write_line()​
271 ··​{275 ··​{
272 ····​/​/​·​Set·​a·​deadline·​for·​the·​write·​operation.​276 ····​/​/​·​Set·​a·​deadline·​for·​the·​write·​operation.​
273 ····​output_deadline_.​expires_after(asio:​:​chrono:​:​seconds(30)​)​;​277 ····​output_deadline_.​expires_after(std:​:​chrono:​:​seconds(30)​)​;​
274 278
275 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​send·​a·​message.​279 ····​/​/​·​Start·​an·​asynchronous·​operation·​to·​send·​a·​message.​
280 ····​auto·​self(shared_from_this​()​)​;​
276 ····​asio:​:​async_write(socket_,​281 ····​asio:​:​async_write(socket_,​
277 ········​asio:​:​buffer(output_queue_.​front()​)​,​282 ········​asio:​:​buffer(output_queue_.​front()​)​,​
278 ········boost:​:​bind(&tcp_session:​:​handle_write,​·shared_from_this()​,​·_1)​)​;​283 ········[this,​·self](const·std:​:​error_code&·error,​·std:​:​size_t·/​*n*/​)​
279 ··}284 ········{
280 285 ··········/​/​·Check·if·the·session·was·stopped·while·the·operation·was·pending.​
281 ··void·handle_write(const·asio:​:​error_code&·ec)​286 ··········if·(stopped()​)​
282 ··{287 ············return;​
283 ····if·(stopped()​)​288
284 ······return;​289 ··········if·(!error)​
285 290 ··········{
286 ····if·(!ec)​291 ············output_queue_.​pop_front()​;​
287 ····{292
288 ······output_queue_.​pop_front()​;​293 ············await_output()​;​
289 294 ··········}
290 ······await_output()​;​295 ··········else
291 ····}296 ··········{
292 ····else297 ············stop()​;​
293 ····{298 ··········}
294 ······stop()​;​299 ········})​;​
295 ····​}300 ··​}
296 ··}301
297 302 ··void·check_deadline(steady​_timer&·deadline)​
298 ··void·check_deadline(steady​_timer*·deadline)​303 ··{
299 ··{304 ····auto·self(shared_from_this​()​)​;​
300 ····​if·(stopped()​)​305 ····deadline.​async_wait(
301 ······​return;​306 ········[this,​·self,​·&deadline](const·std:​:​error_code&·/​*error*/​)​
302 307 ········{
303 ····/​/​·Check·whether·​the·deadline·has·passed.​·We·compare·​the·deadline·against308 ··········/​/​·Check·if·​the·session·was·​stopped·while·​the·operation·was·pending.​
304 ····/​/​·the·current·time·since·a·new·asynchronous·operation·may·have·moved·the309 ··········if·(stopped()​)​
305 ····/​/​·deadline·before·this·actor·had·a·chance·to·run.​310 ············return;​
306 ····if·(deadline-​>expiry()​·<=·steady_timer:​:​clock_type:​:​now()​)​311
307 ····{312 ··········/​/​·Check·whether·the·deadline·has·passed.​·We·compare·the·deadline
308 ······/​/​·The·deadline·has·passed.​·Stop·the·session.​·The·​other·actors·will313 ··········/​/​·​against·the·current·time·since·a·new·asynchronous·​operation·may
309 ······​/​/​·​terminate·as·soon·​as·possible.​314 ··········​/​/​·have·moved·​the·deadline·before·this·actor·had·a·chance·to·run.​
310 ······​stop()​;​315 ··········if·(deadline.​expiry()​·<=·​steady_timer:​:​clock_type:​:​now()​)​
311 ····}316 ··········{
312 ····​else317 ············/​/​·The·deadline·has·passed.​·Stop·the·session.​·The·other·actors·will
313 ····{318 ············/​/​·terminate·as·soon·as·possible.​
314 ······/​/​·Put·the·actor·back·to·​sleep.​319 ············​stop()​;​
315 ······deadline-​>async_wait(320 ··········}
316 ··········boost:​:​bind(&tcp_session:​:​check_deadline,​321 ··········​else
317 ··········shared_from_this()​,​·deadline)​)​;​322 ··········{
318 ····}323 ············/​/​·Put·the·actor·back·to·sleep.​
324 ············​check_deadline(deadli​ne)​;​
325 ··········​}
326 ········​})​;​
319 ··​}327 ··​}
320 328
321 ··​channel&·​channel_;​329 ··​channel&·​channel_;​
322 ··​tcp:​:​socket·​socket_;​330 ··​tcp:​:​socket·​socket_;​
323 ··​std:​:​string·​input_buffer_;​331 ··​std:​:​string·​input_buffer_;​
324 ··​steady_timer·​input_deadline_;​332 ··​steady_timer·​input_deadline_{socke​t_.​get_executor()​.​context()​};​
325 ··​std:​:​deque<std:​:​string>·​output_queue_;​333 ··​std:​:​deque<std:​:​string>·​output_queue_;​
326 ··​steady_timer·​non_empty_output_queu​e_;​334 ··​steady_timer·​non_empty_output_queu​e_{socket_.​get_executor()​.​context()​};​
327 ··​steady_timer·​output_deadline_;​335 ··​steady_timer·​output_deadline_{sock​et_.​get_executor()​.​context()​};​
328 };​336 };​
329 337
330 typedef·boost:​:​shared_ptr<tcp_sessio​n>·​tcp_session_ptr;​338 typedef·​std:​:​shared_ptr<tcp_sessio​n>·​tcp_session_ptr;​
331 339
332 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​340 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
333 341
334 class·​udp_broadcaster342 class·​udp_broadcaster
335 ··​:​·​public·​subscriber343 ··​:​·​public·​subscriber
336 {344 {
337 public:​345 public:​
338 ··​udp_broadcaster(asio:​:​io_context&·​io_context,​346 ··​udp_broadcaster(asio:​:​io_context&·​io_context,​
339 ······​const·​udp:​:​endpoint&·​broadcast_endpoint)​347 ······​const·​udp:​:​endpoint&·​broadcast_endpoint)​
340 ····​:​·​socket_(io_context)​348 ····​:​·​socket_(io_context)​
341 ··​{349 ··​{
342 ····​socket_.​connect(broadcast_end​point)​;​350 ····​socket_.​connect(broadcast_end​point)​;​
343 ····​socket_.​set_option(udp:​:​socket:​:​broadcast(true)​)​;​351 ····​socket_.​set_option(udp:​:​socket:​:​broadcast(true)​)​;​
344 ··​}352 ··​}
345 353
346 private:​354 private:​
347 ··​void·​deliver(const·​std:​:​string&·​msg)​355 ··​void·​deliver(const·​std:​:​string&·​msg)​
348 ··​{356 ··​{
349 ····asio:​:​error_code·​ignored_ec;​357 ····​std:​:​error_code·​ignored_error;​
350 ····​socket_.​send(asio:​:​buffer(msg)​,​·​0,​·​ignored_ec)​;​358 ····​socket_.​send(asio:​:​buffer(msg)​,​·​0,​·​ignored_error)​;​
351 ··​}359 ··​}
352 360
353 ··​udp:​:​socket·​socket_;​361 ··​udp:​:​socket·​socket_;​
354 };​362 };​
355 363
356 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​364 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
357 365
358 class·​server366 class·​server
359 {367 {
360 public:​368 public:​
361 ··​server(asio:​:​io_context&·​io_context,​369 ··​server(asio:​:​io_context&·​io_context,​
362 ······​const·​tcp:​:​endpoint&·​listen_endpoint,​370 ······​const·​tcp:​:​endpoint&·​listen_endpoint,​
363 ······​const·​udp:​:​endpoint&·​broadcast_endpoint)​371 ······​const·​udp:​:​endpoint&·​broadcast_endpoint)​
364 ····​:​·​io_context_(io_contex​t)​,​372 ····​:​·​io_context_(io_contex​t)​,​
365 ······​acceptor_(io_context,​·​listen_endpoint)​373 ······​acceptor_(io_context,​·​listen_endpoint)​
366 ··​{374 ··​{
367 ····subscriber_ptr·bc(new·udp_broadcaster(io_co​ntext_,​·broadcast_endpoint)​)​;​375 ····​channel_.​join(
368 ····channel_.​join(bc)​;​376 ········std:​:​make_shared<udp_broad​caster>(
377 ··········​io_context_,​·​broadcast_endpoint)​)​;​
369 378
370 ····start_accept()​;​379 ····​accept()​;​
371 ··​}380 ··​}
372 381
373 ··void·start_accept()​382 private:​
374 ··{383 ··void·accept()​
375 ····tcp_session_ptr·new_session(new·tcp_session(io_contex​t_,​·channel_)​)​;​
376
377 ····acceptor_.​async_accept(new_sess​ion-​>socket()​,​
378 ········boost:​:​bind(&server:​:​handle_accept,​·this,​·new_session,​·_1)​)​;​
379 ··}
380
381 ··void·handle_accept(tcp_ses​sion_ptr·session,​
382 ······const·asio:​:​error_code&·ec)​
383 ··​{384 ··​{
384 ····if·(!ec)​385 ····acceptor_.​async_accept(
385 ····{386 ········[this](const·std:​:​error_code&·error,​·tcp:​:​socket·socket)​
386 ······session-​>start()​;​387 ········{
387 ····}388 ··········if·(!error)​
389 ··········​{
390 ············​std:​:​make_shared<tcp_sessi​on>(std:​:​move(socket)​,​·​channel_)​-​>start()​;​
391 ··········​}
388 392
389 ····start_accept()​;​393 ··········accept()​;​
394 ········​})​;​
390 ··​}395 ··​}
391 396
392 private:​
393 ··​asio:​:​io_context&·​io_context_;​397 ··​asio:​:​io_context&·​io_context_;​
394 ··​tcp:​:​acceptor·​acceptor_;​398 ··​tcp:​:​acceptor·​acceptor_;​
395 ··​channel·​channel_;​399 ··​channel·​channel_;​
396 };​400 };​
397 401
398 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​402 /​/​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​-​
399 403
400 int·​main(int·​argc,​·​char*·​argv[])​404 int·​main(int·​argc,​·​char*·​argv[])​
401 {405 {
402 ··​try406 ··​try
403 ··​{407 ··​{
404 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​408 ····​using·​namespace·​std;​·​/​/​·​For·​atoi.​
405 409
406 ····​if·​(argc·​!=·​4)​410 ····​if·​(argc·​!=·​4)​
407 ····​{411 ····​{
408 ······​std:​:​cerr·​<<·​"Usage:​·​server·​<listen_port>·​<bcast_address>·​<bcast_port>\n";​412 ······​std:​:​cerr·​<<·​"Usage:​·​server·​<listen_port>·​<bcast_address>·​<bcast_port>\n";​
409 ······​return·​1;​413 ······​return·​1;​
410 ····​}414 ····​}
411 415
412 ····​asio:​:​io_context·​io_context;​416 ····​asio:​:​io_context·​io_context;​
413 417
414 ····​tcp:​:​endpoint·​listen_endpoint(tcp:​:​v4()​,​·​atoi(argv[1])​)​;​418 ····​tcp:​:​endpoint·​listen_endpoint(tcp:​:​v4()​,​·​atoi(argv[1])​)​;​
415 419
416 ····​udp:​:​endpoint·​broadcast_endpoint(420 ····​udp:​:​endpoint·​broadcast_endpoint(
417 ········​asio:​:​ip:​:​make_address(argv[2])​,​·​atoi(argv[3])​)​;​421 ········​asio:​:​ip:​:​make_address(argv[2])​,​·​atoi(argv[3])​)​;​
418 422
419 ····​server·​s(io_context,​·​listen_endpoint,​·​broadcast_endpoint)​;​423 ····​server·​s(io_context,​·​listen_endpoint,​·​broadcast_endpoint)​;​
420 424
421 ····​io_context.​run()​;​425 ····​io_context.​run()​;​
422 ··​}426 ··​}
423 ··​catch·​(std:​:​exception&·​e)​427 ··​catch·​(std:​:​exception&·​e)​
424 ··​{428 ··​{
425 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​429 ····​std:​:​cerr·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
426 ··​}430 ··​}
427 431
428 ··​return·​0;​432 ··​return·​0;​
429 }433 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/examples/diffs/timers/000077500000000000000000000000001340672067200175205ustar00rootroot00000000000000asio-1.12.2/doc/examples/diffs/timers/time_t_timer.cpp.html000066400000000000000000002173021340672067200236550ustar00rootroot00000000000000 HTML Diff timers/time_t_timer.cpp
src/​examples/​cpp03/​timers/​time_t_timer.​cppsrc/​examples/​cpp11/​timers/​time_t_timer.​cpp
1 /​/​1 /​/​
2 /​/​·​time_t_timer.​cpp2 /​/​·​time_t_timer.​cpp
3 /​/​·​~~~~~~~~~~~~~~~~3 /​/​·​~~~~~~~~~~~~~~~~
4 /​/​4 /​/​
5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​5 /​/​·​Copyright·​(c)​·​2003-​2018·​Christopher·​M.​·​Kohlhoff·​(chris·​at·​kohlhoff·​dot·​com)​
6 /​/​6 /​/​
7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying7 /​/​·​Distributed·​under·​the·​Boost·​Software·​License,​·​Version·​1.​0.​·​(See·​accompanying
8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​8 /​/​·​file·​LICENSE_1_0.​txt·​or·​copy·​at·​http:​/​/​www.​boost.​org/​LICENSE_1_0.​txt)​
9 /​/​9 /​/​
10 10
11 #include·​<asio.​hpp>11 #include·​<asio.​hpp>
12 #include·​<ctime>12 #include·​<ctime>
13 #include·​<chrono>
13 #include·​<iostream>14 #include·​<iostream>
14 15
15 /​/​·​A·​custom·​implementation·​of·​the·​Clock·​concept·​from·​the·​standard·​C++·​library.​16 /​/​·​A·​custom·​implementation·​of·​the·​Clock·​concept·​from·​the·​standard·​C++·​library.​
16 struct·​time_t_clock17 struct·​time_t_clock
17 {18 {
18 ··​/​/​·​The·​duration·​type.​19 ··​/​/​·​The·​duration·​type.​
19 ··​typedef·asio:​:​chrono:​:​steady_clock:​:​duration·​duration;​20 ··​typedef·​std:​:​chrono:​:​steady_clock:​:​duration·​duration;​
20 21
21 ··​/​/​·​The·​duration's·​underlying·​arithmetic·​representation.​22 ··​/​/​·​The·​duration's·​underlying·​arithmetic·​representation.​
22 ··​typedef·​duration:​:​rep·​rep;​23 ··​typedef·​duration:​:​rep·​rep;​
23 24
24 ··​/​/​·​The·​ratio·​representing·​the·​duration's·​tick·​period.​25 ··​/​/​·​The·​ratio·​representing·​the·​duration's·​tick·​period.​
25 ··​typedef·​duration:​:​period·​period;​26 ··​typedef·​duration:​:​period·​period;​
26 27
27 ··​/​/​·​An·​absolute·​time·​point·​represented·​using·​the·​clock.​28 ··​/​/​·​An·​absolute·​time·​point·​represented·​using·​the·​clock.​
28 ··​typedef·asio:​:​chrono:​:​time_point<time_t_clo​ck>·​time_point;​29 ··​typedef·​std:​:​chrono:​:​time_point<time_t_clo​ck>·​time_point;​
29 30
30 ··​/​/​·​The·​clock·​is·​not·​monotonically·​increasing.​31 ··​/​/​·​The·​clock·​is·​not·​monotonically·​increasing.​
31 ··​static·​const·​bool·​is_steady·​=·​false;​32 ··​static·​constexpr·​bool·​is_steady·​=·​false;​
32 33
33 ··​/​/​·​Get·​the·​current·​time.​34 ··​/​/​·​Get·​the·​current·​time.​
34 ··​static·​time_point·​now()​35 ··​static·​time_point·​now()​·noexcept
35 ··​{36 ··​{
36 ····​return·​time_point()​·​+·asio:​:​chrono:​:​seconds(std:​:​time(0)​)​;​37 ····​return·​time_point()​·​+·​std:​:​chrono:​:​seconds(std:​:​time(0)​)​;​
37 ··​}38 ··​}
38 };​39 };​
39 40
40 /​/​·​The·​asio:​:​basic_waitable_timer·​template·​accepts·​an·​optional·​WaitTraits41 /​/​·​The·​asio:​:​basic_waitable_timer·​template·​accepts·​an·​optional·​WaitTraits
41 /​/​·​template·​parameter.​·​The·​underlying·​time_t·​clock·​has·​one-​second·​granularity,​42 /​/​·​template·​parameter.​·​The·​underlying·​time_t·​clock·​has·​one-​second·​granularity,​
42 /​/​·​so·​these·​traits·​may·​be·​customised·​to·​reduce·​the·​latency·​between·​the·​clock43 /​/​·​so·​these·​traits·​may·​be·​customised·​to·​reduce·​the·​latency·​between·​the·​clock
43 /​/​·​ticking·​over·​and·​a·​wait·​operation's·​completion.​·​When·​the·​timeout·​is·​near44 /​/​·​ticking·​over·​and·​a·​wait·​operation's·​completion.​·​When·​the·​timeout·​is·​near
44 /​/​·​(less·​than·​one·​second·​away)​·​we·​poll·​the·​clock·​more·​frequently·​to·​detect·​the45 /​/​·​(less·​than·​one·​second·​away)​·​we·​poll·​the·​clock·​more·​frequently·​to·​detect·​the
45 /​/​·​time·​change·​closer·​to·​when·​it·​occurs.​·​The·​user·​can·​select·​the·​appropriate46 /​/​·​time·​change·​closer·​to·​when·​it·​occurs.​·​The·​user·​can·​select·​the·​appropriate
46 /​/​·​trade·​off·​between·​accuracy·​and·​the·​increased·​CPU·​cost·​of·​polling.​·​In·​extreme47 /​/​·​trade·​off·​between·​accuracy·​and·​the·​increased·​CPU·​cost·​of·​polling.​·​In·​extreme
47 /​/​·​cases,​·​a·​zero·​duration·​may·​be·​returned·​to·​make·​the·​timers·​as·​accurate·​as48 /​/​·​cases,​·​a·​zero·​duration·​may·​be·​returned·​to·​make·​the·​timers·​as·​accurate·​as
48 /​/​·​possible,​·​albeit·​with·​100%·​CPU·​usage.​49 /​/​·​possible,​·​albeit·​with·​100%·​CPU·​usage.​
49 struct·​time_t_wait_traits50 struct·​time_t_wait_traits
50 {51 {
51 ··​/​/​·​Determine·​how·​long·​until·​the·​clock·​should·​be·​next·​polled·​to·​determine52 ··​/​/​·​Determine·​how·​long·​until·​the·​clock·​should·​be·​next·​polled·​to·​determine
52 ··​/​/​·​whether·​the·​duration·​has·​elapsed.​53 ··​/​/​·​whether·​the·​duration·​has·​elapsed.​
53 ··​static·​time_t_clock:​:​duration·​to_wait_duration(54 ··​static·​time_t_clock:​:​duration·​to_wait_duration(
54 ······​const·​time_t_clock:​:​duration&·​d)​55 ······​const·​time_t_clock:​:​duration&·​d)​
55 ··​{56 ··​{
56 ····​if·​(d·​>·asio:​:​chrono:​:​seconds(1)​)​57 ····​if·​(d·​>·​std:​:​chrono:​:​seconds(1)​)​
57 ······​return·​d·​-​·asio:​:​chrono:​:​seconds(1)​;​58 ······​return·​d·​-​·​std:​:​chrono:​:​seconds(1)​;​
58 ····​else·​if·​(d·​>·asio:​:​chrono:​:​seconds(0)​)​59 ····​else·​if·​(d·​>·​std:​:​chrono:​:​seconds(0)​)​
59 ······​return·asio:​:​chrono:​:​milliseconds(10)​;​60 ······​return·​std:​:​chrono:​:​milliseconds(10)​;​
60 ····​else61 ····​else
61 ······​return·asio:​:​chrono:​:​seconds(0)​;​62 ······​return·​std:​:​chrono:​:​seconds(0)​;​
62 ··​}63 ··​}
63 64
64 ··​/​/​·​Determine·​how·​long·​until·​the·​clock·​should·​be·​next·​polled·​to·​determine65 ··​/​/​·​Determine·​how·​long·​until·​the·​clock·​should·​be·​next·​polled·​to·​determine
65 ··​/​/​·​whether·​the·​absoluate·​time·​has·​been·​reached.​66 ··​/​/​·​whether·​the·​absoluate·​time·​has·​been·​reached.​
66 ··​static·​time_t_clock:​:​duration·​to_wait_duration(67 ··​static·​time_t_clock:​:​duration·​to_wait_duration(
67 ······​const·​time_t_clock:​:​time_point&·​t)​68 ······​const·​time_t_clock:​:​time_point&·​t)​
68 ··​{69 ··​{
69 ····​return·​to_wait_duration(t·​-​·​time_t_clock:​:​now()​)​;​70 ····​return·​to_wait_duration(t·​-​·​time_t_clock:​:​now()​)​;​
70 ··​}71 ··​}
71 };​72 };​
72 73
73 typedef·​asio:​:​basic_waitable_timer<​74 typedef·​asio:​:​basic_waitable_timer<​
74 ··​time_t_clock,​·​time_t_wait_traits>·​time_t_timer;​75 ··​time_t_clock,​·​time_t_wait_traits>·​time_t_timer;​
75 76
76 void·​handle_timeout(const·​asio:​:​error_code&)​
77 {
78 ··​std:​:​cout·​<<·​"handle_timeout\n";​
79 }
80
81 int·​main()​77 int·​main()​
82 {78 {
83 ··​try79 ··​try
84 ··​{80 ··​{
85 ····​asio:​:​io_context·​io_context;​81 ····​asio:​:​io_context·​io_context;​
86 82
87 ····​time_t_timer·​timer(io_context)​;​83 ····​time_t_timer·​timer(io_context)​;​
88 84
89 ····​timer.​expires_after(asio:​:​chrono:​:​seconds(5)​)​;​85 ····​timer.​expires_after(std:​:​chrono:​:​seconds(5)​)​;​
90 ····​std:​:​cout·​<<·​"Starting·​synchronous·​wait\n";​86 ····​std:​:​cout·​<<·​"Starting·​synchronous·​wait\n";​
91 ····​timer.​wait()​;​87 ····​timer.​wait()​;​
92 ····​std:​:​cout·​<<·​"Finished·​synchronous·​wait\n";​88 ····​std:​:​cout·​<<·​"Finished·​synchronous·​wait\n";​
93 89
94 ····​timer.​expires_after(asio:​:​chrono:​:​seconds(5)​)​;​90 ····​timer.​expires_after(std:​:​chrono:​:​seconds(5)​)​;​
95 ····​std:​:​cout·​<<·​"Starting·​asynchronous·​wait\n";​91 ····​std:​:​cout·​<<·​"Starting·​asynchronous·​wait\n";​
96 ····​timer.​async_wait(&handle_ti​meout)​;​92 ····​timer.​async_wait(
93 ········​[](const·​std:​:​error_code&·​/​*error*/​)​
94 ········​{
95 ··········​std:​:​cout·​<<·​"timeout\n";​
96 ········​})​;​
97 ····​io_context.​run()​;​97 ····​io_context.​run()​;​
98 ····​std:​:​cout·​<<·​"Finished·​asynchronous·​wait\n";​98 ····​std:​:​cout·​<<·​"Finished·​asynchronous·​wait\n";​
99 ··​}99 ··​}
100 ··​catch·​(std:​:​exception&·​e)​100 ··​catch·​(std:​:​exception&·​e)​
101 ··​{101 ··​{
102 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​102 ····​std:​:​cout·​<<·​"Exception:​·​"·​<<·​e.​what()​·​<<·​"\n";​
103 ··​}103 ··​}
104 104
105 ··​return·​0;​105 ··​return·​0;​
106 }106 }

Modified at 12.12.2018. HTML formatting created by diff2html.

asio-1.12.2/doc/home.png000066400000000000000000000005461340672067200147470ustar00rootroot00000000000000‰PNG  IHDR€~+ÿsBITÛáOà$PLTE‹‰ˆC@>ÅÄÃ`^\&# ™™™ÓÓÒ¶µ´QOMfffÿÿÿ¢ü° tRNSÿÿÿÿÿÿÿÿÿÿÿßÎÎ pHYs  ÒÝ~ü%tEXtSoftwareMacromedia Fireworks MX 2004‡v¬ÏtEXtCreation Time10/03/04ǯŒ nIDATxœcØ %Õ@bØcnb`­†2Â!ÌM a(2A‚ a ,ÞÀ 0L€2p .`œ01a·ónîÝÒð1ºÐ™lÆ 0&ÄX³Æ‰>•/qÚ#IEND®B`‚asio-1.12.2/doc/important.png000066400000000000000000000013221340672067200160250ustar00rootroot00000000000000‰PNG  IHDRשÍÊäPLTE)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{ŒŒŒŒ9½½­­!­­9œœZŒŒ{œœcœœ{µµJµµR½½Z¥¥c­­k­­{ÞÞÖÖÞÞ!ÞÞ1ÞÞ9ççïïïïÿÿÿÿÿÿçç)çç1ïï1ÿÿ!ÆÆZÖÖRÎÎsÖÖcÖÖkïïBççcçç{„„„ŒŒŒ”””¥¥„­­Œ¥¥”¥¥œ½½„½½œ¥¥¥­­¥­­­µµµ½½½ÆÆÆÎÎÎÖÖÖÞÞÞçççïïï÷÷÷ÿÿÿ­ÒÃÞbKGDCgÐ bIDATxÚm’ SÂ0 Ç3Eñ1•¡ÀÔÉKÜPT”•‰F'µûþßÇ®Qïö¿ë]’_iÈK±B¥&ºF‚(å6àßñrúðcºŒ/‘Ñ´…\NÞÃh£°›* â2pã¹=…:©ôJí÷v•?°•¾ÿ 6Ôï| @}÷`ÿ^Û>ƒ¯µs P¿ÕvB¡É¨é@Ãd6"èo;g•`PsÎ+ÁÝÞÖs%˜Çǯ%@ÈS{4ñܾ•Už-µs"þ1чßÄ?øjª<`g ­ñeZÔ* Ô+½ƒÃ¦Ú2Ã_Yvì*ÿÁ¤è•lv¬~Œg Z¶[s“ôY[Ãa; =ùí/öoJĘ!¤f€þcl¯RmÌRCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec3ecc1fc5135d1e959695e569d213122riðIEND®B`‚asio-1.12.2/doc/index.html000066400000000000000000000072541340672067200153110ustar00rootroot00000000000000 Asio
asio C++ library

Next

Asio

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

Asio is a cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach.

Overview

An overview of the features included in Asio, plus rationale and design information.

Using Asio

How to use Asio in your applications. Includes information on library dependencies and supported platforms.

Tutorial

A tutorial that introduces the fundamental concepts required to use Asio, and shows how to use Asio to develop simple client and server programs.

Examples

Examples that illustrate the use of Asio in more complex applications.

Reference

Detailed class and function reference.

Networking TS Compatibility

Description of changes to provide compatibility with the "C++ Extensions for Networking" Technical Specification.

Revision History

Log of Asio changes made in each release.

Index

Book-style text index of Asio documentation.

Last revised: December 11, 2018 at 22:29:24 GMT


Next
asio-1.12.2/doc/next.png000066400000000000000000000005201340672067200147650ustar00rootroot00000000000000‰PNG  IHDR€~+ÿsBITÛáOà$PLTE‹‰ˆ333¶µ´QOM&# ¨§¥ââáÓÓÒ`^\C@>ÿÿÿ.?a tRNSÿÿÿÿÿÿÿÿÿÿÿßÎÎ pHYs  ÒÝ~ü%tEXtSoftwareMacromedia Fireworks MX 2004‡v¬ÏtEXtCreation Time10/03/04ǯŒ XIDATxœcØ •Ù@bؾ€ ÆÜÅÀ e–20°A™;@Â`æîV0„ ÞÀâ @á  P€`2 ‹š Ô"™€j.’mHn@r’{¡¾©¤R1P~dlIEND®B`‚asio-1.12.2/doc/next_disabled.png000066400000000000000000000021261340672067200166200ustar00rootroot00000000000000‰PNG  IHDREŽÆþgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€èu0ê`:—o—©™ÔPLTEÑÐÏèççÖÖÖðððÜÜÛÔÓÒîííùùùööößßÞÙÙØÿÿÿÎÎÎÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßàààààààààààààààáááááááááááááááâââââââââââââââãããããããããããããããäääääääääääääääåååååååååååååååæææææææææææææææçççççççççççççççèèèèèèèèèèèèèèèéééééééééééééééêêêêêêêêêêêêêêêëëëëëëëëëëëëëëëìììììììììììììììíííííííííííííííîîîîîîîîîîîîîîîïïïïïïïïïïïïïïïðððððððððððððððñññññññññññññññòòòòòòòòòòòòòòòóóóóóóóóóóóóóóóôôôôôôôôôôôôôôôõõõõõõõõõõõõõõõööööööööööööööö÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøùùùùùùùùùùùùùùùúúúúúúúúúúúúúúúûûûûûûûûûûûûûûûüüüüüüüüüüüüüüüýýýýýýýýýýýýýýýþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿá$xÆ tRNSÿÿÿÿÿÿÿÿÿÿÿßÎνIDATxœbäf€€?LY¡L€b 1c`€ T $ôë7„ @PuþÈ_•UÇ æATÌ`^\ÿÿÿ™Ì ƒ tRNSÿÿÿÿÿÿÿÿÿÿÿßÎÎ pHYs  ÒÝ~ü%tEXtSoftwareMacromedia Fireworks MX 2004‡v¬ÏtEXtCreation Time10/03/04ǯŒ VIDATxœcØ ^ bØÂ0Æt`à„2·00°A™ é&H°„ ™@AÕP 0` B@‚‰$ФÉds‘lCv’ËÝ»ÛleSŠf øIEND®B`‚asio-1.12.2/doc/prev_disabled.png000066400000000000000000000021251340672067200166150ustar00rootroot00000000000000‰PNG  IHDREŽÆþgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€èu0ê`:—o—©™ÔPLTEÑÐÏàààÖÖÖðððîííÜÜÛÔÓÒöööèççÙÙØßßÞÿÿÿÎÎÎÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßàààààààààààààààáááááááááááááááâââââââââââââââãããããããããããããããäääääääääääääääåååååååååååååååæææææææææææææææçççççççççççççççèèèèèèèèèèèèèèèéééééééééééééééêêêêêêêêêêêêêêêëëëëëëëëëëëëëëëìììììììììììììììíííííííííííííííîîîîîîîîîîîîîîîïïïïïïïïïïïïïïïðððððððððððððððñññññññññññññññòòòòòòòòòòòòòòòóóóóóóóóóóóóóóóôôôôôôôôôôôôôôôõõõõõõõõõõõõõõõööööööööööööööö÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøùùùùùùùùùùùùùùùúúúúúúúúúúúúúúúûûûûûûûûûûûûûûûüüüüüüüüüüüüüüüýýýýýýýýýýýýýýýþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿ1nU¹ tRNSÿÿÿÿÿÿÿÿÿÿÿßÎμIDATxœbäf€€ŸlŒP@1Á„þ|û &˜Ãw˜ @1Á…þBň !7 €˜„X bÄ„)Ä@,P!†?Ì¿ Bÿˆ. ÄôCŒ €˜0Õ1 ;D%3Lè7@±0@YöÐ-ì`ίÿp“äftA€û & H@a¶4¬@‚œ°° ˜eì aB ÿ8$-C£ì6IEND®B`‚asio-1.12.2/doc/proactor.png000066400000000000000000000742351340672067200156560ustar00rootroot00000000000000‰PNG  IHDRX’?ý¿“gAMAÙBÖO¡ pHYsÄÄ•+$tEXtSoftwareQuickTime 7.1.3 (Mac OS X)&¥ã¡tIME×:=" IDATxœì ÜTcûÇïJi!’RÖP¡¬‘¥×Bd­,åÍV–dË.JÖD…,•zI¥¤ˆìK–l!YŠDH$)e?ÿù^œùŸgšíyž™9³ü¾ŸÏÔ<3sιçÌ}îó»¯ëº¯«ŠÁ !„BˆŒ±FØ B!„(6$°„B!2Œ–B!D†‘ÀB!„È0XB!„FK!„"ÃH`¥Éøñã]•*UôHñBˆ\£ñYãs>R-ìãÆ » yÉk¯½æ v3„%ŒÆçøh| ¬rrÌ1DŽ݄¼E°"L4>'Fãsî‘‹P!„"ÃH` !„Bd ,!„Bˆ #%„B‘a$°„B!2Œ–B!D†‘ÀB!„È0XB!„FK!„"ÃH` !„Bd ,!„Bˆ #%„B‘a$°„B!2Œ–B!D†‘ÀB!„È0XB!„¦ZØ (Þ~ûm7nÜ8wà 7¤üìÍ7ßìöÚk/·Ûn»•yý‡~p×]wícíµ×ÎVS…¢èa,eLõ©]»¶;òÈ#]ëÖ­Cl•(&dÁÊü±6lXZŸý裢þ¥—^êÎ;ï<{þÛo¿™Pûûï¿Sî#¸Bˆ²Œ9Ò½ÿþû®ZµjöX°`Ûo¿ýÜi§–Óv¼þúënóÍ7Ïé1En+dþúë/·|ùrW·nÝèk÷Ýw_ôùŠ+ÜÊ•+íy£FÜË/¿¼Ú>–,YâÖ[o=W¥J•¸ÛÅ~¶ÁÄmÏO?ýT¦-BQ¬qÄîÜsÏþ=|øp×»wowÓM7¹:uêD_ÿõ×_íÿêÕ«ÛÿÉÆQ^geLŽ÷Þ×_í6Ùd“èküñ‡í/&Ô‹-²Ï®±Æê¶Ø6‰üC¬øì³ÏÌ=dÈ»@×_}·çž{ºŸþÙÞß{ï½Ý˜1c\¿~ýÜwÞéFeÁüùóMü žà©§žrÛl³Ûzë­]ƒ ÜùçŸo¯Çn_}õ•ƒ™Òf›mæÚ¶më¾øâ {ïŽ;îpÇ{¬;ñÄí=!„(EöØc›˜"l¾ùæ Å1b„Mn_xá…¤ã(ôíÛׯbÆdS§N¾÷è£Úxß¼ysM·Ür‹›={¶;ðÀmì¯Y³¦ýϤû‚ .°±~—]vqm´‘›4i’í#^›Dþ"X­°FqÁ¾ñÆnÞ¼yî±Ç³÷P¿ÿþ»»òÊ+Ý™gžéN>ùd7yòd›ý,[¶,ºÜ€×\sûþûïݬY³Ü½÷ÞëÞyçÕ¶ƒnݺ¹­¶ÚÊ-]ºÔfWÍš53A\Ð\üµjÕŠk!Bˆb„P &¼<ž}öYwÑEY âÈó<‡ñ(<øàƒ®]»vIÇѹs纇~ØÍœ9ÓÆä‹/¾Ø&½ì‡q¾sçÎnèС6ö3V_xá…nuÖqÓ§O· ÷/¿übÿóÞĉmB½xñbwÏ=÷¸®]»ºÏ?ÿ«U«V¶-0³ââgŠBˆb„1xРAö|­µÖr-[¶4äú믷EG©ÆQÆP&¨X°G0Dןþi œ°Züñ¶Ïƒ:ÈM˜0Á­¹æš«µ ëÔ1Çc–+À µêÉ'ŸŒz$ü6‰üF+D6ÜpÃèó5jØÌ$]¸¸±Nù¢h‡vpU«VûY.và꘦M›Úÿ˜Â¡E‹WBˆ’ŒÁŠÇvÛmgÿ§GXW\q…YŸš4ib“_܈Ûn»m™ýuÔQÑ÷‚ð7–´ Ç«ƒmùî¨!RAƒ+‹yÊ”)váãâÃ.|Ä&f\Š ¶BŸTãèàÁƒm8Aì¬N$„ç~ýú„ÉñÂ… W;Ÿõf¼÷Þ{«  ¬<²ü„%ÅõêÕ³X Ò÷ÑÇnG̳)Lá~€üèÑ£]ûöíµbP!Ò Õ8ʘŒe‰‰.nÁÛn»Í>ØŒkñåÇÄ2!&È7 V1„›¿*°C‡nìØ±æ^\ƒÄgùîAQ8H`å9\¼A²Ê/Èa‡f+™Õ°šeüøñ–¿…ÀIfPÁíÈñÂ@@=¦æM7ÝÔ½õÖ[¶ÒP!DjR£ÄcM›6Í&½¸Û´icc3ÁíÄi!¸üØ*V"ÔØ'á|ž× €¿ì²Ë,æŠñ˜°N8Á=ðÀeBJDaPÅóM")ÄJ§‹™ +ýâ¹ñ×3{ò-Q,ãmذ¡åÄŠÝŽ|+sæÌqë®»®]øÁ¼Y•%Ìó#„(mr9þ$GY|ôÉ'Ÿ˜µ ñ„eŠ`w_­ZµÊ}÷Ýw&Îb!){|°ˆ±Z‘Ø­ÊVîÐø r/’%’‹½P7Þxã„Ûá6d¶$„¢b$G‰« ³ãþ‹]ÌO\AP\V2?ˆ^&r !„Bd ,!„Bˆ #%„B‘a$°„B!2Œ–B!D†‘ÀB!„È0XB!„FK!„"ÃH` !„Bd ,!„Bˆ #%„B‘a$°„B!2Œ–B!D†‘ÀB!„È0XB!„FK!„"ÃH` !„Bd˜ja7 Ð¨R¥JØMBÏ"ŸÀJ“ÝwßÝ7.«Çx饗ÜwÞéî¾ûnW»ví´¶éÚµ«ûïÿëÚµk—Õ¶ýý÷ßîÖ[ouï¼óŽ;묳ܞ{î™Õã !Dºdc|¾ýöÛÝÇlã^õêÕ3ºïÅ‹»^½z¹«®ºÊµhÑ"£ûùC/BØÿ°ï¾ûººu뺉'¦½Mƒ ÜW\ak¶Ad]xá…nРAîÚk¯u—]vYÖ)„¹fúôéî ƒrS¦Lq:tÈÊ1¶Új+wì±Çºþýûgeÿ"|ƒ•'ÌŸ?ß½ð ®{÷îåÚnÝu×u+V¬ÈR«Ê²Æk¸[n¹Å 2Äf^XÎþüóÏœ[!rÁªU«ÜgœáŽ>ú謉+8à€LȉâE+O9r¤Y£Ú·o_®íjÕªå–/_ž¥VÅáäÉ“ÝØ±cÝ¡‡šóã !D¶¸úê«Ý?þh.Âl‚À"ä‚c‰âD+Àõ†À:餓\µjå ‹Ã‚†ÀAX½øâ‹îý÷ßw{íµ—ûúë¯sÞ!„È$ï½÷žÅ\ 8Ð5lØ0«Ç"$„ ügŸ}6«Çá!•<÷ÜsîË/¿tݺu+÷¶a ,Øi§Ü믿n¢PKQÈ0Ñ=í´ÓÜ®»îêN?ýô¬¯N:v,¹ ‹­"Ìî¿ÿ~[³Í6Û”{Û04mÚÔ½ùæ›Z-„(hîºë.÷î»ïšÛ.WãnÂQ£FåäX"÷È‚2T²R¥"Ö+[`Ä•¢Y´h‘»ôÒKÝùçŸïZ¶l™³ãxànÁ‚îÓO?ÍÙ1Eî+djÔ¨áæÎkB©"´mÛÖ}óÍ7n•B”«zõê¹+¯¼2§ÇÝm·ÝÜ=÷ÜãêׯŸÓãŠÜ ø`ËXqÎ9çX»fΜvSD†È¯VLž<Ù¬N™ChRfç§Ÿ~ÊÈþ„¢!îó•W^qwÞygÞ‰+ lÎ{ï½g±ª¢8È¿^Vä<øàƒ¶ëÔ©ã–-[–±ý !D1çࢋ.2¯ÁN;ívsâ‚Àúý÷ßÝ»ï¾vSD†ÀÊ!?üðƒ- >á„2ºßºuëÊ‚%„ °ñBìg¾²å–[ÚÄ[.Ââ¡ZØ (%ˆ“Zk­µÜG‘ÑýÊ‚%„ñ™3gŽ-¬aÕòúë¯vs’²ë®»º7Þx#ìfˆ ! Vy衇Üá‡îjÖ¬™Ñý›‹Àý“N:É’“ !De8ûì³Ý;ì‘EEÙ% Vñ •#(ÃÌ$ÓîA(6 ‹ÈSC"ÀG}4ìæ! ”qãÆ¹çŸÞRãäc`{,ÄaÍ›7Ï-Y²$즈 ÿ=®HÀ·þí·ßZM¾LSl,’20vëÖͲ½><ì& ! Œ_~ùÅõéÓÇÆ„K!€‹ü\óçÏ»)"(+‡Ô«W/+û%·Ë&›l’•}‡³Mê„m´ÑFîôÓO·¢¬W^yeØÍB °Õƒ »)iS¿~}·xñâ°›!2„м ÖYge%vT-S¿"<>ÿüs×¼ysWçw^ØÍ%Š–(&Mšd¥$=ôP+ „±¢üý÷ß6KÄ:Ü­µk׎+äØKäšk®Yáã !²KÇŽÝܹs-q'•.„™DApä‘GºéÓ§Û É‚D\wÝue²äÿüóÏ&ƾþúkû»_¿~n³Í6s[o½µkÔ¨‘evöyçw\Ë–-ÝÆol˹¯¸âŠhñÕçž{Îí¸ãŽ®E‹¶ ”ã!òÆ *fÜvÛmW"T$°DÁ°×^{¹Y³f¹† &ü )þøãèß$ òÿgŸ}fƒîûï¿oI_©ýuñÅÛçV¬Xá:tè`âŒ÷˜ùb)»çž{ì}>×·o_÷ý÷ßÛ2jŠÅJm!J®} &cÁ:à€ÂnŽ(q$°DAQ¥J• o‹Èbe¢ Eé ,SÀŒ!Ö»woû,RjLœ8ÑÞ§æ#µÌxäÔYºt©Yº„ù1š_|ñ…»õÖ[ÃnŠX¢¸A4ùPŠbÔ¨Q–÷àöÛoïžxâ { X¬XÛm·Ûf›mìñÀD݈#, ÿ{ìa±[—\r‰‚í…È#°._sÍ5î‚ .°0!ÂFwˆ,BÞ«o¼ÑnÜ"7 ˆpú œ|ø=öÜsOsñ}÷Ýwî¸ãŽsgœq†[µj•Ûpà -WÙ—_~é¾úê+{¼ýöÛ–*‚÷Ùçøñã-‘ÆãÉ'Ÿ ã+ !âpùå—»ZµjÙäGˆ|@+‹…üÚk¯U eÙj«­Ì÷é§ŸZ<5È|L”*"Hžd~‡rˆ­(²Æãö#î !B‹÷ÇŽk¢\cdâÇŠµÿþûÛöþ¶Bˆp!fòÞ{ïµØÈL—" &rS§N »¢’H`eR ´oßÞU¯^=ëÇB ,JVQf‚ xVûm¾ùæ®Y³fQWYô×Yg{—]vqÇ{¬%#¬Q£†¹î»ï>³h5mÚÔ܉¸ ÉÍïG€;îA^CĵnÝ:+Yù…凨ÉwÞÙuíÚ5ì¦dãa‡æ¾ùæ›°›"*ò`e f ¸FŽiù›² 1C]ºt±Ô¥ î¼^½zYbAÄJaq Bwÿä“Oܯ¿þjÁê±AóÁôÑG¶mãÆË¼G6yh‰ÝB¨ !‡‰,«_}õUצM›°›“k˜RG±]»va7GTù®²Äã?nÿ“3°ê­Ô „’í8ª“O>Ù(Äm,*Äh"p/0Ž¢+QrR!Dîùí·ß,¨Il±ˆ+`œ!Ù1“A ¬ÂE.Â,Á¬ê?ÿù«S§NNŽ'õǼ­ $~qK-2!DqB^;&S…To0]o@`‰ÂE+ à~b…ÙÇs…Öÿ³ß~û¹_|ÑÍž=Û‚Ó€…Åe«ˆ¡$Ÿ]¬;¿ Ú„Va#•ž~úi·råJwÄGäì˜Xe!˜ bªN§ÄŽ¢x¸êª«,-Ã…^vS²‹ÕТp‘ÀÊdßm·Ý’–tÉ4X«ÃÊÀ3fXJ?¡¨¢ð™3gŽUdèß¿Ñ.8A`ÍŸ?¿L²dQX(È= <8çËk%°âS¿~}÷òË/¯¶šPQ¸ØÎjÞ“N:)ì¦d  Ž©¡ºí¶Û†ÝQ$°²+ÑÈ•”KXË–-³ ’ºyâÿ‘¸¢x cÚ´iVG´˜ËUqaud1ÇbGy°Šr7Ýu×]¶š†Ä™BQlP=¡U«Væþ'Cˆ|FK!DA@9œ3Ï<ÓVãB"Ÿ‘ÀB‘÷°2·YÇŽÝСCÃnŽ)‘sW”4+V¬p§žzªåÔBä/ƒ ²ÄÁ¤g¢À%Í?ü`IIwß}wåÊ"OùþûïÝ 7Ü`9¯¨ñ*D! %JšM7ÝÔ½öÚk–ΑÅs!D~ѯ_?K*zþùç‡Ý!ÒF+C`ý ù(˜Yä­·Þ²ÿ.\hBë´ÓNsGy¤ûóÏ?CnY8Œ5ʽÿþûa7CT ¬ @Åó/¾ø"tÅÀD²QQ9¤;v¬ ªU«VÙk¾ÐêÑ£GŽ[.Ĉ²ÚYXµÿþû‡^°Aƒv!–ª)=ÓT©Re5qåÓ§O§½BdÜ?þøã„ïwéÒŲ¹—¬p&M…(<$°*ɯ¿þjy”Âv‹›¾.ÆÌH\Á›o¾ézè¡Z%DñB€{0î1È¥—^êF]rÅÛeÁ*\$°*ÉK/½dq:܈Ãf£6²ÿ¿ûî»[Rø$W> ø¥"D6ñ܃T«VÍ >Üõïß߬ʥ†,X…‹V%Á=زeK׸qã°›b,X´hQÈ-)|ž{î9W½zõ¤ŸY°`¬¥K—º¿þú+즈r"Ud‡%•y¶Øb K@ê[µÖ¾U‹2J>*DåðÜÿóŸÿ¸3f¸&Mš„ݤ¼`ûí··ÉÝüvSD9©âi­yQ1räH³b•ºY=|öÙgîž{îq#FŒp{챇›4iRØM¢`¹ýöÛÝÌ™3Ýý÷ß_r+Eq"%ò’ñãÇ[²O!*C¶†7õOQt»--ª…Ý!’;NˆòBþAƒeý8êŸ"rÕE~!%ò‚Ì…¨¹¸¡©Št‘À*=ä.„B‘a$°„B!2ŒV`9qÓ¦MÝ×_vS„B‘‡H`U² /_¾Ü2 !„BÄ"UX{î¹§[c >!„Ù…|{±uEþ#…PX{ï½wØÍHȽ÷Þ«åãBQ$PŽëå—_»¢œH`•“>úÈ}ÿý÷nŸ}ö ») yòÉ'Ý„ Ân†Bˆ @Y.ʉÂB«œ¼øâ‹®V­Zy]„´qãÆî«¯¾ »B!2KYà  ¬r‚{°mÛ¶®ZµüÍѺÉ&›XQbQyfÏžíÎ;ï<÷Ö[o…ÚŽþýû»7Þx#Ô6ˆüKÆE]d¡a‚¥|ذa¡¶¡TÀ*L$°ÊI¾Ç_¬o¿ýÖýõ×_a7¥àýôÓPÛ òƒgŸ}ÖÝ|óÍ®OŸ>nÕªU¡µãÝwß5‘%²¢Z‹ª ýbåà‡~°ÿó]`aÁB\!²DÅáæÅb .¸À=úè£nÅŠ«}†×–-[Vî}óûüôÓOqß[¹r¥Åù%‚÷Ífƒûä3 ,Hz¦ý¿ýöÛj¯§³m²}V䜈ô1b„ëÑ£‡=ì±ÇV{Ÿ›ñ¢E‹*´ïü1nßbŸÉÂ~þùç¸ý~ýõW{ø,Y²$iÿNÔ'ÓÙ6•9'ùÀüáÖ\sͰ›!ʉV9¨_¿¾¹ÞHÑÏ`ÁÅaUމ'ºõ×_ß]{íµn­µÖ2+’Bæ°Ãs[mµ•õ‹8À-]ºÔ;Ö5hÐÀDŸ3Î8ÃuîÜÙ}öÙg®víÚnÈ!nƒ 6°}Ó—¸9ÁŸþéÎ9çW·n]·ùæ›»]wÝÕ½þúëÑýðœ×5jdÇðß»ãŽ;ܱÇëN<ñD·Ùf›Ùk?þ¸}f·ÝvsuêÔqçž{nÔ¢yÓM7Y ½£>Úm¸á†nÝu×uW^yeô8ɶ%öðÁŒ~–›½¿à#Ñ9™áŠØG`uìØÑ=ºÌûýúõ³>°õÖ[[?yå•W,g}*hmzúé§Ýzë­ç~ùåû¯»î:Û†Ü~ôÍ3fD?Ëñx­yóæ6y»å–[¢ïÑw9äë/ô#Žß|ó[{íµ­ÐŽ^xÁÆ#ú;}˜6jñÅ_ØçSõÉdÛÒöN:•iÇöAÇ;'…†Va"U„l¼ñÆfNVVåàæ€ha°>òÈ#ËÜÌÈK³Î:ëØ„3äQ£F™ÀঅM¬è<î¸ãìonv,·æ†ALÕ¼yó¢Vö‰¨Cˆ1KçÆwöÙgGÉ rüøñnñâÅfE8p ½Žøá&Èâ öÍ…›Õý÷ßo³vnDS¦LqC‡-Ó&ÚŠµ€›1^X«Rmûûï¿—q=óœ×’‘9~øa·é¦›ºwÞÙüñî©§ž²þô›Ûn»Í½ÿþûfmG¬_|ñÅ&V<ð@ë;>Xf>ø`W³fM»yßwß}Ö‡°zï¾ûîîÆo´ÏÑO™ðûÓw‰ûºð ÝçŸnï2AAHóÄ ý+ý‚ý"ÈÛµkçºuëfâ›Ï"Æ›5kf×$ë“l[ú`pBã›ÿ“BC«@ñDQY^d¦v3*Läà…Ù=,XàEDª7wî\û;r#³¿#¢Õþ¾ù曽Æ{?þ¸T^dô"ƒº½×¥KïÔSOµçÓ§O÷Ö[o=ï·ß~ó"bʾSD´DnÞe—]fÏ#‚*ú"7/"êìyëÖ­½ë¯¿>ú¯Gn2ö|РAö{Gn4ѶEnÂe¾Ï¥—^êEnrö|À€Þ®»î}vóÝfÍš•rÛæÍ›{<ð@ô½ˆ¨òÚ´i“òœäšl÷Ÿ°ú'çšß8¿ë¯¿¾7xð`û›¾ºÖZkyqâE®¸Þ¯¿þjïMž<Ùú!ÛøÛ=ñÄö}‹m|"‚(Ú·øMýç><òˆ÷å—_Z;vÜqÇèë‹sB?â:áyD€Ù{|ž¿ß|óÍèçù¯EbÒ>™jÛ«¯¾Ú‹³è{fïEÄaÒs’K*Û_úöíëE&dl‘Ȳ`)Áî¿ÿþa7£`‰ˆ›3›Ç=r '˜EÆwaYâµÓN;Í\-‡~¸Ym k×®f `VŽÕ÷.F\ >5jÔˆZ€°m»í¶Ñ÷p!²/,“Áí‚q*-Z´ˆÁ²¬_A°zcò‚m`f̶´#mƒømOuNDåùä“OÌ-Œå’>‰;w˜oYÝrË-Íbˆu WØöÛoï""ÊÞÃZÏ=÷œ¹ëX ×'¶Oú}+¶OÂQGe®B– ÃÒËj·`ŸØn»íìÿùóçÛ5LoC=Wðc£õÉt¶ <~²sRHD¨… ˆÂB«HáFÇ`"*ÆÈ‘#-ö 7ÈìÙõìÙ3z3Ãõ@ŒnXR8ঠÛ2pãâöÌ3ϸI“&E]>‰V·„ËÐwñZ>ܼÒý|üñÇe^£@y“&MRî+Õ¶´=è"ô]E윈ÊCŸÜc=lõžß/òœk~3D0qJ3gÎtß}÷¹¥‰ÿÃ͆`áoÜpˆ~Ƈ`ª™dý!Ø'W ~îÊ6!Â'Ø_èWà‹µDmHµ-Û%ê“ÉΉÙFKˆˆcb–‚jýG÷îÝÝ|àÞ{ï=ô$<² IDAT³"#‚•ªeË–nÇwŒ®¾ªZµªÅǰŒž qnŠé@Ð27?nhÄ\\vÙeenér衇Z;‰V†¸N›*»-q0üMœ ~ŸdçDTâþä“O.Ó' 0ßb‹-ܘ1c¬VVC~3D ï³wéÒÅ<ÑŸˆ#Ž8ªWLž<ÙþFÐä¾ÑF•«ýôâ¦Hwâ¯Æåû´oßÞð+³-ï#¸HcÂuCZŸTçDˆl"% …ZEÁEõüóÏg°Eá¥à ƒ²9‚—ƒ;ÉG øeÅ&b× Á¿>¸öæÌ™cÁ¹éÒ·o_»Yâ’ñ“Å÷™.@ßpà æÊ¡½¬ âftÒI'Uz[Vl»KÁÿ>©Î‰¨8¬ú#Hws,¼†Àâwb‘n»]vÙÅ^ǵ„ËXyGÀ;¿}9ZµjeAâ²#ªè£ò&Zæó\7,èÀ½‡ÛËÛwÞYémqòƒÃc¾e÷’!²JÈ1`"†þöÛo˼F0jíÚµWûldÆè­Zµ*á¾–.]jÿG_/rã-óÞòåË-à´"„äžœ›È@oÁ´±p~ ®=Ïé°hÑ"oÉ’%•n¿ÍÌ™3-X>“Û€Ì"€x$;'¹¤XƒÜSA÷G}ä½ûî»ö<–½÷ÞÛ6lX¹÷»råJoþüù•n}‡õÏ>û,nû*³-Áð,&‰%Õ9ÉùÚ_DvÑ/ž¬>á‰wñ×\sפIS¬<{ùå—½>øÀ«^½º ‘Ùž·lÙ2Fûì³W·n]{Df¿Ñ›þí·ßîEf´^×®]í½vØÁ«R¥ŠícĈvsîСƒ‰®ÈìÓÛÿý½ü±\í,äéí·ßöþûßÿz'žxbØM)YJU`%Q2vìX¯~ýú6ñ¹¥Ðú‹È r¦æybÒ 2ÎWå„Á3}útK‚Il ÿc~ÇOr2Õ«WÏV&BlÞ%âH4Èk§œrJÉçCÂ-›Ñ\BB„ Áí¬Œ%Y.×­"ûäoÅâ<ÿ;ìPð‰Þ"‚Úˆ€W Æ7Þ÷ƒOY¡„H"¦È‡ø$VÅ[EÄk¯¾úª›6mš%$¢WBÁÎ~’Q!ò®uBˆÜ! V °þ-tÊ“†•l¬(ÃŠÅ²æØºyÁ¼K±(’BdÒ½ËS‰ÂA+,9ÇVˆ‹R/¬˜ñI7' Ö&Ä+épR»k¯½öJÛEª|HB‘zè¡’ ±(&ä"LÁ‡~h¤ya°P]zé¥ö79a>̈üœ0ƒ¶÷È”L2?ªÞ#°`dÆJõå—_Z~&bµûÔ/ZL>$–‚“¨Óχ”«JöK–,qwÝu—%¥n®],hùÕžóŽø<ýôÓ3ºß©S§Ú¾}øÍ(ÀÌõ`y$&î1W_}uÊ\PÙ`îܹÑ“@:R„~#˜”6W01æP=!çóGú²ÅWd… ùæð8ˆÂC¬`!`›Jò…9•‚‰*“å„Aˆ0¨’ë«¢ŒÜ7¸bÄjQØ5ÑLê裶$ˆÿûßÿBˇ„[³M›6V—äžän"æŒü@ÜÄ ˜ ‘ÉM-Óï†æɃ2'$)Ž‹`áCn5&8ôÇØG6㹎ÅY²€AÂñé7+W®tÇ·kÑžk¸ngÏžmσí¦?sîÒIÜG± U¸È‚•5°ÈÎ]h °È|Œ5ŠU~|VýQÓŒ/¢Êwû±ê×±‘Œð’K.qgžy¦e@&Ù$øÎçi±ƒö­·ÞjÖ1V(1XSÃŒàxŽ‹ÐʬôDTiÜŸéžzê©æêÄŠ i\ ± E›0bȱlÙ2ËÔ þÄ©Å~žóç×F#ùh°¶ pó@x‘X4^LîÕåË—§´pðù«êÛá†B –¾Y¸Ù–ŒãÜÜÅüžÄ²? ô®—àwã9×BƒßE#\ô3& X¸é¦›ÌÒL¿¢X2“#&:ÀoAº¬Î”¼ID Ç$öRŸÅ0dþçwåzÇŠDãoú™ÿ7_§N¢Ça¿ü¶ˆ ±í¦Ø3ûá\P‘>DßåXœ#Ê8Å«-˜¨Ýô}ú[°-„pS}ß;î¸ÃÆÄrplÌL®¸NÂpÙŠ ^ ®Â r3ñf̘v3*Û#˜¨ÂnJ¹)ob>œò]ej>çœs¼=öØÃž“`µY³f–1=2öN=õTK–ʶӦMó"7)ï™gž±¿yäËÈÎg!"Ô¼ˆð°~t½O?ýÔ‹ ´^DÈØû÷ÝwŸ¹DÛÌp?`À¯}ûööü®»î²íüLïAcI^I9oÞ<ûî‘Ü2£GD¾è½Ñ£GÇýnçEĬmÇãwÞñ®¾újÛÇܹsã¶;ÙñɈ]£F /rƒµ÷h?‰dy/ÙùáØáeIjɺ=pàÀè9¿ñÆíû° Çßwß}½AƒÙ{ûí·ŸwÊ)§Xýã?ìyähï-\¸Ð¾‰niG²ªAò-ÑhDˆz‘›¸eìèguVôó‘MTÛ½{wKúK#ÙñÉ'Ÿlç èS´#"àíüÝvÛmÞk¬a™×áì³Ï¶þˆ0¶mùå—ÕÞ#1×L:ǧo0Æ ˜ß˜}<ØÚpÆgx±eŸ¥OFDvôô>ëgý§>|µvû× R#‚Ýž÷ìÙÓÚgÖ9—±ûHÖî9sæXb䈴s™ÄXBéTÛÑg×\sMû^$hN—ŠöG²Ï³™èEá!a "ƒ^ØM¨0˜æ™e-XÅ n/f³‰V:âJÆpàâdv Ìø±öÌO€<³qb¹pQ0{ÅJƒU w#ànôû.Üì‹™6–â¬p-$Ë›†EƯïÌÔ±Ð0Ûç˜@¢R,XP‰)Ã嚈È@l._à`]ÂÒä[1cÛìøXØÞ/ðL{HTÉ÷Iv~¬O”g-Qn4¬WXÀ°ólƒõ÷­Ö7V²2kÓG‚ø.Vâ)Ž…„~JBPâêè·X?qõb¡¢˜1iP°:Òç nâß÷üóÏ·.~¨ÄbNçø,bñkUF„ˆ%f¦lOÿ †`¦!¦’¸Î8ç «´OªvÌOüi¯^½ìZźMlj:ß7YÀLÃØíã¢ðÀ*r¸ù•‚À½„«…2^Œ™êq=ùp^|XĸâRóoúA‚Áâä ¾ÎÀ΀ŒŸB³é€ ,6ñ#"/¸Ú’Þ‡…~,Wˆ*\ï~¨b—\<*ÚF\w¸}pÆ®ÐLÕnöÁù¾êª«¬ý~Ñòt¾o²€™†±›ï—jõ¤ÈOƒUäpÓ+…Eao•#%N_$@Ð:‚õ„A‘ÆÍŠø D„ÿ@LÄŠû° ë£>²8Jù)1RÁ "Ö"õÞ{ï• (Ïæ žìø¼ÇŠÌ ÌØÉk–ìü$˳–(7Ön´ÁÕ®äƒxÁõÅ ‹"–±cÇšCœøâ‰×üó͹œ2eJ4.'Ó%¼X-Ì1°Œeòø±b+ø›—â’‚1WÄeqíI§Ý¾åq†ØOw»\ÂĉE¢0‘À*rzôèa…b‡5.ÒA08²ܸöÞ{ïè,pcaþÇZÀàÊÍ„Àm‚] ðf¸;pµøA®±`Áº‚+WµÁûwé}0?X:X;ý´ ¸æp¯•'¹2$;>DãäÉ“í=ÎA–Òó>+'ýø  ,ß…Êo¼áÚ´iãfÏžma¢°ÑS"`µÂ*AŽ/‘[Þ|óMwå•Wºä­¸Š4>Ü\É&L»9"dæÎëÆŽë.¿ür‰«ÁŒ‰°ÄUq V ±Ùf›¹3Ï<Ó]tÑEa7¥dX¾|¹å Û|óÍÝSO=U1;={öt£Gv3gÎ4Ñ%J“nݺ™Å›˜T ¬Ü±lÙ2£/$°JraKn¯BlÌÓ§O·däV+ˆÇÚ{ï½ÝÏ?ÿl"«V­Za7Iä˜/¿üÒm¹å–îî»ï6¡%„(?š–”W¹+Ðÿþ÷?7räÈ‚WÀê%\„?üðƒÅc‰Òãæ›o¶>K –¢bÈ‚%Døã?\³fÍ\ÇŽÝ AƒÂnN… O—.],ð–¸Q|ÿý÷®iÓ¦¶Úõì³Ï»9B,XBd‰¯¿þÚm°ÁÏfÕªU–ôP”/¼ð‚ëÕ«—-ÎÐo/DÅ‘ÀB!„È0ŠÁ 0uêT+‘ó×_…Ý!„B0X>ÿüs÷ã?ºªU«†Ý!„B0XÈv¾É&›„Ý !„%“úQ£F¹•+W†Ý‘a$°øådŠ+V„Ý!„ž|òI×£G…¦!XJÁ‚uá…ºýöÛ/ìfÑ.5XiF)!Då˜6mškÛ¶­[wÝuÃnŠÈ0XJA`Q.G7ÆÌ±téR«6~üø°›’S.½ôRwøá‡[¶w!DÅøûï¿­„ÖÁvSDÀú̳ß|óMÑ ,’_" ÈÒ-*Ï©§žê~ûí7÷Ÿÿü'ì¦ä2½S3í„N°›„(\¾ýö[… „Ä[o½e‰]9ä°›"²€Ö¿ ®YÅ.°¶Új+û_V¬Ê3tèP÷ØcY9œúõë‡Ýœœ²ñÆ»I“&¹gŸ}Ö]rÉ%a7GT‚ .¸Àzè¡a7£$yâ‰'ìžÓ²e˰›"²€Ö¿à„bX|¿êÕ«»O?ý4ì¦4³fÍr}úôqW\q…ÛgŸ}ÂnN(ì¶Ûnîž{îq7Ýt“{àÂnލ .tãÆ3K¬È=Ä_É=X¼H`ýËî»ïn¦ÚƇݔ¬²Æk¸-¶ØB¬J€;å¸ãŽsmÚ´1UÊœxâ‰îâ‹/v§vš{íµ×ÂnŽ('·ß~»Ûpà ÍÕ+r ÷ÊÉ=X¼H`ýK•*UÌÍÃÿÅnB ¬ŠsÖYgYîš|Ðk©3`Àwàº#<Ò}ùå—a7G¤ …áÇ[Aç5×\3ìæ”¤gà¼kUwñ¢»C B »\„ƒ„€cÆŒ±ÿ‰CÿXE‰CÛh£Ü‹/¾vsDšÜÿýîÏ?ÿt§Ÿ~zØM)IÚµkg×M­ZµÂnŠÈÕÂn€È=Ûl³- å§Q£Fîºë®“Y?røàî%¤0`åçàÁƒÝ)§œâêÕ«vsJâa‹=æ·Ô©âE»B!r+@;uêä>ùä“èÊb!Df‘ÀBˆƒ¸Ÿš5kZš!DvÀBˆã»ï¾sË—/w[n¹eØM¢h‘ÀB!„È0ZE(„B„ÈC=ä&Nœ˜Óc²È!^î:ʨwÞyV¬¢ûÿ åþÉfL<u¡„™eñâÅî /´”BˆÕyå•WÜ믿žÓc>üðÃnöìÙöœâíˆ*@X½ýöÛiÕ îC¬ŽVŠÖ®\¹Ò­³Î:a7Eä O?ý´›1cFØÍ( ¾þúk7lØ0Kh)D)ƒxY²dIôïU«V%ýì/¿ü’ð}&,ÁíS}>$õ ~“Šæå—_v5jÔ(ó™ßÿÝýüóÏ)÷UÑv­Dçx ö-ZTî}†V„Ÿ~úÉþ¯[·nÈ-ù‚€Ò!÷Ýw_ØM) Z·nm É>hР°›#Dh½½aÆv=ð:u¬L›_ 1Œ?¼× AwÐA™>ûì3·öÚk»o¼Ñû®¿þúVlý²Ë.³|flãOd>úè#ûlÐÕסC+¤_¿~îÎ;ï´äÉGq„›?¾Ý \o¼ñ†¥ñ  8eäÖ[o=wüñÇdžÉÚM½RÚËâ 9r¤ 9_4 :ÔÚO^0J¹QD>ؾÍ6ÛÌm½õÖ¶ Ö¾BAËýcÁ:F)ññÇÛ+þŸ¿þúËuîÜÙm°ÁîŽ;î»9ECÇŽÝÀm ž2eJØÍ"H‹Á„£GîÜsϵz„gžy¦]þz³Þ½{»o¿ýÖ„c’–$ÜrŒßwÝu—»á†Üûï¿ï¾øâ +=dÈ‹£b|6Èüac\+¯¼ÒÚpòÉ'»É“'›µÈ¿'b%›7ožûõ×_-”†RX3gÎt7ß|ójß-Y»Ï?ÿ|I={ötß|ó}Ö]ˆÎ¾}ûºGyÄD¯“È1Æýé¶Ûn³ïÇw:çœs¬öiÁà /2›ðªU«v3rÎ{ìáuÖYa7#¯¸âŠ+¼êÕ«{ï½÷^ØM)JþûßÿzµjÕòÞ}÷ݰ›"DN‰¯AƒÞI'äEÄG™÷¶ß~{/2ùðV­Zå­±ÆÞ£>êEĆ=Þzë-¯J•*ÞO?ýäEÄ*ÌûüóÏm»ˆ±¿#Â*º¯5×\Ó›1c†÷á‡Ú{q}ïÀôn½õV{¾ûî»{Ç·çgŸ}¶wê©§ÚsÿË—/÷^yå{‚Ñ}D·ë®»–ÙGªvÃ'Ÿ|â­³Î:^³fͼãŽ;.º¿#Ž8‹ˆ»èv<¶Ýv[ïÞ{ïõæÎë­µÖZv̈0³sü>ùŽJå¸,X¥èŒ\Ôîƒ>»yÃsÏ=çú÷ïoæjÎÈ<¸"pAàª`&¬z޹f r«ÄSxànÃ*ƒ©mÛ¶eÞÛm·Ýì¬PX((,$kÌe,?P­Ú?·ð`6þˆ¨YÍJåkÑJ<;õë×þ«kRTífÔÀÅÉŠÉqãÆE?‹æ" º«yÚp]FD¡»è¢‹\‹-ÌeHaùB@.Bç¢ ÔØn»íÌô*þYéÖµkWwÔQG¹3Î8#ìæ-Ü&L˜àj×®í;ì° åŠô¡°;q7¸‡DxàÄMÆ7Zwß}×þßpà íÿ±cÇšèà› b“&M¢ŸŠ˜D ´ (¶Ø—WÎÔ—$¤ Æ\!7ß|ó2ŸI§Ý¤s DÓ{ìa.C¿l{â‰'F·óÅîE\Ž{î¹§MƧÇwœÏÉäXîUª,¬wøÕK.ô“N:ÉU¯^ÝÝ{ï½a7§èáZ›:uªÍº•º!û ®¸©#hcA| -²Ï£>j~‡9sæØDƒ±ç…^pï¼óŽ}† r±U¾°!…B÷îÝ£‚)]øÍ™ÐøÖ¢ñãÇ— ¦B‘öD+±LÝ}÷ÝöœþBœìARµ›UúŒ±}úô±X«Y³fEƒí?üp;7ìXÁ½Ã;ؤ—t¼OLq±X`ÓI‘7„ë¡ÌN?ýtoß}÷Íɱúöíë{î¹99V*ðÓ"³Œ°›*Ï?ÿ¼·öÚk{‘™YØMI‹æÍ›{Ï=÷\ØÍ×81oƒ Šû~äæî5mÚ4·*Aˆ?b¬å|Ãõ×_o1KÄbm¾ùæ^—.], "BÃkÑ¢…W»vm¯^½zÞŽ;îhñTàÇGùqHQdóº1K/½ô’=¿øâ‹-ª~ýú^ûöííqË-·Ø{Á¬éÓ§{uêÔñŽ9æ˜Õb°jÖ¬é|ðÁ^“&M¼5jx;wö"£Õö‘¬ÝÄún½õÖÑv?ðÀ¶¯>úÈûã?¼SN9ÅÚÉ1"bÍ1b„}Žã´mÛÖ¾ÓÎ;ïìm±ÅÑãXÞ?Á‡¿ýö›=_´h‘ìŃ׃ïÑYÈ‹Ç_ýå-Y²dµ×ƒÁ„A–.]jÛÄã»ï¾ó~ÿý÷”ߣ"0¸öïß?+û.$¾üòË”ŸIö{'ƒþ¯/¿y:DzÑFyO>ùdÚÇ€lö¡|!Õ9`°æ:‹G¢×Ó¡¢ýÂ?n6¯û›o¾Ù[wÝu½eË–•y}åÊ•ö<•ì<òž´\’}ßd¤º†¾ýöÛ ·)Üpà Þúë¯&°xñbïý÷ß/óšß qÂb¾{eà÷ ©'‚{[l?F`!¼€qŠ údT¦Ý±Ïœ9ÓDcöƒcaLeÏE®‘Àú—/¾øÂVF°Êé裶Îöõ×_›z¾ÿþûMY³ZƒÁêøã7«êž• †>—\r‰Íx°b·]sÍ5¶Z‘Çá‡n¯½ýöÛ¦úQóuëÖõ.¿üòh'zöÙg½Ö­[Û~Xríµ×fü{vØaö]Db’ýÞ7Þx£­ B˜3¯7Þ8:à2Ä(ú3Õgžy&ºßI“&YŸÂÂиqc»¿óQGUæøôÁ… z;ì°ƒÍôXéèÏò’#}(Ht˜s=ßqÇ6«ÆjÀŒØ_}õ•]÷œ_„V„­¶ÚÊÞKö;ø'ê©¶ÍÅuÏ›ïtÎ9çD_ãûbu` jÔ¨‘׫W¯2+Y_šûìcKe±|±Ät¿ýö³ý`&Ýl³Í¢Ëhï»ï>°ýÁ$hÁ‹‰øÊ+¯ô~ùåoÁ‚¶íÝwßmïc7nœ=G½3À0@f’Ë.»Ì\N"1É~onbmÚ´ñ:uêdý†›‡³@Œssç†ÀïÿÈ#ØM1Æl›ÍC=dŸ¥o!œ>ûì3ïꫯ6áëã»rýß>hÁJv ÈE ›dçÀww{ì±6azóÍ7M=Ú¶Ýÿým™8‚˜ßo›m¶‰ ŽT¿C²~‘lÛ\]÷ÜÔ”A÷. C9Ä^c=nÿû&;XVƒ6«ÚÔ©SM¤ùn-ÆÜ>>÷Üs]êû&Û6Õo‹hæÜÒ¦Zê‘9°DqˆŠ!åýcúdð›5kVô5f\̆|åû´SåûÀÎ6ø•xñw³½oê ¬1cÆØŒmü}]zé¥ÞAdïï¶ÛnféòM£ â1¯'ãé§Ÿözôè‘Ñ}ÙÊŠÏáæA_,ÀJv ÈE ›dçÀXX¨}Ž<òH›Xp>yïÅ_Œ¾wûí·§%°Rõ‹dÛæêºßk¯½¢–r` ´ò`ó¿o²óHî$ú]ìþÓX©¾o²m‹9G’(~”Ëý“Õ‘ÙkôµwÜÑþ§l ÒÀÿl²|”&¸âŠ+¬2:ËSÉý‘ò¹Öß·OË–-íÿ#FX–]–µFfq®K—.–$“Df'öñÉV~ö¹Q”yñH–»&Ù1 }(pÎÓYŠ©ÎøËÈkœS~ƒªU«ºÈÍ<úe:üÒÍWoÛ\\÷”Gá;÷êÕ+úÚ›o¾ii1üœKÀsålªþJ{‚Ä.Õ¯è÷Mµm±æHÅVê9EĦ]ÌþM š×bo‚Á|‘œ=g@`Ù-‚Š¥©ä8A˜Õ¬YÓ–ß²,5ì‹å­¤Ið—à²4•Ae®ä/ai-û' &-ÉÛ·oŸ­S!bHõ{Cl~—gžyÆ~O¶m×®]™Ú_,Ef¹1¯=ÿüóeŽE‚S„Zl¢@úe²ö%:F¡ö!J¼úê«vNÓYÉÎ_<6Þ~¸î9?|ÆO܈ðIö;¤ê©¶ÍöuÏD4AjÕªei1æÎëš7on¯ùù—üv%:”òS ø,X°ÀÞÎoE¾o:Û&j“Ÿ#‰Úx”œ!•9’8O±…Š…åÁŠ@I„ÔàÁƒí¢'¡u™bI•ïƒA‡™âŠÁŒ:Jàý›T-˜o„AséÒ¥Vø“÷€ÈóÁ Í¾öÙgKê¶ÖZk™•‰A¥ r€ä!åMl™­ü.)„89e€ÏÝrË-v£'?ûa;’CÆg ö¡dÇ(Ô>„`™>}º‰ÕtHv’„\A~Ž~Û`ïd¿Cª~‘lÛ°®{Dß™‚Ûô&?üpZç‘v¼õÖ[Q‘Ås&ÁsõøãÛõÅ~ù.é|ßTÛuޤÜ7°Ä1éòÊ™4˜ËŒÉߟƃÆ »á¢{2¯ˆ Ñ‘Y“×»wo{ÝÁ .ãN–ïƒ\J¬#¾†ÀΡC‡Z@'AÐÌ7D³i“M6±CäñSF[@œGË–-½M7ÝÔV,Ú2Õ|bÔ¨Qo» 8ÙÈïÄûð›tMp5ñ<@_Ûi§,ˆ˜¾D<ýÀÁ¢or b[R£PûPä&k߉Õ©Hvbó‹Y.¼ðB{NÍ6®S®?(p]ú1I©~‡dý"Õ¶a]÷QdýïJð8yùü/‘Î…˜§ˆH³1…?~ éX ˹ FŠÕ‰~Uªï›lÛbΑäCŸá÷àº&ÍÏS•.ÁT,ÞˆLö²ÐÊÿ'Ý<| (‡XŠH` ”™‹:Ï&Ê÷Á{sæÌ‰î‡$˜Æ!6߈¿º)ÞJ!V71(²úFTÑÄÏ?ÿü mŸü.@>¢ùóçÇÝŽ€wÿ& 7ð`?MvŒBíC ÐU«Vµkéì$ƒào~[ÎÏc=¶Z^¨d¿Cª~‘lÛ°®{Ä&ô‰ÎS²óH¤?þؾ÷‰'žªÀyd…`"’}ßTÛcŽ$\œvÚiöœUç‡zhZÛ%Ëe„UœÉr—‘+‰r9ÆËÃ/Ÿ_P`‘¦$Ñ„°r@æ ¬äƒñ— ‹âƒ ›\;Ìr ùb-EH…€0æš â ,ŸX%Ê’HXÇòàƒš•U礙He…K–Ë ë—ï-A¸tèÐÁŸ%Ý‚Ÿ(«;¹ÈØk8“ôÔ'Q.ÇxyøåóC`‘Æ„,ð|Ë%yË|ÂΙ $°"ð#âÊÅ ©1p?ó‰ÂALn)n$~’ÎlB Ò8ˆÔp³LÇ…[ª . é°ýöÛ›«“ƒT”d¹Ì5”Û’ÿ Ñ‚•Šrp~É$’²"œÈ'Æ”ÔAˆ'>›*—cЂ•,Ÿmá9‰cñÚ ±Hcyˇ¹@A¡‚=+ FN¶_ä'ô³x€tG}tÖGà:)VDjH%L!þRK¼ôÒKn—]vIú9ÒMtîÜÙËl²É&àNf‚Ã#"eµÏ³`‚ }ûöµñl§vr]»v»oVg²wÚ´i¶èê©§žr={öŒ¾Þyç¹ ØŠS~Ë÷Þ{Ï °` 2ѰöÌŸ?ßÒŽ°ò4^avÒÒð9VrE Y½Êu ­[·vݺusÕ«W·Å@¬õ F³J¶wïÞöYÑ{ 'D¯=Ò§Œ3Æа¨EQ˜ÞÉÏ#$°þ¥¼•Ê‹×_Ý]{íµa7#£,\¸Ð.nVvqñŠÂqÅ*³BÈß&|ðAØMÿÂJÈzõê¥L­ `5$«2§L™b+-ISrÁX´Xå2‹ÇÙgŸmãÞi§f«^YqùÍ7ßDßN86lh‚ì‡~0ÑG.ÇúõëÛjgDZ"åóCtùûõAÈqŸEXs£‘’Ç<½“ ŽU´¤¾aeõ%—\’v^¼|¢ðZœ¼r.‹-FX&L’>–›Ì”ÈD,X¢°ÙtÓMÝî»ïv3ò–?þØfú,ÓáƒPÂâŠHHv£2‰@¨<øàƒ–îcûí·/“×'˜ËÌ'˜Ë,0,SL4pŒ‰×\sMô}r‡ù ÜHqAòXÒù¹ßÿ}kO"aóæÍ+óùü8&$EÁÜhXûx 4±ÜsÁa=#™,Ò>XÂ`Ä…K'/,ÈÐMžŸuÖY'ìæ‘UÈ·‡Ebß}÷ »)%ÏìÙ³Í݆ë/ä|#Ï—ŸýA†;Ë¢#–T¹Ì‚ 8Ðõïß߯u²æS$hL¸çž{Ìåˆ%éÎ;ït»îº«YÝÊ“Ë1Y>¿d”LÈ0ÀòêdE:XØÍòù+@„…Á?ü`ÆC† »)"¹ÁÈ_–NÚVõÐM€;A߬S“𦬢‹—¦#Y.³`;¹YÀÅgY­PÑ2"ó¿(]ž~úiw衇šEçú믻9BˆGK,䃂õФyBñù”SNq÷ÝwŸ•HBˆ°À Á͸„¾ýö[‹¿)Ô<)"ó\~ùånrÏ>û¬oBˆ0P,QP•`|bP$®DŠ–øá‡V¾CK²`‰‚ƒÂ¤äìBd‘sFˆXXMHÍ4!² Ì)vLí>!bQš†½zõríÛ·»" (LJÕÿüç?®wïÞa7Gä)W"óG‘d¿X³A$°Ü?ùŸ–,Yv3DÜzë­6˜1°•ÊR|!DþA(5 O:é¤ÕJÇXêÕ«ç–.]v3òŽü1ì&¬Fß¾}ÝóÏ?ï6lvS„È*Ô6l˜öŠóvëÖ-äV ŸI“&¹Ï?ÿ\‰^EB$°œV<8^yå÷î»ïº1cƸK/½ÔÍš5+'Çæ·?~|Ü÷pýPEˆL@ |¾òöÛo»ž={ZÒß!C†¸þýû[æz‘°RõðÃwÍš5 »)"OÑ*B÷ÀÂíD¼)»X•7eÊ7gÎ[…5þ|3ƒû%;L›6ÍuéÒÅsÌ1nèС–Y^ˆLsõÕW»~ýú¹¹sçº-¶Ø"ìæ¬Æ¢E‹ìŠÑSÌyíµ×v76‹ÏEx<óÌ3î7Þ°UÌB$BÓ!÷ÀBHüüóÏa7%T°±2ï±ÇsŸ}öYq¹rË!ò+V‹-Z³„¨(ˆ«k®¹Æ&Uù˜¤–v}ÿý÷e^CX!±h]‡"÷Ðw<ð@·Ûn»…Ý‘ÇH`¹”º›p—]vq'œpBÜ÷°ìm´ÑFYoßþéž|òÉèßÜdŽ=öX{ÄÞp„(/_\ùŒ1"ïŠDÿ˜¨MX´X¤¹‡PÂ'®ºêª°›"ò ,'dÀ€qÝõë×ÏÉÒw®xKžeÍ™aW°xñb«i™O|÷Ýw ßÃ’üÄOhåZHÜÿýVE‚\|B$CËý¿ÀZ¶lYÈ- Ÿ¦M›ºsÏ=wµ×7ÞxãœßwÆÃ·fø+Dy‰µ\>|xŽ[“?þ*–Zµj¹ÇÜ5iÒ$Ç->Xü¹—…Ö¿hUÎÿS§NÕâ raÁúôÓOíVrsá¡U…¢¼ì¾ûîIË™ä[°{Xð°ãŽ;ZÊ|‰Í……Š= ôDÕªU³j’gpù‹Dp~Ò¦Mwþùç‡ÝŒ’§”®›nºÉÜÅ“'O»)¢@‘Àú §’%™™òQG•µã”ÂÌOˆL³É&›èÚ9ƒ¬Üd1Äæ›ovsD¢¬!Ñ(ƒx¢D—B!Š¢fÈ9¶õÖ[»>}ú„ÝQÀÈ‚`«­¶²™‹BˆÒä¶Ûns¯¾úª{ã7¬,ŽE¬XBQº|ôÑGV‹õÊ+¯TÍGQi$°PF.B!„(=ÈÃwÒI'¹í·ßÞõíÛ7ìæˆ"@öÏX°Hð·|ùr·îºë†Ý!„9w ™ýÉžÏjr!*‹,XX 7¡B”gœq†· ‘ $°l¶Ùf6‹‘›P!„•A+Àšk®iþ÷+V„Ý!„B0X1¼ýöÛî¿ÿýoØÍˆ2{ölwÞyç¹·Þz+Ôvôïßß–- Q¨ßˆ:ƒÔÖ$3üñÇoõsͲeË욦rDyøá‡l;’" !ò ¬Ú 80§mÁBÎuŽP"e¢ ø<À¿ÿþ;ÛMBd ¬<†.µ /¸à+6ÏuÉk̈ËË_ýå~ú駸ï­\¹Ò}ÿý÷ ·å½D5ƒûä3 ,H:SÿñÇãî+mQÑs"Š—»ï¾Û½òÊ+îÝwß5ÑròÉ'»xÀÄ¢+ØßÓé{¬4B?N×)RÁçbÅ}Ù¿î5jä^~ùeW£Frµ5Ñ5&„È.XyÌĉÝúë¯o5±˜mcEòa0>ì°ÃlåcýúõÝà–.]êÆŽë4h`3vVÆtîÜÙ —Ö®]Û 2Äm°Á¶ï=÷ÜÓýüóÏö9nçœsŽ«[·®ÕßÚu×]Ý믿ÝÏyžcøïÝqÇVöÄO´…ðøãÛgvÛm7W§Nwî¹çš¨^»îºëlµNÆ ­-3f̈'Ù¶$ÿ{ðÁ£Ÿ1b„ÛgŸ}’ž!† fV«7Þ¸Ìë¼ÆuV¥Jû;U¿½è¢‹Ü6ÛlãêÕ«çÚ¶mkŸ6ÚÈúp«V­¢Bí’K.±œJôÍ&MšØ¾pOÆãwÞq-[¶´¶qM^qÅ&ˆúõëçî¼óN7jÔ(wÄG¸ùóçÛµé ®Ê\c¥Ì·ß~kãÄÂ… ÃnŠ(r$°òÄ¢…:‰Gy¤=ztô=ëuÖYÇ}óÍ7ö`æË@ÌÀñË/¿¸gŸ}Ö>‡hš0a‚;î¸ãìofÞÌ‚¿úê+‹©š7ož{ì±Ç¢ûäfƒãFÁ }öÙgGI¼ Ű/^ìöÞ{ï¨k…A ŲÙ÷×_m…yï¿ÿ~·hÑ"÷Å_¸)S¦¸¡C‡Úç÷ÝwŸmÃ`·ûî»»o¼ÑÞKµíï¿ÿ½‰øÇæµdçD”6ôúù;ì°Ú{ä;Âuˆ O§ßNš4É&1¤rùüóÏ-^sÚ´inÉ’%&ð¹>à×_uÿûßÿ,a%ž÷ìÙÓ}øá‡eŽXêСƒëÔ©“ÅX½÷Þ{öYú2ÙÄ€XÛ&OžlýÙ·ÌVæ+e°Î3FòûÕ¬Y3ìæˆ"G+OùòË/ÝóÏ?o ÈåoVXc5¬^ƒ;ÅSO=e8Ï;vìh¢ ؆ÙðÁÝ7-ŸÛyçÝ{ìá>þøc{1rÊ)§XÑëêÕ«[%yfÅ>@Ýi§lÍ1(+áà ™Á™¸oEãÆÌÌ ,ææäC[·Ýv[·Þzë™uÍoC:Û&"Ñ9¥ “ D}:éô=–*,µ-Z´0ËVU® ,ZÁzLBÚ·ooϹ^ø}3‰ BïÞ½í:Å‚Å1™èT¶­‰®±RÊyÀ¥Šõ+¤ÙD+O!>„—™'â…Á“ÂwaYâµÓN;ÍPfáXm k×®6såÆÂŒ÷.FŸ 7Ü0úœxßÄ,˜Ù‡Áž}ùÝ+l ÒåfƒÀñ÷ƒõ+Ȧ›nj3éDmð÷•ζAü¶§:'¢tÁÜ´iS÷Ì3Ϭö×.xp¤Ó÷p·ùÖÅON ¸ƒÖÕ-·Ü²Ì¾7nlVª XÁ°bxë‘×¾ï²LDe®±R‹Q»Å[„ÝQH`å)#GŽ´77ß|Óf¤¾›7.âHáÀÀ~Í5ר{Ä‘0• 3Zß æã ¡Xp“àJñÁZF¼–OªA?¸ŸØÙò¬Y³,%Õ¾RmKÛƒ71nP>ÉΉ(mvÙe—Õ¬Gð /Ø*]úWeúm},ø5Ý7/D1—]vY“.‡z¨µ“˜`&yÚTÙm±ð7qfü>¸J|’QÚà§ÎèùçŸcâ:ÂíMœîÃÊôÛx<÷ÜsQôÐCYœV»víÊ|æÀ´…Ä]ÑWZ‡rH´_c%ó¡Ét[‹™áÇÛX†À"nMˆ\!¬$]ºt)³j/—`½:è ƒÌ5Á€ÛY¹qî½÷^s; &Ì/¼ðÂègqíÍ™3ÇuëÖ-íã‹é7!qXX‚‚ûLb»n¸áwÔQGY{‰W!…UU•Ý–˜0Ìü¸+±Ôüï“꜈Ò!nst/ÅjZâ q#“¶*ÓoãAUV%ú&7øfÍš•ù Ç •¾´‘ãâ.drúôéææ’é¶+,öA@cÉæ!rIOSü¸°Ò„Y­¿*¨²ø±P™<ÝXq˜!슨ÂÊ"l,a,#/Ìô™9㺨 ¬ª"èëñ\™Úë±&AwˆO²s’¸UÈ=¦™nþà‹ ~—ÊÂõGüV,ââ¾W¦ßú ¨è‹äß"¾ Ë+–åDðYp­Æö[V$bU·ê-m-…v}Œ )Þ!rMµ°¯ìµ×^îÖ[o »IaÀe yuÈŸCj†òŠ+@œd,ľdz[Ä_ •1cÆØ¸rÕUW…Ý!Ê V(SÃEKVôB€¡¸5~øaK.JN–“‡º‚a@ ê!©# qÑ€(,¨GIZú~ìƒÙ"^¦ö þõI>®=÷Ü3/®ÏB‡,üœGŠ8 ‘o†r –NÒÀGIr_‘Ñ™úkpê©§ZÒRR60Kf`B9Ø„¦@¾ f؉ra‘›ü%äÔI$'OìçÉ0í× $ùi°¶!P áEbÓx%|Èÿ³|ùr[Ž.Dº,÷ž{î©ðö©ú?з)ì—¤A¼a¡J×góæÍ-±?iKu}&ƒë„©‰J_%"ïVP‹rb¬–VBa‘È‚U$P{ôÍ7ßW>$jÄG–s /ÏW\aKÉdüMÙ Ÿ¡C‡ÚÑCfwU"®Rö=bÄרQ#«ãd€'wÖÖ[om\4ЪU+Ku[†ìôä;úè£í=„Ó\ÍãC¾.ê&æ~nd¾Fü‘@‘O¼’!B”²«S܇¾H_Ÿ0a‚ý¨ÿ–¯»î:ëç~¦Θ1ÃÍž=ÛöKebÛWýë“rN±ñØë³uëÖÑ¢îÀõ¶Ï>ûDÿ&Ï• [àÚàZö§Ú6Ùw+ø½3 ¾ Yð%®D¾"U$0À#~ˆéˆ"ÆwÏa"3E¤™É"^˜]3HS†ÁÄ,{ÅŠn²Úh%ÞÇÅ Æ N, ûÄ%9sæL³†]|ñÅVïÏR|á…Kä”SN1k.àf2qâD7þ|·xñb³6`ÝòkÒFPü–vâ^¡Ì‰é@¿Âºû _R¯1…Õ˜(Ð×;tè´ÿV*ú?}šj#,(JÚ01 ó®O¬½‰’ޝO®±`AsžûV`¿:ur?üðƒÕS¤Ž¡o­K¶mªïVpn8â‹»bü >«ùŠV‘@éLþ¾»"\zþ ÈÓƒøA”ajg ¦Ð,¸Ô7#V„¸ÜÌt}«\ýõö:7 fð!fÄÜÔüÒ\N3kÊmø™æ4±ŠqðáÆåg¸&¦Ì/œ+D*(‘BŒ} °°¢r½¼òÊ+öY +#ºèÏéôÿž={š ’ë­sçÎiõKŽt'ÆÂu˜êšÉ“'›`êÝ»·},X'œp‚‰T¤óÝò&bLê˜ÌQg”ÅBä3ŠÁ*®e&ŠŠWZƒÙuÛ¶m£3°úàê Žƒ1$¬F±®?æ (F|<åkb‹Ù&‚zp]tQ™×pWå³á†FŸ“ôÕŸ‰ ‘ bî¿ÿþ¸ïa]¢H8V,,PôÝiÓ¦Ù{éôÿØ~‰e6©Od[ØIDAT®ÏO>ù¤Ì5$ØïiÖ§à5XÐÒÙ6ÕwËg˜ò}^{íµ„çJˆ|B«H`VÊÀ=jÔ¨ÕÒ `QBÐÜrË-Ñ×pçù°dë7nÌYãC±Z,UñVê <ØŠÔ~ýõ×fm">D*êׯ¿ÚÌ+š_ØÊ¼+Dº°òŒs⦰¢îºë®öz²þï“È • b·b¯O,2 ÔO<M-A¿ºù|·¹ß>,gˆ ¿ìÇw½§Ú6ÕwËg°dvP‘ó/DèV$0HöéÓÇ>qyø³jD ®¸½÷ÞÛfí>ÄlOÂl˜ÂÐÜ`pa`v'¾„ž~úi‹ëbÇ‚ l6¸ÂÅqÛm·Ùë~Ð-ñã§GB;ý¸\ƒ~|…•!‹%bþ*?Vì1© fø@Ÿòöÿ k­µ–YXâY„7¸å±Ú?ÄõI°;)Lˆ¿"UƒŒNi.Vs=0qá:ñA7IÜ×B‹8*ÿ3ɶ­ÌwË$®DAቴ‰ žÞvܸq^¶Owä†áÝzë­Þ:ë¬ãU­ZÕ«S§Ž8^÷îÝ½È 'ú¹7ÞØëØ±£W¿~}/2öZµjåÍ™3ÇÞ‹ˆ./rÃñ"™×¤I{ĈöÞÂ… í;Døè¾Þxã ¯qãÆ^³fͼ† zC‡õ6Ûl3¯S§Nö~ïÞ½½5jx‘›Š7`À/r#±×#¢ËžGfÜ^‹-¼ºuëz&L°÷æÍ›gljܨ¢Çéܹ³Y=Àqù­Dþ™ Ø#]úöík¿c¼G°ñœëäÛo¿¾–¬ÿCëÖ­½x ú÷¤I“¼¦M›Ús®1®®;úw,\Ÿ7ß|³]w£6²ë³mÛ¶öü…^°Ïñ­Zµ¼Úµk{Ûn»­×«W/¯M›6ÑýDÄ•™Ðx›l²‰mO{#‚-å¶©¾[:èú"}ªðOHÚ® ÀÂÒ¥K‹aˆ˜roOâCÜ_¹8ݸˆé`OlFlÚ‚ÉI›@ü ³×xÉY!T¶êiÝu×Mz<,Ù3³rfñ»û±*< úq¶bcFNÐpl;À2+,±ú‰üÀwó»äŠòôÿX°’|žÿúäº fw9æ\7¡ÖeÚ@\c<°PášÇ½™à”y/Õ¶•ùnº>„HÅ`¥ÉN;íd+ƒqBùHdvlA¾©@ôðˆï<Ò¸’®’` p²$¡¶ó"Ÿ(Oÿ%™¸‚x×'.ó ¸Ö $ðWׯ#Õ¶•ùnÙ&Ñ"! Å`¥ 1Nˆb‰*tvÜqGW§N°›!„QFmÖtäQ H`•,W¬öñWì*S¦L‰®šBˆ0Á¥Ù«W/[ÙI9õ„($°Ê«ðˆ“PFq!„¨<”ßÂ3@ú b»È. Uˆb@«à&$û1¦l!„‡¼_Ô+eQå°8/Š ¬rBÍ>²¢Rý.!„ÈXuܯ_?›¬î»ï¾V;E9BXå„D˜¬à V¬B‘¬Äîß¿¿e”'j¢•ÌB:JÓPNXBL¶t¿H±Bˆô!£ü‡~è¶Ür˰›"DV‘Àª—_~yØMBˆ‚EâJ”r !„BdY°rŒŠ• Q~Hð«kGQH¨aŽ ö×k¯½v32ßeРA9­—+¨Ñ[ßM„Ç믿n5@E~êúøí·ß¬Îbƒ rØ*!ò ,Q!rY¼ZQ|ðÁ–ýÿÚ»ਫ-Žã‡ ôÞ‘DB„0HQš#(ÕŽÉБ2"£ (”2G‘(HQd *P”Bˆ´€ôzɾœûÞæ%6 ü³ÿÝäû™ÙÙìîwo á—{ÏÿܲeËJTT”ÝÃlE à¡èZáááR¯^=)X° Ìš5Ëî!¶#`X||¼´jÕJÞzë-9r¤¬_¿^ì`;–´«ûÖ­[íx”nV³fM9xð DGGËèÑ£ÙKø–ÆŒ#;w6»Â@fwõêU騱£ôèÑCºwï.;vì Ø=,À«°,0bÄs–à¼yóì d8s–àºuëLí•ÞgZ¤ÿþ²jÕ*‰•ܹsÛ=œ ÇY„Ü3XÑâÎÓ§Osö `YEû¾¼ñÆ2~üx¹pá‚ÝÃ6"`YhøðáæzÒ¤I6œvb×rŽ€e¡Â… ›Ó”µèóðáÃvîKbb¢Ì™3G*W®lfä<8–Åúõë'Õ«W7[F€¯Ø´i“éÄ®'ìtëÖM/^l÷Ÿ–Óîd6¹rå’mÛ¶I¶lÙì ¤ëÀ2lØ0Y¶l™´hÑBþüóOóG"€‡Ã V \ðvgΜ‘š0#‘‘‘²fÍÂ`f° Ú²e‹,Y²D>þøcéÝ»7[Ü#`@Ô¦M‰‹‹“¼yóÚ= Sb‰²(ÂqX#`@&/C‡•¾}ûÚ= K#`yˆ6ï;v¬ÝÃIíܹSºwï.²páB ²{H@–FÀò ݧpóæÍv@&qóæMs&`“&M$88XvìØaþ˜;xð  2ÄîáYËCtº¾yóæòòË/˵k×ì7sæL©P¡‚éº^¢D ÓÃJ›„êïmx À^,š;w®üûï¿2räH»‡ÀÇåÉ“Gúôécf«–/_nº°ðôÁò òåËË´iÓä•W^‘Ö­[ó ÀëÙ³§ÝCà3X¦Ó÷¡¡¡¦õôéÓv€—ILLd³x  `Ù`öìÙ¦FBg²àúõë²zõj³äW¦L©S§ŽÙ+€ï"`Ù páÂòÅ_Htt´ìß¿ßîá°All¬LŸ>]žþy)V¬˜¹ÖV  03XzßE –M7nlŠS ,h÷Px˜–h¯*ý÷¯gO:UÚ¶m+åÊ•³{h,BÀ²á Èšt)P/O>ù¤äÌɯa 3â_6<„«W¯Ê®]»Ìòž6ú¬Q£†ôë×Ïås´1(€Ì€n:qâ„|ûí·²wï^Ù³g¹Ž‹‹“Û·oK¾|ù¤V­ZR¥J»‡ À °di‡CΞ=+W®\1Ñ]Ù·oŸôïß_ªV­*ÕªU“®]»š«ÚµkK¥J•${vÎð_,>GCÑ7L{ƒ[·nIÑ¢E]¯;(|ðÁrîÜ9sÑ@¥—“'Oš~tú’t‰Ï•FÉåË—%[¶lV~:2!–Ú²e‹*TÈü… ØAƒKBB‚\¼xÑ\k¨Ð½ÖYm)àŠöp/^Ü„žô^'""„– $_k·^4$i¸¸FÀòRGŽ1õeË–•5kÖ˜ÿäœÞ}÷]3ƒP·n]ŽiôèÑ2a—ÇLžÿüó4[»v­ÙW ÷§sçÎrþüùä0¥í³¤ÅàßDÀòÎeÁ;i Öï¿ÿîѱ¬\¹R:vìx×ýÚdqÿþýôJA—ö´.Jk Y M]¼Ü½Â•Ú¶m›¹xÒ³Ï>kN¿“n\›Ù•î1·`Á·×³öæÏŸ/ݺu“Ò¥K›mS.\˜#x+f°¼˜žv¯ËG®ØQìÞºukSt۵&Jëž´¥Öœ¥Õ)üÒ¥KòÓO?™¥Q=ÓS÷¦Óð©-6Z´ha¨ö¢9%d=üæ÷b:u2…í®6]´h‘ùÞ“îl2Ù¡C‡L®tÖJ;7mÚԜũõoú=H‹†°öíÛˆ ¤]»vòý÷ß›f¸† f–p W51ƒåô¬2=Ólܸqfß´;yºØýðáæ›·“ÎÞ茯sÎZi°J©eË–©fìœôû¢Åéît$d-,rá™8q¢„‡‡›½âœì(v6m2Cq»ÎZéöDÓ¦M“ÄÄÄ»×mZîµL@ZX¿ð!ºô”)Säï¿ÿ6µYÎPcG±».‰)_/n×Y+m‹0uêÔ4ÕrµL@ZX>H—ç´öjË–-Ò¤Isßœ9s<:­ÃÒâöž={zô}­¢³Vƒ 2µV:—Ý{w±Dè%ô,¼_ýõž«[Øh§wmé À=AlæÍ›gj–|.ùé~‰î«”Ïa™à.–—Ð’°°0»‡‘%èY‚®öT¼í*UªTŒÙä´{H¼›±´^LÕî›@F¡ Àb,‹°,FÀ° Àb,‹°,FÀ° Àb,¦]ß?ýôSéܹ³4lØP:uê$QQQÇ… dàÀfåûqúôió¼ëׯgÐȰËGݼySBBBdÔ¨QòøãK¿~ý$W®\òâ‹/ÊäÉ“=:–K—.Ixx¸[AiĈ&T)=~Û¶m’˜˜˜ÑCÀ£Ø‹ÐGÍž=[¢££%&&FÊ–-kîëÑ£‡Ô¯_ߘ^½zI‰%Ìý:Óuøða)Y²¤øûû§ùz R @äÛgÏž•¢E‹¦yìùóç%þü’3§ë=®`Á‚’=ûÿs¼†±+W®˜Ë•+'7nLõwƪc+R¤ˆÙWoÄ –úä“O̬•3\9é}Ë—/O«W¯–R¥J™ Ž *$ Û·o›Çô¾!C†HµjÕL`iÔ¨‘¬\¹RJ—.mÂYpp°œ:uÊ;lØ0éÞ½»4kÖLyäóZº<™–?þøCjÖ¬iÆV¬X1=z´ NãÆ“™3gÊüùó¥}ûöòÏ?ÿHáÂ…Mèrg¬&LªU«J™2eÌø6mÚ”!_[š^!""Âáî·ãÖ­[???Ç’%K\wôèQ‡¿¿¿#22ÒÜŽw:ÂÃÃÍí:uê8‚‚‚Û·owÄÅÅ9’‚•#)9’’ãܹsŽŠ+:f̘aŽM ;ŽìÙ³;¾ûî;s{ÅŠf »ví2ï£c×ç$$$8’c̘1ŽË—/;:dÞsöìÙæy¯¿þº£W¯^æãØØXó<}Ž;c pìÞ½ÛqæÌG»ví!!!÷ó%6ôýôk @FbË%,3³“'O—Ç%03#”FÌmQÒ‚ø¤p”|LïÞ½ÍLUR˜‘5j˜™¥¤0cf–tFkÿþýÉÇ6mÚTZµje>îСƒ9.)p¥zϯ¿þZnܸ!o¾ù¦™µÒ,}OU{رöïß_ªW¯n–.»té"{÷îuã«€ç°|Pîܹ¥bÅŠ²víÚ»ÓP3~üxÙ·oŸ A:ä…êÎ×>yò¤\¾|Ùåk[=VìÄ –zï½÷äĉ2hÐ Ó‡JíܹSúôéc Ýuù°mÛ¶ò×_Idd¤y\ϾÓBrí—õ ~üñÇäe¹Å‹Ë™3gäé§ŸNuÌsÏ='çΓ/¿ü2ùŒÀ6mÚ˜%@¥³d/^¼ëµ­+v"`ù(]"Ô3þV­ZeꥴBݺuMo,í5¥žxâ ™2eмð fyO무†JÏ|µjÕ2Jg•´ÄôéÓ¥J•*©ŽÑ÷˜;w®¼úê«fŒú¾º\8xð`ó¸¾ÿ?ü aaa©žgõX°S6­t·{Yºt© ÷ûíÐãµ~Ig±´Þ)­ÂwíG¥Åê>ú¨):¨t™Oûoi}—ÖjåÈ‘ãžÇë±{öì1-´V+¥k×®™Ú®|ùòeÈX]Ñeƈˆ µüµp¢ËÇi`ÐÙWt†Kk¶¬ MC5È¥GÓÎJ¥ÅÕÙVŽ»°à=£ï~÷ «"`Á-Îý@ú(r° Àb¬LNÏäÓå½”Ùôþ]»vYþžz–áÈ‘#ÍÇëׯ7<•°2¹C‡Ixx¸$&&Þõ˜Þ¯[ÛXM··ÑF£jûöí©ö + `!í_¥}ªîEg´WUZÜ=ËP{wi§ö{Ñ÷w5¼ †6*Õmo´)¨nݸqãätàÀÓ)^;·—(QÂ4ÕÇ[Þ=zTžzê)sŒ>Ù²e÷|Ÿ3fH‘"E¤B… R©R%Y·n¹ÿرcfëyóæI¹råÌžŠø*Ú4d}ûöuÙy]ë¤tk›o¾ùÆ4íØ±£¼ÿþû2qâDóxBB‚ÙŒùÈ‘#¦®«]»vf›žnݺ™ý54é>…:»Õµk×4ß#**J†n– Ÿyæs­ûê~…:«uãÆ ³Í΢E‹¤Y³fòuÀXYDÉ’%S¬;·äÑP¤]Ô•%­ÙÚ½{wªctƒig‡v±ÒãnÞ¼iöÔ`¦3RJC×gŸ}v×fÍšeölذ¡\¹rEZ¶liž£ÏÕ}Õ¤I“¤I“&–~îx+‹˜0a‚øùù¥ºoòäÉÉÇÆÆÊ;ï¼#111R½zuÀt90% iNþþþfÆé·ß~3u[ 4H~L?N+`iA½Î€9—RÖ[éÆÐø:j°`”.!êŒÒ©S§$::ÚÌ"é>‡)é>„wÊŸ?¿ÜºuËlÐì¤g¦EÚK/½dB–ó¢a«K—.Ö~BØŒ€3ƒtâÄ ©_¿¾ QZµtéÒ4[;Üé±Ç“   ùðÃMÑ{||¼|õÕWi"+W®4}²Ôš5k¤víÚròäIK?ìFÀ‚Yî1b„„††J5Lá¹6!ݰaƒÌŸ?ßåssæÌ) .”ÈÈHS$¯Ë‹:––×^{Mš7o.ÕªU3ÇvêÔÉ×W­Z5#>-l“Íqgµ3l¡3FaaawŸ{’¶jÐÖ æ¶~¬gæÍ›7Ýç^¿~Ýœ]¨Eë py¬6"ÕÖ´Ò;ÖjºìaÂ$…"w$+T¨¹8-ZÔíçj«àà`·ŽÕ>[z ³b‰Àb,‹°,FÀ° Àb,‹°,FÀ°F½Œvt¾€ået»àÛØ‹ÀbÔ`XŒ€`1€ÅX#`XŒ€`±ÿFœŽ¢ìIÿ\IEND®B`‚asio-1.12.2/doc/standalone_HTML.manifest000066400000000000000000004736101340672067200200230ustar00rootroot00000000000000index.html asio/overview.html asio/overview/rationale.html asio/overview/core.html asio/overview/core/basics.html asio/overview/core/async.html asio/overview/core/threads.html asio/overview/core/strands.html asio/overview/core/buffers.html asio/overview/core/streams.html asio/overview/core/reactor.html asio/overview/core/line_based.html asio/overview/core/allocation.html asio/overview/core/handler_tracking.html asio/overview/core/concurrency_hint.html asio/overview/core/coroutine.html asio/overview/core/spawn.html asio/overview/core/coroutines_ts.html asio/overview/networking.html asio/overview/networking/protocols.html asio/overview/networking/other_protocols.html asio/overview/networking/iostreams.html asio/overview/networking/bsd_sockets.html asio/overview/timers.html asio/overview/serial_ports.html asio/overview/signals.html asio/overview/posix.html asio/overview/posix/local.html asio/overview/posix/stream_descriptor.html asio/overview/posix/fork.html asio/overview/windows.html asio/overview/windows/stream_handle.html asio/overview/windows/random_access_handle.html asio/overview/windows/object_handle.html asio/overview/ssl.html asio/overview/cpp2011.html asio/overview/cpp2011/system_error.html asio/overview/cpp2011/move_objects.html asio/overview/cpp2011/move_handlers.html asio/overview/cpp2011/variadic.html asio/overview/cpp2011/array.html asio/overview/cpp2011/atomic.html asio/overview/cpp2011/shared_ptr.html asio/overview/cpp2011/chrono.html asio/overview/cpp2011/futures.html asio/overview/implementation.html asio/using.html asio/tutorial.html asio/tutorial/tuttimer1.html asio/tutorial/tuttimer1/src.html asio/tutorial/tuttimer2.html asio/tutorial/tuttimer2/src.html asio/tutorial/tuttimer3.html asio/tutorial/tuttimer3/src.html asio/tutorial/tuttimer4.html asio/tutorial/tuttimer4/src.html asio/tutorial/tuttimer5.html asio/tutorial/tuttimer5/src.html asio/tutorial/tutdaytime1.html asio/tutorial/tutdaytime1/src.html asio/tutorial/tutdaytime2.html asio/tutorial/tutdaytime2/src.html asio/tutorial/tutdaytime3.html asio/tutorial/tutdaytime3/src.html asio/tutorial/tutdaytime4.html asio/tutorial/tutdaytime4/src.html asio/tutorial/tutdaytime5.html asio/tutorial/tutdaytime5/src.html asio/tutorial/tutdaytime6.html asio/tutorial/tutdaytime6/src.html asio/tutorial/tutdaytime7.html asio/tutorial/tutdaytime7/src.html asio/tutorial/boost_bind.html asio/examples.html asio/examples/cpp03_examples.html asio/examples/cpp11_examples.html asio/examples/cpp17_examples.html asio/reference.html asio/reference/asynchronous_operations.html asio/reference/read_write_operations.html asio/reference/synchronous_socket_operations.html asio/reference/asynchronous_socket_operations.html asio/reference/AcceptableProtocol.html asio/reference/AcceptHandler.html asio/reference/AsyncRandomAccessReadDevice.html asio/reference/AsyncRandomAccessWriteDevice.html asio/reference/AsyncReadStream.html asio/reference/AsyncWriteStream.html asio/reference/BufferedHandshakeHandler.html asio/reference/CompletionCondition.html asio/reference/CompletionHandler.html asio/reference/ConnectCondition.html asio/reference/ConnectHandler.html asio/reference/ConstBufferSequence.html asio/reference/DynamicBuffer.html asio/reference/Endpoint.html asio/reference/EndpointSequence.html asio/reference/ExecutionContext.html asio/reference/Executor1.html asio/reference/GettableSerialPortOption.html asio/reference/GettableSocketOption.html asio/reference/Handler.html asio/reference/HandshakeHandler.html asio/reference/InternetProtocol.html asio/reference/IoControlCommand.html asio/reference/IoObjectService.html asio/reference/IteratorConnectHandler.html asio/reference/LegacyCompletionHandler.html asio/reference/MoveAcceptHandler.html asio/reference/MutableBufferSequence.html asio/reference/ProtoAllocator.html asio/reference/Protocol.html asio/reference/RangeConnectHandler.html asio/reference/ReadHandler.html asio/reference/ResolveHandler.html asio/reference/Service.html asio/reference/SettableSerialPortOption.html asio/reference/SettableSocketOption.html asio/reference/ShutdownHandler.html asio/reference/SignalHandler.html asio/reference/SyncRandomAccessReadDevice.html asio/reference/SyncRandomAccessWriteDevice.html asio/reference/SyncReadStream.html asio/reference/SyncWriteStream.html asio/reference/TimeTraits.html asio/reference/WaitHandler.html asio/reference/WaitTraits.html asio/reference/WriteHandler.html asio/reference/add_service.html asio/reference/asio_handler_allocate.html asio/reference/asio_handler_deallocate.html asio/reference/asio_handler_invoke.html asio/reference/asio_handler_invoke/overload1.html asio/reference/asio_handler_invoke/overload2.html asio/reference/asio_handler_is_continuation.html asio/reference/associated_allocator.html asio/reference/associated_allocator/get.html asio/reference/associated_allocator/type.html asio/reference/associated_executor.html asio/reference/associated_executor/get.html asio/reference/associated_executor/type.html asio/reference/async_completion.html asio/reference/async_completion/async_completion.html asio/reference/async_completion/completion_handler.html asio/reference/async_completion/completion_handler_type.html asio/reference/async_completion/result.html asio/reference/async_connect.html asio/reference/async_connect/overload1.html asio/reference/async_connect/overload2.html asio/reference/async_connect/overload3.html asio/reference/async_connect/overload4.html asio/reference/async_connect/overload5.html asio/reference/async_connect/overload6.html asio/reference/async_read.html asio/reference/async_read/overload1.html asio/reference/async_read/overload2.html asio/reference/async_read/overload3.html asio/reference/async_read/overload4.html asio/reference/async_read/overload5.html asio/reference/async_read/overload6.html asio/reference/async_read_at.html asio/reference/async_read_at/overload1.html asio/reference/async_read_at/overload2.html asio/reference/async_read_at/overload3.html asio/reference/async_read_at/overload4.html asio/reference/async_read_until.html asio/reference/async_read_until/overload1.html asio/reference/async_read_until/overload2.html asio/reference/async_read_until/overload3.html asio/reference/async_read_until/overload4.html asio/reference/async_read_until/overload5.html asio/reference/async_read_until/overload6.html asio/reference/async_read_until/overload7.html asio/reference/async_read_until/overload8.html asio/reference/async_result.html asio/reference/async_result/async_result.html asio/reference/async_result/completion_handler_type.html asio/reference/async_result/get.html asio/reference/async_result/return_type.html asio/reference/async_result_lt__Handler__gt_.html asio/reference/async_result_lt__Handler__gt_/async_result.html asio/reference/async_result_lt__Handler__gt_/get.html asio/reference/async_result_lt__Handler__gt_/type.html asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_.html asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/async_result.html asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/completion_handler_type.html asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/get.html asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/return_type.html asio/reference/async_write.html asio/reference/async_write/overload1.html asio/reference/async_write/overload2.html asio/reference/async_write/overload3.html asio/reference/async_write/overload4.html asio/reference/async_write/overload5.html asio/reference/async_write/overload6.html asio/reference/async_write_at.html asio/reference/async_write_at/overload1.html asio/reference/async_write_at/overload2.html asio/reference/async_write_at/overload3.html asio/reference/async_write_at/overload4.html asio/reference/bad_executor.html asio/reference/bad_executor/bad_executor.html asio/reference/bad_executor/what.html asio/reference/basic_datagram_socket.html asio/reference/basic_datagram_socket/assign.html asio/reference/basic_datagram_socket/assign/overload1.html asio/reference/basic_datagram_socket/assign/overload2.html asio/reference/basic_datagram_socket/async_connect.html asio/reference/basic_datagram_socket/async_receive.html asio/reference/basic_datagram_socket/async_receive/overload1.html asio/reference/basic_datagram_socket/async_receive/overload2.html asio/reference/basic_datagram_socket/async_receive_from.html asio/reference/basic_datagram_socket/async_receive_from/overload1.html asio/reference/basic_datagram_socket/async_receive_from/overload2.html asio/reference/basic_datagram_socket/async_send.html asio/reference/basic_datagram_socket/async_send/overload1.html asio/reference/basic_datagram_socket/async_send/overload2.html asio/reference/basic_datagram_socket/async_send_to.html asio/reference/basic_datagram_socket/async_send_to/overload1.html asio/reference/basic_datagram_socket/async_send_to/overload2.html asio/reference/basic_datagram_socket/async_wait.html asio/reference/basic_datagram_socket/at_mark.html asio/reference/basic_datagram_socket/at_mark/overload1.html asio/reference/basic_datagram_socket/at_mark/overload2.html asio/reference/basic_datagram_socket/available.html asio/reference/basic_datagram_socket/available/overload1.html asio/reference/basic_datagram_socket/available/overload2.html asio/reference/basic_datagram_socket/basic_datagram_socket.html asio/reference/basic_datagram_socket/basic_datagram_socket/overload1.html asio/reference/basic_datagram_socket/basic_datagram_socket/overload2.html asio/reference/basic_datagram_socket/basic_datagram_socket/overload3.html asio/reference/basic_datagram_socket/basic_datagram_socket/overload4.html asio/reference/basic_datagram_socket/basic_datagram_socket/overload5.html asio/reference/basic_datagram_socket/basic_datagram_socket/overload6.html asio/reference/basic_datagram_socket/bind.html asio/reference/basic_datagram_socket/bind/overload1.html asio/reference/basic_datagram_socket/bind/overload2.html asio/reference/basic_datagram_socket/broadcast.html asio/reference/basic_datagram_socket/bytes_readable.html asio/reference/basic_datagram_socket/cancel.html asio/reference/basic_datagram_socket/cancel/overload1.html asio/reference/basic_datagram_socket/cancel/overload2.html asio/reference/basic_datagram_socket/close.html asio/reference/basic_datagram_socket/close/overload1.html asio/reference/basic_datagram_socket/close/overload2.html asio/reference/basic_datagram_socket/connect.html asio/reference/basic_datagram_socket/connect/overload1.html asio/reference/basic_datagram_socket/connect/overload2.html asio/reference/basic_datagram_socket/debug.html asio/reference/basic_datagram_socket/do_not_route.html asio/reference/basic_datagram_socket/enable_connection_aborted.html asio/reference/basic_datagram_socket/endpoint_type.html asio/reference/basic_datagram_socket/executor_type.html asio/reference/basic_datagram_socket/get_executor.html asio/reference/basic_datagram_socket/get_io_context.html asio/reference/basic_datagram_socket/get_io_service.html asio/reference/basic_datagram_socket/get_option.html asio/reference/basic_datagram_socket/get_option/overload1.html asio/reference/basic_datagram_socket/get_option/overload2.html asio/reference/basic_datagram_socket/io_control.html asio/reference/basic_datagram_socket/io_control/overload1.html asio/reference/basic_datagram_socket/io_control/overload2.html asio/reference/basic_datagram_socket/is_open.html asio/reference/basic_datagram_socket/keep_alive.html asio/reference/basic_datagram_socket/linger.html asio/reference/basic_datagram_socket/local_endpoint.html asio/reference/basic_datagram_socket/local_endpoint/overload1.html asio/reference/basic_datagram_socket/local_endpoint/overload2.html asio/reference/basic_datagram_socket/lowest_layer.html asio/reference/basic_datagram_socket/lowest_layer/overload1.html asio/reference/basic_datagram_socket/lowest_layer/overload2.html asio/reference/basic_datagram_socket/lowest_layer_type.html asio/reference/basic_datagram_socket/max_connections.html asio/reference/basic_datagram_socket/max_listen_connections.html asio/reference/basic_datagram_socket/message_do_not_route.html asio/reference/basic_datagram_socket/message_end_of_record.html asio/reference/basic_datagram_socket/message_flags.html asio/reference/basic_datagram_socket/message_out_of_band.html asio/reference/basic_datagram_socket/message_peek.html asio/reference/basic_datagram_socket/native_handle.html asio/reference/basic_datagram_socket/native_handle_type.html asio/reference/basic_datagram_socket/native_non_blocking.html asio/reference/basic_datagram_socket/native_non_blocking/overload1.html asio/reference/basic_datagram_socket/native_non_blocking/overload2.html asio/reference/basic_datagram_socket/native_non_blocking/overload3.html asio/reference/basic_datagram_socket/non_blocking.html asio/reference/basic_datagram_socket/non_blocking/overload1.html asio/reference/basic_datagram_socket/non_blocking/overload2.html asio/reference/basic_datagram_socket/non_blocking/overload3.html asio/reference/basic_datagram_socket/open.html asio/reference/basic_datagram_socket/open/overload1.html asio/reference/basic_datagram_socket/open/overload2.html asio/reference/basic_datagram_socket/operator_eq_.html asio/reference/basic_datagram_socket/operator_eq_/overload1.html asio/reference/basic_datagram_socket/operator_eq_/overload2.html asio/reference/basic_datagram_socket/out_of_band_inline.html asio/reference/basic_datagram_socket/protocol_type.html asio/reference/basic_datagram_socket/receive.html asio/reference/basic_datagram_socket/receive/overload1.html asio/reference/basic_datagram_socket/receive/overload2.html asio/reference/basic_datagram_socket/receive/overload3.html asio/reference/basic_datagram_socket/receive_buffer_size.html asio/reference/basic_datagram_socket/receive_from.html asio/reference/basic_datagram_socket/receive_from/overload1.html asio/reference/basic_datagram_socket/receive_from/overload2.html asio/reference/basic_datagram_socket/receive_from/overload3.html asio/reference/basic_datagram_socket/receive_low_watermark.html asio/reference/basic_datagram_socket/release.html asio/reference/basic_datagram_socket/release/overload1.html asio/reference/basic_datagram_socket/release/overload2.html asio/reference/basic_datagram_socket/remote_endpoint.html asio/reference/basic_datagram_socket/remote_endpoint/overload1.html asio/reference/basic_datagram_socket/remote_endpoint/overload2.html asio/reference/basic_datagram_socket/reuse_address.html asio/reference/basic_datagram_socket/send.html asio/reference/basic_datagram_socket/send/overload1.html asio/reference/basic_datagram_socket/send/overload2.html asio/reference/basic_datagram_socket/send/overload3.html asio/reference/basic_datagram_socket/send_buffer_size.html asio/reference/basic_datagram_socket/send_low_watermark.html asio/reference/basic_datagram_socket/send_to.html asio/reference/basic_datagram_socket/send_to/overload1.html asio/reference/basic_datagram_socket/send_to/overload2.html asio/reference/basic_datagram_socket/send_to/overload3.html asio/reference/basic_datagram_socket/set_option.html asio/reference/basic_datagram_socket/set_option/overload1.html asio/reference/basic_datagram_socket/set_option/overload2.html asio/reference/basic_datagram_socket/shutdown.html asio/reference/basic_datagram_socket/shutdown/overload1.html asio/reference/basic_datagram_socket/shutdown/overload2.html asio/reference/basic_datagram_socket/shutdown_type.html asio/reference/basic_datagram_socket/wait.html asio/reference/basic_datagram_socket/wait/overload1.html asio/reference/basic_datagram_socket/wait/overload2.html asio/reference/basic_datagram_socket/wait_type.html asio/reference/basic_datagram_socket/_basic_datagram_socket.html asio/reference/basic_deadline_timer.html asio/reference/basic_deadline_timer/async_wait.html asio/reference/basic_deadline_timer/basic_deadline_timer.html asio/reference/basic_deadline_timer/basic_deadline_timer/overload1.html asio/reference/basic_deadline_timer/basic_deadline_timer/overload2.html asio/reference/basic_deadline_timer/basic_deadline_timer/overload3.html asio/reference/basic_deadline_timer/basic_deadline_timer/overload4.html asio/reference/basic_deadline_timer/cancel.html asio/reference/basic_deadline_timer/cancel/overload1.html asio/reference/basic_deadline_timer/cancel/overload2.html asio/reference/basic_deadline_timer/cancel_one.html asio/reference/basic_deadline_timer/cancel_one/overload1.html asio/reference/basic_deadline_timer/cancel_one/overload2.html asio/reference/basic_deadline_timer/duration_type.html asio/reference/basic_deadline_timer/executor_type.html asio/reference/basic_deadline_timer/expires_at.html asio/reference/basic_deadline_timer/expires_at/overload1.html asio/reference/basic_deadline_timer/expires_at/overload2.html asio/reference/basic_deadline_timer/expires_at/overload3.html asio/reference/basic_deadline_timer/expires_from_now.html asio/reference/basic_deadline_timer/expires_from_now/overload1.html asio/reference/basic_deadline_timer/expires_from_now/overload2.html asio/reference/basic_deadline_timer/expires_from_now/overload3.html asio/reference/basic_deadline_timer/get_executor.html asio/reference/basic_deadline_timer/get_io_context.html asio/reference/basic_deadline_timer/get_io_service.html asio/reference/basic_deadline_timer/operator_eq_.html asio/reference/basic_deadline_timer/time_type.html asio/reference/basic_deadline_timer/traits_type.html asio/reference/basic_deadline_timer/wait.html asio/reference/basic_deadline_timer/wait/overload1.html asio/reference/basic_deadline_timer/wait/overload2.html asio/reference/basic_deadline_timer/_basic_deadline_timer.html asio/reference/basic_io_object.html asio/reference/basic_io_object/basic_io_object.html asio/reference/basic_io_object/basic_io_object/overload1.html asio/reference/basic_io_object/basic_io_object/overload2.html asio/reference/basic_io_object/basic_io_object/overload3.html asio/reference/basic_io_object/executor_type.html asio/reference/basic_io_object/get_executor.html asio/reference/basic_io_object/get_implementation.html asio/reference/basic_io_object/get_implementation/overload1.html asio/reference/basic_io_object/get_implementation/overload2.html asio/reference/basic_io_object/get_io_context.html asio/reference/basic_io_object/get_io_service.html asio/reference/basic_io_object/get_service.html asio/reference/basic_io_object/get_service/overload1.html asio/reference/basic_io_object/get_service/overload2.html asio/reference/basic_io_object/implementation_type.html asio/reference/basic_io_object/operator_eq_.html asio/reference/basic_io_object/service_type.html asio/reference/basic_io_object/_basic_io_object.html asio/reference/basic_raw_socket.html asio/reference/basic_raw_socket/assign.html asio/reference/basic_raw_socket/assign/overload1.html asio/reference/basic_raw_socket/assign/overload2.html asio/reference/basic_raw_socket/async_connect.html asio/reference/basic_raw_socket/async_receive.html asio/reference/basic_raw_socket/async_receive/overload1.html asio/reference/basic_raw_socket/async_receive/overload2.html asio/reference/basic_raw_socket/async_receive_from.html asio/reference/basic_raw_socket/async_receive_from/overload1.html asio/reference/basic_raw_socket/async_receive_from/overload2.html asio/reference/basic_raw_socket/async_send.html asio/reference/basic_raw_socket/async_send/overload1.html asio/reference/basic_raw_socket/async_send/overload2.html asio/reference/basic_raw_socket/async_send_to.html asio/reference/basic_raw_socket/async_send_to/overload1.html asio/reference/basic_raw_socket/async_send_to/overload2.html asio/reference/basic_raw_socket/async_wait.html asio/reference/basic_raw_socket/at_mark.html asio/reference/basic_raw_socket/at_mark/overload1.html asio/reference/basic_raw_socket/at_mark/overload2.html asio/reference/basic_raw_socket/available.html asio/reference/basic_raw_socket/available/overload1.html asio/reference/basic_raw_socket/available/overload2.html asio/reference/basic_raw_socket/basic_raw_socket.html asio/reference/basic_raw_socket/basic_raw_socket/overload1.html asio/reference/basic_raw_socket/basic_raw_socket/overload2.html asio/reference/basic_raw_socket/basic_raw_socket/overload3.html asio/reference/basic_raw_socket/basic_raw_socket/overload4.html asio/reference/basic_raw_socket/basic_raw_socket/overload5.html asio/reference/basic_raw_socket/basic_raw_socket/overload6.html asio/reference/basic_raw_socket/bind.html asio/reference/basic_raw_socket/bind/overload1.html asio/reference/basic_raw_socket/bind/overload2.html asio/reference/basic_raw_socket/broadcast.html asio/reference/basic_raw_socket/bytes_readable.html asio/reference/basic_raw_socket/cancel.html asio/reference/basic_raw_socket/cancel/overload1.html asio/reference/basic_raw_socket/cancel/overload2.html asio/reference/basic_raw_socket/close.html asio/reference/basic_raw_socket/close/overload1.html asio/reference/basic_raw_socket/close/overload2.html asio/reference/basic_raw_socket/connect.html asio/reference/basic_raw_socket/connect/overload1.html asio/reference/basic_raw_socket/connect/overload2.html asio/reference/basic_raw_socket/debug.html asio/reference/basic_raw_socket/do_not_route.html asio/reference/basic_raw_socket/enable_connection_aborted.html asio/reference/basic_raw_socket/endpoint_type.html asio/reference/basic_raw_socket/executor_type.html asio/reference/basic_raw_socket/get_executor.html asio/reference/basic_raw_socket/get_io_context.html asio/reference/basic_raw_socket/get_io_service.html asio/reference/basic_raw_socket/get_option.html asio/reference/basic_raw_socket/get_option/overload1.html asio/reference/basic_raw_socket/get_option/overload2.html asio/reference/basic_raw_socket/io_control.html asio/reference/basic_raw_socket/io_control/overload1.html asio/reference/basic_raw_socket/io_control/overload2.html asio/reference/basic_raw_socket/is_open.html asio/reference/basic_raw_socket/keep_alive.html asio/reference/basic_raw_socket/linger.html asio/reference/basic_raw_socket/local_endpoint.html asio/reference/basic_raw_socket/local_endpoint/overload1.html asio/reference/basic_raw_socket/local_endpoint/overload2.html asio/reference/basic_raw_socket/lowest_layer.html asio/reference/basic_raw_socket/lowest_layer/overload1.html asio/reference/basic_raw_socket/lowest_layer/overload2.html asio/reference/basic_raw_socket/lowest_layer_type.html asio/reference/basic_raw_socket/max_connections.html asio/reference/basic_raw_socket/max_listen_connections.html asio/reference/basic_raw_socket/message_do_not_route.html asio/reference/basic_raw_socket/message_end_of_record.html asio/reference/basic_raw_socket/message_flags.html asio/reference/basic_raw_socket/message_out_of_band.html asio/reference/basic_raw_socket/message_peek.html asio/reference/basic_raw_socket/native_handle.html asio/reference/basic_raw_socket/native_handle_type.html asio/reference/basic_raw_socket/native_non_blocking.html asio/reference/basic_raw_socket/native_non_blocking/overload1.html asio/reference/basic_raw_socket/native_non_blocking/overload2.html asio/reference/basic_raw_socket/native_non_blocking/overload3.html asio/reference/basic_raw_socket/non_blocking.html asio/reference/basic_raw_socket/non_blocking/overload1.html asio/reference/basic_raw_socket/non_blocking/overload2.html asio/reference/basic_raw_socket/non_blocking/overload3.html asio/reference/basic_raw_socket/open.html asio/reference/basic_raw_socket/open/overload1.html asio/reference/basic_raw_socket/open/overload2.html asio/reference/basic_raw_socket/operator_eq_.html asio/reference/basic_raw_socket/operator_eq_/overload1.html asio/reference/basic_raw_socket/operator_eq_/overload2.html asio/reference/basic_raw_socket/out_of_band_inline.html asio/reference/basic_raw_socket/protocol_type.html asio/reference/basic_raw_socket/receive.html asio/reference/basic_raw_socket/receive/overload1.html asio/reference/basic_raw_socket/receive/overload2.html asio/reference/basic_raw_socket/receive/overload3.html asio/reference/basic_raw_socket/receive_buffer_size.html asio/reference/basic_raw_socket/receive_from.html asio/reference/basic_raw_socket/receive_from/overload1.html asio/reference/basic_raw_socket/receive_from/overload2.html asio/reference/basic_raw_socket/receive_from/overload3.html asio/reference/basic_raw_socket/receive_low_watermark.html asio/reference/basic_raw_socket/release.html asio/reference/basic_raw_socket/release/overload1.html asio/reference/basic_raw_socket/release/overload2.html asio/reference/basic_raw_socket/remote_endpoint.html asio/reference/basic_raw_socket/remote_endpoint/overload1.html asio/reference/basic_raw_socket/remote_endpoint/overload2.html asio/reference/basic_raw_socket/reuse_address.html asio/reference/basic_raw_socket/send.html asio/reference/basic_raw_socket/send/overload1.html asio/reference/basic_raw_socket/send/overload2.html asio/reference/basic_raw_socket/send/overload3.html asio/reference/basic_raw_socket/send_buffer_size.html asio/reference/basic_raw_socket/send_low_watermark.html asio/reference/basic_raw_socket/send_to.html asio/reference/basic_raw_socket/send_to/overload1.html asio/reference/basic_raw_socket/send_to/overload2.html asio/reference/basic_raw_socket/send_to/overload3.html asio/reference/basic_raw_socket/set_option.html asio/reference/basic_raw_socket/set_option/overload1.html asio/reference/basic_raw_socket/set_option/overload2.html asio/reference/basic_raw_socket/shutdown.html asio/reference/basic_raw_socket/shutdown/overload1.html asio/reference/basic_raw_socket/shutdown/overload2.html asio/reference/basic_raw_socket/shutdown_type.html asio/reference/basic_raw_socket/wait.html asio/reference/basic_raw_socket/wait/overload1.html asio/reference/basic_raw_socket/wait/overload2.html asio/reference/basic_raw_socket/wait_type.html asio/reference/basic_raw_socket/_basic_raw_socket.html asio/reference/basic_seq_packet_socket.html asio/reference/basic_seq_packet_socket/assign.html asio/reference/basic_seq_packet_socket/assign/overload1.html asio/reference/basic_seq_packet_socket/assign/overload2.html asio/reference/basic_seq_packet_socket/async_connect.html asio/reference/basic_seq_packet_socket/async_receive.html asio/reference/basic_seq_packet_socket/async_receive/overload1.html asio/reference/basic_seq_packet_socket/async_receive/overload2.html asio/reference/basic_seq_packet_socket/async_send.html asio/reference/basic_seq_packet_socket/async_wait.html asio/reference/basic_seq_packet_socket/at_mark.html asio/reference/basic_seq_packet_socket/at_mark/overload1.html asio/reference/basic_seq_packet_socket/at_mark/overload2.html asio/reference/basic_seq_packet_socket/available.html asio/reference/basic_seq_packet_socket/available/overload1.html asio/reference/basic_seq_packet_socket/available/overload2.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload1.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload2.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload3.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload4.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload5.html asio/reference/basic_seq_packet_socket/basic_seq_packet_socket/overload6.html asio/reference/basic_seq_packet_socket/bind.html asio/reference/basic_seq_packet_socket/bind/overload1.html asio/reference/basic_seq_packet_socket/bind/overload2.html asio/reference/basic_seq_packet_socket/broadcast.html asio/reference/basic_seq_packet_socket/bytes_readable.html asio/reference/basic_seq_packet_socket/cancel.html asio/reference/basic_seq_packet_socket/cancel/overload1.html asio/reference/basic_seq_packet_socket/cancel/overload2.html asio/reference/basic_seq_packet_socket/close.html asio/reference/basic_seq_packet_socket/close/overload1.html asio/reference/basic_seq_packet_socket/close/overload2.html asio/reference/basic_seq_packet_socket/connect.html asio/reference/basic_seq_packet_socket/connect/overload1.html asio/reference/basic_seq_packet_socket/connect/overload2.html asio/reference/basic_seq_packet_socket/debug.html asio/reference/basic_seq_packet_socket/do_not_route.html asio/reference/basic_seq_packet_socket/enable_connection_aborted.html asio/reference/basic_seq_packet_socket/endpoint_type.html asio/reference/basic_seq_packet_socket/executor_type.html asio/reference/basic_seq_packet_socket/get_executor.html asio/reference/basic_seq_packet_socket/get_io_context.html asio/reference/basic_seq_packet_socket/get_io_service.html asio/reference/basic_seq_packet_socket/get_option.html asio/reference/basic_seq_packet_socket/get_option/overload1.html asio/reference/basic_seq_packet_socket/get_option/overload2.html asio/reference/basic_seq_packet_socket/io_control.html asio/reference/basic_seq_packet_socket/io_control/overload1.html asio/reference/basic_seq_packet_socket/io_control/overload2.html asio/reference/basic_seq_packet_socket/is_open.html asio/reference/basic_seq_packet_socket/keep_alive.html asio/reference/basic_seq_packet_socket/linger.html asio/reference/basic_seq_packet_socket/local_endpoint.html asio/reference/basic_seq_packet_socket/local_endpoint/overload1.html asio/reference/basic_seq_packet_socket/local_endpoint/overload2.html asio/reference/basic_seq_packet_socket/lowest_layer.html asio/reference/basic_seq_packet_socket/lowest_layer/overload1.html asio/reference/basic_seq_packet_socket/lowest_layer/overload2.html asio/reference/basic_seq_packet_socket/lowest_layer_type.html asio/reference/basic_seq_packet_socket/max_connections.html asio/reference/basic_seq_packet_socket/max_listen_connections.html asio/reference/basic_seq_packet_socket/message_do_not_route.html asio/reference/basic_seq_packet_socket/message_end_of_record.html asio/reference/basic_seq_packet_socket/message_flags.html asio/reference/basic_seq_packet_socket/message_out_of_band.html asio/reference/basic_seq_packet_socket/message_peek.html asio/reference/basic_seq_packet_socket/native_handle.html asio/reference/basic_seq_packet_socket/native_handle_type.html asio/reference/basic_seq_packet_socket/native_non_blocking.html asio/reference/basic_seq_packet_socket/native_non_blocking/overload1.html asio/reference/basic_seq_packet_socket/native_non_blocking/overload2.html asio/reference/basic_seq_packet_socket/native_non_blocking/overload3.html asio/reference/basic_seq_packet_socket/non_blocking.html asio/reference/basic_seq_packet_socket/non_blocking/overload1.html asio/reference/basic_seq_packet_socket/non_blocking/overload2.html asio/reference/basic_seq_packet_socket/non_blocking/overload3.html asio/reference/basic_seq_packet_socket/open.html asio/reference/basic_seq_packet_socket/open/overload1.html asio/reference/basic_seq_packet_socket/open/overload2.html asio/reference/basic_seq_packet_socket/operator_eq_.html asio/reference/basic_seq_packet_socket/operator_eq_/overload1.html asio/reference/basic_seq_packet_socket/operator_eq_/overload2.html asio/reference/basic_seq_packet_socket/out_of_band_inline.html asio/reference/basic_seq_packet_socket/protocol_type.html asio/reference/basic_seq_packet_socket/receive.html asio/reference/basic_seq_packet_socket/receive/overload1.html asio/reference/basic_seq_packet_socket/receive/overload2.html asio/reference/basic_seq_packet_socket/receive/overload3.html asio/reference/basic_seq_packet_socket/receive_buffer_size.html asio/reference/basic_seq_packet_socket/receive_low_watermark.html asio/reference/basic_seq_packet_socket/release.html asio/reference/basic_seq_packet_socket/release/overload1.html asio/reference/basic_seq_packet_socket/release/overload2.html asio/reference/basic_seq_packet_socket/remote_endpoint.html asio/reference/basic_seq_packet_socket/remote_endpoint/overload1.html asio/reference/basic_seq_packet_socket/remote_endpoint/overload2.html asio/reference/basic_seq_packet_socket/reuse_address.html asio/reference/basic_seq_packet_socket/send.html asio/reference/basic_seq_packet_socket/send/overload1.html asio/reference/basic_seq_packet_socket/send/overload2.html asio/reference/basic_seq_packet_socket/send_buffer_size.html asio/reference/basic_seq_packet_socket/send_low_watermark.html asio/reference/basic_seq_packet_socket/set_option.html asio/reference/basic_seq_packet_socket/set_option/overload1.html asio/reference/basic_seq_packet_socket/set_option/overload2.html asio/reference/basic_seq_packet_socket/shutdown.html asio/reference/basic_seq_packet_socket/shutdown/overload1.html asio/reference/basic_seq_packet_socket/shutdown/overload2.html asio/reference/basic_seq_packet_socket/shutdown_type.html asio/reference/basic_seq_packet_socket/wait.html asio/reference/basic_seq_packet_socket/wait/overload1.html asio/reference/basic_seq_packet_socket/wait/overload2.html asio/reference/basic_seq_packet_socket/wait_type.html asio/reference/basic_seq_packet_socket/_basic_seq_packet_socket.html asio/reference/basic_socket.html asio/reference/basic_socket/assign.html asio/reference/basic_socket/assign/overload1.html asio/reference/basic_socket/assign/overload2.html asio/reference/basic_socket/async_connect.html asio/reference/basic_socket/async_wait.html asio/reference/basic_socket/at_mark.html asio/reference/basic_socket/at_mark/overload1.html asio/reference/basic_socket/at_mark/overload2.html asio/reference/basic_socket/available.html asio/reference/basic_socket/available/overload1.html asio/reference/basic_socket/available/overload2.html asio/reference/basic_socket/basic_socket.html asio/reference/basic_socket/basic_socket/overload1.html asio/reference/basic_socket/basic_socket/overload2.html asio/reference/basic_socket/basic_socket/overload3.html asio/reference/basic_socket/basic_socket/overload4.html asio/reference/basic_socket/basic_socket/overload5.html asio/reference/basic_socket/basic_socket/overload6.html asio/reference/basic_socket/bind.html asio/reference/basic_socket/bind/overload1.html asio/reference/basic_socket/bind/overload2.html asio/reference/basic_socket/broadcast.html asio/reference/basic_socket/bytes_readable.html asio/reference/basic_socket/cancel.html asio/reference/basic_socket/cancel/overload1.html asio/reference/basic_socket/cancel/overload2.html asio/reference/basic_socket/close.html asio/reference/basic_socket/close/overload1.html asio/reference/basic_socket/close/overload2.html asio/reference/basic_socket/connect.html asio/reference/basic_socket/connect/overload1.html asio/reference/basic_socket/connect/overload2.html asio/reference/basic_socket/debug.html asio/reference/basic_socket/do_not_route.html asio/reference/basic_socket/enable_connection_aborted.html asio/reference/basic_socket/endpoint_type.html asio/reference/basic_socket/executor_type.html asio/reference/basic_socket/get_executor.html asio/reference/basic_socket/get_io_context.html asio/reference/basic_socket/get_io_service.html asio/reference/basic_socket/get_option.html asio/reference/basic_socket/get_option/overload1.html asio/reference/basic_socket/get_option/overload2.html asio/reference/basic_socket/io_control.html asio/reference/basic_socket/io_control/overload1.html asio/reference/basic_socket/io_control/overload2.html asio/reference/basic_socket/is_open.html asio/reference/basic_socket/keep_alive.html asio/reference/basic_socket/linger.html asio/reference/basic_socket/local_endpoint.html asio/reference/basic_socket/local_endpoint/overload1.html asio/reference/basic_socket/local_endpoint/overload2.html asio/reference/basic_socket/lowest_layer.html asio/reference/basic_socket/lowest_layer/overload1.html asio/reference/basic_socket/lowest_layer/overload2.html asio/reference/basic_socket/lowest_layer_type.html asio/reference/basic_socket/max_connections.html asio/reference/basic_socket/max_listen_connections.html asio/reference/basic_socket/message_do_not_route.html asio/reference/basic_socket/message_end_of_record.html asio/reference/basic_socket/message_flags.html asio/reference/basic_socket/message_out_of_band.html asio/reference/basic_socket/message_peek.html asio/reference/basic_socket/native_handle.html asio/reference/basic_socket/native_handle_type.html asio/reference/basic_socket/native_non_blocking.html asio/reference/basic_socket/native_non_blocking/overload1.html asio/reference/basic_socket/native_non_blocking/overload2.html asio/reference/basic_socket/native_non_blocking/overload3.html asio/reference/basic_socket/non_blocking.html asio/reference/basic_socket/non_blocking/overload1.html asio/reference/basic_socket/non_blocking/overload2.html asio/reference/basic_socket/non_blocking/overload3.html asio/reference/basic_socket/open.html asio/reference/basic_socket/open/overload1.html asio/reference/basic_socket/open/overload2.html asio/reference/basic_socket/operator_eq_.html asio/reference/basic_socket/operator_eq_/overload1.html asio/reference/basic_socket/operator_eq_/overload2.html asio/reference/basic_socket/out_of_band_inline.html asio/reference/basic_socket/protocol_type.html asio/reference/basic_socket/receive_buffer_size.html asio/reference/basic_socket/receive_low_watermark.html asio/reference/basic_socket/release.html asio/reference/basic_socket/release/overload1.html asio/reference/basic_socket/release/overload2.html asio/reference/basic_socket/remote_endpoint.html asio/reference/basic_socket/remote_endpoint/overload1.html asio/reference/basic_socket/remote_endpoint/overload2.html asio/reference/basic_socket/reuse_address.html asio/reference/basic_socket/send_buffer_size.html asio/reference/basic_socket/send_low_watermark.html asio/reference/basic_socket/set_option.html asio/reference/basic_socket/set_option/overload1.html asio/reference/basic_socket/set_option/overload2.html asio/reference/basic_socket/shutdown.html asio/reference/basic_socket/shutdown/overload1.html asio/reference/basic_socket/shutdown/overload2.html asio/reference/basic_socket/shutdown_type.html asio/reference/basic_socket/wait.html asio/reference/basic_socket/wait/overload1.html asio/reference/basic_socket/wait/overload2.html asio/reference/basic_socket/wait_type.html asio/reference/basic_socket/_basic_socket.html asio/reference/basic_socket_acceptor.html asio/reference/basic_socket_acceptor/accept.html asio/reference/basic_socket_acceptor/accept/overload1.html asio/reference/basic_socket_acceptor/accept/overload2.html asio/reference/basic_socket_acceptor/accept/overload3.html asio/reference/basic_socket_acceptor/accept/overload4.html asio/reference/basic_socket_acceptor/accept/overload5.html asio/reference/basic_socket_acceptor/accept/overload6.html asio/reference/basic_socket_acceptor/accept/overload7.html asio/reference/basic_socket_acceptor/accept/overload8.html asio/reference/basic_socket_acceptor/accept/overload9.html asio/reference/basic_socket_acceptor/accept/overload10.html asio/reference/basic_socket_acceptor/accept/overload11.html asio/reference/basic_socket_acceptor/accept/overload12.html asio/reference/basic_socket_acceptor/assign.html asio/reference/basic_socket_acceptor/assign/overload1.html asio/reference/basic_socket_acceptor/assign/overload2.html asio/reference/basic_socket_acceptor/async_accept.html asio/reference/basic_socket_acceptor/async_accept/overload1.html asio/reference/basic_socket_acceptor/async_accept/overload2.html asio/reference/basic_socket_acceptor/async_accept/overload3.html asio/reference/basic_socket_acceptor/async_accept/overload4.html asio/reference/basic_socket_acceptor/async_accept/overload5.html asio/reference/basic_socket_acceptor/async_accept/overload6.html asio/reference/basic_socket_acceptor/async_wait.html asio/reference/basic_socket_acceptor/basic_socket_acceptor.html asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload1.html asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload2.html asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload3.html asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload4.html asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload5.html asio/reference/basic_socket_acceptor/basic_socket_acceptor/overload6.html asio/reference/basic_socket_acceptor/bind.html asio/reference/basic_socket_acceptor/bind/overload1.html asio/reference/basic_socket_acceptor/bind/overload2.html asio/reference/basic_socket_acceptor/broadcast.html asio/reference/basic_socket_acceptor/bytes_readable.html asio/reference/basic_socket_acceptor/cancel.html asio/reference/basic_socket_acceptor/cancel/overload1.html asio/reference/basic_socket_acceptor/cancel/overload2.html asio/reference/basic_socket_acceptor/close.html asio/reference/basic_socket_acceptor/close/overload1.html asio/reference/basic_socket_acceptor/close/overload2.html asio/reference/basic_socket_acceptor/debug.html asio/reference/basic_socket_acceptor/do_not_route.html asio/reference/basic_socket_acceptor/enable_connection_aborted.html asio/reference/basic_socket_acceptor/endpoint_type.html asio/reference/basic_socket_acceptor/executor_type.html asio/reference/basic_socket_acceptor/get_executor.html asio/reference/basic_socket_acceptor/get_io_context.html asio/reference/basic_socket_acceptor/get_io_service.html asio/reference/basic_socket_acceptor/get_option.html asio/reference/basic_socket_acceptor/get_option/overload1.html asio/reference/basic_socket_acceptor/get_option/overload2.html asio/reference/basic_socket_acceptor/io_control.html asio/reference/basic_socket_acceptor/io_control/overload1.html asio/reference/basic_socket_acceptor/io_control/overload2.html asio/reference/basic_socket_acceptor/is_open.html asio/reference/basic_socket_acceptor/keep_alive.html asio/reference/basic_socket_acceptor/linger.html asio/reference/basic_socket_acceptor/listen.html asio/reference/basic_socket_acceptor/listen/overload1.html asio/reference/basic_socket_acceptor/listen/overload2.html asio/reference/basic_socket_acceptor/local_endpoint.html asio/reference/basic_socket_acceptor/local_endpoint/overload1.html asio/reference/basic_socket_acceptor/local_endpoint/overload2.html asio/reference/basic_socket_acceptor/max_connections.html asio/reference/basic_socket_acceptor/max_listen_connections.html asio/reference/basic_socket_acceptor/message_do_not_route.html asio/reference/basic_socket_acceptor/message_end_of_record.html asio/reference/basic_socket_acceptor/message_flags.html asio/reference/basic_socket_acceptor/message_out_of_band.html asio/reference/basic_socket_acceptor/message_peek.html asio/reference/basic_socket_acceptor/native_handle.html asio/reference/basic_socket_acceptor/native_handle_type.html asio/reference/basic_socket_acceptor/native_non_blocking.html asio/reference/basic_socket_acceptor/native_non_blocking/overload1.html asio/reference/basic_socket_acceptor/native_non_blocking/overload2.html asio/reference/basic_socket_acceptor/native_non_blocking/overload3.html asio/reference/basic_socket_acceptor/non_blocking.html asio/reference/basic_socket_acceptor/non_blocking/overload1.html asio/reference/basic_socket_acceptor/non_blocking/overload2.html asio/reference/basic_socket_acceptor/non_blocking/overload3.html asio/reference/basic_socket_acceptor/open.html asio/reference/basic_socket_acceptor/open/overload1.html asio/reference/basic_socket_acceptor/open/overload2.html asio/reference/basic_socket_acceptor/operator_eq_.html asio/reference/basic_socket_acceptor/operator_eq_/overload1.html asio/reference/basic_socket_acceptor/operator_eq_/overload2.html asio/reference/basic_socket_acceptor/out_of_band_inline.html asio/reference/basic_socket_acceptor/protocol_type.html asio/reference/basic_socket_acceptor/receive_buffer_size.html asio/reference/basic_socket_acceptor/receive_low_watermark.html asio/reference/basic_socket_acceptor/release.html asio/reference/basic_socket_acceptor/release/overload1.html asio/reference/basic_socket_acceptor/release/overload2.html asio/reference/basic_socket_acceptor/reuse_address.html asio/reference/basic_socket_acceptor/send_buffer_size.html asio/reference/basic_socket_acceptor/send_low_watermark.html asio/reference/basic_socket_acceptor/set_option.html asio/reference/basic_socket_acceptor/set_option/overload1.html asio/reference/basic_socket_acceptor/set_option/overload2.html asio/reference/basic_socket_acceptor/shutdown_type.html asio/reference/basic_socket_acceptor/wait.html asio/reference/basic_socket_acceptor/wait/overload1.html asio/reference/basic_socket_acceptor/wait/overload2.html asio/reference/basic_socket_acceptor/wait_type.html asio/reference/basic_socket_acceptor/_basic_socket_acceptor.html asio/reference/basic_socket_iostream.html asio/reference/basic_socket_iostream/basic_socket_iostream.html asio/reference/basic_socket_iostream/basic_socket_iostream/overload1.html asio/reference/basic_socket_iostream/basic_socket_iostream/overload2.html asio/reference/basic_socket_iostream/basic_socket_iostream/overload3.html asio/reference/basic_socket_iostream/basic_socket_iostream/overload4.html asio/reference/basic_socket_iostream/clock_type.html asio/reference/basic_socket_iostream/close.html asio/reference/basic_socket_iostream/connect.html asio/reference/basic_socket_iostream/duration.html asio/reference/basic_socket_iostream/duration_type.html asio/reference/basic_socket_iostream/endpoint_type.html asio/reference/basic_socket_iostream/error.html asio/reference/basic_socket_iostream/expires_after.html asio/reference/basic_socket_iostream/expires_at.html asio/reference/basic_socket_iostream/expires_at/overload1.html asio/reference/basic_socket_iostream/expires_at/overload2.html asio/reference/basic_socket_iostream/expires_from_now.html asio/reference/basic_socket_iostream/expires_from_now/overload1.html asio/reference/basic_socket_iostream/expires_from_now/overload2.html asio/reference/basic_socket_iostream/expiry.html asio/reference/basic_socket_iostream/operator_eq_.html asio/reference/basic_socket_iostream/protocol_type.html asio/reference/basic_socket_iostream/rdbuf.html asio/reference/basic_socket_iostream/socket.html asio/reference/basic_socket_iostream/time_point.html asio/reference/basic_socket_iostream/time_type.html asio/reference/basic_socket_streambuf.html asio/reference/basic_socket_streambuf/basic_socket_streambuf.html asio/reference/basic_socket_streambuf/basic_socket_streambuf/overload1.html asio/reference/basic_socket_streambuf/basic_socket_streambuf/overload2.html asio/reference/basic_socket_streambuf/basic_socket_streambuf/overload3.html asio/reference/basic_socket_streambuf/clock_type.html asio/reference/basic_socket_streambuf/close.html asio/reference/basic_socket_streambuf/connect.html asio/reference/basic_socket_streambuf/connect/overload1.html asio/reference/basic_socket_streambuf/connect/overload2.html asio/reference/basic_socket_streambuf/duration.html asio/reference/basic_socket_streambuf/duration_type.html asio/reference/basic_socket_streambuf/endpoint_type.html asio/reference/basic_socket_streambuf/error.html asio/reference/basic_socket_streambuf/expires_after.html asio/reference/basic_socket_streambuf/expires_at.html asio/reference/basic_socket_streambuf/expires_at/overload1.html asio/reference/basic_socket_streambuf/expires_at/overload2.html asio/reference/basic_socket_streambuf/expires_from_now.html asio/reference/basic_socket_streambuf/expires_from_now/overload1.html asio/reference/basic_socket_streambuf/expires_from_now/overload2.html asio/reference/basic_socket_streambuf/expiry.html asio/reference/basic_socket_streambuf/operator_eq_.html asio/reference/basic_socket_streambuf/overflow.html asio/reference/basic_socket_streambuf/protocol_type.html asio/reference/basic_socket_streambuf/puberror.html asio/reference/basic_socket_streambuf/setbuf.html asio/reference/basic_socket_streambuf/socket.html asio/reference/basic_socket_streambuf/sync.html asio/reference/basic_socket_streambuf/time_point.html asio/reference/basic_socket_streambuf/time_type.html asio/reference/basic_socket_streambuf/underflow.html asio/reference/basic_socket_streambuf/_basic_socket_streambuf.html asio/reference/basic_stream_socket.html asio/reference/basic_stream_socket/assign.html asio/reference/basic_stream_socket/assign/overload1.html asio/reference/basic_stream_socket/assign/overload2.html asio/reference/basic_stream_socket/async_connect.html asio/reference/basic_stream_socket/async_read_some.html asio/reference/basic_stream_socket/async_receive.html asio/reference/basic_stream_socket/async_receive/overload1.html asio/reference/basic_stream_socket/async_receive/overload2.html asio/reference/basic_stream_socket/async_send.html asio/reference/basic_stream_socket/async_send/overload1.html asio/reference/basic_stream_socket/async_send/overload2.html asio/reference/basic_stream_socket/async_wait.html asio/reference/basic_stream_socket/async_write_some.html asio/reference/basic_stream_socket/at_mark.html asio/reference/basic_stream_socket/at_mark/overload1.html asio/reference/basic_stream_socket/at_mark/overload2.html asio/reference/basic_stream_socket/available.html asio/reference/basic_stream_socket/available/overload1.html asio/reference/basic_stream_socket/available/overload2.html asio/reference/basic_stream_socket/basic_stream_socket.html asio/reference/basic_stream_socket/basic_stream_socket/overload1.html asio/reference/basic_stream_socket/basic_stream_socket/overload2.html asio/reference/basic_stream_socket/basic_stream_socket/overload3.html asio/reference/basic_stream_socket/basic_stream_socket/overload4.html asio/reference/basic_stream_socket/basic_stream_socket/overload5.html asio/reference/basic_stream_socket/basic_stream_socket/overload6.html asio/reference/basic_stream_socket/bind.html asio/reference/basic_stream_socket/bind/overload1.html asio/reference/basic_stream_socket/bind/overload2.html asio/reference/basic_stream_socket/broadcast.html asio/reference/basic_stream_socket/bytes_readable.html asio/reference/basic_stream_socket/cancel.html asio/reference/basic_stream_socket/cancel/overload1.html asio/reference/basic_stream_socket/cancel/overload2.html asio/reference/basic_stream_socket/close.html asio/reference/basic_stream_socket/close/overload1.html asio/reference/basic_stream_socket/close/overload2.html asio/reference/basic_stream_socket/connect.html asio/reference/basic_stream_socket/connect/overload1.html asio/reference/basic_stream_socket/connect/overload2.html asio/reference/basic_stream_socket/debug.html asio/reference/basic_stream_socket/do_not_route.html asio/reference/basic_stream_socket/enable_connection_aborted.html asio/reference/basic_stream_socket/endpoint_type.html asio/reference/basic_stream_socket/executor_type.html asio/reference/basic_stream_socket/get_executor.html asio/reference/basic_stream_socket/get_io_context.html asio/reference/basic_stream_socket/get_io_service.html asio/reference/basic_stream_socket/get_option.html asio/reference/basic_stream_socket/get_option/overload1.html asio/reference/basic_stream_socket/get_option/overload2.html asio/reference/basic_stream_socket/io_control.html asio/reference/basic_stream_socket/io_control/overload1.html asio/reference/basic_stream_socket/io_control/overload2.html asio/reference/basic_stream_socket/is_open.html asio/reference/basic_stream_socket/keep_alive.html asio/reference/basic_stream_socket/linger.html asio/reference/basic_stream_socket/local_endpoint.html asio/reference/basic_stream_socket/local_endpoint/overload1.html asio/reference/basic_stream_socket/local_endpoint/overload2.html asio/reference/basic_stream_socket/lowest_layer.html asio/reference/basic_stream_socket/lowest_layer/overload1.html asio/reference/basic_stream_socket/lowest_layer/overload2.html asio/reference/basic_stream_socket/lowest_layer_type.html asio/reference/basic_stream_socket/max_connections.html asio/reference/basic_stream_socket/max_listen_connections.html asio/reference/basic_stream_socket/message_do_not_route.html asio/reference/basic_stream_socket/message_end_of_record.html asio/reference/basic_stream_socket/message_flags.html asio/reference/basic_stream_socket/message_out_of_band.html asio/reference/basic_stream_socket/message_peek.html asio/reference/basic_stream_socket/native_handle.html asio/reference/basic_stream_socket/native_handle_type.html asio/reference/basic_stream_socket/native_non_blocking.html asio/reference/basic_stream_socket/native_non_blocking/overload1.html asio/reference/basic_stream_socket/native_non_blocking/overload2.html asio/reference/basic_stream_socket/native_non_blocking/overload3.html asio/reference/basic_stream_socket/non_blocking.html asio/reference/basic_stream_socket/non_blocking/overload1.html asio/reference/basic_stream_socket/non_blocking/overload2.html asio/reference/basic_stream_socket/non_blocking/overload3.html asio/reference/basic_stream_socket/open.html asio/reference/basic_stream_socket/open/overload1.html asio/reference/basic_stream_socket/open/overload2.html asio/reference/basic_stream_socket/operator_eq_.html asio/reference/basic_stream_socket/operator_eq_/overload1.html asio/reference/basic_stream_socket/operator_eq_/overload2.html asio/reference/basic_stream_socket/out_of_band_inline.html asio/reference/basic_stream_socket/protocol_type.html asio/reference/basic_stream_socket/read_some.html asio/reference/basic_stream_socket/read_some/overload1.html asio/reference/basic_stream_socket/read_some/overload2.html asio/reference/basic_stream_socket/receive.html asio/reference/basic_stream_socket/receive/overload1.html asio/reference/basic_stream_socket/receive/overload2.html asio/reference/basic_stream_socket/receive/overload3.html asio/reference/basic_stream_socket/receive_buffer_size.html asio/reference/basic_stream_socket/receive_low_watermark.html asio/reference/basic_stream_socket/release.html asio/reference/basic_stream_socket/release/overload1.html asio/reference/basic_stream_socket/release/overload2.html asio/reference/basic_stream_socket/remote_endpoint.html asio/reference/basic_stream_socket/remote_endpoint/overload1.html asio/reference/basic_stream_socket/remote_endpoint/overload2.html asio/reference/basic_stream_socket/reuse_address.html asio/reference/basic_stream_socket/send.html asio/reference/basic_stream_socket/send/overload1.html asio/reference/basic_stream_socket/send/overload2.html asio/reference/basic_stream_socket/send/overload3.html asio/reference/basic_stream_socket/send_buffer_size.html asio/reference/basic_stream_socket/send_low_watermark.html asio/reference/basic_stream_socket/set_option.html asio/reference/basic_stream_socket/set_option/overload1.html asio/reference/basic_stream_socket/set_option/overload2.html asio/reference/basic_stream_socket/shutdown.html asio/reference/basic_stream_socket/shutdown/overload1.html asio/reference/basic_stream_socket/shutdown/overload2.html asio/reference/basic_stream_socket/shutdown_type.html asio/reference/basic_stream_socket/wait.html asio/reference/basic_stream_socket/wait/overload1.html asio/reference/basic_stream_socket/wait/overload2.html asio/reference/basic_stream_socket/wait_type.html asio/reference/basic_stream_socket/write_some.html asio/reference/basic_stream_socket/write_some/overload1.html asio/reference/basic_stream_socket/write_some/overload2.html asio/reference/basic_stream_socket/_basic_stream_socket.html asio/reference/basic_streambuf.html asio/reference/basic_streambuf/basic_streambuf.html asio/reference/basic_streambuf/capacity.html asio/reference/basic_streambuf/commit.html asio/reference/basic_streambuf/const_buffers_type.html asio/reference/basic_streambuf/consume.html asio/reference/basic_streambuf/data.html asio/reference/basic_streambuf/max_size.html asio/reference/basic_streambuf/mutable_buffers_type.html asio/reference/basic_streambuf/overflow.html asio/reference/basic_streambuf/prepare.html asio/reference/basic_streambuf/reserve.html asio/reference/basic_streambuf/size.html asio/reference/basic_streambuf/underflow.html asio/reference/basic_streambuf_ref.html asio/reference/basic_streambuf_ref/basic_streambuf_ref.html asio/reference/basic_streambuf_ref/basic_streambuf_ref/overload1.html asio/reference/basic_streambuf_ref/basic_streambuf_ref/overload2.html asio/reference/basic_streambuf_ref/basic_streambuf_ref/overload3.html asio/reference/basic_streambuf_ref/capacity.html asio/reference/basic_streambuf_ref/commit.html asio/reference/basic_streambuf_ref/const_buffers_type.html asio/reference/basic_streambuf_ref/consume.html asio/reference/basic_streambuf_ref/data.html asio/reference/basic_streambuf_ref/max_size.html asio/reference/basic_streambuf_ref/mutable_buffers_type.html asio/reference/basic_streambuf_ref/prepare.html asio/reference/basic_streambuf_ref/size.html asio/reference/basic_waitable_timer.html asio/reference/basic_waitable_timer/async_wait.html asio/reference/basic_waitable_timer/basic_waitable_timer.html asio/reference/basic_waitable_timer/basic_waitable_timer/overload1.html asio/reference/basic_waitable_timer/basic_waitable_timer/overload2.html asio/reference/basic_waitable_timer/basic_waitable_timer/overload3.html asio/reference/basic_waitable_timer/basic_waitable_timer/overload4.html asio/reference/basic_waitable_timer/cancel.html asio/reference/basic_waitable_timer/cancel/overload1.html asio/reference/basic_waitable_timer/cancel/overload2.html asio/reference/basic_waitable_timer/cancel_one.html asio/reference/basic_waitable_timer/cancel_one/overload1.html asio/reference/basic_waitable_timer/cancel_one/overload2.html asio/reference/basic_waitable_timer/clock_type.html asio/reference/basic_waitable_timer/duration.html asio/reference/basic_waitable_timer/executor_type.html asio/reference/basic_waitable_timer/expires_after.html asio/reference/basic_waitable_timer/expires_at.html asio/reference/basic_waitable_timer/expires_at/overload1.html asio/reference/basic_waitable_timer/expires_at/overload2.html asio/reference/basic_waitable_timer/expires_at/overload3.html asio/reference/basic_waitable_timer/expires_from_now.html asio/reference/basic_waitable_timer/expires_from_now/overload1.html asio/reference/basic_waitable_timer/expires_from_now/overload2.html asio/reference/basic_waitable_timer/expires_from_now/overload3.html asio/reference/basic_waitable_timer/expiry.html asio/reference/basic_waitable_timer/get_executor.html asio/reference/basic_waitable_timer/get_io_context.html asio/reference/basic_waitable_timer/get_io_service.html asio/reference/basic_waitable_timer/operator_eq_.html asio/reference/basic_waitable_timer/time_point.html asio/reference/basic_waitable_timer/traits_type.html asio/reference/basic_waitable_timer/wait.html asio/reference/basic_waitable_timer/wait/overload1.html asio/reference/basic_waitable_timer/wait/overload2.html asio/reference/basic_waitable_timer/_basic_waitable_timer.html asio/reference/basic_yield_context.html asio/reference/basic_yield_context/basic_yield_context.html asio/reference/basic_yield_context/basic_yield_context/overload1.html asio/reference/basic_yield_context/basic_yield_context/overload2.html asio/reference/basic_yield_context/callee_type.html asio/reference/basic_yield_context/caller_type.html asio/reference/basic_yield_context/operator_lb__rb_.html asio/reference/bind_executor.html asio/reference/bind_executor/overload1.html asio/reference/bind_executor/overload2.html asio/reference/buffer.html asio/reference/buffer/overload1.html asio/reference/buffer/overload2.html asio/reference/buffer/overload3.html asio/reference/buffer/overload4.html asio/reference/buffer/overload5.html asio/reference/buffer/overload6.html asio/reference/buffer/overload7.html asio/reference/buffer/overload8.html asio/reference/buffer/overload9.html asio/reference/buffer/overload10.html asio/reference/buffer/overload11.html asio/reference/buffer/overload12.html asio/reference/buffer/overload13.html asio/reference/buffer/overload14.html asio/reference/buffer/overload15.html asio/reference/buffer/overload16.html asio/reference/buffer/overload17.html asio/reference/buffer/overload18.html asio/reference/buffer/overload19.html asio/reference/buffer/overload20.html asio/reference/buffer/overload21.html asio/reference/buffer/overload22.html asio/reference/buffer/overload23.html asio/reference/buffer/overload24.html asio/reference/buffer/overload25.html asio/reference/buffer/overload26.html asio/reference/buffer/overload27.html asio/reference/buffer/overload28.html asio/reference/buffer/overload29.html asio/reference/buffer/overload30.html asio/reference/buffer/overload31.html asio/reference/buffer/overload32.html asio/reference/buffer_cast.html asio/reference/buffer_cast/overload1.html asio/reference/buffer_cast/overload2.html asio/reference/buffer_copy.html asio/reference/buffer_copy/overload1.html asio/reference/buffer_copy/overload2.html asio/reference/buffer_sequence_begin.html asio/reference/buffer_sequence_begin/overload1.html asio/reference/buffer_sequence_begin/overload2.html asio/reference/buffer_sequence_begin/overload3.html asio/reference/buffer_sequence_begin/overload4.html asio/reference/buffer_sequence_end.html asio/reference/buffer_sequence_end/overload1.html asio/reference/buffer_sequence_end/overload2.html asio/reference/buffer_sequence_end/overload3.html asio/reference/buffer_sequence_end/overload4.html asio/reference/buffer_size.html asio/reference/buffered_read_stream.html asio/reference/buffered_read_stream/async_fill.html asio/reference/buffered_read_stream/async_read_some.html asio/reference/buffered_read_stream/async_write_some.html asio/reference/buffered_read_stream/buffered_read_stream.html asio/reference/buffered_read_stream/buffered_read_stream/overload1.html asio/reference/buffered_read_stream/buffered_read_stream/overload2.html asio/reference/buffered_read_stream/close.html asio/reference/buffered_read_stream/close/overload1.html asio/reference/buffered_read_stream/close/overload2.html asio/reference/buffered_read_stream/default_buffer_size.html asio/reference/buffered_read_stream/executor_type.html asio/reference/buffered_read_stream/fill.html asio/reference/buffered_read_stream/fill/overload1.html asio/reference/buffered_read_stream/fill/overload2.html asio/reference/buffered_read_stream/get_executor.html asio/reference/buffered_read_stream/get_io_context.html asio/reference/buffered_read_stream/get_io_service.html asio/reference/buffered_read_stream/in_avail.html asio/reference/buffered_read_stream/in_avail/overload1.html asio/reference/buffered_read_stream/in_avail/overload2.html asio/reference/buffered_read_stream/lowest_layer.html asio/reference/buffered_read_stream/lowest_layer/overload1.html asio/reference/buffered_read_stream/lowest_layer/overload2.html asio/reference/buffered_read_stream/lowest_layer_type.html asio/reference/buffered_read_stream/next_layer.html asio/reference/buffered_read_stream/next_layer_type.html asio/reference/buffered_read_stream/peek.html asio/reference/buffered_read_stream/peek/overload1.html asio/reference/buffered_read_stream/peek/overload2.html asio/reference/buffered_read_stream/read_some.html asio/reference/buffered_read_stream/read_some/overload1.html asio/reference/buffered_read_stream/read_some/overload2.html asio/reference/buffered_read_stream/write_some.html asio/reference/buffered_read_stream/write_some/overload1.html asio/reference/buffered_read_stream/write_some/overload2.html asio/reference/buffered_stream.html asio/reference/buffered_stream/async_fill.html asio/reference/buffered_stream/async_flush.html asio/reference/buffered_stream/async_read_some.html asio/reference/buffered_stream/async_write_some.html asio/reference/buffered_stream/buffered_stream.html asio/reference/buffered_stream/buffered_stream/overload1.html asio/reference/buffered_stream/buffered_stream/overload2.html asio/reference/buffered_stream/close.html asio/reference/buffered_stream/close/overload1.html asio/reference/buffered_stream/close/overload2.html asio/reference/buffered_stream/executor_type.html asio/reference/buffered_stream/fill.html asio/reference/buffered_stream/fill/overload1.html asio/reference/buffered_stream/fill/overload2.html asio/reference/buffered_stream/flush.html asio/reference/buffered_stream/flush/overload1.html asio/reference/buffered_stream/flush/overload2.html asio/reference/buffered_stream/get_executor.html asio/reference/buffered_stream/get_io_context.html asio/reference/buffered_stream/get_io_service.html asio/reference/buffered_stream/in_avail.html asio/reference/buffered_stream/in_avail/overload1.html asio/reference/buffered_stream/in_avail/overload2.html asio/reference/buffered_stream/lowest_layer.html asio/reference/buffered_stream/lowest_layer/overload1.html asio/reference/buffered_stream/lowest_layer/overload2.html asio/reference/buffered_stream/lowest_layer_type.html asio/reference/buffered_stream/next_layer.html asio/reference/buffered_stream/next_layer_type.html asio/reference/buffered_stream/peek.html asio/reference/buffered_stream/peek/overload1.html asio/reference/buffered_stream/peek/overload2.html asio/reference/buffered_stream/read_some.html asio/reference/buffered_stream/read_some/overload1.html asio/reference/buffered_stream/read_some/overload2.html asio/reference/buffered_stream/write_some.html asio/reference/buffered_stream/write_some/overload1.html asio/reference/buffered_stream/write_some/overload2.html asio/reference/buffered_write_stream.html asio/reference/buffered_write_stream/async_flush.html asio/reference/buffered_write_stream/async_read_some.html asio/reference/buffered_write_stream/async_write_some.html asio/reference/buffered_write_stream/buffered_write_stream.html asio/reference/buffered_write_stream/buffered_write_stream/overload1.html asio/reference/buffered_write_stream/buffered_write_stream/overload2.html asio/reference/buffered_write_stream/close.html asio/reference/buffered_write_stream/close/overload1.html asio/reference/buffered_write_stream/close/overload2.html asio/reference/buffered_write_stream/default_buffer_size.html asio/reference/buffered_write_stream/executor_type.html asio/reference/buffered_write_stream/flush.html asio/reference/buffered_write_stream/flush/overload1.html asio/reference/buffered_write_stream/flush/overload2.html asio/reference/buffered_write_stream/get_executor.html asio/reference/buffered_write_stream/get_io_context.html asio/reference/buffered_write_stream/get_io_service.html asio/reference/buffered_write_stream/in_avail.html asio/reference/buffered_write_stream/in_avail/overload1.html asio/reference/buffered_write_stream/in_avail/overload2.html asio/reference/buffered_write_stream/lowest_layer.html asio/reference/buffered_write_stream/lowest_layer/overload1.html asio/reference/buffered_write_stream/lowest_layer/overload2.html asio/reference/buffered_write_stream/lowest_layer_type.html asio/reference/buffered_write_stream/next_layer.html asio/reference/buffered_write_stream/next_layer_type.html asio/reference/buffered_write_stream/peek.html asio/reference/buffered_write_stream/peek/overload1.html asio/reference/buffered_write_stream/peek/overload2.html asio/reference/buffered_write_stream/read_some.html asio/reference/buffered_write_stream/read_some/overload1.html asio/reference/buffered_write_stream/read_some/overload2.html asio/reference/buffered_write_stream/write_some.html asio/reference/buffered_write_stream/write_some/overload1.html asio/reference/buffered_write_stream/write_some/overload2.html asio/reference/buffers_begin.html asio/reference/buffers_end.html asio/reference/buffers_iterator.html asio/reference/buffers_iterator/begin.html asio/reference/buffers_iterator/buffers_iterator.html asio/reference/buffers_iterator/difference_type.html asio/reference/buffers_iterator/end.html asio/reference/buffers_iterator/iterator_category.html asio/reference/buffers_iterator/operator__star_.html asio/reference/buffers_iterator/operator_not__eq_.html asio/reference/buffers_iterator/operator_plus_.html asio/reference/buffers_iterator/operator_plus_/overload1.html asio/reference/buffers_iterator/operator_plus_/overload2.html asio/reference/buffers_iterator/operator_plus__plus_.html asio/reference/buffers_iterator/operator_plus__plus_/overload1.html asio/reference/buffers_iterator/operator_plus__plus_/overload2.html asio/reference/buffers_iterator/operator_plus__eq_.html asio/reference/buffers_iterator/operator_minus_.html asio/reference/buffers_iterator/operator_minus_/overload1.html asio/reference/buffers_iterator/operator_minus_/overload2.html asio/reference/buffers_iterator/operator_minus__minus_.html asio/reference/buffers_iterator/operator_minus__minus_/overload1.html asio/reference/buffers_iterator/operator_minus__minus_/overload2.html asio/reference/buffers_iterator/operator_minus__eq_.html asio/reference/buffers_iterator/operator_arrow_.html asio/reference/buffers_iterator/operator_lt_.html asio/reference/buffers_iterator/operator_lt__eq_.html asio/reference/buffers_iterator/operator_eq__eq_.html asio/reference/buffers_iterator/operator_gt_.html asio/reference/buffers_iterator/operator_gt__eq_.html asio/reference/buffers_iterator/operator_lb__rb_.html asio/reference/buffers_iterator/pointer.html asio/reference/buffers_iterator/reference.html asio/reference/buffers_iterator/value_type.html asio/reference/connect.html asio/reference/connect/overload1.html asio/reference/connect/overload2.html asio/reference/connect/overload3.html asio/reference/connect/overload4.html asio/reference/connect/overload5.html asio/reference/connect/overload6.html asio/reference/connect/overload7.html asio/reference/connect/overload8.html asio/reference/connect/overload9.html asio/reference/connect/overload10.html asio/reference/connect/overload11.html asio/reference/connect/overload12.html asio/reference/const_buffer.html asio/reference/const_buffer/const_buffer.html asio/reference/const_buffer/const_buffer/overload1.html asio/reference/const_buffer/const_buffer/overload2.html asio/reference/const_buffer/const_buffer/overload3.html asio/reference/const_buffer/data.html asio/reference/const_buffer/operator_plus_.html asio/reference/const_buffer/operator_plus_/overload1.html asio/reference/const_buffer/operator_plus_/overload2.html asio/reference/const_buffer/operator_plus__eq_.html asio/reference/const_buffer/size.html asio/reference/const_buffers_1.html asio/reference/const_buffers_1/begin.html asio/reference/const_buffers_1/const_buffers_1.html asio/reference/const_buffers_1/const_buffers_1/overload1.html asio/reference/const_buffers_1/const_buffers_1/overload2.html asio/reference/const_buffers_1/const_iterator.html asio/reference/const_buffers_1/data.html asio/reference/const_buffers_1/end.html asio/reference/const_buffers_1/operator_plus_.html asio/reference/const_buffers_1/operator_plus_/overload1.html asio/reference/const_buffers_1/operator_plus_/overload2.html asio/reference/const_buffers_1/operator_plus__eq_.html asio/reference/const_buffers_1/size.html asio/reference/const_buffers_1/value_type.html asio/reference/coroutine.html asio/reference/coroutine/coroutine.html asio/reference/coroutine/is_child.html asio/reference/coroutine/is_complete.html asio/reference/coroutine/is_parent.html asio/reference/deadline_timer.html asio/reference/defer.html asio/reference/defer/overload1.html asio/reference/defer/overload2.html asio/reference/defer/overload3.html asio/reference/dispatch.html asio/reference/dispatch/overload1.html asio/reference/dispatch/overload2.html asio/reference/dispatch/overload3.html asio/reference/dynamic_buffer.html asio/reference/dynamic_buffer/overload1.html asio/reference/dynamic_buffer/overload2.html asio/reference/dynamic_buffer/overload3.html asio/reference/dynamic_buffer/overload4.html asio/reference/dynamic_string_buffer.html asio/reference/dynamic_string_buffer/capacity.html asio/reference/dynamic_string_buffer/commit.html asio/reference/dynamic_string_buffer/const_buffers_type.html asio/reference/dynamic_string_buffer/consume.html asio/reference/dynamic_string_buffer/data.html asio/reference/dynamic_string_buffer/dynamic_string_buffer.html asio/reference/dynamic_string_buffer/dynamic_string_buffer/overload1.html asio/reference/dynamic_string_buffer/dynamic_string_buffer/overload2.html asio/reference/dynamic_string_buffer/max_size.html asio/reference/dynamic_string_buffer/mutable_buffers_type.html asio/reference/dynamic_string_buffer/prepare.html asio/reference/dynamic_string_buffer/size.html asio/reference/dynamic_vector_buffer.html asio/reference/dynamic_vector_buffer/capacity.html asio/reference/dynamic_vector_buffer/commit.html asio/reference/dynamic_vector_buffer/const_buffers_type.html asio/reference/dynamic_vector_buffer/consume.html asio/reference/dynamic_vector_buffer/data.html asio/reference/dynamic_vector_buffer/dynamic_vector_buffer.html asio/reference/dynamic_vector_buffer/dynamic_vector_buffer/overload1.html asio/reference/dynamic_vector_buffer/dynamic_vector_buffer/overload2.html asio/reference/dynamic_vector_buffer/max_size.html asio/reference/dynamic_vector_buffer/mutable_buffers_type.html asio/reference/dynamic_vector_buffer/prepare.html asio/reference/dynamic_vector_buffer/size.html asio/reference/error__addrinfo_category.html asio/reference/error__addrinfo_errors.html asio/reference/error__basic_errors.html asio/reference/error__get_addrinfo_category.html asio/reference/error__get_misc_category.html asio/reference/error__get_netdb_category.html asio/reference/error__get_ssl_category.html asio/reference/error__get_system_category.html asio/reference/error__make_error_code.html asio/reference/error__make_error_code/overload1.html asio/reference/error__make_error_code/overload2.html asio/reference/error__make_error_code/overload3.html asio/reference/error__make_error_code/overload4.html asio/reference/error__make_error_code/overload5.html asio/reference/error__misc_category.html asio/reference/error__misc_errors.html asio/reference/error__netdb_category.html asio/reference/error__netdb_errors.html asio/reference/error__ssl_category.html asio/reference/error__ssl_errors.html asio/reference/error__system_category.html asio/reference/error_category.html asio/reference/error_category/message.html asio/reference/error_category/name.html asio/reference/error_category/operator_not__eq_.html asio/reference/error_category/operator_eq__eq_.html asio/reference/error_category/_error_category.html asio/reference/error_code.html asio/reference/error_code/assign.html asio/reference/error_code/category.html asio/reference/error_code/clear.html asio/reference/error_code/error_code.html asio/reference/error_code/error_code/overload1.html asio/reference/error_code/error_code/overload2.html asio/reference/error_code/error_code/overload3.html asio/reference/error_code/message.html asio/reference/error_code/operator_unspecified_bool_type.html asio/reference/error_code/operator_not_.html asio/reference/error_code/operator_not__eq_.html asio/reference/error_code/operator_eq__eq_.html asio/reference/error_code/unspecified_bool_true.html asio/reference/error_code/unspecified_bool_type.html asio/reference/error_code/value.html asio/reference/error_code__unspecified_bool_type_t.html asio/reference/execution_context.html asio/reference/execution_context/add_service.html asio/reference/execution_context/destroy.html asio/reference/execution_context/execution_context.html asio/reference/execution_context/fork_event.html asio/reference/execution_context/has_service.html asio/reference/execution_context/make_service.html asio/reference/execution_context/notify_fork.html asio/reference/execution_context/shutdown.html asio/reference/execution_context/use_service.html asio/reference/execution_context/use_service/overload1.html asio/reference/execution_context/use_service/overload2.html asio/reference/execution_context/_execution_context.html asio/reference/execution_context__id.html asio/reference/execution_context__id/id.html asio/reference/execution_context__service.html asio/reference/execution_context__service/context.html asio/reference/execution_context__service/service.html asio/reference/execution_context__service/_service.html asio/reference/execution_context__service/notify_fork.html asio/reference/execution_context__service/shutdown.html asio/reference/executor.html asio/reference/executor/context.html asio/reference/executor/defer.html asio/reference/executor/dispatch.html asio/reference/executor/executor.html asio/reference/executor/executor/overload1.html asio/reference/executor/executor/overload2.html asio/reference/executor/executor/overload3.html asio/reference/executor/executor/overload4.html asio/reference/executor/executor/overload5.html asio/reference/executor/executor/overload6.html asio/reference/executor/on_work_finished.html asio/reference/executor/on_work_started.html asio/reference/executor/operator_unspecified_bool_type.html asio/reference/executor/operator_not__eq_.html asio/reference/executor/operator_eq_.html asio/reference/executor/operator_eq_/overload1.html asio/reference/executor/operator_eq_/overload2.html asio/reference/executor/operator_eq_/overload3.html asio/reference/executor/operator_eq_/overload4.html asio/reference/executor/operator_eq__eq_.html asio/reference/executor/post.html asio/reference/executor/target.html asio/reference/executor/target/overload1.html asio/reference/executor/target/overload2.html asio/reference/executor/target_type.html asio/reference/executor/unspecified_bool_true.html asio/reference/executor/unspecified_bool_type.html asio/reference/executor/_executor.html asio/reference/executor__unspecified_bool_type_t.html asio/reference/executor_arg.html asio/reference/executor_arg_t.html asio/reference/executor_arg_t/executor_arg_t.html asio/reference/executor_binder.html asio/reference/executor_binder/argument_type.html asio/reference/executor_binder/executor_binder.html asio/reference/executor_binder/executor_binder/overload1.html asio/reference/executor_binder/executor_binder/overload2.html asio/reference/executor_binder/executor_binder/overload3.html asio/reference/executor_binder/executor_binder/overload4.html asio/reference/executor_binder/executor_binder/overload5.html asio/reference/executor_binder/executor_binder/overload6.html asio/reference/executor_binder/executor_binder/overload7.html asio/reference/executor_binder/executor_binder/overload8.html asio/reference/executor_binder/executor_binder/overload9.html asio/reference/executor_binder/executor_type.html asio/reference/executor_binder/first_argument_type.html asio/reference/executor_binder/get.html asio/reference/executor_binder/get/overload1.html asio/reference/executor_binder/get/overload2.html asio/reference/executor_binder/get_executor.html asio/reference/executor_binder/operator_lp__rp_.html asio/reference/executor_binder/operator_lp__rp_/overload1.html asio/reference/executor_binder/operator_lp__rp_/overload2.html asio/reference/executor_binder/result_type.html asio/reference/executor_binder/second_argument_type.html asio/reference/executor_binder/target_type.html asio/reference/executor_binder/_executor_binder.html asio/reference/executor_work_guard.html asio/reference/executor_work_guard/executor_type.html asio/reference/executor_work_guard/executor_work_guard.html asio/reference/executor_work_guard/executor_work_guard/overload1.html asio/reference/executor_work_guard/executor_work_guard/overload2.html asio/reference/executor_work_guard/executor_work_guard/overload3.html asio/reference/executor_work_guard/get_executor.html asio/reference/executor_work_guard/owns_work.html asio/reference/executor_work_guard/reset.html asio/reference/executor_work_guard/_executor_work_guard.html asio/reference/experimental__await_token.html asio/reference/experimental__await_token/await_token.html asio/reference/experimental__await_token/await_token/overload1.html asio/reference/experimental__await_token/await_token/overload2.html asio/reference/experimental__await_token/executor_type.html asio/reference/experimental__await_token/get_executor.html asio/reference/experimental__awaitable.html asio/reference/experimental__awaitable/awaitable.html asio/reference/experimental__awaitable/executor_type.html asio/reference/experimental__awaitable/value_type.html asio/reference/experimental__awaitable/_awaitable.html asio/reference/experimental__co_spawn.html asio/reference/experimental__co_spawn/overload1.html asio/reference/experimental__co_spawn/overload2.html asio/reference/experimental__co_spawn/overload3.html asio/reference/experimental__detached.html asio/reference/experimental__detached_t.html asio/reference/experimental__detached_t/detached_t.html asio/reference/experimental__redirect_error.html asio/reference/experimental__redirect_error_t.html asio/reference/experimental__redirect_error_t/ec_.html asio/reference/experimental__redirect_error_t/redirect_error_t.html asio/reference/experimental__redirect_error_t/token_.html asio/reference/experimental__this_coro__executor.html asio/reference/experimental__this_coro__executor_t.html asio/reference/experimental__this_coro__token.html asio/reference/experimental__this_coro__token_t.html asio/reference/generic__basic_endpoint.html asio/reference/generic__basic_endpoint/basic_endpoint.html asio/reference/generic__basic_endpoint/basic_endpoint/overload1.html asio/reference/generic__basic_endpoint/basic_endpoint/overload2.html asio/reference/generic__basic_endpoint/basic_endpoint/overload3.html asio/reference/generic__basic_endpoint/basic_endpoint/overload4.html asio/reference/generic__basic_endpoint/capacity.html asio/reference/generic__basic_endpoint/data.html asio/reference/generic__basic_endpoint/data/overload1.html asio/reference/generic__basic_endpoint/data/overload2.html asio/reference/generic__basic_endpoint/data_type.html asio/reference/generic__basic_endpoint/operator_not__eq_.html asio/reference/generic__basic_endpoint/operator_lt_.html asio/reference/generic__basic_endpoint/operator_lt__eq_.html asio/reference/generic__basic_endpoint/operator_eq_.html asio/reference/generic__basic_endpoint/operator_eq__eq_.html asio/reference/generic__basic_endpoint/operator_gt_.html asio/reference/generic__basic_endpoint/operator_gt__eq_.html asio/reference/generic__basic_endpoint/protocol.html asio/reference/generic__basic_endpoint/protocol_type.html asio/reference/generic__basic_endpoint/resize.html asio/reference/generic__basic_endpoint/size.html asio/reference/generic__datagram_protocol.html asio/reference/generic__datagram_protocol/datagram_protocol.html asio/reference/generic__datagram_protocol/datagram_protocol/overload1.html asio/reference/generic__datagram_protocol/datagram_protocol/overload2.html asio/reference/generic__datagram_protocol/endpoint.html asio/reference/generic__datagram_protocol/family.html asio/reference/generic__datagram_protocol/operator_not__eq_.html asio/reference/generic__datagram_protocol/operator_eq__eq_.html asio/reference/generic__datagram_protocol/protocol.html asio/reference/generic__datagram_protocol/socket.html asio/reference/generic__datagram_protocol/type.html asio/reference/generic__raw_protocol.html asio/reference/generic__raw_protocol/endpoint.html asio/reference/generic__raw_protocol/family.html asio/reference/generic__raw_protocol/operator_not__eq_.html asio/reference/generic__raw_protocol/operator_eq__eq_.html asio/reference/generic__raw_protocol/protocol.html asio/reference/generic__raw_protocol/raw_protocol.html asio/reference/generic__raw_protocol/raw_protocol/overload1.html asio/reference/generic__raw_protocol/raw_protocol/overload2.html asio/reference/generic__raw_protocol/socket.html asio/reference/generic__raw_protocol/type.html asio/reference/generic__seq_packet_protocol.html asio/reference/generic__seq_packet_protocol/endpoint.html asio/reference/generic__seq_packet_protocol/family.html asio/reference/generic__seq_packet_protocol/operator_not__eq_.html asio/reference/generic__seq_packet_protocol/operator_eq__eq_.html asio/reference/generic__seq_packet_protocol/protocol.html asio/reference/generic__seq_packet_protocol/seq_packet_protocol.html asio/reference/generic__seq_packet_protocol/seq_packet_protocol/overload1.html asio/reference/generic__seq_packet_protocol/seq_packet_protocol/overload2.html asio/reference/generic__seq_packet_protocol/socket.html asio/reference/generic__seq_packet_protocol/type.html asio/reference/generic__stream_protocol.html asio/reference/generic__stream_protocol/endpoint.html asio/reference/generic__stream_protocol/family.html asio/reference/generic__stream_protocol/iostream.html asio/reference/generic__stream_protocol/operator_not__eq_.html asio/reference/generic__stream_protocol/operator_eq__eq_.html asio/reference/generic__stream_protocol/protocol.html asio/reference/generic__stream_protocol/socket.html asio/reference/generic__stream_protocol/stream_protocol.html asio/reference/generic__stream_protocol/stream_protocol/overload1.html asio/reference/generic__stream_protocol/stream_protocol/overload2.html asio/reference/generic__stream_protocol/type.html asio/reference/get_associated_allocator.html asio/reference/get_associated_allocator/overload1.html asio/reference/get_associated_allocator/overload2.html asio/reference/get_associated_executor.html asio/reference/get_associated_executor/overload1.html asio/reference/get_associated_executor/overload2.html asio/reference/get_associated_executor/overload3.html asio/reference/handler_type.html asio/reference/handler_type/type.html asio/reference/has_service.html asio/reference/high_resolution_timer.html asio/reference/invalid_service_owner.html asio/reference/invalid_service_owner/invalid_service_owner.html asio/reference/io_context.html asio/reference/io_context/add_service.html asio/reference/io_context/count_type.html asio/reference/io_context/destroy.html asio/reference/io_context/dispatch.html asio/reference/io_context/fork_event.html asio/reference/io_context/get_executor.html asio/reference/io_context/has_service.html asio/reference/io_context/io_context.html asio/reference/io_context/io_context/overload1.html asio/reference/io_context/io_context/overload2.html asio/reference/io_context/make_service.html asio/reference/io_context/notify_fork.html asio/reference/io_context/poll.html asio/reference/io_context/poll/overload1.html asio/reference/io_context/poll/overload2.html asio/reference/io_context/poll_one.html asio/reference/io_context/poll_one/overload1.html asio/reference/io_context/poll_one/overload2.html asio/reference/io_context/post.html asio/reference/io_context/reset.html asio/reference/io_context/restart.html asio/reference/io_context/run.html asio/reference/io_context/run/overload1.html asio/reference/io_context/run/overload2.html asio/reference/io_context/run_for.html asio/reference/io_context/run_one.html asio/reference/io_context/run_one/overload1.html asio/reference/io_context/run_one/overload2.html asio/reference/io_context/run_one_for.html asio/reference/io_context/run_one_until.html asio/reference/io_context/run_until.html asio/reference/io_context/shutdown.html asio/reference/io_context/stop.html asio/reference/io_context/stopped.html asio/reference/io_context/use_service.html asio/reference/io_context/use_service/overload1.html asio/reference/io_context/use_service/overload2.html asio/reference/io_context/wrap.html asio/reference/io_context/_io_context.html asio/reference/io_context__executor_type.html asio/reference/io_context__executor_type/context.html asio/reference/io_context__executor_type/defer.html asio/reference/io_context__executor_type/dispatch.html asio/reference/io_context__executor_type/on_work_finished.html asio/reference/io_context__executor_type/on_work_started.html asio/reference/io_context__executor_type/operator_not__eq_.html asio/reference/io_context__executor_type/operator_eq__eq_.html asio/reference/io_context__executor_type/post.html asio/reference/io_context__executor_type/running_in_this_thread.html asio/reference/io_context__service.html asio/reference/io_context__service/get_io_context.html asio/reference/io_context__service/get_io_service.html asio/reference/io_context__service/service.html asio/reference/io_context__service/_service.html asio/reference/io_context__strand.html asio/reference/io_context__strand/context.html asio/reference/io_context__strand/defer.html asio/reference/io_context__strand/dispatch.html asio/reference/io_context__strand/dispatch/overload1.html asio/reference/io_context__strand/dispatch/overload2.html asio/reference/io_context__strand/get_io_context.html asio/reference/io_context__strand/get_io_service.html asio/reference/io_context__strand/on_work_finished.html asio/reference/io_context__strand/on_work_started.html asio/reference/io_context__strand/operator_not__eq_.html asio/reference/io_context__strand/operator_eq__eq_.html asio/reference/io_context__strand/post.html asio/reference/io_context__strand/post/overload1.html asio/reference/io_context__strand/post/overload2.html asio/reference/io_context__strand/running_in_this_thread.html asio/reference/io_context__strand/strand.html asio/reference/io_context__strand/wrap.html asio/reference/io_context__strand/_strand.html asio/reference/io_context__work.html asio/reference/io_context__work/get_io_context.html asio/reference/io_context__work/get_io_service.html asio/reference/io_context__work/work.html asio/reference/io_context__work/work/overload1.html asio/reference/io_context__work/work/overload2.html asio/reference/io_context__work/_work.html asio/reference/io_service.html asio/reference/ip__address.html asio/reference/ip__address/address.html asio/reference/ip__address/address/overload1.html asio/reference/ip__address/address/overload2.html asio/reference/ip__address/address/overload3.html asio/reference/ip__address/address/overload4.html asio/reference/ip__address/from_string.html asio/reference/ip__address/from_string/overload1.html asio/reference/ip__address/from_string/overload2.html asio/reference/ip__address/from_string/overload3.html asio/reference/ip__address/from_string/overload4.html asio/reference/ip__address/is_loopback.html asio/reference/ip__address/is_multicast.html asio/reference/ip__address/is_unspecified.html asio/reference/ip__address/is_v4.html asio/reference/ip__address/is_v6.html asio/reference/ip__address/make_address.html asio/reference/ip__address/make_address/overload1.html asio/reference/ip__address/make_address/overload2.html asio/reference/ip__address/make_address/overload3.html asio/reference/ip__address/make_address/overload4.html asio/reference/ip__address/make_address/overload5.html asio/reference/ip__address/make_address/overload6.html asio/reference/ip__address/operator_not__eq_.html asio/reference/ip__address/operator_lt_.html asio/reference/ip__address/operator_lt__lt_.html asio/reference/ip__address/operator_lt__eq_.html asio/reference/ip__address/operator_eq_.html asio/reference/ip__address/operator_eq_/overload1.html asio/reference/ip__address/operator_eq_/overload2.html asio/reference/ip__address/operator_eq_/overload3.html asio/reference/ip__address/operator_eq__eq_.html asio/reference/ip__address/operator_gt_.html asio/reference/ip__address/operator_gt__eq_.html asio/reference/ip__address/to_string.html asio/reference/ip__address/to_string/overload1.html asio/reference/ip__address/to_string/overload2.html asio/reference/ip__address/to_v4.html asio/reference/ip__address/to_v6.html asio/reference/ip__address_v4.html asio/reference/ip__address_v4/address_v4.html asio/reference/ip__address_v4/address_v4/overload1.html asio/reference/ip__address_v4/address_v4/overload2.html asio/reference/ip__address_v4/address_v4/overload3.html asio/reference/ip__address_v4/address_v4/overload4.html asio/reference/ip__address_v4/any.html asio/reference/ip__address_v4/broadcast.html asio/reference/ip__address_v4/broadcast/overload1.html asio/reference/ip__address_v4/broadcast/overload2.html asio/reference/ip__address_v4/bytes_type.html asio/reference/ip__address_v4/from_string.html asio/reference/ip__address_v4/from_string/overload1.html asio/reference/ip__address_v4/from_string/overload2.html asio/reference/ip__address_v4/from_string/overload3.html asio/reference/ip__address_v4/from_string/overload4.html asio/reference/ip__address_v4/is_class_a.html asio/reference/ip__address_v4/is_class_b.html asio/reference/ip__address_v4/is_class_c.html asio/reference/ip__address_v4/is_loopback.html asio/reference/ip__address_v4/is_multicast.html asio/reference/ip__address_v4/is_unspecified.html asio/reference/ip__address_v4/loopback.html asio/reference/ip__address_v4/make_address_v4.html asio/reference/ip__address_v4/make_address_v4/overload1.html asio/reference/ip__address_v4/make_address_v4/overload2.html asio/reference/ip__address_v4/make_address_v4/overload3.html asio/reference/ip__address_v4/make_address_v4/overload4.html asio/reference/ip__address_v4/make_address_v4/overload5.html asio/reference/ip__address_v4/make_address_v4/overload6.html asio/reference/ip__address_v4/make_address_v4/overload7.html asio/reference/ip__address_v4/make_address_v4/overload8.html asio/reference/ip__address_v4/make_address_v4/overload9.html asio/reference/ip__address_v4/make_network_v4.html asio/reference/ip__address_v4/make_network_v4/overload1.html asio/reference/ip__address_v4/make_network_v4/overload2.html asio/reference/ip__address_v4/netmask.html asio/reference/ip__address_v4/operator_not__eq_.html asio/reference/ip__address_v4/operator_lt_.html asio/reference/ip__address_v4/operator_lt__lt_.html asio/reference/ip__address_v4/operator_lt__lt_/overload1.html asio/reference/ip__address_v4/operator_lt__lt_/overload2.html asio/reference/ip__address_v4/operator_lt__eq_.html asio/reference/ip__address_v4/operator_eq_.html asio/reference/ip__address_v4/operator_eq__eq_.html asio/reference/ip__address_v4/operator_gt_.html asio/reference/ip__address_v4/operator_gt__eq_.html asio/reference/ip__address_v4/to_bytes.html asio/reference/ip__address_v4/to_string.html asio/reference/ip__address_v4/to_string/overload1.html asio/reference/ip__address_v4/to_string/overload2.html asio/reference/ip__address_v4/to_uint.html asio/reference/ip__address_v4/to_ulong.html asio/reference/ip__address_v4/uint_type.html asio/reference/ip__address_v4_iterator.html asio/reference/ip__address_v4_range.html asio/reference/ip__address_v6.html asio/reference/ip__address_v6/address_v6.html asio/reference/ip__address_v6/address_v6/overload1.html asio/reference/ip__address_v6/address_v6/overload2.html asio/reference/ip__address_v6/address_v6/overload3.html asio/reference/ip__address_v6/any.html asio/reference/ip__address_v6/bytes_type.html asio/reference/ip__address_v6/from_string.html asio/reference/ip__address_v6/from_string/overload1.html asio/reference/ip__address_v6/from_string/overload2.html asio/reference/ip__address_v6/from_string/overload3.html asio/reference/ip__address_v6/from_string/overload4.html asio/reference/ip__address_v6/is_link_local.html asio/reference/ip__address_v6/is_loopback.html asio/reference/ip__address_v6/is_multicast.html asio/reference/ip__address_v6/is_multicast_global.html asio/reference/ip__address_v6/is_multicast_link_local.html asio/reference/ip__address_v6/is_multicast_node_local.html asio/reference/ip__address_v6/is_multicast_org_local.html asio/reference/ip__address_v6/is_multicast_site_local.html asio/reference/ip__address_v6/is_site_local.html asio/reference/ip__address_v6/is_unspecified.html asio/reference/ip__address_v6/is_v4_compatible.html asio/reference/ip__address_v6/is_v4_mapped.html asio/reference/ip__address_v6/loopback.html asio/reference/ip__address_v6/make_address_v6.html asio/reference/ip__address_v6/make_address_v6/overload1.html asio/reference/ip__address_v6/make_address_v6/overload2.html asio/reference/ip__address_v6/make_address_v6/overload3.html asio/reference/ip__address_v6/make_address_v6/overload4.html asio/reference/ip__address_v6/make_address_v6/overload5.html asio/reference/ip__address_v6/make_address_v6/overload6.html asio/reference/ip__address_v6/make_address_v6/overload7.html asio/reference/ip__address_v6/make_address_v6/overload8.html asio/reference/ip__address_v6/make_network_v6.html asio/reference/ip__address_v6/operator_not__eq_.html asio/reference/ip__address_v6/operator_lt_.html asio/reference/ip__address_v6/operator_lt__lt_.html asio/reference/ip__address_v6/operator_lt__lt_/overload1.html asio/reference/ip__address_v6/operator_lt__lt_/overload2.html asio/reference/ip__address_v6/operator_lt__eq_.html asio/reference/ip__address_v6/operator_eq_.html asio/reference/ip__address_v6/operator_eq__eq_.html asio/reference/ip__address_v6/operator_gt_.html asio/reference/ip__address_v6/operator_gt__eq_.html asio/reference/ip__address_v6/scope_id.html asio/reference/ip__address_v6/scope_id/overload1.html asio/reference/ip__address_v6/scope_id/overload2.html asio/reference/ip__address_v6/to_bytes.html asio/reference/ip__address_v6/to_string.html asio/reference/ip__address_v6/to_string/overload1.html asio/reference/ip__address_v6/to_string/overload2.html asio/reference/ip__address_v6/to_v4.html asio/reference/ip__address_v6/v4_compatible.html asio/reference/ip__address_v6/v4_mapped.html asio/reference/ip__address_v6_iterator.html asio/reference/ip__address_v6_range.html asio/reference/ip__bad_address_cast.html asio/reference/ip__bad_address_cast/bad_address_cast.html asio/reference/ip__bad_address_cast/what.html asio/reference/ip__bad_address_cast/_bad_address_cast.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/basic_address_iterator.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/basic_address_iterator/overload1.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/basic_address_iterator/overload2.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/difference_type.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/iterator_category.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator__star_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_not__eq_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_plus__plus_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_plus__plus_/overload1.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_plus__plus_/overload2.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_minus__minus_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_minus__minus_/overload1.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_minus__minus_/overload2.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_arrow_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_eq_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/operator_eq__eq_.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/pointer.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/reference.html asio/reference/ip__basic_address_iterator_lt__address_v4__gt_/value_type.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/basic_address_iterator.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/basic_address_iterator/overload1.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/basic_address_iterator/overload2.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/difference_type.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/iterator_category.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator__star_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_not__eq_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_plus__plus_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_plus__plus_/overload1.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_plus__plus_/overload2.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_minus__minus_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_minus__minus_/overload1.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_minus__minus_/overload2.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_arrow_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_eq_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/operator_eq__eq_.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/pointer.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/reference.html asio/reference/ip__basic_address_iterator_lt__address_v6__gt_/value_type.html asio/reference/ip__basic_address_range_lt__address_v4__gt_.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range/overload1.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range/overload2.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/basic_address_range/overload3.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/begin.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/empty.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/end.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/find.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/iterator.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/operator_eq_.html asio/reference/ip__basic_address_range_lt__address_v4__gt_/size.html asio/reference/ip__basic_address_range_lt__address_v6__gt_.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range/overload1.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range/overload2.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/basic_address_range/overload3.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/begin.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/empty.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/end.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/find.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/iterator.html asio/reference/ip__basic_address_range_lt__address_v6__gt_/operator_eq_.html asio/reference/ip__basic_endpoint.html asio/reference/ip__basic_endpoint/address.html asio/reference/ip__basic_endpoint/address/overload1.html asio/reference/ip__basic_endpoint/address/overload2.html asio/reference/ip__basic_endpoint/basic_endpoint.html asio/reference/ip__basic_endpoint/basic_endpoint/overload1.html asio/reference/ip__basic_endpoint/basic_endpoint/overload2.html asio/reference/ip__basic_endpoint/basic_endpoint/overload3.html asio/reference/ip__basic_endpoint/basic_endpoint/overload4.html asio/reference/ip__basic_endpoint/basic_endpoint/overload5.html asio/reference/ip__basic_endpoint/capacity.html asio/reference/ip__basic_endpoint/data.html asio/reference/ip__basic_endpoint/data/overload1.html asio/reference/ip__basic_endpoint/data/overload2.html asio/reference/ip__basic_endpoint/data_type.html asio/reference/ip__basic_endpoint/operator_not__eq_.html asio/reference/ip__basic_endpoint/operator_lt_.html asio/reference/ip__basic_endpoint/operator_lt__lt_.html asio/reference/ip__basic_endpoint/operator_lt__eq_.html asio/reference/ip__basic_endpoint/operator_eq_.html asio/reference/ip__basic_endpoint/operator_eq_/overload1.html asio/reference/ip__basic_endpoint/operator_eq_/overload2.html asio/reference/ip__basic_endpoint/operator_eq__eq_.html asio/reference/ip__basic_endpoint/operator_gt_.html asio/reference/ip__basic_endpoint/operator_gt__eq_.html asio/reference/ip__basic_endpoint/port.html asio/reference/ip__basic_endpoint/port/overload1.html asio/reference/ip__basic_endpoint/port/overload2.html asio/reference/ip__basic_endpoint/protocol.html asio/reference/ip__basic_endpoint/protocol_type.html asio/reference/ip__basic_endpoint/resize.html asio/reference/ip__basic_endpoint/size.html asio/reference/ip__basic_resolver.html asio/reference/ip__basic_resolver/address_configured.html asio/reference/ip__basic_resolver/all_matching.html asio/reference/ip__basic_resolver/async_resolve.html asio/reference/ip__basic_resolver/async_resolve/overload1.html asio/reference/ip__basic_resolver/async_resolve/overload2.html asio/reference/ip__basic_resolver/async_resolve/overload3.html asio/reference/ip__basic_resolver/async_resolve/overload4.html asio/reference/ip__basic_resolver/async_resolve/overload5.html asio/reference/ip__basic_resolver/async_resolve/overload6.html asio/reference/ip__basic_resolver/basic_resolver.html asio/reference/ip__basic_resolver/basic_resolver/overload1.html asio/reference/ip__basic_resolver/basic_resolver/overload2.html asio/reference/ip__basic_resolver/cancel.html asio/reference/ip__basic_resolver/canonical_name.html asio/reference/ip__basic_resolver/endpoint_type.html asio/reference/ip__basic_resolver/executor_type.html asio/reference/ip__basic_resolver/flags.html asio/reference/ip__basic_resolver/get_executor.html asio/reference/ip__basic_resolver/get_io_context.html asio/reference/ip__basic_resolver/get_io_service.html asio/reference/ip__basic_resolver/iterator.html asio/reference/ip__basic_resolver/numeric_host.html asio/reference/ip__basic_resolver/numeric_service.html asio/reference/ip__basic_resolver/operator_eq_.html asio/reference/ip__basic_resolver/passive.html asio/reference/ip__basic_resolver/protocol_type.html asio/reference/ip__basic_resolver/query.html asio/reference/ip__basic_resolver/resolve.html asio/reference/ip__basic_resolver/resolve/overload1.html asio/reference/ip__basic_resolver/resolve/overload2.html asio/reference/ip__basic_resolver/resolve/overload3.html asio/reference/ip__basic_resolver/resolve/overload4.html asio/reference/ip__basic_resolver/resolve/overload5.html asio/reference/ip__basic_resolver/resolve/overload6.html asio/reference/ip__basic_resolver/resolve/overload7.html asio/reference/ip__basic_resolver/resolve/overload8.html asio/reference/ip__basic_resolver/resolve/overload9.html asio/reference/ip__basic_resolver/resolve/overload10.html asio/reference/ip__basic_resolver/resolve/overload11.html asio/reference/ip__basic_resolver/resolve/overload12.html asio/reference/ip__basic_resolver/results_type.html asio/reference/ip__basic_resolver/v4_mapped.html asio/reference/ip__basic_resolver/_basic_resolver.html asio/reference/ip__basic_resolver_entry.html asio/reference/ip__basic_resolver_entry/basic_resolver_entry.html asio/reference/ip__basic_resolver_entry/basic_resolver_entry/overload1.html asio/reference/ip__basic_resolver_entry/basic_resolver_entry/overload2.html asio/reference/ip__basic_resolver_entry/endpoint.html asio/reference/ip__basic_resolver_entry/endpoint_type.html asio/reference/ip__basic_resolver_entry/host_name.html asio/reference/ip__basic_resolver_entry/host_name/overload1.html asio/reference/ip__basic_resolver_entry/host_name/overload2.html asio/reference/ip__basic_resolver_entry/operator_endpoint_type.html asio/reference/ip__basic_resolver_entry/protocol_type.html asio/reference/ip__basic_resolver_entry/service_name.html asio/reference/ip__basic_resolver_entry/service_name/overload1.html asio/reference/ip__basic_resolver_entry/service_name/overload2.html asio/reference/ip__basic_resolver_iterator.html asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator.html asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/overload1.html asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/overload2.html asio/reference/ip__basic_resolver_iterator/basic_resolver_iterator/overload3.html asio/reference/ip__basic_resolver_iterator/dereference.html asio/reference/ip__basic_resolver_iterator/difference_type.html asio/reference/ip__basic_resolver_iterator/equal.html asio/reference/ip__basic_resolver_iterator/increment.html asio/reference/ip__basic_resolver_iterator/index_.html asio/reference/ip__basic_resolver_iterator/iterator_category.html asio/reference/ip__basic_resolver_iterator/operator__star_.html asio/reference/ip__basic_resolver_iterator/operator_not__eq_.html asio/reference/ip__basic_resolver_iterator/operator_plus__plus_.html asio/reference/ip__basic_resolver_iterator/operator_plus__plus_/overload1.html asio/reference/ip__basic_resolver_iterator/operator_plus__plus_/overload2.html asio/reference/ip__basic_resolver_iterator/operator_arrow_.html asio/reference/ip__basic_resolver_iterator/operator_eq_.html asio/reference/ip__basic_resolver_iterator/operator_eq_/overload1.html asio/reference/ip__basic_resolver_iterator/operator_eq_/overload2.html asio/reference/ip__basic_resolver_iterator/operator_eq__eq_.html asio/reference/ip__basic_resolver_iterator/pointer.html asio/reference/ip__basic_resolver_iterator/reference.html asio/reference/ip__basic_resolver_iterator/value_type.html asio/reference/ip__basic_resolver_iterator/values_.html asio/reference/ip__basic_resolver_query.html asio/reference/ip__basic_resolver_query/address_configured.html asio/reference/ip__basic_resolver_query/all_matching.html asio/reference/ip__basic_resolver_query/basic_resolver_query.html asio/reference/ip__basic_resolver_query/basic_resolver_query/overload1.html asio/reference/ip__basic_resolver_query/basic_resolver_query/overload2.html asio/reference/ip__basic_resolver_query/basic_resolver_query/overload3.html asio/reference/ip__basic_resolver_query/basic_resolver_query/overload4.html asio/reference/ip__basic_resolver_query/canonical_name.html asio/reference/ip__basic_resolver_query/flags.html asio/reference/ip__basic_resolver_query/hints.html asio/reference/ip__basic_resolver_query/host_name.html asio/reference/ip__basic_resolver_query/numeric_host.html asio/reference/ip__basic_resolver_query/numeric_service.html asio/reference/ip__basic_resolver_query/passive.html asio/reference/ip__basic_resolver_query/protocol_type.html asio/reference/ip__basic_resolver_query/service_name.html asio/reference/ip__basic_resolver_query/v4_mapped.html asio/reference/ip__basic_resolver_results.html asio/reference/ip__basic_resolver_results/basic_resolver_results.html asio/reference/ip__basic_resolver_results/basic_resolver_results/overload1.html asio/reference/ip__basic_resolver_results/basic_resolver_results/overload2.html asio/reference/ip__basic_resolver_results/basic_resolver_results/overload3.html asio/reference/ip__basic_resolver_results/begin.html asio/reference/ip__basic_resolver_results/cbegin.html asio/reference/ip__basic_resolver_results/cend.html asio/reference/ip__basic_resolver_results/const_iterator.html asio/reference/ip__basic_resolver_results/const_reference.html asio/reference/ip__basic_resolver_results/dereference.html asio/reference/ip__basic_resolver_results/difference_type.html asio/reference/ip__basic_resolver_results/empty.html asio/reference/ip__basic_resolver_results/end.html asio/reference/ip__basic_resolver_results/endpoint_type.html asio/reference/ip__basic_resolver_results/equal.html asio/reference/ip__basic_resolver_results/increment.html asio/reference/ip__basic_resolver_results/index_.html asio/reference/ip__basic_resolver_results/iterator.html asio/reference/ip__basic_resolver_results/iterator_category.html asio/reference/ip__basic_resolver_results/max_size.html asio/reference/ip__basic_resolver_results/operator__star_.html asio/reference/ip__basic_resolver_results/operator_not__eq_.html asio/reference/ip__basic_resolver_results/operator_not__eq_/overload1.html asio/reference/ip__basic_resolver_results/operator_not__eq_/overload2.html asio/reference/ip__basic_resolver_results/operator_plus__plus_.html asio/reference/ip__basic_resolver_results/operator_plus__plus_/overload1.html asio/reference/ip__basic_resolver_results/operator_plus__plus_/overload2.html asio/reference/ip__basic_resolver_results/operator_arrow_.html asio/reference/ip__basic_resolver_results/operator_eq_.html asio/reference/ip__basic_resolver_results/operator_eq_/overload1.html asio/reference/ip__basic_resolver_results/operator_eq_/overload2.html asio/reference/ip__basic_resolver_results/operator_eq__eq_.html asio/reference/ip__basic_resolver_results/operator_eq__eq_/overload1.html asio/reference/ip__basic_resolver_results/operator_eq__eq_/overload2.html asio/reference/ip__basic_resolver_results/pointer.html asio/reference/ip__basic_resolver_results/protocol_type.html asio/reference/ip__basic_resolver_results/reference.html asio/reference/ip__basic_resolver_results/size.html asio/reference/ip__basic_resolver_results/size_type.html asio/reference/ip__basic_resolver_results/swap.html asio/reference/ip__basic_resolver_results/value_type.html asio/reference/ip__basic_resolver_results/values_.html asio/reference/ip__host_name.html asio/reference/ip__host_name/overload1.html asio/reference/ip__host_name/overload2.html asio/reference/ip__icmp.html asio/reference/ip__icmp/endpoint.html asio/reference/ip__icmp/family.html asio/reference/ip__icmp/operator_not__eq_.html asio/reference/ip__icmp/operator_eq__eq_.html asio/reference/ip__icmp/protocol.html asio/reference/ip__icmp/resolver.html asio/reference/ip__icmp/socket.html asio/reference/ip__icmp/type.html asio/reference/ip__icmp/v4.html asio/reference/ip__icmp/v6.html asio/reference/ip__multicast__enable_loopback.html asio/reference/ip__multicast__hops.html asio/reference/ip__multicast__join_group.html asio/reference/ip__multicast__leave_group.html asio/reference/ip__multicast__outbound_interface.html asio/reference/ip__network_v4.html asio/reference/ip__network_v4/address.html asio/reference/ip__network_v4/broadcast.html asio/reference/ip__network_v4/canonical.html asio/reference/ip__network_v4/hosts.html asio/reference/ip__network_v4/is_host.html asio/reference/ip__network_v4/is_subnet_of.html asio/reference/ip__network_v4/make_network_v4.html asio/reference/ip__network_v4/make_network_v4/overload1.html asio/reference/ip__network_v4/make_network_v4/overload2.html asio/reference/ip__network_v4/make_network_v4/overload3.html asio/reference/ip__network_v4/make_network_v4/overload4.html asio/reference/ip__network_v4/make_network_v4/overload5.html asio/reference/ip__network_v4/make_network_v4/overload6.html asio/reference/ip__network_v4/netmask.html asio/reference/ip__network_v4/network.html asio/reference/ip__network_v4/network_v4.html asio/reference/ip__network_v4/network_v4/overload1.html asio/reference/ip__network_v4/network_v4/overload2.html asio/reference/ip__network_v4/network_v4/overload3.html asio/reference/ip__network_v4/network_v4/overload4.html asio/reference/ip__network_v4/operator_not__eq_.html asio/reference/ip__network_v4/operator_eq_.html asio/reference/ip__network_v4/operator_eq__eq_.html asio/reference/ip__network_v4/prefix_length.html asio/reference/ip__network_v4/to_string.html asio/reference/ip__network_v4/to_string/overload1.html asio/reference/ip__network_v4/to_string/overload2.html asio/reference/ip__network_v6.html asio/reference/ip__network_v6/address.html asio/reference/ip__network_v6/canonical.html asio/reference/ip__network_v6/hosts.html asio/reference/ip__network_v6/is_host.html asio/reference/ip__network_v6/is_subnet_of.html asio/reference/ip__network_v6/make_network_v6.html asio/reference/ip__network_v6/make_network_v6/overload1.html asio/reference/ip__network_v6/make_network_v6/overload2.html asio/reference/ip__network_v6/make_network_v6/overload3.html asio/reference/ip__network_v6/make_network_v6/overload4.html asio/reference/ip__network_v6/make_network_v6/overload5.html asio/reference/ip__network_v6/make_network_v6/overload6.html asio/reference/ip__network_v6/network.html asio/reference/ip__network_v6/network_v6.html asio/reference/ip__network_v6/network_v6/overload1.html asio/reference/ip__network_v6/network_v6/overload2.html asio/reference/ip__network_v6/network_v6/overload3.html asio/reference/ip__network_v6/operator_not__eq_.html asio/reference/ip__network_v6/operator_eq_.html asio/reference/ip__network_v6/operator_eq__eq_.html asio/reference/ip__network_v6/prefix_length.html asio/reference/ip__network_v6/to_string.html asio/reference/ip__network_v6/to_string/overload1.html asio/reference/ip__network_v6/to_string/overload2.html asio/reference/ip__resolver_base.html asio/reference/ip__resolver_base/address_configured.html asio/reference/ip__resolver_base/all_matching.html asio/reference/ip__resolver_base/canonical_name.html asio/reference/ip__resolver_base/flags.html asio/reference/ip__resolver_base/numeric_host.html asio/reference/ip__resolver_base/numeric_service.html asio/reference/ip__resolver_base/passive.html asio/reference/ip__resolver_base/v4_mapped.html asio/reference/ip__resolver_base/_resolver_base.html asio/reference/ip__resolver_query_base.html asio/reference/ip__resolver_query_base/address_configured.html asio/reference/ip__resolver_query_base/all_matching.html asio/reference/ip__resolver_query_base/canonical_name.html asio/reference/ip__resolver_query_base/flags.html asio/reference/ip__resolver_query_base/numeric_host.html asio/reference/ip__resolver_query_base/numeric_service.html asio/reference/ip__resolver_query_base/passive.html asio/reference/ip__resolver_query_base/v4_mapped.html asio/reference/ip__resolver_query_base/_resolver_query_base.html asio/reference/ip__tcp.html asio/reference/ip__tcp/acceptor.html asio/reference/ip__tcp/endpoint.html asio/reference/ip__tcp/family.html asio/reference/ip__tcp/iostream.html asio/reference/ip__tcp/no_delay.html asio/reference/ip__tcp/operator_not__eq_.html asio/reference/ip__tcp/operator_eq__eq_.html asio/reference/ip__tcp/protocol.html asio/reference/ip__tcp/resolver.html asio/reference/ip__tcp/socket.html asio/reference/ip__tcp/type.html asio/reference/ip__tcp/v4.html asio/reference/ip__tcp/v6.html asio/reference/ip__udp.html asio/reference/ip__udp/endpoint.html asio/reference/ip__udp/family.html asio/reference/ip__udp/operator_not__eq_.html asio/reference/ip__udp/operator_eq__eq_.html asio/reference/ip__udp/protocol.html asio/reference/ip__udp/resolver.html asio/reference/ip__udp/socket.html asio/reference/ip__udp/type.html asio/reference/ip__udp/v4.html asio/reference/ip__udp/v6.html asio/reference/ip__unicast__hops.html asio/reference/ip__v4_mapped_t.html asio/reference/ip__v6_only.html asio/reference/is_const_buffer_sequence.html asio/reference/is_dynamic_buffer.html asio/reference/is_endpoint_sequence.html asio/reference/is_endpoint_sequence/value.html asio/reference/is_executor.html asio/reference/is_match_condition.html asio/reference/is_match_condition/value.html asio/reference/is_mutable_buffer_sequence.html asio/reference/is_read_buffered.html asio/reference/is_read_buffered/value.html asio/reference/is_write_buffered.html asio/reference/is_write_buffered/value.html asio/reference/local__basic_endpoint.html asio/reference/local__basic_endpoint/basic_endpoint.html asio/reference/local__basic_endpoint/basic_endpoint/overload1.html asio/reference/local__basic_endpoint/basic_endpoint/overload2.html asio/reference/local__basic_endpoint/basic_endpoint/overload3.html asio/reference/local__basic_endpoint/basic_endpoint/overload4.html asio/reference/local__basic_endpoint/capacity.html asio/reference/local__basic_endpoint/data.html asio/reference/local__basic_endpoint/data/overload1.html asio/reference/local__basic_endpoint/data/overload2.html asio/reference/local__basic_endpoint/data_type.html asio/reference/local__basic_endpoint/operator_not__eq_.html asio/reference/local__basic_endpoint/operator_lt_.html asio/reference/local__basic_endpoint/operator_lt__lt_.html asio/reference/local__basic_endpoint/operator_lt__eq_.html asio/reference/local__basic_endpoint/operator_eq_.html asio/reference/local__basic_endpoint/operator_eq__eq_.html asio/reference/local__basic_endpoint/operator_gt_.html asio/reference/local__basic_endpoint/operator_gt__eq_.html asio/reference/local__basic_endpoint/path.html asio/reference/local__basic_endpoint/path/overload1.html asio/reference/local__basic_endpoint/path/overload2.html asio/reference/local__basic_endpoint/path/overload3.html asio/reference/local__basic_endpoint/protocol.html asio/reference/local__basic_endpoint/protocol_type.html asio/reference/local__basic_endpoint/resize.html asio/reference/local__basic_endpoint/size.html asio/reference/local__connect_pair.html asio/reference/local__connect_pair/overload1.html asio/reference/local__connect_pair/overload2.html asio/reference/local__datagram_protocol.html asio/reference/local__datagram_protocol/endpoint.html asio/reference/local__datagram_protocol/family.html asio/reference/local__datagram_protocol/protocol.html asio/reference/local__datagram_protocol/socket.html asio/reference/local__datagram_protocol/type.html asio/reference/local__stream_protocol.html asio/reference/local__stream_protocol/acceptor.html asio/reference/local__stream_protocol/endpoint.html asio/reference/local__stream_protocol/family.html asio/reference/local__stream_protocol/iostream.html asio/reference/local__stream_protocol/protocol.html asio/reference/local__stream_protocol/socket.html asio/reference/local__stream_protocol/type.html asio/reference/make_work_guard.html asio/reference/make_work_guard/overload1.html asio/reference/make_work_guard/overload2.html asio/reference/make_work_guard/overload3.html asio/reference/make_work_guard/overload4.html asio/reference/make_work_guard/overload5.html asio/reference/mutable_buffer.html asio/reference/mutable_buffer/data.html asio/reference/mutable_buffer/mutable_buffer.html asio/reference/mutable_buffer/mutable_buffer/overload1.html asio/reference/mutable_buffer/mutable_buffer/overload2.html asio/reference/mutable_buffer/operator_plus_.html asio/reference/mutable_buffer/operator_plus_/overload1.html asio/reference/mutable_buffer/operator_plus_/overload2.html asio/reference/mutable_buffer/operator_plus__eq_.html asio/reference/mutable_buffer/size.html asio/reference/mutable_buffers_1.html asio/reference/mutable_buffers_1/begin.html asio/reference/mutable_buffers_1/const_iterator.html asio/reference/mutable_buffers_1/data.html asio/reference/mutable_buffers_1/end.html asio/reference/mutable_buffers_1/mutable_buffers_1.html asio/reference/mutable_buffers_1/mutable_buffers_1/overload1.html asio/reference/mutable_buffers_1/mutable_buffers_1/overload2.html asio/reference/mutable_buffers_1/operator_plus_.html asio/reference/mutable_buffers_1/operator_plus_/overload1.html asio/reference/mutable_buffers_1/operator_plus_/overload2.html asio/reference/mutable_buffers_1/operator_plus__eq_.html asio/reference/mutable_buffers_1/size.html asio/reference/mutable_buffers_1/value_type.html asio/reference/null_buffers.html asio/reference/null_buffers/begin.html asio/reference/null_buffers/const_iterator.html asio/reference/null_buffers/end.html asio/reference/null_buffers/value_type.html asio/reference/operator_lt__lt_.html asio/reference/placeholders__bytes_transferred.html asio/reference/placeholders__endpoint.html asio/reference/placeholders__error.html asio/reference/placeholders__iterator.html asio/reference/placeholders__results.html asio/reference/placeholders__signal_number.html asio/reference/posix__descriptor.html asio/reference/posix__descriptor/assign.html asio/reference/posix__descriptor/assign/overload1.html asio/reference/posix__descriptor/assign/overload2.html asio/reference/posix__descriptor/async_wait.html asio/reference/posix__descriptor/bytes_readable.html asio/reference/posix__descriptor/cancel.html asio/reference/posix__descriptor/cancel/overload1.html asio/reference/posix__descriptor/cancel/overload2.html asio/reference/posix__descriptor/close.html asio/reference/posix__descriptor/close/overload1.html asio/reference/posix__descriptor/close/overload2.html asio/reference/posix__descriptor/descriptor.html asio/reference/posix__descriptor/descriptor/overload1.html asio/reference/posix__descriptor/descriptor/overload2.html asio/reference/posix__descriptor/descriptor/overload3.html asio/reference/posix__descriptor/executor_type.html asio/reference/posix__descriptor/get_executor.html asio/reference/posix__descriptor/get_io_context.html asio/reference/posix__descriptor/get_io_service.html asio/reference/posix__descriptor/io_control.html asio/reference/posix__descriptor/io_control/overload1.html asio/reference/posix__descriptor/io_control/overload2.html asio/reference/posix__descriptor/is_open.html asio/reference/posix__descriptor/lowest_layer.html asio/reference/posix__descriptor/lowest_layer/overload1.html asio/reference/posix__descriptor/lowest_layer/overload2.html asio/reference/posix__descriptor/lowest_layer_type.html asio/reference/posix__descriptor/native_handle.html asio/reference/posix__descriptor/native_handle_type.html asio/reference/posix__descriptor/native_non_blocking.html asio/reference/posix__descriptor/native_non_blocking/overload1.html asio/reference/posix__descriptor/native_non_blocking/overload2.html asio/reference/posix__descriptor/native_non_blocking/overload3.html asio/reference/posix__descriptor/non_blocking.html asio/reference/posix__descriptor/non_blocking/overload1.html asio/reference/posix__descriptor/non_blocking/overload2.html asio/reference/posix__descriptor/non_blocking/overload3.html asio/reference/posix__descriptor/operator_eq_.html asio/reference/posix__descriptor/release.html asio/reference/posix__descriptor/wait.html asio/reference/posix__descriptor/wait/overload1.html asio/reference/posix__descriptor/wait/overload2.html asio/reference/posix__descriptor/wait_type.html asio/reference/posix__descriptor/_descriptor.html asio/reference/posix__descriptor_base.html asio/reference/posix__descriptor_base/bytes_readable.html asio/reference/posix__descriptor_base/wait_type.html asio/reference/posix__descriptor_base/_descriptor_base.html asio/reference/posix__stream_descriptor.html asio/reference/posix__stream_descriptor/assign.html asio/reference/posix__stream_descriptor/assign/overload1.html asio/reference/posix__stream_descriptor/assign/overload2.html asio/reference/posix__stream_descriptor/async_read_some.html asio/reference/posix__stream_descriptor/async_wait.html asio/reference/posix__stream_descriptor/async_write_some.html asio/reference/posix__stream_descriptor/bytes_readable.html asio/reference/posix__stream_descriptor/cancel.html asio/reference/posix__stream_descriptor/cancel/overload1.html asio/reference/posix__stream_descriptor/cancel/overload2.html asio/reference/posix__stream_descriptor/close.html asio/reference/posix__stream_descriptor/close/overload1.html asio/reference/posix__stream_descriptor/close/overload2.html asio/reference/posix__stream_descriptor/executor_type.html asio/reference/posix__stream_descriptor/get_executor.html asio/reference/posix__stream_descriptor/get_io_context.html asio/reference/posix__stream_descriptor/get_io_service.html asio/reference/posix__stream_descriptor/io_control.html asio/reference/posix__stream_descriptor/io_control/overload1.html asio/reference/posix__stream_descriptor/io_control/overload2.html asio/reference/posix__stream_descriptor/is_open.html asio/reference/posix__stream_descriptor/lowest_layer.html asio/reference/posix__stream_descriptor/lowest_layer/overload1.html asio/reference/posix__stream_descriptor/lowest_layer/overload2.html asio/reference/posix__stream_descriptor/lowest_layer_type.html asio/reference/posix__stream_descriptor/native_handle.html asio/reference/posix__stream_descriptor/native_handle_type.html asio/reference/posix__stream_descriptor/native_non_blocking.html asio/reference/posix__stream_descriptor/native_non_blocking/overload1.html asio/reference/posix__stream_descriptor/native_non_blocking/overload2.html asio/reference/posix__stream_descriptor/native_non_blocking/overload3.html asio/reference/posix__stream_descriptor/non_blocking.html asio/reference/posix__stream_descriptor/non_blocking/overload1.html asio/reference/posix__stream_descriptor/non_blocking/overload2.html asio/reference/posix__stream_descriptor/non_blocking/overload3.html asio/reference/posix__stream_descriptor/operator_eq_.html asio/reference/posix__stream_descriptor/read_some.html asio/reference/posix__stream_descriptor/read_some/overload1.html asio/reference/posix__stream_descriptor/read_some/overload2.html asio/reference/posix__stream_descriptor/release.html asio/reference/posix__stream_descriptor/stream_descriptor.html asio/reference/posix__stream_descriptor/stream_descriptor/overload1.html asio/reference/posix__stream_descriptor/stream_descriptor/overload2.html asio/reference/posix__stream_descriptor/stream_descriptor/overload3.html asio/reference/posix__stream_descriptor/wait.html asio/reference/posix__stream_descriptor/wait/overload1.html asio/reference/posix__stream_descriptor/wait/overload2.html asio/reference/posix__stream_descriptor/wait_type.html asio/reference/posix__stream_descriptor/write_some.html asio/reference/posix__stream_descriptor/write_some/overload1.html asio/reference/posix__stream_descriptor/write_some/overload2.html asio/reference/post.html asio/reference/post/overload1.html asio/reference/post/overload2.html asio/reference/post/overload3.html asio/reference/read.html asio/reference/read/overload1.html asio/reference/read/overload2.html asio/reference/read/overload3.html asio/reference/read/overload4.html asio/reference/read/overload5.html asio/reference/read/overload6.html asio/reference/read/overload7.html asio/reference/read/overload8.html asio/reference/read/overload9.html asio/reference/read/overload10.html asio/reference/read/overload11.html asio/reference/read/overload12.html asio/reference/read_at.html asio/reference/read_at/overload1.html asio/reference/read_at/overload2.html asio/reference/read_at/overload3.html asio/reference/read_at/overload4.html asio/reference/read_at/overload5.html asio/reference/read_at/overload6.html asio/reference/read_at/overload7.html asio/reference/read_at/overload8.html asio/reference/read_until.html asio/reference/read_until/overload1.html asio/reference/read_until/overload2.html asio/reference/read_until/overload3.html asio/reference/read_until/overload4.html asio/reference/read_until/overload5.html asio/reference/read_until/overload6.html asio/reference/read_until/overload7.html asio/reference/read_until/overload8.html asio/reference/read_until/overload9.html asio/reference/read_until/overload10.html asio/reference/read_until/overload11.html asio/reference/read_until/overload12.html asio/reference/read_until/overload13.html asio/reference/read_until/overload14.html asio/reference/read_until/overload15.html asio/reference/read_until/overload16.html asio/reference/resolver_errc__try_again.html asio/reference/serial_port.html asio/reference/serial_port/assign.html asio/reference/serial_port/assign/overload1.html asio/reference/serial_port/assign/overload2.html asio/reference/serial_port/async_read_some.html asio/reference/serial_port/async_write_some.html asio/reference/serial_port/cancel.html asio/reference/serial_port/cancel/overload1.html asio/reference/serial_port/cancel/overload2.html asio/reference/serial_port/close.html asio/reference/serial_port/close/overload1.html asio/reference/serial_port/close/overload2.html asio/reference/serial_port/executor_type.html asio/reference/serial_port/get_executor.html asio/reference/serial_port/get_io_context.html asio/reference/serial_port/get_io_service.html asio/reference/serial_port/get_option.html asio/reference/serial_port/get_option/overload1.html asio/reference/serial_port/get_option/overload2.html asio/reference/serial_port/is_open.html asio/reference/serial_port/lowest_layer.html asio/reference/serial_port/lowest_layer/overload1.html asio/reference/serial_port/lowest_layer/overload2.html asio/reference/serial_port/lowest_layer_type.html asio/reference/serial_port/native_handle.html asio/reference/serial_port/native_handle_type.html asio/reference/serial_port/open.html asio/reference/serial_port/open/overload1.html asio/reference/serial_port/open/overload2.html asio/reference/serial_port/operator_eq_.html asio/reference/serial_port/read_some.html asio/reference/serial_port/read_some/overload1.html asio/reference/serial_port/read_some/overload2.html asio/reference/serial_port/send_break.html asio/reference/serial_port/send_break/overload1.html asio/reference/serial_port/send_break/overload2.html asio/reference/serial_port/serial_port.html asio/reference/serial_port/serial_port/overload1.html asio/reference/serial_port/serial_port/overload2.html asio/reference/serial_port/serial_port/overload3.html asio/reference/serial_port/serial_port/overload4.html asio/reference/serial_port/serial_port/overload5.html asio/reference/serial_port/set_option.html asio/reference/serial_port/set_option/overload1.html asio/reference/serial_port/set_option/overload2.html asio/reference/serial_port/write_some.html asio/reference/serial_port/write_some/overload1.html asio/reference/serial_port/write_some/overload2.html asio/reference/serial_port/_serial_port.html asio/reference/serial_port_base.html asio/reference/serial_port_base/_serial_port_base.html asio/reference/serial_port_base__baud_rate.html asio/reference/serial_port_base__baud_rate/baud_rate.html asio/reference/serial_port_base__baud_rate/load.html asio/reference/serial_port_base__baud_rate/store.html asio/reference/serial_port_base__baud_rate/value.html asio/reference/serial_port_base__character_size.html asio/reference/serial_port_base__character_size/character_size.html asio/reference/serial_port_base__character_size/load.html asio/reference/serial_port_base__character_size/store.html asio/reference/serial_port_base__character_size/value.html asio/reference/serial_port_base__flow_control.html asio/reference/serial_port_base__flow_control/flow_control.html asio/reference/serial_port_base__flow_control/load.html asio/reference/serial_port_base__flow_control/store.html asio/reference/serial_port_base__flow_control/type.html asio/reference/serial_port_base__flow_control/value.html asio/reference/serial_port_base__parity.html asio/reference/serial_port_base__parity/load.html asio/reference/serial_port_base__parity/parity.html asio/reference/serial_port_base__parity/store.html asio/reference/serial_port_base__parity/type.html asio/reference/serial_port_base__parity/value.html asio/reference/serial_port_base__stop_bits.html asio/reference/serial_port_base__stop_bits/load.html asio/reference/serial_port_base__stop_bits/stop_bits.html asio/reference/serial_port_base__stop_bits/store.html asio/reference/serial_port_base__stop_bits/type.html asio/reference/serial_port_base__stop_bits/value.html asio/reference/service_already_exists.html asio/reference/service_already_exists/service_already_exists.html asio/reference/signal_set.html asio/reference/signal_set/add.html asio/reference/signal_set/add/overload1.html asio/reference/signal_set/add/overload2.html asio/reference/signal_set/async_wait.html asio/reference/signal_set/cancel.html asio/reference/signal_set/cancel/overload1.html asio/reference/signal_set/cancel/overload2.html asio/reference/signal_set/clear.html asio/reference/signal_set/clear/overload1.html asio/reference/signal_set/clear/overload2.html asio/reference/signal_set/executor_type.html asio/reference/signal_set/get_executor.html asio/reference/signal_set/get_io_context.html asio/reference/signal_set/get_io_service.html asio/reference/signal_set/remove.html asio/reference/signal_set/remove/overload1.html asio/reference/signal_set/remove/overload2.html asio/reference/signal_set/signal_set.html asio/reference/signal_set/signal_set/overload1.html asio/reference/signal_set/signal_set/overload2.html asio/reference/signal_set/signal_set/overload3.html asio/reference/signal_set/signal_set/overload4.html asio/reference/signal_set/_signal_set.html asio/reference/socket_base.html asio/reference/socket_base/broadcast.html asio/reference/socket_base/bytes_readable.html asio/reference/socket_base/debug.html asio/reference/socket_base/do_not_route.html asio/reference/socket_base/enable_connection_aborted.html asio/reference/socket_base/keep_alive.html asio/reference/socket_base/linger.html asio/reference/socket_base/max_connections.html asio/reference/socket_base/max_listen_connections.html asio/reference/socket_base/message_do_not_route.html asio/reference/socket_base/message_end_of_record.html asio/reference/socket_base/message_flags.html asio/reference/socket_base/message_out_of_band.html asio/reference/socket_base/message_peek.html asio/reference/socket_base/out_of_band_inline.html asio/reference/socket_base/receive_buffer_size.html asio/reference/socket_base/receive_low_watermark.html asio/reference/socket_base/reuse_address.html asio/reference/socket_base/send_buffer_size.html asio/reference/socket_base/send_low_watermark.html asio/reference/socket_base/shutdown_type.html asio/reference/socket_base/wait_type.html asio/reference/socket_base/_socket_base.html asio/reference/spawn.html asio/reference/spawn/overload1.html asio/reference/spawn/overload2.html asio/reference/spawn/overload3.html asio/reference/spawn/overload4.html asio/reference/spawn/overload5.html asio/reference/spawn/overload6.html asio/reference/spawn/overload7.html asio/reference/ssl__context.html asio/reference/ssl__context/add_certificate_authority.html asio/reference/ssl__context/add_certificate_authority/overload1.html asio/reference/ssl__context/add_certificate_authority/overload2.html asio/reference/ssl__context/add_verify_path.html asio/reference/ssl__context/add_verify_path/overload1.html asio/reference/ssl__context/add_verify_path/overload2.html asio/reference/ssl__context/clear_options.html asio/reference/ssl__context/clear_options/overload1.html asio/reference/ssl__context/clear_options/overload2.html asio/reference/ssl__context/context.html asio/reference/ssl__context/context/overload1.html asio/reference/ssl__context/context/overload2.html asio/reference/ssl__context/default_workarounds.html asio/reference/ssl__context/file_format.html asio/reference/ssl__context/load_verify_file.html asio/reference/ssl__context/load_verify_file/overload1.html asio/reference/ssl__context/load_verify_file/overload2.html asio/reference/ssl__context/method.html asio/reference/ssl__context/native_handle.html asio/reference/ssl__context/native_handle_type.html asio/reference/ssl__context/no_compression.html asio/reference/ssl__context/no_sslv2.html asio/reference/ssl__context/no_sslv3.html asio/reference/ssl__context/no_tlsv1.html asio/reference/ssl__context/no_tlsv1_1.html asio/reference/ssl__context/no_tlsv1_2.html asio/reference/ssl__context/no_tlsv1_3.html asio/reference/ssl__context/operator_eq_.html asio/reference/ssl__context/options.html asio/reference/ssl__context/password_purpose.html asio/reference/ssl__context/set_default_verify_paths.html asio/reference/ssl__context/set_default_verify_paths/overload1.html asio/reference/ssl__context/set_default_verify_paths/overload2.html asio/reference/ssl__context/set_options.html asio/reference/ssl__context/set_options/overload1.html asio/reference/ssl__context/set_options/overload2.html asio/reference/ssl__context/set_password_callback.html asio/reference/ssl__context/set_password_callback/overload1.html asio/reference/ssl__context/set_password_callback/overload2.html asio/reference/ssl__context/set_verify_callback.html asio/reference/ssl__context/set_verify_callback/overload1.html asio/reference/ssl__context/set_verify_callback/overload2.html asio/reference/ssl__context/set_verify_depth.html asio/reference/ssl__context/set_verify_depth/overload1.html asio/reference/ssl__context/set_verify_depth/overload2.html asio/reference/ssl__context/set_verify_mode.html asio/reference/ssl__context/set_verify_mode/overload1.html asio/reference/ssl__context/set_verify_mode/overload2.html asio/reference/ssl__context/single_dh_use.html asio/reference/ssl__context/use_certificate.html asio/reference/ssl__context/use_certificate/overload1.html asio/reference/ssl__context/use_certificate/overload2.html asio/reference/ssl__context/use_certificate_chain.html asio/reference/ssl__context/use_certificate_chain/overload1.html asio/reference/ssl__context/use_certificate_chain/overload2.html asio/reference/ssl__context/use_certificate_chain_file.html asio/reference/ssl__context/use_certificate_chain_file/overload1.html asio/reference/ssl__context/use_certificate_chain_file/overload2.html asio/reference/ssl__context/use_certificate_file.html asio/reference/ssl__context/use_certificate_file/overload1.html asio/reference/ssl__context/use_certificate_file/overload2.html asio/reference/ssl__context/use_private_key.html asio/reference/ssl__context/use_private_key/overload1.html asio/reference/ssl__context/use_private_key/overload2.html asio/reference/ssl__context/use_private_key_file.html asio/reference/ssl__context/use_private_key_file/overload1.html asio/reference/ssl__context/use_private_key_file/overload2.html asio/reference/ssl__context/use_rsa_private_key.html asio/reference/ssl__context/use_rsa_private_key/overload1.html asio/reference/ssl__context/use_rsa_private_key/overload2.html asio/reference/ssl__context/use_rsa_private_key_file.html asio/reference/ssl__context/use_rsa_private_key_file/overload1.html asio/reference/ssl__context/use_rsa_private_key_file/overload2.html asio/reference/ssl__context/use_tmp_dh.html asio/reference/ssl__context/use_tmp_dh/overload1.html asio/reference/ssl__context/use_tmp_dh/overload2.html asio/reference/ssl__context/use_tmp_dh_file.html asio/reference/ssl__context/use_tmp_dh_file/overload1.html asio/reference/ssl__context/use_tmp_dh_file/overload2.html asio/reference/ssl__context/_context.html asio/reference/ssl__context_base.html asio/reference/ssl__context_base/default_workarounds.html asio/reference/ssl__context_base/file_format.html asio/reference/ssl__context_base/method.html asio/reference/ssl__context_base/no_compression.html asio/reference/ssl__context_base/no_sslv2.html asio/reference/ssl__context_base/no_sslv3.html asio/reference/ssl__context_base/no_tlsv1.html asio/reference/ssl__context_base/no_tlsv1_1.html asio/reference/ssl__context_base/no_tlsv1_2.html asio/reference/ssl__context_base/no_tlsv1_3.html asio/reference/ssl__context_base/options.html asio/reference/ssl__context_base/password_purpose.html asio/reference/ssl__context_base/single_dh_use.html asio/reference/ssl__context_base/_context_base.html asio/reference/ssl__error__get_stream_category.html asio/reference/ssl__error__make_error_code.html asio/reference/ssl__error__stream_category.html asio/reference/ssl__error__stream_errors.html asio/reference/ssl__rfc2818_verification.html asio/reference/ssl__rfc2818_verification/operator_lp__rp_.html asio/reference/ssl__rfc2818_verification/result_type.html asio/reference/ssl__rfc2818_verification/rfc2818_verification.html asio/reference/ssl__stream.html asio/reference/ssl__stream/async_handshake.html asio/reference/ssl__stream/async_handshake/overload1.html asio/reference/ssl__stream/async_handshake/overload2.html asio/reference/ssl__stream/async_read_some.html asio/reference/ssl__stream/async_shutdown.html asio/reference/ssl__stream/async_write_some.html asio/reference/ssl__stream/executor_type.html asio/reference/ssl__stream/get_executor.html asio/reference/ssl__stream/get_io_context.html asio/reference/ssl__stream/get_io_service.html asio/reference/ssl__stream/handshake.html asio/reference/ssl__stream/handshake/overload1.html asio/reference/ssl__stream/handshake/overload2.html asio/reference/ssl__stream/handshake/overload3.html asio/reference/ssl__stream/handshake/overload4.html asio/reference/ssl__stream/handshake_type.html asio/reference/ssl__stream/lowest_layer.html asio/reference/ssl__stream/lowest_layer/overload1.html asio/reference/ssl__stream/lowest_layer/overload2.html asio/reference/ssl__stream/lowest_layer_type.html asio/reference/ssl__stream/native_handle.html asio/reference/ssl__stream/native_handle_type.html asio/reference/ssl__stream/next_layer.html asio/reference/ssl__stream/next_layer/overload1.html asio/reference/ssl__stream/next_layer/overload2.html asio/reference/ssl__stream/next_layer_type.html asio/reference/ssl__stream/read_some.html asio/reference/ssl__stream/read_some/overload1.html asio/reference/ssl__stream/read_some/overload2.html asio/reference/ssl__stream/set_verify_callback.html asio/reference/ssl__stream/set_verify_callback/overload1.html asio/reference/ssl__stream/set_verify_callback/overload2.html asio/reference/ssl__stream/set_verify_depth.html asio/reference/ssl__stream/set_verify_depth/overload1.html asio/reference/ssl__stream/set_verify_depth/overload2.html asio/reference/ssl__stream/set_verify_mode.html asio/reference/ssl__stream/set_verify_mode/overload1.html asio/reference/ssl__stream/set_verify_mode/overload2.html asio/reference/ssl__stream/shutdown.html asio/reference/ssl__stream/shutdown/overload1.html asio/reference/ssl__stream/shutdown/overload2.html asio/reference/ssl__stream/stream.html asio/reference/ssl__stream/write_some.html asio/reference/ssl__stream/write_some/overload1.html asio/reference/ssl__stream/write_some/overload2.html asio/reference/ssl__stream/_stream.html asio/reference/ssl__stream__impl_struct.html asio/reference/ssl__stream__impl_struct/ssl.html asio/reference/ssl__stream_base.html asio/reference/ssl__stream_base/handshake_type.html asio/reference/ssl__stream_base/_stream_base.html asio/reference/ssl__verify_client_once.html asio/reference/ssl__verify_context.html asio/reference/ssl__verify_context/native_handle.html asio/reference/ssl__verify_context/native_handle_type.html asio/reference/ssl__verify_context/verify_context.html asio/reference/ssl__verify_fail_if_no_peer_cert.html asio/reference/ssl__verify_mode.html asio/reference/ssl__verify_none.html asio/reference/ssl__verify_peer.html asio/reference/steady_timer.html asio/reference/strand.html asio/reference/strand/context.html asio/reference/strand/defer.html asio/reference/strand/dispatch.html asio/reference/strand/get_inner_executor.html asio/reference/strand/inner_executor_type.html asio/reference/strand/on_work_finished.html asio/reference/strand/on_work_started.html asio/reference/strand/operator_not__eq_.html asio/reference/strand/operator_eq_.html asio/reference/strand/operator_eq_/overload1.html asio/reference/strand/operator_eq_/overload2.html asio/reference/strand/operator_eq_/overload3.html asio/reference/strand/operator_eq_/overload4.html asio/reference/strand/operator_eq__eq_.html asio/reference/strand/post.html asio/reference/strand/running_in_this_thread.html asio/reference/strand/strand.html asio/reference/strand/strand/overload1.html asio/reference/strand/strand/overload2.html asio/reference/strand/strand/overload3.html asio/reference/strand/strand/overload4.html asio/reference/strand/strand/overload5.html asio/reference/strand/strand/overload6.html asio/reference/strand/_strand.html asio/reference/streambuf.html asio/reference/system_category.html asio/reference/system_context.html asio/reference/system_context/add_service.html asio/reference/system_context/destroy.html asio/reference/system_context/executor_type.html asio/reference/system_context/fork_event.html asio/reference/system_context/get_executor.html asio/reference/system_context/has_service.html asio/reference/system_context/join.html asio/reference/system_context/make_service.html asio/reference/system_context/notify_fork.html asio/reference/system_context/shutdown.html asio/reference/system_context/stop.html asio/reference/system_context/stopped.html asio/reference/system_context/use_service.html asio/reference/system_context/use_service/overload1.html asio/reference/system_context/use_service/overload2.html asio/reference/system_context/_system_context.html asio/reference/system_error.html asio/reference/system_error/code.html asio/reference/system_error/operator_eq_.html asio/reference/system_error/system_error.html asio/reference/system_error/system_error/overload1.html asio/reference/system_error/system_error/overload2.html asio/reference/system_error/system_error/overload3.html asio/reference/system_error/what.html asio/reference/system_error/_system_error.html asio/reference/system_executor.html asio/reference/system_executor/context.html asio/reference/system_executor/defer.html asio/reference/system_executor/dispatch.html asio/reference/system_executor/on_work_finished.html asio/reference/system_executor/on_work_started.html asio/reference/system_executor/operator_not__eq_.html asio/reference/system_executor/operator_eq__eq_.html asio/reference/system_executor/post.html asio/reference/system_timer.html asio/reference/thread.html asio/reference/thread/join.html asio/reference/thread/thread.html asio/reference/thread/_thread.html asio/reference/thread_pool.html asio/reference/thread_pool/add_service.html asio/reference/thread_pool/destroy.html asio/reference/thread_pool/fork_event.html asio/reference/thread_pool/get_executor.html asio/reference/thread_pool/has_service.html asio/reference/thread_pool/join.html asio/reference/thread_pool/make_service.html asio/reference/thread_pool/notify_fork.html asio/reference/thread_pool/shutdown.html asio/reference/thread_pool/stop.html asio/reference/thread_pool/thread_pool.html asio/reference/thread_pool/thread_pool/overload1.html asio/reference/thread_pool/thread_pool/overload2.html asio/reference/thread_pool/use_service.html asio/reference/thread_pool/use_service/overload1.html asio/reference/thread_pool/use_service/overload2.html asio/reference/thread_pool/_thread_pool.html asio/reference/thread_pool__executor_type.html asio/reference/thread_pool__executor_type/context.html asio/reference/thread_pool__executor_type/defer.html asio/reference/thread_pool__executor_type/dispatch.html asio/reference/thread_pool__executor_type/on_work_finished.html asio/reference/thread_pool__executor_type/on_work_started.html asio/reference/thread_pool__executor_type/operator_not__eq_.html asio/reference/thread_pool__executor_type/operator_eq__eq_.html asio/reference/thread_pool__executor_type/post.html asio/reference/thread_pool__executor_type/running_in_this_thread.html asio/reference/time_traits_lt__ptime__gt_.html asio/reference/time_traits_lt__ptime__gt_/add.html asio/reference/time_traits_lt__ptime__gt_/duration_type.html asio/reference/time_traits_lt__ptime__gt_/less_than.html asio/reference/time_traits_lt__ptime__gt_/now.html asio/reference/time_traits_lt__ptime__gt_/subtract.html asio/reference/time_traits_lt__ptime__gt_/time_type.html asio/reference/time_traits_lt__ptime__gt_/to_posix_duration.html asio/reference/transfer_all.html asio/reference/transfer_at_least.html asio/reference/transfer_exactly.html asio/reference/use_future.html asio/reference/use_future_t.html asio/reference/use_future_t/allocator_type.html asio/reference/use_future_t/get_allocator.html asio/reference/use_future_t/operator_lp__rp_.html asio/reference/use_future_t/operator_lb__rb_.html asio/reference/use_future_t/rebind.html asio/reference/use_future_t/use_future_t.html asio/reference/use_future_t/use_future_t/overload1.html asio/reference/use_future_t/use_future_t/overload2.html asio/reference/use_service.html asio/reference/use_service/overload1.html asio/reference/use_service/overload2.html asio/reference/uses_executor.html asio/reference/wait_traits.html asio/reference/wait_traits/to_wait_duration.html asio/reference/wait_traits/to_wait_duration/overload1.html asio/reference/wait_traits/to_wait_duration/overload2.html asio/reference/windows__object_handle.html asio/reference/windows__object_handle/assign.html asio/reference/windows__object_handle/assign/overload1.html asio/reference/windows__object_handle/assign/overload2.html asio/reference/windows__object_handle/async_wait.html asio/reference/windows__object_handle/cancel.html asio/reference/windows__object_handle/cancel/overload1.html asio/reference/windows__object_handle/cancel/overload2.html asio/reference/windows__object_handle/close.html asio/reference/windows__object_handle/close/overload1.html asio/reference/windows__object_handle/close/overload2.html asio/reference/windows__object_handle/executor_type.html asio/reference/windows__object_handle/get_executor.html asio/reference/windows__object_handle/get_io_context.html asio/reference/windows__object_handle/get_io_service.html asio/reference/windows__object_handle/is_open.html asio/reference/windows__object_handle/lowest_layer.html asio/reference/windows__object_handle/lowest_layer/overload1.html asio/reference/windows__object_handle/lowest_layer/overload2.html asio/reference/windows__object_handle/lowest_layer_type.html asio/reference/windows__object_handle/native_handle.html asio/reference/windows__object_handle/native_handle_type.html asio/reference/windows__object_handle/object_handle.html asio/reference/windows__object_handle/object_handle/overload1.html asio/reference/windows__object_handle/object_handle/overload2.html asio/reference/windows__object_handle/object_handle/overload3.html asio/reference/windows__object_handle/operator_eq_.html asio/reference/windows__object_handle/wait.html asio/reference/windows__object_handle/wait/overload1.html asio/reference/windows__object_handle/wait/overload2.html asio/reference/windows__overlapped_handle.html asio/reference/windows__overlapped_handle/assign.html asio/reference/windows__overlapped_handle/assign/overload1.html asio/reference/windows__overlapped_handle/assign/overload2.html asio/reference/windows__overlapped_handle/cancel.html asio/reference/windows__overlapped_handle/cancel/overload1.html asio/reference/windows__overlapped_handle/cancel/overload2.html asio/reference/windows__overlapped_handle/close.html asio/reference/windows__overlapped_handle/close/overload1.html asio/reference/windows__overlapped_handle/close/overload2.html asio/reference/windows__overlapped_handle/executor_type.html asio/reference/windows__overlapped_handle/get_executor.html asio/reference/windows__overlapped_handle/get_io_context.html asio/reference/windows__overlapped_handle/get_io_service.html asio/reference/windows__overlapped_handle/is_open.html asio/reference/windows__overlapped_handle/lowest_layer.html asio/reference/windows__overlapped_handle/lowest_layer/overload1.html asio/reference/windows__overlapped_handle/lowest_layer/overload2.html asio/reference/windows__overlapped_handle/lowest_layer_type.html asio/reference/windows__overlapped_handle/native_handle.html asio/reference/windows__overlapped_handle/native_handle_type.html asio/reference/windows__overlapped_handle/operator_eq_.html asio/reference/windows__overlapped_handle/overlapped_handle.html asio/reference/windows__overlapped_handle/overlapped_handle/overload1.html asio/reference/windows__overlapped_handle/overlapped_handle/overload2.html asio/reference/windows__overlapped_handle/overlapped_handle/overload3.html asio/reference/windows__overlapped_handle/_overlapped_handle.html asio/reference/windows__overlapped_ptr.html asio/reference/windows__overlapped_ptr/complete.html asio/reference/windows__overlapped_ptr/get.html asio/reference/windows__overlapped_ptr/get/overload1.html asio/reference/windows__overlapped_ptr/get/overload2.html asio/reference/windows__overlapped_ptr/overlapped_ptr.html asio/reference/windows__overlapped_ptr/overlapped_ptr/overload1.html asio/reference/windows__overlapped_ptr/overlapped_ptr/overload2.html asio/reference/windows__overlapped_ptr/release.html asio/reference/windows__overlapped_ptr/reset.html asio/reference/windows__overlapped_ptr/reset/overload1.html asio/reference/windows__overlapped_ptr/reset/overload2.html asio/reference/windows__overlapped_ptr/_overlapped_ptr.html asio/reference/windows__random_access_handle.html asio/reference/windows__random_access_handle/assign.html asio/reference/windows__random_access_handle/assign/overload1.html asio/reference/windows__random_access_handle/assign/overload2.html asio/reference/windows__random_access_handle/async_read_some_at.html asio/reference/windows__random_access_handle/async_write_some_at.html asio/reference/windows__random_access_handle/cancel.html asio/reference/windows__random_access_handle/cancel/overload1.html asio/reference/windows__random_access_handle/cancel/overload2.html asio/reference/windows__random_access_handle/close.html asio/reference/windows__random_access_handle/close/overload1.html asio/reference/windows__random_access_handle/close/overload2.html asio/reference/windows__random_access_handle/executor_type.html asio/reference/windows__random_access_handle/get_executor.html asio/reference/windows__random_access_handle/get_io_context.html asio/reference/windows__random_access_handle/get_io_service.html asio/reference/windows__random_access_handle/is_open.html asio/reference/windows__random_access_handle/lowest_layer.html asio/reference/windows__random_access_handle/lowest_layer/overload1.html asio/reference/windows__random_access_handle/lowest_layer/overload2.html asio/reference/windows__random_access_handle/lowest_layer_type.html asio/reference/windows__random_access_handle/native_handle.html asio/reference/windows__random_access_handle/native_handle_type.html asio/reference/windows__random_access_handle/operator_eq_.html asio/reference/windows__random_access_handle/random_access_handle.html asio/reference/windows__random_access_handle/random_access_handle/overload1.html asio/reference/windows__random_access_handle/random_access_handle/overload2.html asio/reference/windows__random_access_handle/random_access_handle/overload3.html asio/reference/windows__random_access_handle/read_some_at.html asio/reference/windows__random_access_handle/read_some_at/overload1.html asio/reference/windows__random_access_handle/read_some_at/overload2.html asio/reference/windows__random_access_handle/write_some_at.html asio/reference/windows__random_access_handle/write_some_at/overload1.html asio/reference/windows__random_access_handle/write_some_at/overload2.html asio/reference/windows__stream_handle.html asio/reference/windows__stream_handle/assign.html asio/reference/windows__stream_handle/assign/overload1.html asio/reference/windows__stream_handle/assign/overload2.html asio/reference/windows__stream_handle/async_read_some.html asio/reference/windows__stream_handle/async_write_some.html asio/reference/windows__stream_handle/cancel.html asio/reference/windows__stream_handle/cancel/overload1.html asio/reference/windows__stream_handle/cancel/overload2.html asio/reference/windows__stream_handle/close.html asio/reference/windows__stream_handle/close/overload1.html asio/reference/windows__stream_handle/close/overload2.html asio/reference/windows__stream_handle/executor_type.html asio/reference/windows__stream_handle/get_executor.html asio/reference/windows__stream_handle/get_io_context.html asio/reference/windows__stream_handle/get_io_service.html asio/reference/windows__stream_handle/is_open.html asio/reference/windows__stream_handle/lowest_layer.html asio/reference/windows__stream_handle/lowest_layer/overload1.html asio/reference/windows__stream_handle/lowest_layer/overload2.html asio/reference/windows__stream_handle/lowest_layer_type.html asio/reference/windows__stream_handle/native_handle.html asio/reference/windows__stream_handle/native_handle_type.html asio/reference/windows__stream_handle/operator_eq_.html asio/reference/windows__stream_handle/read_some.html asio/reference/windows__stream_handle/read_some/overload1.html asio/reference/windows__stream_handle/read_some/overload2.html asio/reference/windows__stream_handle/stream_handle.html asio/reference/windows__stream_handle/stream_handle/overload1.html asio/reference/windows__stream_handle/stream_handle/overload2.html asio/reference/windows__stream_handle/stream_handle/overload3.html asio/reference/windows__stream_handle/write_some.html asio/reference/windows__stream_handle/write_some/overload1.html asio/reference/windows__stream_handle/write_some/overload2.html asio/reference/write.html asio/reference/write/overload1.html asio/reference/write/overload2.html asio/reference/write/overload3.html asio/reference/write/overload4.html asio/reference/write/overload5.html asio/reference/write/overload6.html asio/reference/write/overload7.html asio/reference/write/overload8.html asio/reference/write/overload9.html asio/reference/write/overload10.html asio/reference/write/overload11.html asio/reference/write/overload12.html asio/reference/write_at.html asio/reference/write_at/overload1.html asio/reference/write_at/overload2.html asio/reference/write_at/overload3.html asio/reference/write_at/overload4.html asio/reference/write_at/overload5.html asio/reference/write_at/overload6.html asio/reference/write_at/overload7.html asio/reference/write_at/overload8.html asio/reference/yield_context.html asio/net_ts.html asio/history.html asio/index.html asio-1.12.2/doc/sync_op.png000066400000000000000000000474231340672067200154760ustar00rootroot00000000000000‰PNG  IHDR܃@õ~sRGB®Îé@IDATxí¸E¶Ç‹5[|!¸Ûâœ` nÁ݃`!8K6’à°Üw'¸³ÀâlpXxØÃWïüÎRCß¹=Þ=ÓÝsÎ÷Ý;3ÝÕÕU§ëtUùŸ ¼÷W9#ã€q -˜@ηåNvã€qÀýÊx`0´&píãµÝÉ8`3œã@;9ð›vÞ¬(÷êÓ§û裊ÒÂõc…Vp>ø`&ûe×àcù¿ÿû?¶<ÐõíÛ·Á«­xÚ¸á†Ü£>šömš®ß®IÖ-·Ürnã7nòj»,-üë_ÿÊ´À™Ò$­'oõb8`Ã;dH‹&piqÖê5ÄpÀ.†)vÈ8LàÒâ¬Õkˆá€ \ Sìq -˜À¥ÅY«×8ø¦Ø!ã@Z0K‹³V¯q †&p1L±CÆ´8`—g­^ã@ Làb˜b‡ŒiqÀ.-ÎZ½Æ˜ÀÅ0ÅÒ†\Zœµz10‹aŠ2¤Å @M‹³?×ûöÛo»SN9Å 4ÈÍ?ÿü=îvýõ×»'Ÿ|Ò :Ôýú׿îq.©Æ sÿõ_ÿUªîøƒÛh£Üb‹-V:f_ÚÇ›áRæõ¬³Îê^yå·Ç{ô¸ÓÇìvÜqG7å”S¦&lÜð‚ .pÏ?ÿ¼ûÍo~£¼V[m5·Ûn»õhýh‚5ªŸ?ýôÀ¹þïÿ{Ý?ÞO<ñÄþ²Ë.+]³Ã;x™eüÿþïÿê1ÁJño½õ–ÿöÛoKeùòÝwßyþÊiÎ9çô£Fêqøì³ÏÖö|ñÅ=Ž—×!3£—C2áÇÿüÏÿ”ÚŽ•Fë‡oŸ~úiy‘Òïü±Gß¿ÿþ{ÿõ×_—Î×ûåøã÷sÌ1G½ÅÛ^Îf¸6¼Øf›m6wÌ1Ǹ?ÿùÏ¾RÌK.¹Ä{î¹:»ÝrË-nºé¦SP¢É'ŸÜí·ß~N¨¶Œ¥Ÿj©•cÇŽu+¯¼²þþàƒÜ„Nè86ãŒ3ºûï¿¿T®ÚðXD° )®Žwß}×|%×Í>ûìnùå—wò2Ð*i×þûïïXšÒfÀ”Zh!÷òË/ëù~ýú¹ãŽ;NQ:ôÐCµì¼óÎëø»ùæ›õø›o¾©í1b„›~úéÝÔSOí9äwøá‡ëÌ/öÙg-[˜mñœß°™Ž.3“1£É ,}rü½÷ÞóM4‘¿é¦›øéßÿ}/ƒÜ=Z/°Àþ¢‹.Òïü!õË,³ŒþæZˆ^Âß~ûíg¸#Ž8¿ñÆúw÷ÝwûµÖZKÛ@%quÈ’Ó3ÓWf¾‹ê=O?ýt?óÌ3û×^{Í‹°ú-¶ØBÛ ËV=¿ì²Ëúi§ÖSŽÙ‘rôGÀ}ôüyçççž{nÏŒN›hÿ¶Ûnë?ùäá…êïu×]×ÿûßÿöwÞy§þæ\½”õÎÕÛ‘"—c©óðÃ{ƒ¼u€­¹æš~ÑEÕÁÅšl²É¼ìƒT $,)ïžzê)/Ê/ûºÒriäÈ‘^fÀPD?;ì0/3…~¯GàÆ×ãúè–”¿ûÝïü$“L¢²gô+®¸¢úé§µX¸PÇ;ï¼£ƒ\”9¥jž{î9=† 4 §Í4ø¸½÷Þ;œöŸþ¹ 5‚‹ÐtÒIZž%i¸ ŒŸ}ö™ž»í¶ÛJ×ÿö·¿ÕgS:PãK֮봔_~ù¥{â‰'Üc=æüqÕ¢À€dŸåæšk.7à 3èGÎM3Í4Nf ÷ûßÿ^ÿ¦˜b -ÛÌ¿%–XÂñ·úê«;­‚¥Z9¾%KPèØ[È@íuœ%]5bÉÆ2µ…:d¿éD@{h1Qü@€ßŠ@êR3ÔÅuð-J /¼pé§ìÅÜ‘G鮽öZ7Ë,³¸yæ™§t.|a9 ¡ØdÔOþM0Á¥åué`Ž¿^ànEÀî¸ã'K2ö! j:{†?ýéOn¾ùæs²TÒ\íyR_+ô«_ýÊñ.G –E'e(K{»˜&Élîjî>íàçÙ¯aZ€Böƒ•H–ÆZ^–Êú’yæ™gz½L¢ü¨TOQŽÿòä‹Ò#éBñÀ¸½öÚKg+ÙW8Y.ªìòË/×A›üŠ+®P@ÿþýu€ó6m7­³Î:î…^p²‡Ó[˲ʡD‘½‘þfÐóû›o¾q ZÚœ&q?f!l‡¢%Ô[]|ñÅN–ØŽÙ}À€îÊ+¯t(<~øáUpTkffAftÙÇ:јjqYV»¬°ç %p²'Ð ]?Ñ–=ôÐCNö^Ò¥Ðßþö7·é¦›ªÆ,+OtÉ%—t'œp‚¢8³œE+ÈàÞn»í´‰,E!¢/Ž5ÖX£4³¤Õ~–uØ7ÞèXJ²½§;óÌ3õ–Gu”¾¸\pA7ÓL3錇¦”%w <ØÉžLµ“,)Eá£}Üj«­âŠÿX=hæO£ý»êª«ü*«¬âe†R%‡ /ÆæTÚÞ¬–²VcP.ÈÒ×cû*' 2S”Nõ7÷DY"3™jÃÍd éQnÈì¦ZLÚ–5ØC¹è'<“—žj<9εh!Ó Sš¤ôÎb‰uþùçëÒ‡¼¨’uY&*ï{¤”nŸxµ,×–Zj©ØzESWÚÓÅHá ÷\d‘EzÕÌluÚi§¹sÎ9Gg·£>Z=Wª¹¦±G‹ºµ¡”ùãÿØ«în8;¥ ‚6fÌ'ªi‡ ÷¨8 ‡æ¬\§úÈRWlkn—]vÑ}%ò¨a¾SíÊË}s#plÐÏ:ë,7|øp'.H޽û¼ŒÚÇf+žFs ‡ "Y÷«æU¾ ZãÛ®è<2­¥üç?ÿ©ûƒM6Ùĉw„C yâ‰'š°u~ÜX šä@&Žå£øÿ9<=þû¿ÿÛ‰Û•BU7ÙO»Ì8 dnIIºØwÞÙᱎñãu' Ò™x:ÖˆÂq 33^„e õÂ@úâ‹/ªÑÚ„­pc®«;”‰7+<þñ¸3Î8Cáºú©Xç ËŽÏp×]wîÕPõKȈ [a‡šu tLàp0F12pà@·å–[ªÔÁq ˆèÈ’Í#BvÏ=÷¨‹^ FÆnà@ÛŽ“µ×^ÛIؼ†Ð”_vÓ­Ý˶.)Ñ<žF’ˆk¶îxÝÚó¶ ö5Tþ‚±¡†lTÿFÆnã@[NjQÕ+­´’B´‚ ÒmÈú[,¤.p÷Þ{¯#F(f€qˆ62t+R8–‘믿¾Û`ƒ ‹ƒ F#ã@Ws 0wꯢ\)´>­{µ³^üñ‚¬ø‰2prÿ ^¥ –)æfúC$šÜ Z;‡EÝ÷š€’I¿qpÕNCö­·ÞZ`&éû¦]‘Î Vp%Ó¾gÚõq6&äÕ`ÒnG’õ¨ ð‘ LW„­Hò~Ô•¸ÀaÔ–Ü ð'tÒFÚ“Ù²à4±GÈÐvE!`ì. ;|°Þ¡_àjn¸á†ê½tß}÷¹(0m§û—èÀÒÍ7ßÜ ’“úEØHx$€±E6_Xà)*ƒ—=(¼$]XV(Q;è ƒÔ{LC0 ‹@@£’>#ÊŸ¢QŽgN&ã¬Oòá±ÍÉ%&pxý0 |à¦E "Ï/½ôR'‰<@¶H³@x>F½ˆpãì³Ñ!»³”$m ÝîØg"Çþ¸:²jn³Í6ëLÒ7ê›D[o½µ+ªI#\H¤‘4;]9怊g_·Þzë)â['ÛÔ²Àá >ÉûHÜP$ŒIQö¢qφçÇÌ]ÄÙ;ô—ÛW_}U_ž­&d õ6óÙ²À ´´&£`éU _¾™†Ù5íá™LQÈŽtà 7¨àiÚ1Â×,=/K-M²×lvq  …Ìæ¥ ³í¼7÷jÚÇ´ >Óû%·t7Ý{ ÚSå9ÈÉD¾@I“ê½Ê+o:k>yÍHÖgÂVÎVûeHZi÷ì³ÏºÍ6ÛL=RB†×v´¹©NR*iÒ> Hg[By€kS‘•ExNIõ¤0¸2Y4\ž69©û”×Ó”Ò„é˜òY_…D„FÝÁ¶B×_½&êl'¦NÇÍL¢ä+ŠºW´'Ÿ|²+´uÝ!Nõõ’l³8£ój;¨aûË_þ¢nNاŠB(}$”È-¾øâEé’õ£N¬¾úê ×Hv&tiSCGx ö¶¡C‡º¢x&ÄF¯¼òÊ]¹#Cþ¢ÝLlpGÄñžp¥4©!ÃW’iíNQô0ÜHßm„iØ   »™P–á NþA’|¦Iu ŽŸ^x¡f-ŠçdÌEq¶nt »(¶Xg NNƒŠÏ;ï<ÕO\}õÕ²²îòu Q¸ní´ÓNuWžõ‚àd2àºuïöÅ_è#2ûÏH%hü=÷ÜSŠÓ¿u ÜØ±c5 ]öŠ4:[^'×0™ˆ€n$Ž(ˆ"=ÓVŸãÈ‘#•ä%Lƒê¸GyĽþúën‡vH£ «Íd78îVb0póÓL3M¥Ó]yœØGVs,+‰Ošê8Òý‚ Ñ­K¯¤™ž•ú>þøc'WYiNfÚ1`ÀÝ:±´D‹$Õ8ö8„5ØÞ¨X@+7ÝtÓ«S õæä“OVÓ×Pÿ©¦¦À‘$ñ£>ÒhÙDïl•uœ -´k§ãnÇ;Ü@05ʱºÐ8)ªé¼ŒgÉù矯>gIÝÔê1ä…áðÄO$Ss†{àõ(/ j¶˜Þ{ï½f/ÏýuÁñš¿ë®»ö9£ÿp`̘1š{ÿáDHöhIBV¼xU{ÑÚT,S„2À[˜Z„î4ÜqÙó‚ûá%wŸ~Î8ãŒ^°8®§¨$ƒm®JË]¬:Ã=ÿüóޏ!”‹Døƒ‚È‹§ÉöÛoïØË ±ëF’¤@I»ï¾»îU€=¢ÞB•~ l«ð®6lØ/›üVUà$!‡¦—Z`š¬>›—@ :/L$Iäá‡î¦vÚ®t^Æ!¥$/ˆtbøWÉ£¨ÕQˆ…1BO«~§Uc7ȵEñ„ñ¼ÑÙ£à΄—Å®»îª Wu#ñŒÉF{É%—(Ô!«V 2£_80hÐ µYþõ¯ýå`ßj Ü<óÌÓDµÙ½ ¼LŒœ{ã7ô­ýÌ3ϨÇ<@¾,¡’X>‰¿Ìü„ñààüæ›o6ݵªGf•¢Ùi@S†páéFzùå—@Å•ºRTvÚiN”&ÂwÞYqùK…ì‹r×FüoA;h–ª έSM5U³ugòº`Ø­»@I°¬Är’·w4bÀ–“;=?y9!l¤-kv–«*p`}méõÝwßéÞ-¼Ù{²´Ø¿ð $‹ÌK,Qê(ì_qeŸU û9REõæQἤàW3TUà¾úê«Â-½T¼Ñ»‘È ÊL†",èU(IXRÎ0à nÎ9çÔl¨C† Eì3Â^Ôûï¿¿&±l*O5Kž ryÙ$V+’Ës"t¹lw+–¥´>|¸@l5ð„¼ìfðŽeOƒ¢ð²ÕòÇsLãõü¨:á6 µhD¿ºÀnø xú8‚'„`õéÓ'î´‹p€UÁ{ì¡«‚ï¿ÿ>r¦öת‡q¸Ñ kßÒJ´›<ÃÇ\‘†»ñe“¿÷Þ{oM­}Í5×4T}U#VêÃ?l¨B+œ= p¤L®4»e¯ÅÙo9çHðxî¹ç6ÔØªGžnÊå›(JHšÉŠÅ(9‘>nÜ8‡{\½TSàÞyçzë²rÆ®âyÃgžyf…Ö«·ãUpT˜ŒÆÞÀÇÈðZëU.V8 ¤¿1–Œ½9°ÝvÛihá^õPU[tÑE5gî@E¡‡zHq*ŠÒëGg9€£Àb‹-¦°zõ´¤ªÀáoØ·o_wûí·×SW.Ê0õTkdHŠ Ú‘kî§Ÿ~ªYeUãêu×]×Ýzë­=^k֚ᬻ Ï)*~iSnGEeJÊýÚtÓM´gµ¨.¿O…r"*øC)?œéßøÂU¸zÞPYîý1˜Oóøoß“š{î¹ÕK‡HùZTSàÀû@[Ià]9~óÍ7—ÎÄo"™/¸àÅ-‰6ˆ<$%)§›nº)¶åå²üûÎ;ïÔ7-oÜ¢äïË2¿£mÃ^ÏÖ«¦ÀQ)áåW\qE/ø4`å^}õU ëˆÞ< ß1öjNTeûã?:¢ ¢„"…ˆgrßå•|Â}‹°š©§ž:¯ÝÈm»×Xc Õæ“’»Õ%pÛn»­‚ìˆA‹òÁLͬ @„¡úBÀ`XF–ïáÀ£¼çž{@h饗ÎZ7êj/>fh‘º99I]ÌJ©X085ƒëYê8öûî×Bä¨ ³Ci¥•VÒfñÖ N¦Q£!CʼóΛË}€H¬>POƒlÔà6ÇxKDàèG¦Ð­·ÞZ÷EAàØ+dUàp»Ázå•Wt‡4³ÀóÈ#ƒÁràÀyl~¡ÚLôü½÷Þ[U£;ÃI ]¯°´{„Þ³/B3‰À!l,)ã4˜Yád˜åè/ÚJ›qÇa?Çqr¤å,‰pÜ‹,ì¦ó#Ž%=žYÕœ™cމöv‹,²ˆÎl,Y0B<Å=z´zk0[@샲ªRGe‹@M0ÁÚV–i+ûOöu_n¹åôœý3´Âä…¥%‰?*Q¬ÀmµÕVnŸ}öQA:õÔSÝ–[n©3Éû°¨ƒä…I hÿÀ aÉ–U ³\hB”(0ˆHg#ã@«+‡±TÍ2Và˜ÝN9凂¤_¿~¥v¢Û ƒ–™.«û8Ú‰‘>b Ñn4“݈àxaŸÉr€ ߆.4œxAcAÑ)xi„™-”ãx–ŽmÅW,-+C»<‹‚ܰÏ$8Àxzî¹çJ«¿ò:cg¸òBo¼±BbqĺF-ß £|Àèše£; ÇìF–˜¼ 0“‰6ËÊ©,?ûv¶Õ•BÚê8ŒKÔ_s ÌÚk¯­}J~ Õa©¦'3ö*Ê‘Ðf–Ãy1|Ë-·¨V5clµæ”q ä⨤©¬[àB½¨ÏÙÇaàÃØ0ˆÆ$†È2E÷k(€°ÓepÙºá†tI̲Ø(ÛÀI„±UIàjæø®Ö=örh1É…À1cd}ƒ¶„¡—/ŒÆY&–À¸§-¾øâŠ•å¶ZÛ~áZq\ìÎ<óÌ_þü­á.ZË4`Ÿ=öXUHäa?D2F0öóÇm0QjuÙÿŽí—h•8úMÜÁF1 P»b”ˆCdF6ÊXåa§Ž£–f¸¸ í˜q Û9ÀKò£>Šeƒ \,[ì q y€XŽ~¬r2+çˆý6´ÈbKPN&på±ßÆ9`×"írã@#Zår(ê°®NZYã@ UئËÉ®œ#öÛ8Ð"pƒ„âr+šÀµÈ\»Ü8P΢gp𷮜3öÛ8XVšÀ¥Ä\«Ö8Çë=×ñ%%q^C† ‰¶I×¾‡vXéx ëׯŸyä‘îÝwß-¯ô¥Öuo¾ù¦;øàƒ+]îî¾ûíU¬ÈNtˆ-… 8°PÎ8ãŒ„П—_~Y]z饚‚€­²Ê*«(¹ëH÷Z‰ê¹÷›‹.º¨RQÚQ±PÎ1Ç5JÙé¢q/“ØÏ4Ú2‰G»—H¦êè=/ŽÏ=®Ýa‡¼ÀØy‰šõ‘à%¬Çy ò›o¾¹ˆ8/ëqŽõ^'ç^Œ”z½xæ{qÇéUWùÑ<ù¯¿þºü°þ40/èf=ÎÉKÁÿáèq¬ÞòB|Å?ðÀõ^bå2ÀÆ'ÏM Izµ¦ã3\ù› ;’"x"‚\÷Þ{ïÅÐ9R¡ûâ"¹Ž˜>’£ã0å”S:à$D ô~'Ÿ|²Îªü œ‡£&e  ™/CÃÊ^¼ÅO:é$E=ëß¿¿^ vB‚Bì³yÊL.)Ë»Å2\?x— =‡¨òhY•ûôéeÞÈu 0³¹ŸÿÁtÏ>û¬1b„Þê‡~(%o$îïÃ?Ô¥.ñtÜ8Aˆå.ßO?ýtMò·¿ýÍtÐAŽ„–¼d†Ózø4*>‚‡I\|hæf¸ë®»Îm´ÑFúTÀÄ5ŽÀ$A âh½ QàË/¿¼“¥j¯´C0I}…Ð>φÜN`­¹×UW]¥³Ú[l¡Meö#—AÜ.®/v¬X ÈŠ»‰ &É.ð;‚ÖeƒìÇb«–™†%g95rðÑ4Uy^yå•=ª|ë­·ƒsÏ=÷ì1ÛÎ8㌆ÁyÀ¢ÄÒâœQwq šÀej†{ê©§t©Æ@†V]uU]’}ðÁ½žK5–˜ Ê©‘ë€>gÆ úxýQbVƒ€|gùÈ&RDQ–7Y9€ËK–©FÝÇî9.O_¦ŽÔQa9Éc"/3yÆA•õL;|øpwÌ1ÇÄâ}4rJ“Q£F騎Ž6„¥a*@»“¨á¬³ÎÒ=,CI¹Ìþoƒ 6н³3„¥ ‘¿¨†ÙDÇùÕ…úí³X`†c¿»¥è¥·lâ@Rfùæ›ÏKFÕ-·…—å™—­æA²ò"^2›ö(Wþ£žë0 쟜M5ˆrÆK:®’©A„Ú‹¶T«Ø3/HLªâ—™Õ ’–—D”¥ÛŽ3Æ ƒµú!B§çD8½`zÑnzÑR–Ê×óÅÌõp){e¿ÕK¾Á؆1k´L­\½7Í#²—¥[½—h¹z¯“埗ÝuGŽØÙ2™ ½(mz”åÇ·ß~«6À^'䀼õâW=fW•=™=¹ÝvÛùµÖZ+¶}™SšTZ\€ Ö·oßJ§+¯÷º°o áa‚‰àÛ@˜'°³U"Â2f“”^q·ž+gÇòÏ2î’º*Ž2µ‡‹k`§Ž¡! ñ¡‡Ú©&Ø}sÊ.ªùŽv#73\´Ñíø^É©/ÌÁèÝŽ¶Ø=òÔc8HTòŸµ®ÁgI– 8w²ZÕ˜s-ã<9dóæ@_Ž£Ž ø}!±c\£Çâú¢ç+}§~"âoò–ǵcØÜ¥¨KX¸[_°Ï„cöY<`Z"'„hªc;×1ÃSŸI<=P(ãÆ›!Žn¼ñF5ˆO1Åj ÇþüãÊG :T×ÓìÇPŒˆ)@Oãöç?ÿÙQ'Iô°™áV(Î9œ Ÿ¸u‘k×]wU­äàŒo§91®ûÇ yw#–bu— lÔ,€ª^œýQGå%¹½—ÆË&ÓŸ}öÙ½îL¸‹hÿ¼Ä·iYÊHG¼h¯²å0!`3#ì†0žã?Þ‹€h11bë=e½­¿±›‰³± ±áž—_~¹ž“}›Ú9‡eûí·÷²óâXíEøÕ\@A¾¯¼òÊ^6Í^f9-·Új«iÍ„é˜Y@Y—«âå¤ã R£;2Ãá‘÷ÎÀÒ0á}ÁË£œ®¾új·ÐB ©’ïûÝvÛMµ‡ååâ~S·´;÷ÜsÖ!8CcÇŽu›nºi)YÞ"Ì€(Ej9#£4Y}õÕ5L‡È̵œãÚgÇŠÇ–”•Lô¶#‡Ú”˜3‰µ.D^Ça@°¿*wP®7s)¹Õ$UaÂ1ùÖ[oÕ§ŒSq¹]›{=ÎÅ9#‡Üw˜ ‰yôÑGK1q\ÞçЧ 7ÜP…˜}ªQñ9À`ŸN>¿JÔÃÿDY.–œÁ6)‡Z Ñu–Ãà8\¡žÅlpÞ ½Ù}÷ÝM ‡cà¢ÄÛ ¡ªåŒ¼Î:ëè^µ:a:P-çè}ì{19@<% b8+QGÂçŸîÀaÙ‡à‘7o|ºìŸô;eI»{óÍ7kY–ÑÜ[,ņ̃¾rBˆ×_}µ›!¸Ü#h#qˆæ~!qKI–Ÿ,-«9#s’Ùgf”+,‘k98›sùÓ)Þo\@^Žía¥Í]#ÇUšP7Jð2£¨Ó/8&( ñîðâB¥ßùwÚi§yÑ&ª0J‰5×\Ó6LÏ‹¶S•(QGâp!ØTêe°«‚C–¦þœsÎÑÓ8SË8%S¿†K}%gä 4 i«hZU1SÍÁ¹'fSš.çã‡eÆC5bÖh™š8n Ï“O>éÅÖU± h49/3“gÐBk¬±FÉ¿â…?Ÿà:Y’zNˆu8–u·ž¥G¯ªª9#÷*üóZÎ81›ÀUâröŽãø.3šAÕÆU0ÄN†‰X§Úz—²ÌCÙ!B­û1´–àŽ”+<*5Ž¥_%#$× (‰:(Gë©æŒ-ý^ËÁÙœ˜£Ü*ÎwAVs€[ÓQ:²‡«Ö òs d¡Ö—¥ jØÛ±Ÿ³Ü×圲ßäÚïe—]VO«µ££3\µ†EÏ 8ÐñgdÈ"d én»í67xðàšÍËü W³VÀ8Ða€ÅƒÙ -x-2«Å!;o¨Á[n¹Eí·èj‘ \-Ùyã@  S¨gv£¸Ì´ÓÆjÀë ‹zu &pÕ¸içŒ58€·n}`¡ÖC&põpÉÊ*p#ê\=dW—¬Œq †óWS´t騀 ûbhŒ8a]RË»$Zk"†o<ðÅïÐm¶ÙfѺí{‹ ¨•´\FÙãÄp«ÇY©Å-Ïp˜#øF“bTºa§ã¿I[,î{§Wv’?’,2$ˆ,;m?;È\¹Þÿ}}>4£¥— ÈÉM€È:Âuþùç«o&—u”†É!¦5Êðí¼šŠø“•ZÙ’Àz%I5‹$Âe/‹<Т‹.êÈðƒ7³r½Qyè[^ÛH2|'Ct#ýhZàÈ}Ê)§¸Ë.»Ì9`”ab¹~Çw8feà:ÇBų³¦QjJàÈÊìF´FT¢6.òaƒ›—.ð€Ðör@: t•°ëCyûL‡ Í T£ælFаÒ7–wÜÑí·ß~ s—N·Ò«5¯G$Ò]>ê/=.YÍ•8À2U©\¥ã Íp„ 0®¸âŠnäÈ‘•êÌôñ< Œàˆ=Qg8Àª UÛ¡ºõ?c@$bIY¯+K3Jóš¼ æÀŒÚÏ’¸úEa³4ìeêR×wÜqN«Ân±Åkö~vq ·0`€Â,bk–êšáØ·I]Fš°5Ëj».Ï ù 3ø¥­PÍÀ-1¼Þwß} ¹±´Ò0»Ö8%(Œƒü€­PÍnôèÑ 5 xØÿ´rC»6ðbäù°Ç3J–¬ðÈ'7U«Tu†# öž½÷ÞÛýõ¯mõ^v}Š ‹Ï<óÌãVZi¥ïÒU¯·Þzî“O>QýE«¨:Ãp šX®R¾ëVon×'ǼOî¾ûn'ñšû ¹š»»&¹À,Á•+ ª8Ñ͓OG}´z•$q3«#= lf–#ó&Ž FÉp@òO82Ý’š, ª¸à¿à‚ 4[ á!FÙçû76ö8ÖoÔ:Pÿã¿*™s[¯ìç* oË­·ÞZs`'v·ŒT„— K…¢°ðK,±„»ÿþûͥŇ‹£ÇA¤/1ÉØÔbm¿\+p’[-ê$0,"á©!©±ŠØ5Çà R¼Uõu!™Ó@§ˆæ–h=F’+p¨@I0XTîi’ú*I>f¦." ˆ,@àxK5ÎàBŽ8â·ë®»VͼÔxÍÎÅj)É@ÊCc^Dšx≠+p}ú¤ÐlT‰_¨¤2ÎFc¬™áº þðm&š»žŽôšá$Û¤“NZÏõ¹,à FH‘I¹ì£5º1 Dcv#æs•UViìâJ÷šá‚d9ªxþùçwüŽ=öX÷ÙgŸ¥ŽdÐKàH$Y©˜÷ɬ÷ꫯêkùEY$®X®}üñÇŠËíÝÌüÝHÏ?ÿ¼1b„‚b¥¾•’Ö‹DmîÅÓ¤×ñ¢ƒ±÷(?å”SzñØðâ.åÅÛ&×Ý¿ðÁ½lJýØi§¼¬d¼Ø#K‚V:ßM_dká_|q/¦/!N©w½× ÇŽÍuýýïwÄýáiƒáÔc"Ü=ôPEËÊ#?°Åáê5ÅS”ð,_ýuõ€ïß¿»”h›O<ñD÷ÒK/éso‡Ý²—Ò„Þà×®Aôy­µÖRaƒ óòÉ3,Î La_ Ä eÞyçíz¥ÑË/¿ìŽ9æ7tèP% üIõ3n=óÌ3½h)½(NâNwͱqãÆy°^<ðsÝç{î¹ÇŸvÚiÚ––ò&÷‚‹¯ËÉé§ŸÞKp±7°\÷±ÑƳ|\f™e¼8x´uœÇÎpä À<ðÀ¤*ìY­ -0î$JçíG\`ži–YfQ% NÍ|ðã·ìãÜøñãhlhè€Òè&"ä†0¦±cǶò±Ò›aá…ö{î¹g¥Ó…8Ž’äÓO?íÑÙ·y‰žÖ´ø”ö8—×âèÅ/Ð˲2¶ Ûl³_n¹åbÏñàO<¡J#ÉÑöîÅÎp¼éÈ[|õÕW;°Ô‹J‚Õè•W^QÇ_’ì=ùä“…ÉTƒºsæ€LËÁp¦™fš®—ÅÜEœg¿~ýÜàÁƒÃ£oÛgEcÉñù矻k®¹¦mi÷P!M8D’`Üy ~ø¡&Ü#é^ÜÀpÄEàM®^ö§ÚgÕI ßL&­ gÿ2 Ü t…®Úœ:pà@/a:ÕŠäúœÌÞ~ذa^ÖòÚlo2~zýQ&ï$f/NéÚ ÑÌy1ðzÑÀj_%îËË¢Óµ×^«ýå³STDˆÀ)²¶W4(²=‘Èo‡ý%oi·Z}àXbBBjã¢0ØT7Þxcwî¹çv¬»UŽVaE»– kiJ7~ñÅÝu×]ç8à‹!K‰Ç®Gu¶ ìß°µ€Ü)ª¸‡ &O\ƒ½(+Ò'NÌN8¡!]é¡–õ…ä¡à“ è¤°Ñ¬šG¸>ȳC† )¤gi·pP6h¹²QZŸÙ˜1ct‰’¬ãTÏæQÞ^¦$£zŠç®ŒÝzÑÖu·EîTƒ ~íµ×¼gÊž\sÞÂŒIè ªe#ã@–9À~ …ˆ?üpfìŒ5—”©$ó¯ uy ÇìÓ8EÈDèvØauccI™¥Œ±u y$õÀ÷ªQþ8À S@ÑIì¦êA„°Í:묙ênÝG«Ñö`³9üðÃ3Õ kL} Dš"Ó 7Ü  hpÆN¢<)ž5$p¨T~>ÿüó)XòÅðjŠìËì,úq¼Ïäé[im=¦¼3°Ï凗^z©â–e§h„~¡oß¾Nâû4`8Kû¶(¯šáÂ…Ø5yäwñŇC…údnœÎqĦœŒ˜y#¢¿óˆÆFŽ„jä$fÁùš¾ñܲ*lŒ—¦†Aƒ© ö¢ŒŒËW\B ð^$*¾ê È"O0òãC™75j” ŸØf$.z„‘²+ËÔ”ÀÑ!¢„y£€Á^DâIxÒ}÷Ý׫{!›dž(¯G®ÂJ°(ð˜Õø#ÝrÖ©i(9Í<ýôÓ5X3ëm´} \‘n£é¿þõ¯—#lþyy"öÝq3v–ûÐqËD3Þÿ«®ºj–»Qj[ÓG Ûo¿½ª^Y^æqoPâB…/„süéOr·ß~{ôVAàùÈSbG2"á5Ÿ'ºüò˵¹åxë{ìáŽ:ê(‡yéSKG'Ï:ë,}tÒIyésCíÄq›ä^xa/áb¶½†êëdaàò@XÎÁwˆˆŽ@¬:°±) Ì]ž¨e›gžyÔÐHòº< ¾zoVÔè${Š¥C˜áX¢uƒçF½¼Jºð¬" 0Ãaÿ]gu\¿~ýÜ>ûì“ô-S¯¯e£…x °aÝqÇs·G¨‡ÃÌpàœ|ôÑGª¹ Ç ¨j5õô»ÓeXN†ä28̳—0`€[zé¥õå‡(o”ˆÀaßaêúé§SÏ>Ò¿ýöÛjg‹îÏá†d¯(^'{×n„…Oû9ð2ÃÎK´6„a¼TbÚ@Z‹.1ÓnK’õ7åiR©¸}!.¸Np-+Ëôq¬ —ÚÈË„\yh-ùÃq0Õ@¼eZh!·Á„Cö™ȇPž§ç@Ô Bˆã8'à 0ûí·_wO¯ŠDŽ·kk:Ïú;¯qs€Àjxt¹¬û6–”áGÃÛ–ˆøŽÀ®¥76:Zón»í¦Pva† ÿÁc†ñqŒ}6¶á¬Ûâ8:Ï&Èö<Ñ™‚sy#%¼8@/H û·ò¾•µPò6æå7B8m%/¦`ÀŸvÚiÝ^{íåæO–䡉 ±y³Í6ÓÏM6Ù$|¨ÚFÞ¤ ?ôÐCŠÑÏ5¼]¹°ä’Kª¡¼jE>‰íê‹/¾p+­´R‡[Rýö¸h¡‰,'(c¿Ÿ5”ÌjÌvy¢D”&å&ðˆwÞYµxåçóöcÖæmJø™Q¡ %cÙ™¯öžyPðÕ),ãÙ¿í½÷ÞêN‡»ø’¡Œ>ŒœüKe†£ïhøãá“ýÐ$“L’–Ô×LÒ¥&IÃl7÷Üs—ÔØõÕÒÞR˜5X‡F{ï^ß݈ÔàE4Ääè#Ù=⻾š2ZJö$©‘¨×½¬³½Ìx…EħZ/5…LŸo¾ùJ[u&?É'–ɶEy&J(OZdÔŠF(R%™þ55¤íMõ>®\–AÚÏN·#ï÷£¶Gмw£bûSÙÃE's6¸xsãÕw·‘q ›9ÐQ„¸àÝê|5Öèfž[ß»˜©Ïp·xuo¹å–3ž(FÆnä@Û沤$ Tü.ŒÝƶ !„Â/³Ì2º¬´Ý6ܬ¿m8Øß!àÍ1Ç-ß?©zZnH–*¨¾Ó2ˆ½ ðúVXA1F„×^L ^ ‘yÙ÷yA†ªÙ;Á?ôm´‘7³èßeçO=õT/èW=êHÓ„:ßzë-/°{=ê®ç‡°àÚ^EQLëüöÛo{ iºÈÓ¸qã¼$0 §KŸÔEÙz©R=Õ®/:¦Iê BÕ˜›ö¹¯¿þÚK$‚‚Òð %JA…T(ÉSî-Ù V½GXämì%o@&!t‚ØCè`ÙOzÉ%íeIXÞFNòéùêýdÿé<ð@m(gü]{íµ=ÚRéJß&žxb/6L/õž~Câ®uÑV™¹½ÀÍyîq }—tc^âýÔSOíèÖ àm‰OÔùå—_jyÙ7ûÉ'Ÿ\ï#³Ÿ—%±1b„ò‡x©I:xTàw´-TåŸ \æäíÄ€ºè¢‹üàÁƒ½x³ø¹æš«4"LÌb²/ô³Ì2‹—ì§*˜AÈøŒþ!x3Î8£í© -ƒº^ÅŒ—”ÆZ\’ZúÙgŸÝKR ý-Ùat`‹3wÍêÄNéE™¤3îûï¿ïçŸ~/IUü{ï½ç%"ÃßtÓMZç¸ÇèÑ£õ·dwUÈ<٠묵îºëz‰ÚÐså3/-„!c–“ bR„ –€b}ypIx¢¼ ¢òz´òÿLàj0¨§4ãÇ÷¢íÔÁ‚Œ9Ò}ôÑ^ ÛUÈD¡ÒCØ¢‚Ç`äÍÞ¬ÀõíÛ×|ðÁ=X) ²^ò§÷8VþCò8h›ÄdR:%®qþÁÔöƒA¥Ã;Ì# 'DK§e¿«³ÊE¼Ø?uædöäÁ–*½^Ì)ú‚`¶Ü|óÍKu–×S:QåKÑ®£á92h3A„FÌ_”yäMH‚öR„²t Å ÷ .¸ Bºc®¸å–[Jçý"ËB'×ã2ÐÍP¬T#® »d Å_\¿â'‚ë'ýâ"9ïŸЎñð‰RêÝwßíåPœo \ñ®ºêªp™}ÆpÀ.†):ï¼óÜ AƒØã*”9v@¾Ë~Dó NIf‰ W7vc;‰£„QŸ„(ÕHö]Ú&Bf-J”í¤N™éz\Žó€,•KÇêM¯…`ÊÌèÆŒSº–ôÒxAØDÍXn¹å4G&zë.UØ%_rmHã1“‘4b—]vQ{‚ÉRGó•‘ðÌ3ÏLLب[öOšB7˜ n¿ývµûÕJòH6PMöeZžä„¸¾‘ø‚ì3dü‘=·Ðœ}ÌÂØ,k`O`ü‡Œˆ|²Ž†îØ?InBrJÑ~:ü^E飳'B³¼žZ÷íŠóU–Ó]wJtxñ+íÕPžˆ}ϳG©Ej)£JɃ¦ ”0(jP<ˆ-°Ö-õ¼ØUÁ3ÕTSy™‰üþûï_ºŽ={Oñ Q5¿ÌØÅÄåQ ™¡¼,cõ'æöch%i× Ñ•Y«t/ö¬dIò"ø%3 u¢¬‘|Üj¦ˆÖ£ÔøWô=Ë£Ÿ9 €F:¨Äx®š¸zìuy \¸.ú‰Š_ Kƒ7z®Úwìvo¼ñFI˜¢eÅ'Ô ð®çeÒ(•_#ÁÁZBØ•×SíÚ¢ œíá"ë–B¸ŠÍ<óÌ‘£íûŠ¢„¿(U[’Ö Ï–½øÆyÉ—Zj©¸S5±GŒ<ü5Jåõ4z}‘Ê›ÀEžæÂ /ù•¯W\qE6b­H„¦4I„V‰q >˜ÀÕÇ'+eH„&p‰°Ñ*1ÔǸúød¥Œ‰pÀ.6Z%Æú8`WŸ¬”q ˜À%ÂF«Ä8PLàêã“•2$¸DØh•ê〠\}|²RÆD8`—­ã@}0«OVÊ8Làa£Ub¨&põñÉJဠ\"l´JŒõqÀâáêãS]¥³Q‹ÔUØ Årà³Ï>+4‘ \ìcoì àwhnràój!m5Vsw–,wÿý÷+RXÑ8`×⢬Ç%—\2±D-6)÷—ƒüEšiJw‚êœûþD;`åFƒßG—‚´å¶¼Á«­x%÷OÃ4ó-3À…LiÒä“·¤a@RÁm4J–Ë.»¬“„+N’š8^lE!¸&Ÿ$«{6 Ò’çÀZk­å$ó§G¡æ“¿Sûj4k‚×d_}ñÅäs“L2I5Ø%õpø?I¿¥I1ï½÷Þz.É|¸&o[pô“ÈÚÄí»êI é˜éH¨RšÜ"tÄú`Èl†ËÃS²6†&p…y”Ö‘nË-·t+®¸¢›gžyÜ[o½•PíVM-\uÕUnÝu×u/¼ðB­¢=o—û÷ß·ï¾ûª½ÿþûn¶ÙfsgœqFBµ[5Õ8ðöÛo»!C†(RsµrY8g—ÀS tgúé§wƒvØì€wCà^ýõj·*ªqø6Ûlㆮ…YWn™ÀU{š1ç@~þùç{œùÝï~§°ÜÝ}÷ݧ¡< 2ï±Ç=ÊÙÖ8ðÞ{ï9r9DiذanÖYgÕ¥|ôxV¿ì¯Üeùrûí·»9çœ3–$×]wCC”A›Wè[¡‚¯ôá‡v_|±{úé§sÓo›á|T$š`ÙøÐCÅ^yÊ)§è>nŸ}öq»ì²‹+ DwlgÛxð“O>qãÇ×,Eá¶[o½µ"37ÎèùG}Ô=û쳡Hæ>Mà|$¸¡…|ê©§J!"Àž“A'*\h̾øâ‹Ì«©ì~ÇŠ?òÈ#nÚi§usÍ5W© óÏ?¿#µàüApà 7¸»îº«T&s_ÄeɨAÈFÝ3ÆK^8½RÂwüÌ3Ïìe?á¿þúk/ö8¿í¶ÛzYv6X³ã€DÜû¡C‡z®¸Ó¥c²‡öwß}wéw¿Ø ×Ä+-dÿþýÕæóî»ïªåñÇïŽ=öX7ãŒ3j «Ç{Ì]qÅMÔn—”s€l¨ä‰[xá…ËOåî·9/·ðÈ.½ôR]V4HM2»)ÐÐd“M¦J•¼†´À’Ä/ýè£Ü9çœã¨ËöÄoÐæ m†ká묳ŽÂ.„°I'T“âebÂÖc#—¾ù曺j`\²®O±à}@eéª þ­{Æ48`KÊ4¸ju*pÀ®cì°q ˜À¥ÁU«Ó8P&pÓÊa¢~üñÇVª°k ʸìe—]殽öÚj.v•¸o=óÌ3…î¤ \ wµÕVÓX8¢Àêãa7â–Õõ¾+óUÊ.…ç%~•n½õÖÓˆ‚òعn—û*É ~©nÁtK/½tîûS­W;-œ[d‘E!%ÄÇ$K¸Qo`Ô¾òÊ+^:¼¤ŠN6Ã¥ø„W_}uG  á«DwÜqG׆ñ¬KÓ[lá~ûÛßVbQaŽ›À¥ü(7ÜpCÅ;ÁÑ9/½-Ù<‰^î6" €¬²›m¶™FtCÿMàR~Ê81óö^sÍ5+úR楗^ê*S)ÀYÂL’n!¸69F:,þ(¾‡ßhq–fÏÈgôe,þ›`=âVÆgôï÷¿ÿ½Ã^þ ß 5šfšitOFr?þñšdcê©§Ö—^4˜=f™e–Žò2«77ëð“Êû-ÉΞÓŸü!DøV¢pa™Aap3è'Ÿ|r„ áá@h‚• u tqÂÈ1–¸Apƒ ¡Æ¬àc¾ˆ¶‹™61«!l8$ó¾H»»LàÚ0˜]Xf½òÊ+ú÷òË/—¾W.lŸ>}t€†AÊçtÓM§3H˜I¦šj*IÚÐ쪷@`ËgÞ?ü°ôÂ/„3&G| ³6á;ÂHÿ»Là~ʵqÏzâ‰'T)Bþ2òDZÄÛ„åVpᓌž(Š€‰ï(†¢/^<Ø'™½!ff2ãì>V§ÁIDATr‰%–pK-µ”[` ™ŸÁ®EûôÓO݃>¨¤dEe†p1ˆ_|qDÀ-ð‡€M2É$-Þ±8—éͲC?ðŽOøŸ¼VXAÿ–[n9]>ç½÷&p >AÞØ÷K¤òwÞéÈ9œy#3(øáê–eRƒ,¬Zœ=ä /¼ +`óˆ„ÇÄÀ~\uÕU57|æXÞÈ®Ž'ÆÞ÷,ÒÙ"l(HŸ^¿~ýÜÊ+¯ìØ[¥Ã|Káû}÷ݧPz(™P­±Ænƒ 6p¤wžbŠ)Ò¹yµšÀU`(û ¸ø¢êžh¢‰ôÍÊÃ0`€t+𭇱[â}óÍ7« ¢”áå‡wÎFm¤ÂØŽv4ui¬ÑÏ…‡¿æšküÚk¯íEuîÅæäÅ€ëefó2«Ÿ2Èò© @“—™Î‹ªsˆÁó²ä÷â@¹£²ízzÿý÷ý‘GéE¯‚†À ´ YÎFÂwî¹çúW\Ã¥ŸsÎ9ýÈ‘#½Ø 3Ó“®8QOûvÚÉK˜Œ—pôÑG{ñnÏÌñ†4ÏžíàÁƒ½ìí¼8ø<Ðóbí4u¥À‰ÖË‹»Îf¯í/¼ðBÏrÒ¨xO?zôh/^/ºÜÜÿý½¸Çu¬£]%pâžä=ôP]ë‹–Q÷kY\çwl4øÆ¼PÏ>ûl/:ë|òÉ^LmïqלÀ‰ë[Nüý”ñânÕvfÛ ;ϼðÇ{¬Ÿx≽x¶ø§Ÿ~º­*¼À‰×‚®åÅ­ÊKä±϶2Øn–Mˆ-ϯµÖZ^Üéü‰'žØ6f¡Ng½x$ø)§œÒKÒˆl>ykUG9púé§ëCB¡<³_ÚTXÃ7³¸‚—ÂFÆ8àhNÒ•ÙgŸÝÝvÛmš^,®\Ç )pi.»ì²Íí*‰¡Rì:À_Á[…)2×O˜.‰8­7ÞXÁUqÿ1aKcدNf·»îºKÈvÛm·Ô:˜?wë¬1b„†yˆö)Ñœc„áœuÖYîÉ'ŸÔhgÂmÖ_}GÒÅN¹±ÁC4hPâMÁ—TÜÝ4iâ*«¬âDÑ 1k‰ß(ŠgŠúÎâͳÝd“MoU¡f8¢‹‡îÄc$Qˆ9‚'—YfÍdJXÈvÛmç¾ùæÍùö—¿ü%ñ‡RO…D+à=Ó@®µ¤IÔçn¿ýöÓ(tÑðªÐÑÿ3Î8£¥[vØaN¼@Zª#­‹Ù÷ï²Ë. àD0qâ”¶V¦õ‹°yìl³–èmEؼ¬ï{Õ‹¿¥</¨½î‡†4Ž0´W3Mà$u”–%rlùé§ŸÞË’9î¥cxYTâE=9 òçw^©>¾sÌ1^ð2{«öƒ6H i"ûì³—Üp=ŽñŸGú[‰¨+ê¨P«|¥zjǽçuÉpT«hÃç eXrÉ%ý^{íÕ0ª] KH*‰FŽ-&Êuã$ñˆ#ŽP»„óèo P-]wÚi§y‰ãR£«hM½,õ>~øsžþù^öœ^=züCÑ/Á©ô7Ýt“—å¬Ç®ˆgüرcýI'äQkC²¤ö²Òß´;ŽÙˆ|@X¹Ÿ,ýŽ;îèO8á„pºôÉÀÆ‘6D‰A.‘ízˆûÈlP:çuqA9 eÒß(êeéí‹S–ßüɲM¯ÅøŒçíÅ÷Á¢?8“KتïñyDg/1ˆ*´1ð«Ô¾ôïßßo¹å– ÔÔ³ŠÂž#!fš¹çž»ÔŽè ÇÌ.)µß©ë‚ .ÐÙbÔ¨Q^"ÏÕÆ$À>:¨á‘,‰ÕㆲQÔJ~þ‡37ç%K©ŒL SŠÎŒÌØ8ƒ*Þ<„4Ñ~Erwk{™íe©æO9å­9:Ã1k‰fÐuÔQÚ&A.Ó~ã†Ñ^.ø» @´ ÿHÚ²ûî»{ Ö²Iþ“­‚>Ë$뤮Âìá€o ”«$‰zÑtG@.ˆ•N±7¡ Øÿd)FV(\О²”¢A¬lÒ ¢ tÜqÇéqTÒ`>‚•ìÜxQYƒÿÁ>>Ö" Ä9[!öÜsO-NÐ&µ -´fí×&‡6®œ:ûSÀ~°Q¡,ÚtÓM‰¾@ë­·žÂí5¡\K“ö/DfðID¬>´\ôQôì•Ä©˜—¿šrdfq×^{m©Ø0ì›ÁÄDu/BîèAÁÓ·¤‰g*YÒT à<à'&ỈþF°âl'Pô;6\W@êâSÞî=êEq?™yëo½¤^ ÀhƒÜËhû(à ŽòA3 ä:/4@M×Áá;‚…&AãE Þ<ЏL}2‹9¡æ……Ö/. |á™Ñ÷À›‹.º¨Ç >’UŒVOˆ!¦ ¤ ¥XSIÖ]cFáA€ú”$1 X²¤éU-3Î[‚¯ÁÌ£{ ff?„!ØvÛm2/þ0°’#.ŽdÉäÀ¯”ý¡Ù«—*ÍÆÌšÔ%Ì q„€3Ðy)Bpd¥}"+¤ùõ×_¯X#ð©_¿~zœzTÊ$PˆÂEÏEÿÁêeø‚I'ª ­ÔŸh=IgñHš #p0F6ºú–M’I R ^T51é—xóC`+²ÄZi¥•G#ÜS"Žј·ö™gž©^,xÃ30Ãò#+¶®6lXòᇀ'yy˫҅ ®)7ƒH.;UdÈ~/\ê%+òØ 4²¯ôÿüç?õ<χûË K£Ä‘‹—ýªò>å¡4‰öåJœ@òShŒð;‰Ox-/U~%Q_´Þ*…"YÞyÐNÅó[ÞÖ:hd‰kßBàLhÞdIËWÙÇèà—Ù)ö|ô 6)6J2e?Y*‚€†s¥ƒU¾Ð.Y¶©æ0¼(Ä«Â3h+}Fc*3aEžžzê©jb(¯ƒ€_xÅ=ˉûs>ßyaÆ• eÚñ){S}QÈÌžÊí 'p hÁ°×Ù$ŽU©4\•"=… ‚YJ–’U½('tp1Èš!Adö“ˆŒfªÈÔ5˜7°M2«GÍI6²psDM­KQ4$É«šuaèe)˜eÂ(Í2¨0{챦›+г6±¼39†n–Û¢XJ­;…8¸%6'5„c˜fifd¨Äf3öÞí™±Ó¤ÿ3WÅt¾BìCFAãÅx‹Ìò“uþ¹d­Ø1ÖckÅ€Oöž4©PfrF­³Î:ªöÆS;ª^#ã@à€ø®jv#¼nˆúN[Øô¾iNŸY© Ø®»îª*yITo`¯Yy0jš_”#˜vðálDÓÛj“ =Ã…7ÆãsÎ9G½!ð À] ·)ü$º‡¸£í±Çšüã60x¿7±¶p¢U‰ÍÛõ¼ÍЪë…F ¯pñuÌ[7¬½ p€( ”g³qÀÐÞ)*¬–²C1ãÅ€àáA"o>/©k]fçsÄ4ލúñ´AÐ$Ê¡JÔ©nt­À†£GY5vÊ’B3¯K†@åä 3fŒ—œáênÖ·o_/¸,;[¨ë.ú%À‘€S|û$Eƒ.+ÁD¯µïãnr,‰ GB /‘踊e ‰KÙêæW 0Ä*PïxЪðøçï£ÎrQ€ü‚ZF$h[Äà.…ª?‹dWã©ÏE`%¡5ãÆcE !7D}LtµàƒÔ¨ÅN·Ê¢ä~øa.¢ÇÑ6ãØ€‘ÎË0Ž &p Œ`ˆc`–Ho„‘7)Ðq+¬°‚L'{¨ÖŠÆp€hsQzèP¦Eì&bèXi€“‰Ðå‰LàZxZD|ãÄÌÇÒ“àI0‰^j©¥Aœ’Ií>àqÅsázî¹çô(yìc!Ì^d‡§¹"Äé:¾’œ5KðA1ã‰÷½¾8­§Æu €8½nBÉ`Šâ$Ø”LV\‘òüáßʧx}(Œ &ºžÈp–éü±ZàX‘È.ŧÉ~ÌO¢O$ 6ö$ €}$ \ÿ$5né;Ç“²[bS[®¥ÀÌòüýÎŒ%.vz‰ö.½xx Á QÜNâ [nGÖ+0ëÀBÌЇ7=ƒ3 P>£8'é ÊÞôü1#†ï ÜI'T÷Œ¢ /}ç{\–ÊÿÀBaÙ‹€ˆmJÿØ…ï|J4¶‚‰-R…„Ïð},@IüÑÎðÍ.ý‚¨"^á"†gљ٣(\`Goi×QöÇ߈ôMþl£Þ0ëÍ“\G1ÌB|✵¢³³[ùÌÇo„„OP¸¢3fÞ4Y~€&pY~:Ö¶Âq +Âs ÷Ô¬C¹å€ \n5<0ËãS³6ç–ÿËÑb'7|]IEND®B`‚asio-1.12.2/doc/tip.png000066400000000000000000000007011340672067200146040ustar00rootroot00000000000000‰PNG  IHDR*Þ bKGDª#2ÛIDATxÚu’»à @!+xŒ¬’6¥K—¬àR+hJ·”–TaK >ßžþRh~j?ïg0qF@”Ÿøƒð!¢ÊòeH,î…0܆x˜”0‘&p „^—µªJéÄ5y»=ôJØ % P<†*ÄŸ{Œ®”¨…Š–×Âj÷ #û7±^ñóŸÍL~Ù!=™ ä&Ṳ; ‘&rgߊFâm‰¬Í©×Pý•¬Ö;Ùä óot6BöJäqC ìXduÀê³Ýi]}OLð4+|) -íCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignatureee9d877396ce267aeb0179d35f81b2ac3ú'tEXtPage25x24+0+0¾ñ ¯IEND®B`‚asio-1.12.2/doc/up.png000066400000000000000000000005621340672067200144410ustar00rootroot00000000000000‰PNG  IHDR€~+ÿsBITÛáOà*PLTEfffC@>¶µ´¨§¥‹‰ˆÓÓÒQOM&# ™™™ÅÄÃ`^\ââáÿÿÿ–Ø=tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿEÀÜÈ pHYs  ÒÝ~ü%tEXtSoftwareMacromedia Fireworks MX 2004‡v¬ÏtEXtCreation Time10/03/04ǯŒ rIDATxœ•α €0Fá'X¸€¥Q\À=ÜÀÖ,ÀÎ%ÄN„€Ø%»ø_¢˜âøòäˆ:G§áÑ®ü¸A—”™Š–E‹–Å•=9*{«ä– j˜í²QܰŒªÁ5âÚëmÜ£1¬écã»Ã^ÃpŠø™_E"Ï\ÜIEND®B`‚asio-1.12.2/doc/up_disabled.png000066400000000000000000000021331340672067200162640ustar00rootroot00000000000000‰PNG  IHDREŽÆþgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€èu0ê`:—o—©™ÔPLTEÑÐÏàààÙÙØðððîííèççöööÜÜÛÔÓÒëëëóóóßßÞùùùÿÿÿÏÏÏÏÏÏÏÏÏÏÏÏÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÒÒÒÒÒÒÒÒÒÒÒÒÒÒÒÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ×××××××××××××××ØØØØØØØØØØØØØØØÙÙÙÙÙÙÙÙÙÙÙÙÙÙÙÚÚÚÚÚÚÚÚÚÚÚÚÚÚÚÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞßßßßßßßßßßßßßßßàààààààààààààààáááááááááááááááâââââââââââââââãããããããããããããããäääääääääääääääåååååååååååååååæææææææææææææææçççççççççççççççèèèèèèèèèèèèèèèéééééééééééééééêêêêêêêêêêêêêêêëëëëëëëëëëëëëëëìììììììììììììììíííííííííííííííîîîîîîîîîîîîîîîïïïïïïïïïïïïïïïðððððððððððððððñññññññññññññññòòòòòòòòòòòòòòòóóóóóóóóóóóóóóóôôôôôôôôôôôôôôôõõõõõõõõõõõõõõõööööööööööööööö÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøùùùùùùùùùùùùùùùúúúúúúúúúúúúúúúûûûûûûûûûûûûûûûüüüüüüüüüüüüüüüýýýýýýýýýýýýýýýþþþþþþþþþþþþþþþÿÿÿÿÿÿÿÿÿæ}DŠtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿEÀÜÈÀIDATxœbäe€€ÿÿrB™Äúöá;T €˜B ¾C8Ä„‚ ’L €˜… ‚Ä„" &T!° @1ð@lá@ˆ²Ó_°*Æ¿ ’,ó €˜˜AêyÀ*ÿYˆ‰‘‹ &ÄÀÀdá F®œp³Øÿs13P'#BÈaf` &L@ØÄ›@a X˜þcG(0ØN.3@¥:ŸIEND®B`‚asio-1.12.2/doc/warning.png000066400000000000000000000023311340672067200154560ustar00rootroot00000000000000‰PNG  IHDRשÍÊPLTE!)1BJRZks{„Œ””{{œRRœZZœ{{¥¥99¥JJ¥„„¥””¥¥¥­­11­””µµ))µŒŒµœœµ¥¥µµµ½½­­½µµÆÆÆÆÆÆÎÎÎÎ))ÖÖ))ÖÖÖÞÞÞÞçç!!çççïïïïï÷÷÷÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp;ã”bKGDˆHèIDATxÚm’}o‚0Æï”MÜæÄé¦5…%¼•%m ßÿs­ìzP“^ÿ ²¥UDÂýKnßk[;Ò»?0n!¿œqCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com‘º!¸*tEXtSignaturec42b7d2d564aab588891979703f02b45Oß“tEXtPage24x24+0+0r[ 1IEND®B`‚asio-1.12.2/include/000077500000000000000000000000001340672067200141625ustar00rootroot00000000000000asio-1.12.2/include/Makefile.am000066400000000000000000000377641340672067200162370ustar00rootroot00000000000000# find . -name "*.*pp" | sed -e 's/^\.\///' | sed -e 's/^.*$/ & \\/' | sort nobase_include_HEADERS = \ asio/associated_allocator.hpp \ asio/associated_executor.hpp \ asio/async_result.hpp \ asio/basic_datagram_socket.hpp \ asio/basic_deadline_timer.hpp \ asio/basic_io_object.hpp \ asio/basic_raw_socket.hpp \ asio/basic_seq_packet_socket.hpp \ asio/basic_serial_port.hpp \ asio/basic_signal_set.hpp \ asio/basic_socket_acceptor.hpp \ asio/basic_socket.hpp \ asio/basic_socket_iostream.hpp \ asio/basic_socket_streambuf.hpp \ asio/basic_streambuf_fwd.hpp \ asio/basic_streambuf.hpp \ asio/basic_stream_socket.hpp \ asio/basic_waitable_timer.hpp \ asio/bind_executor.hpp \ asio/buffered_read_stream_fwd.hpp \ asio/buffered_read_stream.hpp \ asio/buffered_stream_fwd.hpp \ asio/buffered_stream.hpp \ asio/buffered_write_stream_fwd.hpp \ asio/buffered_write_stream.hpp \ asio/buffer.hpp \ asio/buffers_iterator.hpp \ asio/completion_condition.hpp \ asio/connect.hpp \ asio/coroutine.hpp \ asio/datagram_socket_service.hpp \ asio/deadline_timer.hpp \ asio/deadline_timer_service.hpp \ asio/defer.hpp \ asio/detail/array_fwd.hpp \ asio/detail/array.hpp \ asio/detail/assert.hpp \ asio/detail/atomic_count.hpp \ asio/detail/base_from_completion_cond.hpp \ asio/detail/bind_handler.hpp \ asio/detail/buffered_stream_storage.hpp \ asio/detail/buffer_resize_guard.hpp \ asio/detail/buffer_sequence_adapter.hpp \ asio/detail/call_stack.hpp \ asio/detail/chrono.hpp \ asio/detail/chrono_time_traits.hpp \ asio/detail/completion_handler.hpp \ asio/detail/concurrency_hint.hpp \ asio/detail/conditionally_enabled_event.hpp \ asio/detail/conditionally_enabled_mutex.hpp \ asio/detail/config.hpp \ asio/detail/consuming_buffers.hpp \ asio/detail/cstddef.hpp \ asio/detail/cstdint.hpp \ asio/detail/date_time_fwd.hpp \ asio/detail/deadline_timer_service.hpp \ asio/detail/dependent_type.hpp \ asio/detail/descriptor_ops.hpp \ asio/detail/descriptor_read_op.hpp \ asio/detail/descriptor_write_op.hpp \ asio/detail/dev_poll_reactor.hpp \ asio/detail/epoll_reactor.hpp \ asio/detail/eventfd_select_interrupter.hpp \ asio/detail/event.hpp \ asio/detail/executor_op.hpp \ asio/detail/fd_set_adapter.hpp \ asio/detail/fenced_block.hpp \ asio/detail/functional.hpp \ asio/detail/future.hpp \ asio/detail/gcc_arm_fenced_block.hpp \ asio/detail/gcc_hppa_fenced_block.hpp \ asio/detail/gcc_sync_fenced_block.hpp \ asio/detail/gcc_x86_fenced_block.hpp \ asio/detail/global.hpp \ asio/detail/handler_alloc_helpers.hpp \ asio/detail/handler_cont_helpers.hpp \ asio/detail/handler_invoke_helpers.hpp \ asio/detail/handler_tracking.hpp \ asio/detail/handler_type_requirements.hpp \ asio/detail/handler_work.hpp \ asio/detail/hash_map.hpp \ asio/detail/impl/buffer_sequence_adapter.ipp \ asio/detail/impl/descriptor_ops.ipp \ asio/detail/impl/dev_poll_reactor.hpp \ asio/detail/impl/dev_poll_reactor.ipp \ asio/detail/impl/epoll_reactor.hpp \ asio/detail/impl/epoll_reactor.ipp \ asio/detail/impl/eventfd_select_interrupter.ipp \ asio/detail/impl/handler_tracking.ipp \ asio/detail/impl/kqueue_reactor.hpp \ asio/detail/impl/kqueue_reactor.ipp \ asio/detail/impl/null_event.ipp \ asio/detail/impl/pipe_select_interrupter.ipp \ asio/detail/impl/posix_event.ipp \ asio/detail/impl/posix_mutex.ipp \ asio/detail/impl/posix_thread.ipp \ asio/detail/impl/posix_tss_ptr.ipp \ asio/detail/impl/reactive_descriptor_service.ipp \ asio/detail/impl/reactive_serial_port_service.ipp \ asio/detail/impl/reactive_socket_service_base.ipp \ asio/detail/impl/resolver_service_base.ipp \ asio/detail/impl/scheduler.ipp \ asio/detail/impl/select_reactor.hpp \ asio/detail/impl/select_reactor.ipp \ asio/detail/impl/service_registry.hpp \ asio/detail/impl/service_registry.ipp \ asio/detail/impl/signal_set_service.ipp \ asio/detail/impl/socket_ops.ipp \ asio/detail/impl/socket_select_interrupter.ipp \ asio/detail/impl/strand_executor_service.hpp \ asio/detail/impl/strand_executor_service.ipp \ asio/detail/impl/strand_service.hpp \ asio/detail/impl/strand_service.ipp \ asio/detail/impl/throw_error.ipp \ asio/detail/impl/timer_queue_ptime.ipp \ asio/detail/impl/timer_queue_set.ipp \ asio/detail/impl/win_event.ipp \ asio/detail/impl/win_iocp_handle_service.ipp \ asio/detail/impl/win_iocp_io_context.hpp \ asio/detail/impl/win_iocp_io_context.ipp \ asio/detail/impl/win_iocp_serial_port_service.ipp \ asio/detail/impl/win_iocp_socket_service_base.ipp \ asio/detail/impl/win_mutex.ipp \ asio/detail/impl/win_object_handle_service.ipp \ asio/detail/impl/winrt_ssocket_service_base.ipp \ asio/detail/impl/winrt_timer_scheduler.hpp \ asio/detail/impl/winrt_timer_scheduler.ipp \ asio/detail/impl/winsock_init.ipp \ asio/detail/impl/win_static_mutex.ipp \ asio/detail/impl/win_thread.ipp \ asio/detail/impl/win_tss_ptr.ipp \ asio/detail/io_control.hpp \ asio/detail/is_buffer_sequence.hpp \ asio/detail/is_executor.hpp \ asio/detail/keyword_tss_ptr.hpp \ asio/detail/kqueue_reactor.hpp \ asio/detail/limits.hpp \ asio/detail/local_free_on_block_exit.hpp \ asio/detail/macos_fenced_block.hpp \ asio/detail/memory.hpp \ asio/detail/mutex.hpp \ asio/detail/noncopyable.hpp \ asio/detail/null_event.hpp \ asio/detail/null_fenced_block.hpp \ asio/detail/null_global.hpp \ asio/detail/null_mutex.hpp \ asio/detail/null_reactor.hpp \ asio/detail/null_signal_blocker.hpp \ asio/detail/null_socket_service.hpp \ asio/detail/null_static_mutex.hpp \ asio/detail/null_thread.hpp \ asio/detail/null_tss_ptr.hpp \ asio/detail/object_pool.hpp \ asio/detail/old_win_sdk_compat.hpp \ asio/detail/operation.hpp \ asio/detail/op_queue.hpp \ asio/detail/pipe_select_interrupter.hpp \ asio/detail/pop_options.hpp \ asio/detail/posix_event.hpp \ asio/detail/posix_fd_set_adapter.hpp \ asio/detail/posix_global.hpp \ asio/detail/posix_mutex.hpp \ asio/detail/posix_signal_blocker.hpp \ asio/detail/posix_static_mutex.hpp \ asio/detail/posix_thread.hpp \ asio/detail/posix_tss_ptr.hpp \ asio/detail/push_options.hpp \ asio/detail/reactive_descriptor_service.hpp \ asio/detail/reactive_null_buffers_op.hpp \ asio/detail/reactive_serial_port_service.hpp \ asio/detail/reactive_socket_accept_op.hpp \ asio/detail/reactive_socket_connect_op.hpp \ asio/detail/reactive_socket_recvfrom_op.hpp \ asio/detail/reactive_socket_recvmsg_op.hpp \ asio/detail/reactive_socket_recv_op.hpp \ asio/detail/reactive_socket_send_op.hpp \ asio/detail/reactive_socket_sendto_op.hpp \ asio/detail/reactive_socket_service_base.hpp \ asio/detail/reactive_socket_service.hpp \ asio/detail/reactive_wait_op.hpp \ asio/detail/reactor_fwd.hpp \ asio/detail/reactor.hpp \ asio/detail/reactor_op.hpp \ asio/detail/reactor_op_queue.hpp \ asio/detail/recycling_allocator.hpp \ asio/detail/regex_fwd.hpp \ asio/detail/resolve_endpoint_op.hpp \ asio/detail/resolve_op.hpp \ asio/detail/resolve_query_op.hpp \ asio/detail/resolver_service_base.hpp \ asio/detail/resolver_service.hpp \ asio/detail/scheduler.hpp \ asio/detail/scheduler_operation.hpp \ asio/detail/scheduler_thread_info.hpp \ asio/detail/scoped_lock.hpp \ asio/detail/scoped_ptr.hpp \ asio/detail/select_interrupter.hpp \ asio/detail/select_reactor.hpp \ asio/detail/service_registry.hpp \ asio/detail/signal_blocker.hpp \ asio/detail/signal_handler.hpp \ asio/detail/signal_init.hpp \ asio/detail/signal_op.hpp \ asio/detail/signal_set_service.hpp \ asio/detail/socket_holder.hpp \ asio/detail/socket_ops.hpp \ asio/detail/socket_option.hpp \ asio/detail/socket_select_interrupter.hpp \ asio/detail/socket_types.hpp \ asio/detail/solaris_fenced_block.hpp \ asio/detail/static_mutex.hpp \ asio/detail/std_event.hpp \ asio/detail/std_fenced_block.hpp \ asio/detail/std_global.hpp \ asio/detail/std_mutex.hpp \ asio/detail/std_static_mutex.hpp \ asio/detail/std_thread.hpp \ asio/detail/strand_executor_service.hpp \ asio/detail/strand_service.hpp \ asio/detail/string_view.hpp \ asio/detail/thread_context.hpp \ asio/detail/thread_group.hpp \ asio/detail/thread.hpp \ asio/detail/thread_info_base.hpp \ asio/detail/throw_error.hpp \ asio/detail/throw_exception.hpp \ asio/detail/timer_queue_base.hpp \ asio/detail/timer_queue.hpp \ asio/detail/timer_queue_ptime.hpp \ asio/detail/timer_queue_set.hpp \ asio/detail/timer_scheduler_fwd.hpp \ asio/detail/timer_scheduler.hpp \ asio/detail/tss_ptr.hpp \ asio/detail/type_traits.hpp \ asio/detail/variadic_templates.hpp \ asio/detail/wait_handler.hpp \ asio/detail/wait_op.hpp \ asio/detail/winapp_thread.hpp \ asio/detail/wince_thread.hpp \ asio/detail/win_event.hpp \ asio/detail/win_fd_set_adapter.hpp \ asio/detail/win_fenced_block.hpp \ asio/detail/win_global.hpp \ asio/detail/win_iocp_handle_read_op.hpp \ asio/detail/win_iocp_handle_service.hpp \ asio/detail/win_iocp_handle_write_op.hpp \ asio/detail/win_iocp_io_context.hpp \ asio/detail/win_iocp_null_buffers_op.hpp \ asio/detail/win_iocp_operation.hpp \ asio/detail/win_iocp_overlapped_op.hpp \ asio/detail/win_iocp_overlapped_ptr.hpp \ asio/detail/win_iocp_serial_port_service.hpp \ asio/detail/win_iocp_socket_accept_op.hpp \ asio/detail/win_iocp_socket_connect_op.hpp \ asio/detail/win_iocp_socket_recvfrom_op.hpp \ asio/detail/win_iocp_socket_recvmsg_op.hpp \ asio/detail/win_iocp_socket_recv_op.hpp \ asio/detail/win_iocp_socket_send_op.hpp \ asio/detail/win_iocp_socket_service_base.hpp \ asio/detail/win_iocp_socket_service.hpp \ asio/detail/win_iocp_thread_info.hpp \ asio/detail/win_iocp_wait_op.hpp \ asio/detail/win_mutex.hpp \ asio/detail/win_object_handle_service.hpp \ asio/detail/winrt_async_manager.hpp \ asio/detail/winrt_async_op.hpp \ asio/detail/winrt_resolve_op.hpp \ asio/detail/winrt_resolver_service.hpp \ asio/detail/winrt_socket_connect_op.hpp \ asio/detail/winrt_socket_recv_op.hpp \ asio/detail/winrt_socket_send_op.hpp \ asio/detail/winrt_ssocket_service_base.hpp \ asio/detail/winrt_ssocket_service.hpp \ asio/detail/winrt_timer_scheduler.hpp \ asio/detail/winrt_utils.hpp \ asio/detail/winsock_init.hpp \ asio/detail/win_static_mutex.hpp \ asio/detail/win_thread.hpp \ asio/detail/win_tss_ptr.hpp \ asio/detail/work_dispatcher.hpp \ asio/detail/wrapped_handler.hpp \ asio/dispatch.hpp \ asio/error_code.hpp \ asio/error.hpp \ asio/execution_context.hpp \ asio/executor.hpp \ asio/executor_work_guard.hpp \ asio/experimental/co_spawn.hpp \ asio/experimental/detached.hpp \ asio/experimental.hpp \ asio/experimental/impl/co_spawn.hpp \ asio/experimental/impl/detached.hpp \ asio/experimental/impl/redirect_error.hpp \ asio/experimental/redirect_error.hpp \ asio/generic/basic_endpoint.hpp \ asio/generic/datagram_protocol.hpp \ asio/generic/detail/endpoint.hpp \ asio/generic/detail/impl/endpoint.ipp \ asio/generic/raw_protocol.hpp \ asio/generic/seq_packet_protocol.hpp \ asio/generic/stream_protocol.hpp \ asio/handler_alloc_hook.hpp \ asio/handler_continuation_hook.hpp \ asio/handler_invoke_hook.hpp \ asio/handler_type.hpp \ asio/high_resolution_timer.hpp \ asio.hpp \ asio/impl/buffered_read_stream.hpp \ asio/impl/buffered_write_stream.hpp \ asio/impl/connect.hpp \ asio/impl/defer.hpp \ asio/impl/dispatch.hpp \ asio/impl/error_code.ipp \ asio/impl/error.ipp \ asio/impl/execution_context.hpp \ asio/impl/execution_context.ipp \ asio/impl/executor.hpp \ asio/impl/executor.ipp \ asio/impl/handler_alloc_hook.ipp \ asio/impl/io_context.hpp \ asio/impl/io_context.ipp \ asio/impl/post.hpp \ asio/impl/read_at.hpp \ asio/impl/read.hpp \ asio/impl/read_until.hpp \ asio/impl/serial_port_base.hpp \ asio/impl/serial_port_base.ipp \ asio/impl/spawn.hpp \ asio/impl/src.cpp \ asio/impl/src.hpp \ asio/impl/system_context.hpp \ asio/impl/system_context.ipp \ asio/impl/system_executor.hpp \ asio/impl/thread_pool.hpp \ asio/impl/thread_pool.ipp \ asio/impl/use_future.hpp \ asio/impl/write_at.hpp \ asio/impl/write.hpp \ asio/io_context.hpp \ asio/io_context_strand.hpp \ asio/io_service.hpp \ asio/io_service_strand.hpp \ asio/ip/address.hpp \ asio/ip/address_v4.hpp \ asio/ip/address_v4_iterator.hpp \ asio/ip/address_v4_range.hpp \ asio/ip/address_v6.hpp \ asio/ip/address_v6_iterator.hpp \ asio/ip/address_v6_range.hpp \ asio/ip/bad_address_cast.hpp \ asio/ip/basic_endpoint.hpp \ asio/ip/basic_resolver_entry.hpp \ asio/ip/basic_resolver.hpp \ asio/ip/basic_resolver_iterator.hpp \ asio/ip/basic_resolver_query.hpp \ asio/ip/basic_resolver_results.hpp \ asio/ip/detail/endpoint.hpp \ asio/ip/detail/impl/endpoint.ipp \ asio/ip/detail/socket_option.hpp \ asio/ip/host_name.hpp \ asio/ip/icmp.hpp \ asio/ip/impl/address.hpp \ asio/ip/impl/address.ipp \ asio/ip/impl/address_v4.hpp \ asio/ip/impl/address_v4.ipp \ asio/ip/impl/address_v6.hpp \ asio/ip/impl/address_v6.ipp \ asio/ip/impl/basic_endpoint.hpp \ asio/ip/impl/host_name.ipp \ asio/ip/impl/network_v4.hpp \ asio/ip/impl/network_v4.ipp \ asio/ip/impl/network_v6.hpp \ asio/ip/impl/network_v6.ipp \ asio/ip/multicast.hpp \ asio/ip/network_v4.hpp \ asio/ip/network_v6.hpp \ asio/ip/resolver_base.hpp \ asio/ip/resolver_query_base.hpp \ asio/ip/resolver_service.hpp \ asio/ip/tcp.hpp \ asio/ip/udp.hpp \ asio/ip/unicast.hpp \ asio/ip/v6_only.hpp \ asio/is_executor.hpp \ asio/is_read_buffered.hpp \ asio/is_write_buffered.hpp \ asio/local/basic_endpoint.hpp \ asio/local/connect_pair.hpp \ asio/local/datagram_protocol.hpp \ asio/local/detail/endpoint.hpp \ asio/local/detail/impl/endpoint.ipp \ asio/local/stream_protocol.hpp \ asio/packaged_task.hpp \ asio/placeholders.hpp \ asio/posix/basic_descriptor.hpp \ asio/posix/basic_stream_descriptor.hpp \ asio/posix/descriptor_base.hpp \ asio/posix/descriptor.hpp \ asio/posix/stream_descriptor.hpp \ asio/posix/stream_descriptor_service.hpp \ asio/post.hpp \ asio/raw_socket_service.hpp \ asio/read_at.hpp \ asio/read.hpp \ asio/read_until.hpp \ asio/seq_packet_socket_service.hpp \ asio/serial_port_base.hpp \ asio/serial_port.hpp \ asio/serial_port_service.hpp \ asio/signal_set.hpp \ asio/signal_set_service.hpp \ asio/socket_acceptor_service.hpp \ asio/socket_base.hpp \ asio/spawn.hpp \ asio/ssl/context_base.hpp \ asio/ssl/context.hpp \ asio/ssl/detail/buffered_handshake_op.hpp \ asio/ssl/detail/engine.hpp \ asio/ssl/detail/handshake_op.hpp \ asio/ssl/detail/impl/engine.ipp \ asio/ssl/detail/impl/openssl_init.ipp \ asio/ssl/detail/io.hpp \ asio/ssl/detail/openssl_init.hpp \ asio/ssl/detail/openssl_types.hpp \ asio/ssl/detail/password_callback.hpp \ asio/ssl/detail/read_op.hpp \ asio/ssl/detail/shutdown_op.hpp \ asio/ssl/detail/stream_core.hpp \ asio/ssl/detail/verify_callback.hpp \ asio/ssl/detail/write_op.hpp \ asio/ssl/error.hpp \ asio/ssl.hpp \ asio/ssl/impl/context.hpp \ asio/ssl/impl/context.ipp \ asio/ssl/impl/error.ipp \ asio/ssl/impl/rfc2818_verification.ipp \ asio/ssl/impl/src.hpp \ asio/ssl/rfc2818_verification.hpp \ asio/ssl/stream_base.hpp \ asio/ssl/stream.hpp \ asio/ssl/verify_context.hpp \ asio/ssl/verify_mode.hpp \ asio/steady_timer.hpp \ asio/strand.hpp \ asio/streambuf.hpp \ asio/stream_socket_service.hpp \ asio/system_context.hpp \ asio/system_error.hpp \ asio/system_executor.hpp \ asio/system_timer.hpp \ asio/thread.hpp \ asio/thread_pool.hpp \ asio/time_traits.hpp \ asio/ts/buffer.hpp \ asio/ts/executor.hpp \ asio/ts/internet.hpp \ asio/ts/io_context.hpp \ asio/ts/netfwd.hpp \ asio/ts/net.hpp \ asio/ts/socket.hpp \ asio/ts/timer.hpp \ asio/unyield.hpp \ asio/use_future.hpp \ asio/uses_executor.hpp \ asio/version.hpp \ asio/waitable_timer_service.hpp \ asio/wait_traits.hpp \ asio/windows/basic_handle.hpp \ asio/windows/basic_object_handle.hpp \ asio/windows/basic_random_access_handle.hpp \ asio/windows/basic_stream_handle.hpp \ asio/windows/object_handle.hpp \ asio/windows/object_handle_service.hpp \ asio/windows/overlapped_handle.hpp \ asio/windows/overlapped_ptr.hpp \ asio/windows/random_access_handle.hpp \ asio/windows/random_access_handle_service.hpp \ asio/windows/stream_handle.hpp \ asio/windows/stream_handle_service.hpp \ asio/write_at.hpp \ asio/write.hpp \ asio/yield.hpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/include/Makefile.in000066400000000000000000000774271340672067200162500ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(nobase_include_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(includedir)" HEADERS = $(nobase_include_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # find . -name "*.*pp" | sed -e 's/^\.\///' | sed -e 's/^.*$/ & \\/' | sort nobase_include_HEADERS = \ asio/associated_allocator.hpp \ asio/associated_executor.hpp \ asio/async_result.hpp \ asio/basic_datagram_socket.hpp \ asio/basic_deadline_timer.hpp \ asio/basic_io_object.hpp \ asio/basic_raw_socket.hpp \ asio/basic_seq_packet_socket.hpp \ asio/basic_serial_port.hpp \ asio/basic_signal_set.hpp \ asio/basic_socket_acceptor.hpp \ asio/basic_socket.hpp \ asio/basic_socket_iostream.hpp \ asio/basic_socket_streambuf.hpp \ asio/basic_streambuf_fwd.hpp \ asio/basic_streambuf.hpp \ asio/basic_stream_socket.hpp \ asio/basic_waitable_timer.hpp \ asio/bind_executor.hpp \ asio/buffered_read_stream_fwd.hpp \ asio/buffered_read_stream.hpp \ asio/buffered_stream_fwd.hpp \ asio/buffered_stream.hpp \ asio/buffered_write_stream_fwd.hpp \ asio/buffered_write_stream.hpp \ asio/buffer.hpp \ asio/buffers_iterator.hpp \ asio/completion_condition.hpp \ asio/connect.hpp \ asio/coroutine.hpp \ asio/datagram_socket_service.hpp \ asio/deadline_timer.hpp \ asio/deadline_timer_service.hpp \ asio/defer.hpp \ asio/detail/array_fwd.hpp \ asio/detail/array.hpp \ asio/detail/assert.hpp \ asio/detail/atomic_count.hpp \ asio/detail/base_from_completion_cond.hpp \ asio/detail/bind_handler.hpp \ asio/detail/buffered_stream_storage.hpp \ asio/detail/buffer_resize_guard.hpp \ asio/detail/buffer_sequence_adapter.hpp \ asio/detail/call_stack.hpp \ asio/detail/chrono.hpp \ asio/detail/chrono_time_traits.hpp \ asio/detail/completion_handler.hpp \ asio/detail/concurrency_hint.hpp \ asio/detail/conditionally_enabled_event.hpp \ asio/detail/conditionally_enabled_mutex.hpp \ asio/detail/config.hpp \ asio/detail/consuming_buffers.hpp \ asio/detail/cstddef.hpp \ asio/detail/cstdint.hpp \ asio/detail/date_time_fwd.hpp \ asio/detail/deadline_timer_service.hpp \ asio/detail/dependent_type.hpp \ asio/detail/descriptor_ops.hpp \ asio/detail/descriptor_read_op.hpp \ asio/detail/descriptor_write_op.hpp \ asio/detail/dev_poll_reactor.hpp \ asio/detail/epoll_reactor.hpp \ asio/detail/eventfd_select_interrupter.hpp \ asio/detail/event.hpp \ asio/detail/executor_op.hpp \ asio/detail/fd_set_adapter.hpp \ asio/detail/fenced_block.hpp \ asio/detail/functional.hpp \ asio/detail/future.hpp \ asio/detail/gcc_arm_fenced_block.hpp \ asio/detail/gcc_hppa_fenced_block.hpp \ asio/detail/gcc_sync_fenced_block.hpp \ asio/detail/gcc_x86_fenced_block.hpp \ asio/detail/global.hpp \ asio/detail/handler_alloc_helpers.hpp \ asio/detail/handler_cont_helpers.hpp \ asio/detail/handler_invoke_helpers.hpp \ asio/detail/handler_tracking.hpp \ asio/detail/handler_type_requirements.hpp \ asio/detail/handler_work.hpp \ asio/detail/hash_map.hpp \ asio/detail/impl/buffer_sequence_adapter.ipp \ asio/detail/impl/descriptor_ops.ipp \ asio/detail/impl/dev_poll_reactor.hpp \ asio/detail/impl/dev_poll_reactor.ipp \ asio/detail/impl/epoll_reactor.hpp \ asio/detail/impl/epoll_reactor.ipp \ asio/detail/impl/eventfd_select_interrupter.ipp \ asio/detail/impl/handler_tracking.ipp \ asio/detail/impl/kqueue_reactor.hpp \ asio/detail/impl/kqueue_reactor.ipp \ asio/detail/impl/null_event.ipp \ asio/detail/impl/pipe_select_interrupter.ipp \ asio/detail/impl/posix_event.ipp \ asio/detail/impl/posix_mutex.ipp \ asio/detail/impl/posix_thread.ipp \ asio/detail/impl/posix_tss_ptr.ipp \ asio/detail/impl/reactive_descriptor_service.ipp \ asio/detail/impl/reactive_serial_port_service.ipp \ asio/detail/impl/reactive_socket_service_base.ipp \ asio/detail/impl/resolver_service_base.ipp \ asio/detail/impl/scheduler.ipp \ asio/detail/impl/select_reactor.hpp \ asio/detail/impl/select_reactor.ipp \ asio/detail/impl/service_registry.hpp \ asio/detail/impl/service_registry.ipp \ asio/detail/impl/signal_set_service.ipp \ asio/detail/impl/socket_ops.ipp \ asio/detail/impl/socket_select_interrupter.ipp \ asio/detail/impl/strand_executor_service.hpp \ asio/detail/impl/strand_executor_service.ipp \ asio/detail/impl/strand_service.hpp \ asio/detail/impl/strand_service.ipp \ asio/detail/impl/throw_error.ipp \ asio/detail/impl/timer_queue_ptime.ipp \ asio/detail/impl/timer_queue_set.ipp \ asio/detail/impl/win_event.ipp \ asio/detail/impl/win_iocp_handle_service.ipp \ asio/detail/impl/win_iocp_io_context.hpp \ asio/detail/impl/win_iocp_io_context.ipp \ asio/detail/impl/win_iocp_serial_port_service.ipp \ asio/detail/impl/win_iocp_socket_service_base.ipp \ asio/detail/impl/win_mutex.ipp \ asio/detail/impl/win_object_handle_service.ipp \ asio/detail/impl/winrt_ssocket_service_base.ipp \ asio/detail/impl/winrt_timer_scheduler.hpp \ asio/detail/impl/winrt_timer_scheduler.ipp \ asio/detail/impl/winsock_init.ipp \ asio/detail/impl/win_static_mutex.ipp \ asio/detail/impl/win_thread.ipp \ asio/detail/impl/win_tss_ptr.ipp \ asio/detail/io_control.hpp \ asio/detail/is_buffer_sequence.hpp \ asio/detail/is_executor.hpp \ asio/detail/keyword_tss_ptr.hpp \ asio/detail/kqueue_reactor.hpp \ asio/detail/limits.hpp \ asio/detail/local_free_on_block_exit.hpp \ asio/detail/macos_fenced_block.hpp \ asio/detail/memory.hpp \ asio/detail/mutex.hpp \ asio/detail/noncopyable.hpp \ asio/detail/null_event.hpp \ asio/detail/null_fenced_block.hpp \ asio/detail/null_global.hpp \ asio/detail/null_mutex.hpp \ asio/detail/null_reactor.hpp \ asio/detail/null_signal_blocker.hpp \ asio/detail/null_socket_service.hpp \ asio/detail/null_static_mutex.hpp \ asio/detail/null_thread.hpp \ asio/detail/null_tss_ptr.hpp \ asio/detail/object_pool.hpp \ asio/detail/old_win_sdk_compat.hpp \ asio/detail/operation.hpp \ asio/detail/op_queue.hpp \ asio/detail/pipe_select_interrupter.hpp \ asio/detail/pop_options.hpp \ asio/detail/posix_event.hpp \ asio/detail/posix_fd_set_adapter.hpp \ asio/detail/posix_global.hpp \ asio/detail/posix_mutex.hpp \ asio/detail/posix_signal_blocker.hpp \ asio/detail/posix_static_mutex.hpp \ asio/detail/posix_thread.hpp \ asio/detail/posix_tss_ptr.hpp \ asio/detail/push_options.hpp \ asio/detail/reactive_descriptor_service.hpp \ asio/detail/reactive_null_buffers_op.hpp \ asio/detail/reactive_serial_port_service.hpp \ asio/detail/reactive_socket_accept_op.hpp \ asio/detail/reactive_socket_connect_op.hpp \ asio/detail/reactive_socket_recvfrom_op.hpp \ asio/detail/reactive_socket_recvmsg_op.hpp \ asio/detail/reactive_socket_recv_op.hpp \ asio/detail/reactive_socket_send_op.hpp \ asio/detail/reactive_socket_sendto_op.hpp \ asio/detail/reactive_socket_service_base.hpp \ asio/detail/reactive_socket_service.hpp \ asio/detail/reactive_wait_op.hpp \ asio/detail/reactor_fwd.hpp \ asio/detail/reactor.hpp \ asio/detail/reactor_op.hpp \ asio/detail/reactor_op_queue.hpp \ asio/detail/recycling_allocator.hpp \ asio/detail/regex_fwd.hpp \ asio/detail/resolve_endpoint_op.hpp \ asio/detail/resolve_op.hpp \ asio/detail/resolve_query_op.hpp \ asio/detail/resolver_service_base.hpp \ asio/detail/resolver_service.hpp \ asio/detail/scheduler.hpp \ asio/detail/scheduler_operation.hpp \ asio/detail/scheduler_thread_info.hpp \ asio/detail/scoped_lock.hpp \ asio/detail/scoped_ptr.hpp \ asio/detail/select_interrupter.hpp \ asio/detail/select_reactor.hpp \ asio/detail/service_registry.hpp \ asio/detail/signal_blocker.hpp \ asio/detail/signal_handler.hpp \ asio/detail/signal_init.hpp \ asio/detail/signal_op.hpp \ asio/detail/signal_set_service.hpp \ asio/detail/socket_holder.hpp \ asio/detail/socket_ops.hpp \ asio/detail/socket_option.hpp \ asio/detail/socket_select_interrupter.hpp \ asio/detail/socket_types.hpp \ asio/detail/solaris_fenced_block.hpp \ asio/detail/static_mutex.hpp \ asio/detail/std_event.hpp \ asio/detail/std_fenced_block.hpp \ asio/detail/std_global.hpp \ asio/detail/std_mutex.hpp \ asio/detail/std_static_mutex.hpp \ asio/detail/std_thread.hpp \ asio/detail/strand_executor_service.hpp \ asio/detail/strand_service.hpp \ asio/detail/string_view.hpp \ asio/detail/thread_context.hpp \ asio/detail/thread_group.hpp \ asio/detail/thread.hpp \ asio/detail/thread_info_base.hpp \ asio/detail/throw_error.hpp \ asio/detail/throw_exception.hpp \ asio/detail/timer_queue_base.hpp \ asio/detail/timer_queue.hpp \ asio/detail/timer_queue_ptime.hpp \ asio/detail/timer_queue_set.hpp \ asio/detail/timer_scheduler_fwd.hpp \ asio/detail/timer_scheduler.hpp \ asio/detail/tss_ptr.hpp \ asio/detail/type_traits.hpp \ asio/detail/variadic_templates.hpp \ asio/detail/wait_handler.hpp \ asio/detail/wait_op.hpp \ asio/detail/winapp_thread.hpp \ asio/detail/wince_thread.hpp \ asio/detail/win_event.hpp \ asio/detail/win_fd_set_adapter.hpp \ asio/detail/win_fenced_block.hpp \ asio/detail/win_global.hpp \ asio/detail/win_iocp_handle_read_op.hpp \ asio/detail/win_iocp_handle_service.hpp \ asio/detail/win_iocp_handle_write_op.hpp \ asio/detail/win_iocp_io_context.hpp \ asio/detail/win_iocp_null_buffers_op.hpp \ asio/detail/win_iocp_operation.hpp \ asio/detail/win_iocp_overlapped_op.hpp \ asio/detail/win_iocp_overlapped_ptr.hpp \ asio/detail/win_iocp_serial_port_service.hpp \ asio/detail/win_iocp_socket_accept_op.hpp \ asio/detail/win_iocp_socket_connect_op.hpp \ asio/detail/win_iocp_socket_recvfrom_op.hpp \ asio/detail/win_iocp_socket_recvmsg_op.hpp \ asio/detail/win_iocp_socket_recv_op.hpp \ asio/detail/win_iocp_socket_send_op.hpp \ asio/detail/win_iocp_socket_service_base.hpp \ asio/detail/win_iocp_socket_service.hpp \ asio/detail/win_iocp_thread_info.hpp \ asio/detail/win_iocp_wait_op.hpp \ asio/detail/win_mutex.hpp \ asio/detail/win_object_handle_service.hpp \ asio/detail/winrt_async_manager.hpp \ asio/detail/winrt_async_op.hpp \ asio/detail/winrt_resolve_op.hpp \ asio/detail/winrt_resolver_service.hpp \ asio/detail/winrt_socket_connect_op.hpp \ asio/detail/winrt_socket_recv_op.hpp \ asio/detail/winrt_socket_send_op.hpp \ asio/detail/winrt_ssocket_service_base.hpp \ asio/detail/winrt_ssocket_service.hpp \ asio/detail/winrt_timer_scheduler.hpp \ asio/detail/winrt_utils.hpp \ asio/detail/winsock_init.hpp \ asio/detail/win_static_mutex.hpp \ asio/detail/win_thread.hpp \ asio/detail/win_tss_ptr.hpp \ asio/detail/work_dispatcher.hpp \ asio/detail/wrapped_handler.hpp \ asio/dispatch.hpp \ asio/error_code.hpp \ asio/error.hpp \ asio/execution_context.hpp \ asio/executor.hpp \ asio/executor_work_guard.hpp \ asio/experimental/co_spawn.hpp \ asio/experimental/detached.hpp \ asio/experimental.hpp \ asio/experimental/impl/co_spawn.hpp \ asio/experimental/impl/detached.hpp \ asio/experimental/impl/redirect_error.hpp \ asio/experimental/redirect_error.hpp \ asio/generic/basic_endpoint.hpp \ asio/generic/datagram_protocol.hpp \ asio/generic/detail/endpoint.hpp \ asio/generic/detail/impl/endpoint.ipp \ asio/generic/raw_protocol.hpp \ asio/generic/seq_packet_protocol.hpp \ asio/generic/stream_protocol.hpp \ asio/handler_alloc_hook.hpp \ asio/handler_continuation_hook.hpp \ asio/handler_invoke_hook.hpp \ asio/handler_type.hpp \ asio/high_resolution_timer.hpp \ asio.hpp \ asio/impl/buffered_read_stream.hpp \ asio/impl/buffered_write_stream.hpp \ asio/impl/connect.hpp \ asio/impl/defer.hpp \ asio/impl/dispatch.hpp \ asio/impl/error_code.ipp \ asio/impl/error.ipp \ asio/impl/execution_context.hpp \ asio/impl/execution_context.ipp \ asio/impl/executor.hpp \ asio/impl/executor.ipp \ asio/impl/handler_alloc_hook.ipp \ asio/impl/io_context.hpp \ asio/impl/io_context.ipp \ asio/impl/post.hpp \ asio/impl/read_at.hpp \ asio/impl/read.hpp \ asio/impl/read_until.hpp \ asio/impl/serial_port_base.hpp \ asio/impl/serial_port_base.ipp \ asio/impl/spawn.hpp \ asio/impl/src.cpp \ asio/impl/src.hpp \ asio/impl/system_context.hpp \ asio/impl/system_context.ipp \ asio/impl/system_executor.hpp \ asio/impl/thread_pool.hpp \ asio/impl/thread_pool.ipp \ asio/impl/use_future.hpp \ asio/impl/write_at.hpp \ asio/impl/write.hpp \ asio/io_context.hpp \ asio/io_context_strand.hpp \ asio/io_service.hpp \ asio/io_service_strand.hpp \ asio/ip/address.hpp \ asio/ip/address_v4.hpp \ asio/ip/address_v4_iterator.hpp \ asio/ip/address_v4_range.hpp \ asio/ip/address_v6.hpp \ asio/ip/address_v6_iterator.hpp \ asio/ip/address_v6_range.hpp \ asio/ip/bad_address_cast.hpp \ asio/ip/basic_endpoint.hpp \ asio/ip/basic_resolver_entry.hpp \ asio/ip/basic_resolver.hpp \ asio/ip/basic_resolver_iterator.hpp \ asio/ip/basic_resolver_query.hpp \ asio/ip/basic_resolver_results.hpp \ asio/ip/detail/endpoint.hpp \ asio/ip/detail/impl/endpoint.ipp \ asio/ip/detail/socket_option.hpp \ asio/ip/host_name.hpp \ asio/ip/icmp.hpp \ asio/ip/impl/address.hpp \ asio/ip/impl/address.ipp \ asio/ip/impl/address_v4.hpp \ asio/ip/impl/address_v4.ipp \ asio/ip/impl/address_v6.hpp \ asio/ip/impl/address_v6.ipp \ asio/ip/impl/basic_endpoint.hpp \ asio/ip/impl/host_name.ipp \ asio/ip/impl/network_v4.hpp \ asio/ip/impl/network_v4.ipp \ asio/ip/impl/network_v6.hpp \ asio/ip/impl/network_v6.ipp \ asio/ip/multicast.hpp \ asio/ip/network_v4.hpp \ asio/ip/network_v6.hpp \ asio/ip/resolver_base.hpp \ asio/ip/resolver_query_base.hpp \ asio/ip/resolver_service.hpp \ asio/ip/tcp.hpp \ asio/ip/udp.hpp \ asio/ip/unicast.hpp \ asio/ip/v6_only.hpp \ asio/is_executor.hpp \ asio/is_read_buffered.hpp \ asio/is_write_buffered.hpp \ asio/local/basic_endpoint.hpp \ asio/local/connect_pair.hpp \ asio/local/datagram_protocol.hpp \ asio/local/detail/endpoint.hpp \ asio/local/detail/impl/endpoint.ipp \ asio/local/stream_protocol.hpp \ asio/packaged_task.hpp \ asio/placeholders.hpp \ asio/posix/basic_descriptor.hpp \ asio/posix/basic_stream_descriptor.hpp \ asio/posix/descriptor_base.hpp \ asio/posix/descriptor.hpp \ asio/posix/stream_descriptor.hpp \ asio/posix/stream_descriptor_service.hpp \ asio/post.hpp \ asio/raw_socket_service.hpp \ asio/read_at.hpp \ asio/read.hpp \ asio/read_until.hpp \ asio/seq_packet_socket_service.hpp \ asio/serial_port_base.hpp \ asio/serial_port.hpp \ asio/serial_port_service.hpp \ asio/signal_set.hpp \ asio/signal_set_service.hpp \ asio/socket_acceptor_service.hpp \ asio/socket_base.hpp \ asio/spawn.hpp \ asio/ssl/context_base.hpp \ asio/ssl/context.hpp \ asio/ssl/detail/buffered_handshake_op.hpp \ asio/ssl/detail/engine.hpp \ asio/ssl/detail/handshake_op.hpp \ asio/ssl/detail/impl/engine.ipp \ asio/ssl/detail/impl/openssl_init.ipp \ asio/ssl/detail/io.hpp \ asio/ssl/detail/openssl_init.hpp \ asio/ssl/detail/openssl_types.hpp \ asio/ssl/detail/password_callback.hpp \ asio/ssl/detail/read_op.hpp \ asio/ssl/detail/shutdown_op.hpp \ asio/ssl/detail/stream_core.hpp \ asio/ssl/detail/verify_callback.hpp \ asio/ssl/detail/write_op.hpp \ asio/ssl/error.hpp \ asio/ssl.hpp \ asio/ssl/impl/context.hpp \ asio/ssl/impl/context.ipp \ asio/ssl/impl/error.ipp \ asio/ssl/impl/rfc2818_verification.ipp \ asio/ssl/impl/src.hpp \ asio/ssl/rfc2818_verification.hpp \ asio/ssl/stream_base.hpp \ asio/ssl/stream.hpp \ asio/ssl/verify_context.hpp \ asio/ssl/verify_mode.hpp \ asio/steady_timer.hpp \ asio/strand.hpp \ asio/streambuf.hpp \ asio/stream_socket_service.hpp \ asio/system_context.hpp \ asio/system_error.hpp \ asio/system_executor.hpp \ asio/system_timer.hpp \ asio/thread.hpp \ asio/thread_pool.hpp \ asio/time_traits.hpp \ asio/ts/buffer.hpp \ asio/ts/executor.hpp \ asio/ts/internet.hpp \ asio/ts/io_context.hpp \ asio/ts/netfwd.hpp \ asio/ts/net.hpp \ asio/ts/socket.hpp \ asio/ts/timer.hpp \ asio/unyield.hpp \ asio/use_future.hpp \ asio/uses_executor.hpp \ asio/version.hpp \ asio/waitable_timer_service.hpp \ asio/wait_traits.hpp \ asio/windows/basic_handle.hpp \ asio/windows/basic_object_handle.hpp \ asio/windows/basic_random_access_handle.hpp \ asio/windows/basic_stream_handle.hpp \ asio/windows/object_handle.hpp \ asio/windows/object_handle_service.hpp \ asio/windows/overlapped_handle.hpp \ asio/windows/overlapped_ptr.hpp \ asio/windows/random_access_handle.hpp \ asio/windows/random_access_handle_service.hpp \ asio/windows/stream_handle.hpp \ asio/windows/stream_handle_service.hpp \ asio/write_at.hpp \ asio/write.hpp \ asio/yield.hpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-nobase_includeHEADERS: $(nobase_include_HEADERS) @$(NORMAL_INSTALL) @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)/$$dir"; }; \ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'"; \ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(includedir)/$$dir" || exit $$?; }; \ done uninstall-nobase_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(HEADERS) installdirs: for dir in "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-nobase_includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-nobase_includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ cscopelist-am ctags ctags-am distclean distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-nobase_includeHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-nobase_includeHEADERS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/include/asio.hpp000066400000000000000000000125371340672067200156360ustar00rootroot00000000000000// // asio.hpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_HPP #define ASIO_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/async_result.hpp" #include "asio/basic_datagram_socket.hpp" #include "asio/basic_deadline_timer.hpp" #include "asio/basic_io_object.hpp" #include "asio/basic_raw_socket.hpp" #include "asio/basic_seq_packet_socket.hpp" #include "asio/basic_serial_port.hpp" #include "asio/basic_signal_set.hpp" #include "asio/basic_socket_acceptor.hpp" #include "asio/basic_socket_iostream.hpp" #include "asio/basic_socket_streambuf.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/basic_streambuf.hpp" #include "asio/basic_waitable_timer.hpp" #include "asio/bind_executor.hpp" #include "asio/buffer.hpp" #include "asio/buffered_read_stream_fwd.hpp" #include "asio/buffered_read_stream.hpp" #include "asio/buffered_stream_fwd.hpp" #include "asio/buffered_stream.hpp" #include "asio/buffered_write_stream_fwd.hpp" #include "asio/buffered_write_stream.hpp" #include "asio/buffers_iterator.hpp" #include "asio/completion_condition.hpp" #include "asio/connect.hpp" #include "asio/coroutine.hpp" #include "asio/datagram_socket_service.hpp" #include "asio/deadline_timer_service.hpp" #include "asio/deadline_timer.hpp" #include "asio/defer.hpp" #include "asio/dispatch.hpp" #include "asio/error.hpp" #include "asio/error_code.hpp" #include "asio/execution_context.hpp" #include "asio/executor.hpp" #include "asio/executor_work_guard.hpp" #include "asio/generic/basic_endpoint.hpp" #include "asio/generic/datagram_protocol.hpp" #include "asio/generic/raw_protocol.hpp" #include "asio/generic/seq_packet_protocol.hpp" #include "asio/generic/stream_protocol.hpp" #include "asio/handler_alloc_hook.hpp" #include "asio/handler_continuation_hook.hpp" #include "asio/handler_invoke_hook.hpp" #include "asio/handler_type.hpp" #include "asio/high_resolution_timer.hpp" #include "asio/io_context.hpp" #include "asio/io_context_strand.hpp" #include "asio/io_service.hpp" #include "asio/io_service_strand.hpp" #include "asio/ip/address.hpp" #include "asio/ip/address_v4.hpp" #include "asio/ip/address_v4_iterator.hpp" #include "asio/ip/address_v4_range.hpp" #include "asio/ip/address_v6.hpp" #include "asio/ip/address_v6_iterator.hpp" #include "asio/ip/address_v6_range.hpp" #include "asio/ip/bad_address_cast.hpp" #include "asio/ip/basic_endpoint.hpp" #include "asio/ip/basic_resolver.hpp" #include "asio/ip/basic_resolver_entry.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/host_name.hpp" #include "asio/ip/icmp.hpp" #include "asio/ip/multicast.hpp" #include "asio/ip/resolver_base.hpp" #include "asio/ip/resolver_query_base.hpp" #include "asio/ip/resolver_service.hpp" #include "asio/ip/tcp.hpp" #include "asio/ip/udp.hpp" #include "asio/ip/unicast.hpp" #include "asio/ip/v6_only.hpp" #include "asio/is_executor.hpp" #include "asio/is_read_buffered.hpp" #include "asio/is_write_buffered.hpp" #include "asio/local/basic_endpoint.hpp" #include "asio/local/connect_pair.hpp" #include "asio/local/datagram_protocol.hpp" #include "asio/local/stream_protocol.hpp" #include "asio/packaged_task.hpp" #include "asio/placeholders.hpp" #include "asio/posix/basic_descriptor.hpp" #include "asio/posix/basic_stream_descriptor.hpp" #include "asio/posix/descriptor.hpp" #include "asio/posix/descriptor_base.hpp" #include "asio/posix/stream_descriptor.hpp" #include "asio/posix/stream_descriptor_service.hpp" #include "asio/post.hpp" #include "asio/raw_socket_service.hpp" #include "asio/read.hpp" #include "asio/read_at.hpp" #include "asio/read_until.hpp" #include "asio/seq_packet_socket_service.hpp" #include "asio/serial_port.hpp" #include "asio/serial_port_base.hpp" #include "asio/serial_port_service.hpp" #include "asio/signal_set.hpp" #include "asio/signal_set_service.hpp" #include "asio/socket_acceptor_service.hpp" #include "asio/socket_base.hpp" #include "asio/steady_timer.hpp" #include "asio/strand.hpp" #include "asio/stream_socket_service.hpp" #include "asio/streambuf.hpp" #include "asio/system_context.hpp" #include "asio/system_error.hpp" #include "asio/system_executor.hpp" #include "asio/system_timer.hpp" #include "asio/thread.hpp" #include "asio/thread_pool.hpp" #include "asio/time_traits.hpp" #include "asio/use_future.hpp" #include "asio/uses_executor.hpp" #include "asio/version.hpp" #include "asio/wait_traits.hpp" #include "asio/waitable_timer_service.hpp" #include "asio/windows/basic_handle.hpp" #include "asio/windows/basic_object_handle.hpp" #include "asio/windows/basic_random_access_handle.hpp" #include "asio/windows/basic_stream_handle.hpp" #include "asio/windows/object_handle.hpp" #include "asio/windows/object_handle_service.hpp" #include "asio/windows/overlapped_handle.hpp" #include "asio/windows/overlapped_ptr.hpp" #include "asio/windows/random_access_handle.hpp" #include "asio/windows/random_access_handle_service.hpp" #include "asio/windows/stream_handle.hpp" #include "asio/windows/stream_handle_service.hpp" #include "asio/write.hpp" #include "asio/write_at.hpp" #endif // ASIO_HPP asio-1.12.2/include/asio/000077500000000000000000000000001340672067200151155ustar00rootroot00000000000000asio-1.12.2/include/asio/associated_allocator.hpp000066400000000000000000000072661340672067200220200ustar00rootroot00000000000000// // associated_allocator.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_ASSOCIATED_ALLOCATOR_HPP #define ASIO_ASSOCIATED_ALLOCATOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct associated_allocator_check { typedef void type; }; template struct associated_allocator_impl { typedef E type; static type get(const T&, const E& e) ASIO_NOEXCEPT { return e; } }; template struct associated_allocator_impl::type> { typedef typename T::allocator_type type; static type get(const T& t, const E&) ASIO_NOEXCEPT { return t.get_allocator(); } }; } // namespace detail /// Traits type used to obtain the allocator associated with an object. /** * A program may specialise this traits type if the @c T template parameter in * the specialisation is a user-defined type. The template parameter @c * Allocator shall be a type meeting the Allocator requirements. * * Specialisations shall meet the following requirements, where @c t is a const * reference to an object of type @c T, and @c a is an object of type @c * Allocator. * * @li Provide a nested typedef @c type that identifies a type meeting the * Allocator requirements. * * @li Provide a noexcept static member function named @c get, callable as @c * get(t) and with return type @c type. * * @li Provide a noexcept static member function named @c get, callable as @c * get(t,a) and with return type @c type. */ template > struct associated_allocator { /// If @c T has a nested type @c allocator_type, T::allocator_type. /// Otherwise @c Allocator. #if defined(GENERATING_DOCUMENTATION) typedef see_below type; #else // defined(GENERATING_DOCUMENTATION) typedef typename detail::associated_allocator_impl::type type; #endif // defined(GENERATING_DOCUMENTATION) /// If @c T has a nested type @c allocator_type, returns /// t.get_allocator(). Otherwise returns @c a. static type get(const T& t, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return detail::associated_allocator_impl::get(t, a); } }; /// Helper function to obtain an object's associated allocator. /** * @returns associated_allocator::get(t) */ template inline typename associated_allocator::type get_associated_allocator(const T& t) ASIO_NOEXCEPT { return associated_allocator::get(t); } /// Helper function to obtain an object's associated allocator. /** * @returns associated_allocator::get(t, a) */ template inline typename associated_allocator::type get_associated_allocator(const T& t, const Allocator& a) ASIO_NOEXCEPT { return associated_allocator::get(t, a); } #if defined(ASIO_HAS_ALIAS_TEMPLATES) template > using associated_allocator_t = typename associated_allocator::type; #endif // defined(ASIO_HAS_ALIAS_TEMPLATES) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_ASSOCIATED_ALLOCATOR_HPP asio-1.12.2/include/asio/associated_executor.hpp000066400000000000000000000105351340672067200216670ustar00rootroot00000000000000// // associated_executor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_ASSOCIATED_EXECUTOR_HPP #define ASIO_ASSOCIATED_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/is_executor.hpp" #include "asio/system_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct associated_executor_check { typedef void type; }; template struct associated_executor_impl { typedef E type; static type get(const T&, const E& e) ASIO_NOEXCEPT { return e; } }; template struct associated_executor_impl::type> { typedef typename T::executor_type type; static type get(const T& t, const E&) ASIO_NOEXCEPT { return t.get_executor(); } }; } // namespace detail /// Traits type used to obtain the executor associated with an object. /** * A program may specialise this traits type if the @c T template parameter in * the specialisation is a user-defined type. The template parameter @c * Executor shall be a type meeting the Executor requirements. * * Specialisations shall meet the following requirements, where @c t is a const * reference to an object of type @c T, and @c e is an object of type @c * Executor. * * @li Provide a nested typedef @c type that identifies a type meeting the * Executor requirements. * * @li Provide a noexcept static member function named @c get, callable as @c * get(t) and with return type @c type. * * @li Provide a noexcept static member function named @c get, callable as @c * get(t,e) and with return type @c type. */ template struct associated_executor { /// If @c T has a nested type @c executor_type, T::executor_type. /// Otherwise @c Executor. #if defined(GENERATING_DOCUMENTATION) typedef see_below type; #else // defined(GENERATING_DOCUMENTATION) typedef typename detail::associated_executor_impl::type type; #endif // defined(GENERATING_DOCUMENTATION) /// If @c T has a nested type @c executor_type, returns /// t.get_executor(). Otherwise returns @c ex. static type get(const T& t, const Executor& ex = Executor()) ASIO_NOEXCEPT { return detail::associated_executor_impl::get(t, ex); } }; /// Helper function to obtain an object's associated executor. /** * @returns associated_executor::get(t) */ template inline typename associated_executor::type get_associated_executor(const T& t) ASIO_NOEXCEPT { return associated_executor::get(t); } /// Helper function to obtain an object's associated executor. /** * @returns associated_executor::get(t, ex) */ template inline typename associated_executor::type get_associated_executor(const T& t, const Executor& ex, typename enable_if::value>::type* = 0) ASIO_NOEXCEPT { return associated_executor::get(t, ex); } /// Helper function to obtain an object's associated executor. /** * @returns associated_executor::get(t, ctx.get_executor()) */ template inline typename associated_executor::type get_associated_executor(const T& t, ExecutionContext& ctx, typename enable_if::value>::type* = 0) ASIO_NOEXCEPT { return associated_executor::get(t, ctx.get_executor()); } #if defined(ASIO_HAS_ALIAS_TEMPLATES) template using associated_executor_t = typename associated_executor::type; #endif // defined(ASIO_HAS_ALIAS_TEMPLATES) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_ASSOCIATED_EXECUTOR_HPP asio-1.12.2/include/asio/async_result.hpp000066400000000000000000000171431340672067200203470ustar00rootroot00000000000000// // async_result.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_ASYNC_RESULT_HPP #define ASIO_ASYNC_RESULT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/handler_type.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// An interface for customising the behaviour of an initiating function. /** * The async_result traits class is used for determining: * * @li the concrete completion handler type to be called at the end of the * asynchronous operation; * * @li the initiating function return type; and * * @li how the return value of the initiating function is obtained. * * The trait allows the handler and return types to be determined at the point * where the specific completion handler signature is known. * * This template may be specialised for user-defined completion token types. * The primary template assumes that the CompletionToken is the completion * handler. */ #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) template #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) template #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) class async_result { public: #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) /// The concrete completion handler type for the specific signature. typedef CompletionToken completion_handler_type; /// The return type of the initiating function. typedef void return_type; #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) // For backward compatibility, determine the concrete completion handler type // by using the legacy handler_type trait. typedef typename handler_type::type completion_handler_type; // For backward compatibility, determine the initiating function return type // using the legacy single-parameter version of async_result. typedef typename async_result::type return_type; #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) /// Construct an async result from a given handler. /** * When using a specalised async_result, the constructor has an opportunity * to initialise some state associated with the completion handler, which is * then returned from the initiating function. */ explicit async_result(completion_handler_type& h) #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) // No data members to initialise. #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) : legacy_result_(h) #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) { (void)h; } /// Obtain the value to be returned from the initiating function. return_type get() { #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) // Nothing to do. #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) return legacy_result_.get(); #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) } private: async_result(const async_result&) ASIO_DELETED; async_result& operator=(const async_result&) ASIO_DELETED; #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) // No data members. #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) async_result legacy_result_; #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) }; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use two-parameter version of async_result.) An interface for /// customising the behaviour of an initiating function. /** * This template may be specialised for user-defined handler types. */ template class async_result { public: /// The return type of the initiating function. typedef void type; /// Construct an async result from a given handler. /** * When using a specalised async_result, the constructor has an opportunity * to initialise some state associated with the handler, which is then * returned from the initiating function. */ explicit async_result(Handler&) { } /// Obtain the value to be returned from the initiating function. type get() { } }; #endif // !defined(ASIO_NO_DEPRECATED) /// Helper template to deduce the handler type from a CompletionToken, capture /// a local copy of the handler, and then create an async_result for the /// handler. template struct async_completion { /// The real handler type to be used for the asynchronous operation. typedef typename asio::async_result< typename decay::type, Signature>::completion_handler_type completion_handler_type; #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Constructor. /** * The constructor creates the concrete completion handler and makes the link * between the handler and the asynchronous result. */ explicit async_completion(CompletionToken& token) : completion_handler(static_cast::value, completion_handler_type&, CompletionToken&&>::type>(token)), result(completion_handler) { } #else // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) explicit async_completion(typename decay::type& token) : completion_handler(token), result(completion_handler) { } explicit async_completion(const typename decay::type& token) : completion_handler(token), result(completion_handler) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// A copy of, or reference to, a real handler object. #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) typename conditional< is_same::value, completion_handler_type&, completion_handler_type>::type completion_handler; #else // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) completion_handler_type completion_handler; #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// The result of the asynchronous operation's initiating function. async_result::type, Signature> result; }; namespace detail { template struct async_result_helper : async_result::type, Signature> { }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(GENERATING_DOCUMENTATION) # define ASIO_INITFN_RESULT_TYPE(ct, sig) \ void_or_deduced #elif defined(_MSC_VER) && (_MSC_VER < 1500) # define ASIO_INITFN_RESULT_TYPE(ct, sig) \ typename ::asio::detail::async_result_helper< \ ct, sig>::return_type #define ASIO_HANDLER_TYPE(ct, sig) \ typename ::asio::detail::async_result_helper< \ ct, sig>::completion_handler_type #else # define ASIO_INITFN_RESULT_TYPE(ct, sig) \ typename ::asio::async_result< \ typename ::asio::decay::type, sig>::return_type #define ASIO_HANDLER_TYPE(ct, sig) \ typename ::asio::async_result< \ typename ::asio::decay::type, sig>::completion_handler_type #endif #endif // ASIO_ASYNC_RESULT_HPP asio-1.12.2/include/asio/basic_datagram_socket.hpp000066400000000000000000001175271340672067200221340ustar00rootroot00000000000000// // basic_datagram_socket.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_DATAGRAM_SOCKET_HPP #define ASIO_BASIC_DATAGRAM_SOCKET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_socket.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/datagram_socket_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides datagram-oriented socket functionality. /** * The basic_datagram_socket class template provides asynchronous and blocking * datagram-oriented socket functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template )> class basic_datagram_socket : public basic_socket { public: /// The native representation of a socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename basic_socket< Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// Construct a basic_datagram_socket without opening it. /** * This constructor creates a datagram socket without opening it. The open() * function must be called before data can be sent or received on the socket. * * @param io_context The io_context object that the datagram socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. */ explicit basic_datagram_socket(asio::io_context& io_context) : basic_socket(io_context) { } /// Construct and open a basic_datagram_socket. /** * This constructor creates and opens a datagram socket. * * @param io_context The io_context object that the datagram socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. */ basic_datagram_socket(asio::io_context& io_context, const protocol_type& protocol) : basic_socket(io_context, protocol) { } /// Construct a basic_datagram_socket, opening it and binding it to the given /// local endpoint. /** * This constructor creates a datagram socket and automatically opens it bound * to the specified endpoint on the local machine. The protocol used is the * protocol associated with the given endpoint. * * @param io_context The io_context object that the datagram socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. * * @param endpoint An endpoint on the local machine to which the datagram * socket will be bound. * * @throws asio::system_error Thrown on failure. */ basic_datagram_socket(asio::io_context& io_context, const endpoint_type& endpoint) : basic_socket(io_context, endpoint) { } /// Construct a basic_datagram_socket on an existing native socket. /** * This constructor creates a datagram socket object to hold an existing * native socket. * * @param io_context The io_context object that the datagram socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. * * @param protocol An object specifying protocol parameters to be used. * * @param native_socket The new underlying socket implementation. * * @throws asio::system_error Thrown on failure. */ basic_datagram_socket(asio::io_context& io_context, const protocol_type& protocol, const native_handle_type& native_socket) : basic_socket( io_context, protocol, native_socket) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_datagram_socket from another. /** * This constructor moves a datagram socket from one object to another. * * @param other The other basic_datagram_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_datagram_socket(io_context&) constructor. */ basic_datagram_socket(basic_datagram_socket&& other) : basic_socket(std::move(other)) { } /// Move-assign a basic_datagram_socket from another. /** * This assignment operator moves a datagram socket from one object to * another. * * @param other The other basic_datagram_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_datagram_socket(io_context&) constructor. */ basic_datagram_socket& operator=(basic_datagram_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } /// Move-construct a basic_datagram_socket from a socket of another protocol /// type. /** * This constructor moves a datagram socket from one object to another. * * @param other The other basic_datagram_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_datagram_socket(io_context&) constructor. */ template basic_datagram_socket( basic_datagram_socket&& other, typename enable_if::value>::type* = 0) : basic_socket(std::move(other)) { } /// Move-assign a basic_datagram_socket from a socket of another protocol /// type. /** * This assignment operator moves a datagram socket from one object to * another. * * @param other The other basic_datagram_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_datagram_socket(io_context&) constructor. */ template typename enable_if::value, basic_datagram_socket>::type& operator=( basic_datagram_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the socket. /** * This function destroys the socket, cancelling any outstanding asynchronous * operations associated with the socket as if by calling @c cancel. */ ~basic_datagram_socket() { } /// Send some data on a connected socket. /** * This function is used to send data on the datagram socket. The function * call will block until the data has been sent successfully or an error * occurs. * * @param buffers One ore more data buffers to be sent on the socket. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @note The send operation can only be used with a connected socket. Use * the send_to function to send data on an unconnected datagram socket. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code socket.send(asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on a connected socket. /** * This function is used to send data on the datagram socket. The function * call will block until the data has been sent successfully or an error * occurs. * * @param buffers One ore more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @note The send operation can only be used with a connected socket. Use * the send_to function to send data on an unconnected datagram socket. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on a connected socket. /** * This function is used to send data on the datagram socket. The function * call will block until the data has been sent successfully or an error * occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes sent. * * @note The send operation can only be used with a connected socket. Use * the send_to function to send data on an unconnected datagram socket. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().send( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous send on a connected socket. /** * This function is used to asynchronously send data on the datagram socket. * The function call always returns immediately. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_send operation can only be used with a connected socket. * Use the async_send_to function to send data on an unconnected datagram * socket. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.async_send(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous send on a connected socket. /** * This function is used to asynchronously send data on the datagram socket. * The function call always returns immediately. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param flags Flags specifying how the send call is to be made. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_send operation can only be used with a connected socket. * Use the async_send_to function to send data on an unconnected datagram * socket. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send(this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send(this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Send a datagram to the specified endpoint. /** * This function is used to send a datagram to the specified remote endpoint. * The function call will block until the data has been sent successfully or * an error occurs. * * @param buffers One or more data buffers to be sent to the remote endpoint. * * @param destination The remote endpoint to which the data will be sent. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * asio::ip::udp::endpoint destination( * asio::ip::address::from_string("1.2.3.4"), 12345); * socket.send_to(asio::buffer(data, size), destination); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send_to(const ConstBufferSequence& buffers, const endpoint_type& destination) { asio::error_code ec; std::size_t s = this->get_service().send_to( this->get_implementation(), buffers, destination, 0, ec); asio::detail::throw_error(ec, "send_to"); return s; } /// Send a datagram to the specified endpoint. /** * This function is used to send a datagram to the specified remote endpoint. * The function call will block until the data has been sent successfully or * an error occurs. * * @param buffers One or more data buffers to be sent to the remote endpoint. * * @param destination The remote endpoint to which the data will be sent. * * @param flags Flags specifying how the send call is to be made. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. */ template std::size_t send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().send_to( this->get_implementation(), buffers, destination, flags, ec); asio::detail::throw_error(ec, "send_to"); return s; } /// Send a datagram to the specified endpoint. /** * This function is used to send a datagram to the specified remote endpoint. * The function call will block until the data has been sent successfully or * an error occurs. * * @param buffers One or more data buffers to be sent to the remote endpoint. * * @param destination The remote endpoint to which the data will be sent. * * @param flags Flags specifying how the send call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes sent. */ template std::size_t send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().send_to(this->get_implementation(), buffers, destination, flags, ec); } /// Start an asynchronous send. /** * This function is used to asynchronously send a datagram to the specified * remote endpoint. The function call always returns immediately. * * @param buffers One or more data buffers to be sent to the remote endpoint. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param destination The remote endpoint to which the data will be sent. * Copies will be made of the endpoint as required. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * asio::ip::udp::endpoint destination( * asio::ip::address::from_string("1.2.3.4"), 12345); * socket.async_send_to( * asio::buffer(data, size), destination, handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send_to( this->get_implementation(), buffers, destination, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send_to( this->get_implementation(), buffers, destination, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous send. /** * This function is used to asynchronously send a datagram to the specified * remote endpoint. The function call always returns immediately. * * @param buffers One or more data buffers to be sent to the remote endpoint. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param flags Flags specifying how the send call is to be made. * * @param destination The remote endpoint to which the data will be sent. * Copies will be made of the endpoint as required. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send_to( this->get_implementation(), buffers, destination, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send_to( this->get_implementation(), buffers, destination, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Receive some data on a connected socket. /** * This function is used to receive data on the datagram socket. The function * call will block until data has been received successfully or an error * occurs. * * @param buffers One or more buffers into which the data will be received. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. * * @note The receive operation can only be used with a connected socket. Use * the receive_from function to receive data on an unconnected datagram * socket. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code socket.receive(asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on a connected socket. /** * This function is used to receive data on the datagram socket. The function * call will block until data has been received successfully or an error * occurs. * * @param buffers One or more buffers into which the data will be received. * * @param flags Flags specifying how the receive call is to be made. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. * * @note The receive operation can only be used with a connected socket. Use * the receive_from function to receive data on an unconnected datagram * socket. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on a connected socket. /** * This function is used to receive data on the datagram socket. The function * call will block until data has been received successfully or an error * occurs. * * @param buffers One or more buffers into which the data will be received. * * @param flags Flags specifying how the receive call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes received. * * @note The receive operation can only be used with a connected socket. Use * the receive_from function to receive data on an unconnected datagram * socket. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().receive( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous receive on a connected socket. /** * This function is used to asynchronously receive data from the datagram * socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_receive operation can only be used with a connected socket. * Use the async_receive_from function to receive data on an unconnected * datagram socket. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.async_receive(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive on a connected socket. /** * This function is used to asynchronously receive data from the datagram * socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param flags Flags specifying how the receive call is to be made. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_receive operation can only be used with a connected socket. * Use the async_receive_from function to receive data on an unconnected * datagram socket. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Receive a datagram with the endpoint of the sender. /** * This function is used to receive a datagram. The function call will block * until data has been received successfully or an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the datagram. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * asio::ip::udp::endpoint sender_endpoint; * socket.receive_from( * asio::buffer(data, size), sender_endpoint); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint) { asio::error_code ec; std::size_t s = this->get_service().receive_from( this->get_implementation(), buffers, sender_endpoint, 0, ec); asio::detail::throw_error(ec, "receive_from"); return s; } /// Receive a datagram with the endpoint of the sender. /** * This function is used to receive a datagram. The function call will block * until data has been received successfully or an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the datagram. * * @param flags Flags specifying how the receive call is to be made. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. */ template std::size_t receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().receive_from( this->get_implementation(), buffers, sender_endpoint, flags, ec); asio::detail::throw_error(ec, "receive_from"); return s; } /// Receive a datagram with the endpoint of the sender. /** * This function is used to receive a datagram. The function call will block * until data has been received successfully or an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the datagram. * * @param flags Flags specifying how the receive call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes received. */ template std::size_t receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().receive_from(this->get_implementation(), buffers, sender_endpoint, flags, ec); } /// Start an asynchronous receive. /** * This function is used to asynchronously receive a datagram. The function * call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the datagram. Ownership of the sender_endpoint object * is retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code socket.async_receive_from( * asio::buffer(data, size), sender_endpoint, handler); @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive. /** * This function is used to asynchronously receive a datagram. The function * call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the datagram. Ownership of the sender_endpoint object * is retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param flags Flags specifying how the receive call is to be made. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BASIC_DATAGRAM_SOCKET_HPP asio-1.12.2/include/asio/basic_deadline_timer.hpp000066400000000000000000000524131340672067200217410ustar00rootroot00000000000000// // basic_deadline_timer.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_DEADLINE_TIMER_HPP #define ASIO_BASIC_DEADLINE_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_DATE_TIME) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/time_traits.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/deadline_timer_service.hpp" #else // defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/detail/deadline_timer_service.hpp" # define ASIO_SVC_T detail::deadline_timer_service #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides waitable timer functionality. /** * The basic_deadline_timer class template provides the ability to perform a * blocking or asynchronous wait for a timer to expire. * * A deadline timer is always in one of two states: "expired" or "not expired". * If the wait() or async_wait() function is called on an expired timer, the * wait operation will complete immediately. * * Most applications will use the asio::deadline_timer typedef. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Examples * Performing a blocking wait: * @code * // Construct a timer without setting an expiry time. * asio::deadline_timer timer(io_context); * * // Set an expiry time relative to now. * timer.expires_from_now(boost::posix_time::seconds(5)); * * // Wait for the timer to expire. * timer.wait(); * @endcode * * @par * Performing an asynchronous wait: * @code * void handler(const asio::error_code& error) * { * if (!error) * { * // Timer expired. * } * } * * ... * * // Construct a timer with an absolute expiry time. * asio::deadline_timer timer(io_context, * boost::posix_time::time_from_string("2005-12-07 23:59:59.000")); * * // Start an asynchronous wait. * timer.async_wait(handler); * @endcode * * @par Changing an active deadline_timer's expiry time * * Changing the expiry time of a timer while there are pending asynchronous * waits causes those wait operations to be cancelled. To ensure that the action * associated with the timer is performed only once, use something like this: * used: * * @code * void on_some_event() * { * if (my_timer.expires_from_now(seconds(5)) > 0) * { * // We managed to cancel the timer. Start new asynchronous wait. * my_timer.async_wait(on_timeout); * } * else * { * // Too late, timer has already expired! * } * } * * void on_timeout(const asio::error_code& e) * { * if (e != asio::error::operation_aborted) * { * // Timer was not cancelled, take necessary action. * } * } * @endcode * * @li The asio::basic_deadline_timer::expires_from_now() function * cancels any pending asynchronous waits, and returns the number of * asynchronous waits that were cancelled. If it returns 0 then you were too * late and the wait handler has already been executed, or will soon be * executed. If it returns 1 then the wait handler was successfully cancelled. * * @li If a wait handler is cancelled, the asio::error_code passed to * it contains the value asio::error::operation_aborted. */ template ASIO_SVC_TPARAM_DEF2(= deadline_timer_service)> class basic_deadline_timer : ASIO_SVC_ACCESS basic_io_object { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The time traits type. typedef TimeTraits traits_type; /// The time type. typedef typename traits_type::time_type time_type; /// The duration type. typedef typename traits_type::duration_type duration_type; /// Constructor. /** * This constructor creates a timer without setting an expiry time. The * expires_at() or expires_from_now() functions must be called to set an * expiry time before the timer can be waited on. * * @param io_context The io_context object that the timer will use to dispatch * handlers for any asynchronous operations performed on the timer. */ explicit basic_deadline_timer(asio::io_context& io_context) : basic_io_object(io_context) { } /// Constructor to set a particular expiry time as an absolute time. /** * This constructor creates a timer and sets the expiry time. * * @param io_context The io_context object that the timer will use to dispatch * handlers for any asynchronous operations performed on the timer. * * @param expiry_time The expiry time to be used for the timer, expressed * as an absolute time. */ basic_deadline_timer(asio::io_context& io_context, const time_type& expiry_time) : basic_io_object(io_context) { asio::error_code ec; this->get_service().expires_at(this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_at"); } /// Constructor to set a particular expiry time relative to now. /** * This constructor creates a timer and sets the expiry time. * * @param io_context The io_context object that the timer will use to dispatch * handlers for any asynchronous operations performed on the timer. * * @param expiry_time The expiry time to be used for the timer, relative to * now. */ basic_deadline_timer(asio::io_context& io_context, const duration_type& expiry_time) : basic_io_object(io_context) { asio::error_code ec; this->get_service().expires_from_now( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_from_now"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_deadline_timer from another. /** * This constructor moves a timer from one object to another. * * @param other The other basic_deadline_timer object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_deadline_timer(io_context&) constructor. */ basic_deadline_timer(basic_deadline_timer&& other) : basic_io_object(std::move(other)) { } /// Move-assign a basic_deadline_timer from another. /** * This assignment operator moves a timer from one object to another. Cancels * any outstanding asynchronous operations associated with the target object. * * @param other The other basic_deadline_timer object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_deadline_timer(io_context&) constructor. */ basic_deadline_timer& operator=(basic_deadline_timer&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the timer. /** * This function destroys the timer, cancelling any outstanding asynchronous * wait operations associated with the timer as if by calling @c cancel. */ ~basic_deadline_timer() { } #if defined(ASIO_ENABLE_OLD_SERVICES) // These functions are provided by basic_io_object<>. #else // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } #endif // defined(ASIO_ENABLE_OLD_SERVICES) /// Cancel any asynchronous operations that are waiting on the timer. /** * This function forces the completion of any pending asynchronous wait * operations against the timer. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel() { asio::error_code ec; std::size_t s = this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); return s; } /// Cancel any asynchronous operations that are waiting on the timer. /** * This function forces the completion of any pending asynchronous wait * operations against the timer. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. * * @note If the timer has already expired when cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel(asio::error_code& ec) { return this->get_service().cancel(this->get_implementation(), ec); } /// Cancels one asynchronous operation that is waiting on the timer. /** * This function forces the completion of one pending asynchronous wait * operation against the timer. Handlers are cancelled in FIFO order. The * handler for the cancelled operation will be invoked with the * asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @return The number of asynchronous operations that were cancelled. That is, * either 0 or 1. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when cancel_one() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel_one() { asio::error_code ec; std::size_t s = this->get_service().cancel_one( this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel_one"); return s; } /// Cancels one asynchronous operation that is waiting on the timer. /** * This function forces the completion of one pending asynchronous wait * operation against the timer. Handlers are cancelled in FIFO order. The * handler for the cancelled operation will be invoked with the * asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. That is, * either 0 or 1. * * @note If the timer has already expired when cancel_one() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel_one(asio::error_code& ec) { return this->get_service().cancel_one(this->get_implementation(), ec); } /// Get the timer's expiry time as an absolute time. /** * This function may be used to obtain the timer's current expiry time. * Whether the timer has expired or not does not affect this value. */ time_type expires_at() const { return this->get_service().expires_at(this->get_implementation()); } /// Set the timer's expiry time as an absolute time. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when expires_at() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_at(const time_type& expiry_time) { asio::error_code ec; std::size_t s = this->get_service().expires_at( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_at"); return s; } /// Set the timer's expiry time as an absolute time. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. * * @note If the timer has already expired when expires_at() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_at(const time_type& expiry_time, asio::error_code& ec) { return this->get_service().expires_at( this->get_implementation(), expiry_time, ec); } /// Get the timer's expiry time relative to now. /** * This function may be used to obtain the timer's current expiry time. * Whether the timer has expired or not does not affect this value. */ duration_type expires_from_now() const { return this->get_service().expires_from_now(this->get_implementation()); } /// Set the timer's expiry time relative to now. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when expires_from_now() is called, * then the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_from_now(const duration_type& expiry_time) { asio::error_code ec; std::size_t s = this->get_service().expires_from_now( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_from_now"); return s; } /// Set the timer's expiry time relative to now. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. * * @note If the timer has already expired when expires_from_now() is called, * then the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_from_now(const duration_type& expiry_time, asio::error_code& ec) { return this->get_service().expires_from_now( this->get_implementation(), expiry_time, ec); } /// Perform a blocking wait on the timer. /** * This function is used to wait for the timer to expire. This function * blocks and does not return until the timer has expired. * * @throws asio::system_error Thrown on failure. */ void wait() { asio::error_code ec; this->get_service().wait(this->get_implementation(), ec); asio::detail::throw_error(ec, "wait"); } /// Perform a blocking wait on the timer. /** * This function is used to wait for the timer to expire. This function * blocks and does not return until the timer has expired. * * @param ec Set to indicate what error occurred, if any. */ void wait(asio::error_code& ec) { this->get_service().wait(this->get_implementation(), ec); } /// Start an asynchronous wait on the timer. /** * This function may be used to initiate an asynchronous wait against the * timer. It always returns immediately. * * For each call to async_wait(), the supplied handler will be called exactly * once. The handler will be called when: * * @li The timer has expired. * * @li The timer was cancelled, in which case the handler is passed the error * code asio::error::operation_aborted. * * @param handler The handler to be called when the timer expires. Copies * will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(ASIO_MOVE_ARG(WaitHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WaitHandler. ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_wait(this->get_implementation(), ASIO_MOVE_CAST(WaitHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_wait(this->get_implementation(), init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } }; } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_BASIC_DEADLINE_TIMER_HPP asio-1.12.2/include/asio/basic_io_object.hpp000066400000000000000000000173001340672067200207250ustar00rootroot00000000000000// // basic_io_object.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_IO_OBJECT_HPP #define ASIO_BASIC_IO_OBJECT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { #if defined(ASIO_HAS_MOVE) namespace detail { // Type trait used to determine whether a service supports move. template class service_has_move { private: typedef IoObjectService service_type; typedef typename service_type::implementation_type implementation_type; template static auto asio_service_has_move_eval(T* t, U* u) -> decltype(t->move_construct(*u, *u), char()); static char (&asio_service_has_move_eval(...))[2]; public: static const bool value = sizeof(asio_service_has_move_eval( static_cast(0), static_cast(0))) == 1; }; } #endif // defined(ASIO_HAS_MOVE) /// Base class for all I/O objects. /** * @note All I/O objects are non-copyable. However, when using C++0x, certain * I/O objects do support move construction and move assignment. */ #if !defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) template #else template ::value> #endif class basic_io_object { public: /// The type of the service that will be used to provide I/O operations. typedef IoObjectService service_type; /// The underlying implementation type of I/O object. typedef typename service_type::implementation_type implementation_type; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return service_.get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return service_.get_io_context(); } #endif // !defined(ASIO_NO_DEPRECATED) /// The type of the executor associated with the object. typedef asio::io_context::executor_type executor_type; /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return service_.get_io_context().get_executor(); } protected: /// Construct a basic_io_object. /** * Performs: * @code get_service().construct(get_implementation()); @endcode */ explicit basic_io_object(asio::io_context& io_context) : service_(asio::use_service(io_context)) { service_.construct(implementation_); } #if defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_io_object. /** * Performs: * @code get_service().move_construct( * get_implementation(), other.get_implementation()); @endcode * * @note Available only for services that support movability, */ basic_io_object(basic_io_object&& other); /// Move-assign a basic_io_object. /** * Performs: * @code get_service().move_assign(get_implementation(), * other.get_service(), other.get_implementation()); @endcode * * @note Available only for services that support movability, */ basic_io_object& operator=(basic_io_object&& other); /// Perform a converting move-construction of a basic_io_object. template basic_io_object(IoObjectService1& other_service, typename IoObjectService1::implementation_type& other_implementation); #endif // defined(GENERATING_DOCUMENTATION) /// Protected destructor to prevent deletion through this type. /** * Performs: * @code get_service().destroy(get_implementation()); @endcode */ ~basic_io_object() { service_.destroy(implementation_); } /// Get the service associated with the I/O object. service_type& get_service() { return service_; } /// Get the service associated with the I/O object. const service_type& get_service() const { return service_; } /// Get the underlying implementation of the I/O object. implementation_type& get_implementation() { return implementation_; } /// Get the underlying implementation of the I/O object. const implementation_type& get_implementation() const { return implementation_; } private: basic_io_object(const basic_io_object&); basic_io_object& operator=(const basic_io_object&); // The service associated with the I/O object. service_type& service_; /// The underlying implementation of the I/O object. implementation_type implementation_; }; #if defined(ASIO_HAS_MOVE) // Specialisation for movable objects. template class basic_io_object { public: typedef IoObjectService service_type; typedef typename service_type::implementation_type implementation_type; #if !defined(ASIO_NO_DEPRECATED) asio::io_context& get_io_context() { return service_->get_io_context(); } asio::io_context& get_io_service() { return service_->get_io_context(); } #endif // !defined(ASIO_NO_DEPRECATED) typedef asio::io_context::executor_type executor_type; executor_type get_executor() ASIO_NOEXCEPT { return service_->get_io_context().get_executor(); } protected: explicit basic_io_object(asio::io_context& io_context) : service_(&asio::use_service(io_context)) { service_->construct(implementation_); } basic_io_object(basic_io_object&& other) : service_(&other.get_service()) { service_->move_construct(implementation_, other.implementation_); } template basic_io_object(IoObjectService1& other_service, typename IoObjectService1::implementation_type& other_implementation) : service_(&asio::use_service( other_service.get_io_context())) { service_->converting_move_construct(implementation_, other_service, other_implementation); } ~basic_io_object() { service_->destroy(implementation_); } basic_io_object& operator=(basic_io_object&& other) { service_->move_assign(implementation_, *other.service_, other.implementation_); service_ = other.service_; return *this; } service_type& get_service() { return *service_; } const service_type& get_service() const { return *service_; } implementation_type& get_implementation() { return implementation_; } const implementation_type& get_implementation() const { return implementation_; } private: basic_io_object(const basic_io_object&); void operator=(const basic_io_object&); IoObjectService* service_; implementation_type implementation_; }; #endif // defined(ASIO_HAS_MOVE) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BASIC_IO_OBJECT_HPP asio-1.12.2/include/asio/basic_raw_socket.hpp000066400000000000000000001166671340672067200211510ustar00rootroot00000000000000// // basic_raw_socket.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_RAW_SOCKET_HPP #define ASIO_BASIC_RAW_SOCKET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_socket.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/raw_socket_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides raw-oriented socket functionality. /** * The basic_raw_socket class template provides asynchronous and blocking * raw-oriented socket functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template )> class basic_raw_socket : public basic_socket { public: /// The native representation of a socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename basic_socket< Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// Construct a basic_raw_socket without opening it. /** * This constructor creates a raw socket without opening it. The open() * function must be called before data can be sent or received on the socket. * * @param io_context The io_context object that the raw socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. */ explicit basic_raw_socket(asio::io_context& io_context) : basic_socket(io_context) { } /// Construct and open a basic_raw_socket. /** * This constructor creates and opens a raw socket. * * @param io_context The io_context object that the raw socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. */ basic_raw_socket(asio::io_context& io_context, const protocol_type& protocol) : basic_socket(io_context, protocol) { } /// Construct a basic_raw_socket, opening it and binding it to the given /// local endpoint. /** * This constructor creates a raw socket and automatically opens it bound * to the specified endpoint on the local machine. The protocol used is the * protocol associated with the given endpoint. * * @param io_context The io_context object that the raw socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. * * @param endpoint An endpoint on the local machine to which the raw * socket will be bound. * * @throws asio::system_error Thrown on failure. */ basic_raw_socket(asio::io_context& io_context, const endpoint_type& endpoint) : basic_socket(io_context, endpoint) { } /// Construct a basic_raw_socket on an existing native socket. /** * This constructor creates a raw socket object to hold an existing * native socket. * * @param io_context The io_context object that the raw socket will use * to dispatch handlers for any asynchronous operations performed on the * socket. * * @param protocol An object specifying protocol parameters to be used. * * @param native_socket The new underlying socket implementation. * * @throws asio::system_error Thrown on failure. */ basic_raw_socket(asio::io_context& io_context, const protocol_type& protocol, const native_handle_type& native_socket) : basic_socket( io_context, protocol, native_socket) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_raw_socket from another. /** * This constructor moves a raw socket from one object to another. * * @param other The other basic_raw_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_raw_socket(io_context&) constructor. */ basic_raw_socket(basic_raw_socket&& other) : basic_socket(std::move(other)) { } /// Move-assign a basic_raw_socket from another. /** * This assignment operator moves a raw socket from one object to another. * * @param other The other basic_raw_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_raw_socket(io_context&) constructor. */ basic_raw_socket& operator=(basic_raw_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } /// Move-construct a basic_raw_socket from a socket of another protocol type. /** * This constructor moves a raw socket from one object to another. * * @param other The other basic_raw_socket object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_raw_socket(io_context&) constructor. */ template basic_raw_socket(basic_raw_socket&& other, typename enable_if::value>::type* = 0) : basic_socket(std::move(other)) { } /// Move-assign a basic_raw_socket from a socket of another protocol type. /** * This assignment operator moves a raw socket from one object to another. * * @param other The other basic_raw_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_raw_socket(io_context&) constructor. */ template typename enable_if::value, basic_raw_socket>::type& operator=( basic_raw_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the socket. /** * This function destroys the socket, cancelling any outstanding asynchronous * operations associated with the socket as if by calling @c cancel. */ ~basic_raw_socket() { } /// Send some data on a connected socket. /** * This function is used to send data on the raw socket. The function call * will block until the data has been sent successfully or an error occurs. * * @param buffers One ore more data buffers to be sent on the socket. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @note The send operation can only be used with a connected socket. Use * the send_to function to send data on an unconnected raw socket. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code socket.send(asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on a connected socket. /** * This function is used to send data on the raw socket. The function call * will block until the data has been sent successfully or an error occurs. * * @param buffers One ore more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @note The send operation can only be used with a connected socket. Use * the send_to function to send data on an unconnected raw socket. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on a connected socket. /** * This function is used to send data on the raw socket. The function call * will block until the data has been sent successfully or an error occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes sent. * * @note The send operation can only be used with a connected socket. Use * the send_to function to send data on an unconnected raw socket. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().send( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous send on a connected socket. /** * This function is used to send data on the raw socket. The function call * will block until the data has been sent successfully or an error occurs. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_send operation can only be used with a connected socket. * Use the async_send_to function to send data on an unconnected raw * socket. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.async_send(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous send on a connected socket. /** * This function is used to send data on the raw socket. The function call * will block until the data has been sent successfully or an error occurs. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param flags Flags specifying how the send call is to be made. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_send operation can only be used with a connected socket. * Use the async_send_to function to send data on an unconnected raw * socket. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send(this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send(this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Send raw data to the specified endpoint. /** * This function is used to send raw data to the specified remote endpoint. * The function call will block until the data has been sent successfully or * an error occurs. * * @param buffers One or more data buffers to be sent to the remote endpoint. * * @param destination The remote endpoint to which the data will be sent. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * asio::ip::udp::endpoint destination( * asio::ip::address::from_string("1.2.3.4"), 12345); * socket.send_to(asio::buffer(data, size), destination); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send_to(const ConstBufferSequence& buffers, const endpoint_type& destination) { asio::error_code ec; std::size_t s = this->get_service().send_to( this->get_implementation(), buffers, destination, 0, ec); asio::detail::throw_error(ec, "send_to"); return s; } /// Send raw data to the specified endpoint. /** * This function is used to send raw data to the specified remote endpoint. * The function call will block until the data has been sent successfully or * an error occurs. * * @param buffers One or more data buffers to be sent to the remote endpoint. * * @param destination The remote endpoint to which the data will be sent. * * @param flags Flags specifying how the send call is to be made. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. */ template std::size_t send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().send_to( this->get_implementation(), buffers, destination, flags, ec); asio::detail::throw_error(ec, "send_to"); return s; } /// Send raw data to the specified endpoint. /** * This function is used to send raw data to the specified remote endpoint. * The function call will block until the data has been sent successfully or * an error occurs. * * @param buffers One or more data buffers to be sent to the remote endpoint. * * @param destination The remote endpoint to which the data will be sent. * * @param flags Flags specifying how the send call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes sent. */ template std::size_t send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().send_to(this->get_implementation(), buffers, destination, flags, ec); } /// Start an asynchronous send. /** * This function is used to asynchronously send raw data to the specified * remote endpoint. The function call always returns immediately. * * @param buffers One or more data buffers to be sent to the remote endpoint. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param destination The remote endpoint to which the data will be sent. * Copies will be made of the endpoint as required. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * asio::ip::udp::endpoint destination( * asio::ip::address::from_string("1.2.3.4"), 12345); * socket.async_send_to( * asio::buffer(data, size), destination, handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send_to(this->get_implementation(), buffers, destination, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send_to(this->get_implementation(), buffers, destination, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous send. /** * This function is used to asynchronously send raw data to the specified * remote endpoint. The function call always returns immediately. * * @param buffers One or more data buffers to be sent to the remote endpoint. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param flags Flags specifying how the send call is to be made. * * @param destination The remote endpoint to which the data will be sent. * Copies will be made of the endpoint as required. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send_to(const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send_to( this->get_implementation(), buffers, destination, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send_to( this->get_implementation(), buffers, destination, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Receive some data on a connected socket. /** * This function is used to receive data on the raw socket. The function * call will block until data has been received successfully or an error * occurs. * * @param buffers One or more buffers into which the data will be received. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. * * @note The receive operation can only be used with a connected socket. Use * the receive_from function to receive data on an unconnected raw * socket. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code socket.receive(asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on a connected socket. /** * This function is used to receive data on the raw socket. The function * call will block until data has been received successfully or an error * occurs. * * @param buffers One or more buffers into which the data will be received. * * @param flags Flags specifying how the receive call is to be made. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. * * @note The receive operation can only be used with a connected socket. Use * the receive_from function to receive data on an unconnected raw * socket. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on a connected socket. /** * This function is used to receive data on the raw socket. The function * call will block until data has been received successfully or an error * occurs. * * @param buffers One or more buffers into which the data will be received. * * @param flags Flags specifying how the receive call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes received. * * @note The receive operation can only be used with a connected socket. Use * the receive_from function to receive data on an unconnected raw * socket. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().receive( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous receive on a connected socket. /** * This function is used to asynchronously receive data from the raw * socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_receive operation can only be used with a connected socket. * Use the async_receive_from function to receive data on an unconnected * raw socket. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.async_receive(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive on a connected socket. /** * This function is used to asynchronously receive data from the raw * socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param flags Flags specifying how the receive call is to be made. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The async_receive operation can only be used with a connected socket. * Use the async_receive_from function to receive data on an unconnected * raw socket. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Receive raw data with the endpoint of the sender. /** * This function is used to receive raw data. The function call will block * until data has been received successfully or an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the data. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * asio::ip::udp::endpoint sender_endpoint; * socket.receive_from( * asio::buffer(data, size), sender_endpoint); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint) { asio::error_code ec; std::size_t s = this->get_service().receive_from( this->get_implementation(), buffers, sender_endpoint, 0, ec); asio::detail::throw_error(ec, "receive_from"); return s; } /// Receive raw data with the endpoint of the sender. /** * This function is used to receive raw data. The function call will block * until data has been received successfully or an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the data. * * @param flags Flags specifying how the receive call is to be made. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. */ template std::size_t receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().receive_from( this->get_implementation(), buffers, sender_endpoint, flags, ec); asio::detail::throw_error(ec, "receive_from"); return s; } /// Receive raw data with the endpoint of the sender. /** * This function is used to receive raw data. The function call will block * until data has been received successfully or an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the data. * * @param flags Flags specifying how the receive call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes received. */ template std::size_t receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().receive_from(this->get_implementation(), buffers, sender_endpoint, flags, ec); } /// Start an asynchronous receive. /** * This function is used to asynchronously receive raw data. The function * call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the data. Ownership of the sender_endpoint object * is retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code socket.async_receive_from( * asio::buffer(data, size), 0, sender_endpoint, handler); @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive. /** * This function is used to asynchronously receive raw data. The function * call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param sender_endpoint An endpoint object that receives the endpoint of * the remote sender of the data. Ownership of the sender_endpoint object * is retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param flags Flags specifying how the receive call is to be made. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive_from(const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive_from( this->get_implementation(), buffers, sender_endpoint, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BASIC_RAW_SOCKET_HPP asio-1.12.2/include/asio/basic_seq_packet_socket.hpp000066400000000000000000000566151340672067200224730ustar00rootroot00000000000000// // basic_seq_packet_socket.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SEQ_PACKET_SOCKET_HPP #define ASIO_BASIC_SEQ_PACKET_SOCKET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_socket.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/seq_packet_socket_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides sequenced packet socket functionality. /** * The basic_seq_packet_socket class template provides asynchronous and blocking * sequenced packet socket functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template )> class basic_seq_packet_socket : public basic_socket { public: /// The native representation of a socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename basic_socket< Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// Construct a basic_seq_packet_socket without opening it. /** * This constructor creates a sequenced packet socket without opening it. The * socket needs to be opened and then connected or accepted before data can * be sent or received on it. * * @param io_context The io_context object that the sequenced packet socket * will use to dispatch handlers for any asynchronous operations performed on * the socket. */ explicit basic_seq_packet_socket(asio::io_context& io_context) : basic_socket(io_context) { } /// Construct and open a basic_seq_packet_socket. /** * This constructor creates and opens a sequenced_packet socket. The socket * needs to be connected or accepted before data can be sent or received on * it. * * @param io_context The io_context object that the sequenced packet socket * will use to dispatch handlers for any asynchronous operations performed on * the socket. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. */ basic_seq_packet_socket(asio::io_context& io_context, const protocol_type& protocol) : basic_socket(io_context, protocol) { } /// Construct a basic_seq_packet_socket, opening it and binding it to the /// given local endpoint. /** * This constructor creates a sequenced packet socket and automatically opens * it bound to the specified endpoint on the local machine. The protocol used * is the protocol associated with the given endpoint. * * @param io_context The io_context object that the sequenced packet socket * will use to dispatch handlers for any asynchronous operations performed on * the socket. * * @param endpoint An endpoint on the local machine to which the sequenced * packet socket will be bound. * * @throws asio::system_error Thrown on failure. */ basic_seq_packet_socket(asio::io_context& io_context, const endpoint_type& endpoint) : basic_socket(io_context, endpoint) { } /// Construct a basic_seq_packet_socket on an existing native socket. /** * This constructor creates a sequenced packet socket object to hold an * existing native socket. * * @param io_context The io_context object that the sequenced packet socket * will use to dispatch handlers for any asynchronous operations performed on * the socket. * * @param protocol An object specifying protocol parameters to be used. * * @param native_socket The new underlying socket implementation. * * @throws asio::system_error Thrown on failure. */ basic_seq_packet_socket(asio::io_context& io_context, const protocol_type& protocol, const native_handle_type& native_socket) : basic_socket( io_context, protocol, native_socket) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_seq_packet_socket from another. /** * This constructor moves a sequenced packet socket from one object to * another. * * @param other The other basic_seq_packet_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_seq_packet_socket(io_context&) constructor. */ basic_seq_packet_socket(basic_seq_packet_socket&& other) : basic_socket(std::move(other)) { } /// Move-assign a basic_seq_packet_socket from another. /** * This assignment operator moves a sequenced packet socket from one object to * another. * * @param other The other basic_seq_packet_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_seq_packet_socket(io_context&) constructor. */ basic_seq_packet_socket& operator=(basic_seq_packet_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } /// Move-construct a basic_seq_packet_socket from a socket of another protocol /// type. /** * This constructor moves a sequenced packet socket from one object to * another. * * @param other The other basic_seq_packet_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_seq_packet_socket(io_context&) constructor. */ template basic_seq_packet_socket( basic_seq_packet_socket&& other, typename enable_if::value>::type* = 0) : basic_socket(std::move(other)) { } /// Move-assign a basic_seq_packet_socket from a socket of another protocol /// type. /** * This assignment operator moves a sequenced packet socket from one object to * another. * * @param other The other basic_seq_packet_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_seq_packet_socket(io_context&) constructor. */ template typename enable_if::value, basic_seq_packet_socket>::type& operator=( basic_seq_packet_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the socket. /** * This function destroys the socket, cancelling any outstanding asynchronous * operations associated with the socket as if by calling @c cancel. */ ~basic_seq_packet_socket() { } /// Send some data on the socket. /** * This function is used to send data on the sequenced packet socket. The * function call will block until the data has been sent successfully, or an * until error occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.send(asio::buffer(data, size), 0); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on the socket. /** * This function is used to send data on the sequenced packet socket. The * function call will block the data has been sent successfully, or an until * error occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes sent. Returns 0 if an error occurred. * * @note The send operation may not transmit all of the data to the peer. * Consider using the @ref write function if you need to ensure that all data * is written before the blocking operation completes. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().send( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous send. /** * This function is used to asynchronously send data on the sequenced packet * socket. The function call always returns immediately. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param flags Flags specifying how the send call is to be made. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.async_send(asio::buffer(data, size), 0, handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send(this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send(this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Receive some data on the socket. /** * This function is used to receive data on the sequenced packet socket. The * function call will block until data has been received successfully, or * until an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param out_flags After the receive call completes, contains flags * associated with the received data. For example, if the * socket_base::message_end_of_record bit is set then the received data marks * the end of a record. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.receive(asio::buffer(data, size), out_flags); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags& out_flags) { asio::error_code ec; #if defined(ASIO_ENABLE_OLD_SERVICES) std::size_t s = this->get_service().receive( this->get_implementation(), buffers, 0, out_flags, ec); #else // defined(ASIO_ENABLE_OLD_SERVICES) std::size_t s = this->get_service().receive_with_flags( this->get_implementation(), buffers, 0, out_flags, ec); #endif // defined(ASIO_ENABLE_OLD_SERVICES) asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on the socket. /** * This function is used to receive data on the sequenced packet socket. The * function call will block until data has been received successfully, or * until an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param in_flags Flags specifying how the receive call is to be made. * * @param out_flags After the receive call completes, contains flags * associated with the received data. For example, if the * socket_base::message_end_of_record bit is set then the received data marks * the end of a record. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.receive(asio::buffer(data, size), 0, out_flags); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags) { asio::error_code ec; #if defined(ASIO_ENABLE_OLD_SERVICES) std::size_t s = this->get_service().receive( this->get_implementation(), buffers, in_flags, out_flags, ec); #else // defined(ASIO_ENABLE_OLD_SERVICES) std::size_t s = this->get_service().receive_with_flags( this->get_implementation(), buffers, in_flags, out_flags, ec); #endif // defined(ASIO_ENABLE_OLD_SERVICES) asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on a connected socket. /** * This function is used to receive data on the sequenced packet socket. The * function call will block until data has been received successfully, or * until an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param in_flags Flags specifying how the receive call is to be made. * * @param out_flags After the receive call completes, contains flags * associated with the received data. For example, if the * socket_base::message_end_of_record bit is set then the received data marks * the end of a record. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes received. Returns 0 if an error occurred. * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, asio::error_code& ec) { #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().receive(this->get_implementation(), buffers, in_flags, out_flags, ec); #else // defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().receive_with_flags(this->get_implementation(), buffers, in_flags, out_flags, ec); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive. /** * This function is used to asynchronously receive data from the sequenced * packet socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param out_flags Once the asynchronous operation completes, contains flags * associated with the received data. For example, if the * socket_base::message_end_of_record bit is set then the received data marks * the end of a record. The caller must guarantee that the referenced * variable remains valid until the handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.async_receive(asio::buffer(data, size), out_flags, handler); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, socket_base::message_flags& out_flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive( this->get_implementation(), buffers, 0, out_flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive_with_flags( this->get_implementation(), buffers, 0, out_flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive. /** * This function is used to asynchronously receive data from the sequenced * data socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param in_flags Flags specifying how the receive call is to be made. * * @param out_flags Once the asynchronous operation completes, contains flags * associated with the received data. For example, if the * socket_base::message_end_of_record bit is set then the received data marks * the end of a record. The caller must guarantee that the referenced * variable remains valid until the handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.async_receive( * asio::buffer(data, size), * 0, out_flags, handler); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive( this->get_implementation(), buffers, in_flags, out_flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive_with_flags( this->get_implementation(), buffers, in_flags, out_flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BASIC_SEQ_PACKET_SOCKET_HPP asio-1.12.2/include/asio/basic_serial_port.hpp000066400000000000000000000573131340672067200213230ustar00rootroot00000000000000// // basic_serial_port.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SERIAL_PORT_HPP #define ASIO_BASIC_SERIAL_PORT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_SERIAL_PORT) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/serial_port_base.hpp" #include "asio/serial_port_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Provides serial port functionality. /** * The basic_serial_port class template provides functionality that is common * to all serial ports. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_serial_port : public basic_io_object, public serial_port_base { public: /// The native representation of a serial port. typedef typename SerialPortService::native_handle_type native_handle_type; /// A basic_serial_port is always the lowest layer. typedef basic_serial_port lowest_layer_type; /// Construct a basic_serial_port without opening it. /** * This constructor creates a serial port without opening it. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. */ explicit basic_serial_port(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct and open a basic_serial_port. /** * This constructor creates and opens a serial port for the specified device * name. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. * * @param device The platform-specific device name for this serial * port. */ explicit basic_serial_port(asio::io_context& io_context, const char* device) : basic_io_object(io_context) { asio::error_code ec; this->get_service().open(this->get_implementation(), device, ec); asio::detail::throw_error(ec, "open"); } /// Construct and open a basic_serial_port. /** * This constructor creates and opens a serial port for the specified device * name. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. * * @param device The platform-specific device name for this serial * port. */ explicit basic_serial_port(asio::io_context& io_context, const std::string& device) : basic_io_object(io_context) { asio::error_code ec; this->get_service().open(this->get_implementation(), device, ec); asio::detail::throw_error(ec, "open"); } /// Construct a basic_serial_port on an existing native serial port. /** * This constructor creates a serial port object to hold an existing native * serial port. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. * * @param native_serial_port A native serial port. * * @throws asio::system_error Thrown on failure. */ basic_serial_port(asio::io_context& io_context, const native_handle_type& native_serial_port) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_serial_port, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_serial_port from another. /** * This constructor moves a serial port from one object to another. * * @param other The other basic_serial_port object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_serial_port(io_context&) constructor. */ basic_serial_port(basic_serial_port&& other) : basic_io_object( ASIO_MOVE_CAST(basic_serial_port)(other)) { } /// Move-assign a basic_serial_port from another. /** * This assignment operator moves a serial port from one object to another. * * @param other The other basic_serial_port object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_serial_port(io_context&) constructor. */ basic_serial_port& operator=(basic_serial_port&& other) { basic_io_object::operator=( ASIO_MOVE_CAST(basic_serial_port)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since a basic_serial_port cannot contain any further layers, it * simply returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since a basic_serial_port cannot contain any further layers, it * simply returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Open the serial port using the specified device name. /** * This function opens the serial port for the specified device name. * * @param device The platform-specific device name. * * @throws asio::system_error Thrown on failure. */ void open(const std::string& device) { asio::error_code ec; this->get_service().open(this->get_implementation(), device, ec); asio::detail::throw_error(ec, "open"); } /// Open the serial port using the specified device name. /** * This function opens the serial port using the given platform-specific * device name. * * @param device The platform-specific device name. * * @param ec Set the indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID open(const std::string& device, asio::error_code& ec) { this->get_service().open(this->get_implementation(), device, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native serial port to the serial port. /* * This function opens the serial port to hold an existing native serial port. * * @param native_serial_port A native serial port. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& native_serial_port) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_serial_port, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native serial port to the serial port. /* * This function opens the serial port to hold an existing native serial port. * * @param native_serial_port A native serial port. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_serial_port, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), native_serial_port, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the serial port is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the serial port. /** * This function is used to close the serial port. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the serial port. /** * This function is used to close the serial port. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native serial port representation. /** * This function may be used to obtain the underlying representation of the * serial port. This is intended to allow access to native serial port * functionality that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the serial port. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the serial port. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Send a break sequence to the serial port. /** * This function causes a break sequence of platform-specific duration to be * sent out the serial port. * * @throws asio::system_error Thrown on failure. */ void send_break() { asio::error_code ec; this->get_service().send_break(this->get_implementation(), ec); asio::detail::throw_error(ec, "send_break"); } /// Send a break sequence to the serial port. /** * This function causes a break sequence of platform-specific duration to be * sent out the serial port. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID send_break(asio::error_code& ec) { this->get_service().send_break(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Set an option on the serial port. /** * This function is used to set an option on the serial port. * * @param option The option value to be set on the serial port. * * @throws asio::system_error Thrown on failure. * * @sa SettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template void set_option(const SettableSerialPortOption& option) { asio::error_code ec; this->get_service().set_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "set_option"); } /// Set an option on the serial port. /** * This function is used to set an option on the serial port. * * @param option The option value to be set on the serial port. * * @param ec Set to indicate what error occurred, if any. * * @sa SettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template ASIO_SYNC_OP_VOID set_option(const SettableSerialPortOption& option, asio::error_code& ec) { this->get_service().set_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get an option from the serial port. /** * This function is used to get the current value of an option on the serial * port. * * @param option The option value to be obtained from the serial port. * * @throws asio::system_error Thrown on failure. * * @sa GettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template void get_option(GettableSerialPortOption& option) { asio::error_code ec; this->get_service().get_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "get_option"); } /// Get an option from the serial port. /** * This function is used to get the current value of an option on the serial * port. * * @param option The option value to be obtained from the serial port. * * @param ec Set to indicate what error occurred, if any. * * @sa GettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template ASIO_SYNC_OP_VOID get_option(GettableSerialPortOption& option, asio::error_code& ec) { this->get_service().get_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Write some data to the serial port. /** * This function is used to write data to the serial port. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the serial port. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * serial_port.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the serial port. /** * This function is used to write data to the serial port. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the serial port. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the serial port. * The function call always returns immediately. * * @param buffers One or more data buffers to be written to the serial port. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * serial_port.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; return this->get_service().async_write_some(this->get_implementation(), buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Read some data from the serial port. /** * This function is used to read data from the serial port. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * serial_port.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the serial port. /** * This function is used to read data from the serial port. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the serial port. * The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * serial_port.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; return this->get_service().async_read_some(this->get_implementation(), buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_SERIAL_PORT) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_BASIC_SERIAL_PORT_HPP asio-1.12.2/include/asio/basic_signal_set.hpp000066400000000000000000000321661340672067200211270ustar00rootroot00000000000000// // basic_signal_set.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SIGNAL_SET_HPP #define ASIO_BASIC_SIGNAL_SET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/signal_set_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Provides signal functionality. /** * The basic_signal_set class template provides the ability to perform an * asynchronous wait for one or more signals to occur. * * Most applications will use the asio::signal_set typedef. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Example * Performing an asynchronous wait: * @code * void handler( * const asio::error_code& error, * int signal_number) * { * if (!error) * { * // A signal occurred. * } * } * * ... * * // Construct a signal set registered for process termination. * asio::signal_set signals(io_context, SIGINT, SIGTERM); * * // Start an asynchronous wait for one of the signals to occur. * signals.async_wait(handler); * @endcode * * @par Queueing of signal notifications * * If a signal is registered with a signal_set, and the signal occurs when * there are no waiting handlers, then the signal notification is queued. The * next async_wait operation on that signal_set will dequeue the notification. * If multiple notifications are queued, subsequent async_wait operations * dequeue them one at a time. Signal notifications are dequeued in order of * ascending signal number. * * If a signal number is removed from a signal_set (using the @c remove or @c * erase member functions) then any queued notifications for that signal are * discarded. * * @par Multiple registration of signals * * The same signal number may be registered with different signal_set objects. * When the signal occurs, one handler is called for each signal_set object. * * Note that multiple registration only works for signals that are registered * using Asio. The application must not also register a signal handler using * functions such as @c signal() or @c sigaction(). * * @par Signal masking on POSIX platforms * * POSIX allows signals to be blocked using functions such as @c sigprocmask() * and @c pthread_sigmask(). For signals to be delivered, programs must ensure * that any signals registered using signal_set objects are unblocked in at * least one thread. */ template class basic_signal_set : public basic_io_object { public: /// Construct a signal set without adding any signals. /** * This constructor creates a signal set without registering for any signals. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. */ explicit basic_signal_set(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct a signal set and add one signal. /** * This constructor creates a signal set and registers for one signal. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. * * @param signal_number_1 The signal number to be added. * * @note This constructor is equivalent to performing: * @code asio::signal_set signals(io_context); * signals.add(signal_number_1); @endcode */ basic_signal_set(asio::io_context& io_context, int signal_number_1) : basic_io_object(io_context) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number_1, ec); asio::detail::throw_error(ec, "add"); } /// Construct a signal set and add two signals. /** * This constructor creates a signal set and registers for two signals. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. * * @param signal_number_1 The first signal number to be added. * * @param signal_number_2 The second signal number to be added. * * @note This constructor is equivalent to performing: * @code asio::signal_set signals(io_context); * signals.add(signal_number_1); * signals.add(signal_number_2); @endcode */ basic_signal_set(asio::io_context& io_context, int signal_number_1, int signal_number_2) : basic_io_object(io_context) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number_1, ec); asio::detail::throw_error(ec, "add"); this->get_service().add(this->get_implementation(), signal_number_2, ec); asio::detail::throw_error(ec, "add"); } /// Construct a signal set and add three signals. /** * This constructor creates a signal set and registers for three signals. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. * * @param signal_number_1 The first signal number to be added. * * @param signal_number_2 The second signal number to be added. * * @param signal_number_3 The third signal number to be added. * * @note This constructor is equivalent to performing: * @code asio::signal_set signals(io_context); * signals.add(signal_number_1); * signals.add(signal_number_2); * signals.add(signal_number_3); @endcode */ basic_signal_set(asio::io_context& io_context, int signal_number_1, int signal_number_2, int signal_number_3) : basic_io_object(io_context) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number_1, ec); asio::detail::throw_error(ec, "add"); this->get_service().add(this->get_implementation(), signal_number_2, ec); asio::detail::throw_error(ec, "add"); this->get_service().add(this->get_implementation(), signal_number_3, ec); asio::detail::throw_error(ec, "add"); } /// Add a signal to a signal_set. /** * This function adds the specified signal to the set. It has no effect if the * signal is already in the set. * * @param signal_number The signal to be added to the set. * * @throws asio::system_error Thrown on failure. */ void add(int signal_number) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number, ec); asio::detail::throw_error(ec, "add"); } /// Add a signal to a signal_set. /** * This function adds the specified signal to the set. It has no effect if the * signal is already in the set. * * @param signal_number The signal to be added to the set. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID add(int signal_number, asio::error_code& ec) { this->get_service().add(this->get_implementation(), signal_number, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Remove a signal from a signal_set. /** * This function removes the specified signal from the set. It has no effect * if the signal is not in the set. * * @param signal_number The signal to be removed from the set. * * @throws asio::system_error Thrown on failure. * * @note Removes any notifications that have been queued for the specified * signal number. */ void remove(int signal_number) { asio::error_code ec; this->get_service().remove(this->get_implementation(), signal_number, ec); asio::detail::throw_error(ec, "remove"); } /// Remove a signal from a signal_set. /** * This function removes the specified signal from the set. It has no effect * if the signal is not in the set. * * @param signal_number The signal to be removed from the set. * * @param ec Set to indicate what error occurred, if any. * * @note Removes any notifications that have been queued for the specified * signal number. */ ASIO_SYNC_OP_VOID remove(int signal_number, asio::error_code& ec) { this->get_service().remove(this->get_implementation(), signal_number, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Remove all signals from a signal_set. /** * This function removes all signals from the set. It has no effect if the set * is already empty. * * @throws asio::system_error Thrown on failure. * * @note Removes all queued notifications. */ void clear() { asio::error_code ec; this->get_service().clear(this->get_implementation(), ec); asio::detail::throw_error(ec, "clear"); } /// Remove all signals from a signal_set. /** * This function removes all signals from the set. It has no effect if the set * is already empty. * * @param ec Set to indicate what error occurred, if any. * * @note Removes all queued notifications. */ ASIO_SYNC_OP_VOID clear(asio::error_code& ec) { this->get_service().clear(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Cancel all operations associated with the signal set. /** * This function forces the completion of any pending asynchronous wait * operations against the signal set. The handler for each cancelled * operation will be invoked with the asio::error::operation_aborted * error code. * * Cancellation does not alter the set of registered signals. * * @throws asio::system_error Thrown on failure. * * @note If a registered signal occurred before cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all operations associated with the signal set. /** * This function forces the completion of any pending asynchronous wait * operations against the signal set. The handler for each cancelled * operation will be invoked with the asio::error::operation_aborted * error code. * * Cancellation does not alter the set of registered signals. * * @param ec Set to indicate what error occurred, if any. * * @note If a registered signal occurred before cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous operation to wait for a signal to be delivered. /** * This function may be used to initiate an asynchronous wait against the * signal set. It always returns immediately. * * For each call to async_wait(), the supplied handler will be called exactly * once. The handler will be called when: * * @li One of the registered signals in the signal set occurs; or * * @li The signal set was cancelled, in which case the handler is passed the * error code asio::error::operation_aborted. * * @param handler The handler to be called when the signal occurs. Copies * will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * int signal_number // Indicates which signal occurred. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(SignalHandler, void (asio::error_code, int)) async_wait(ASIO_MOVE_ARG(SignalHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a SignalHandler. ASIO_SIGNAL_HANDLER_CHECK(SignalHandler, handler) type_check; return this->get_service().async_wait(this->get_implementation(), ASIO_MOVE_CAST(SignalHandler)(handler)); } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_BASIC_SIGNAL_SET_HPP asio-1.12.2/include/asio/basic_socket.hpp000066400000000000000000001626521340672067200202730ustar00rootroot00000000000000// // basic_socket.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SOCKET_HPP #define ASIO_BASIC_SOCKET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/post.hpp" #include "asio/socket_base.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #if !defined(ASIO_ENABLE_OLD_SERVICES) # if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_ssocket_service.hpp" # define ASIO_SVC_T detail::winrt_ssocket_service # elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" # define ASIO_SVC_T detail::win_iocp_socket_service # else # include "asio/detail/reactive_socket_service.hpp" # define ASIO_SVC_T detail::reactive_socket_service # endif #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides socket functionality. /** * The basic_socket class template provides functionality that is common to both * stream-oriented and datagram-oriented sockets. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_socket : ASIO_SVC_ACCESS basic_io_object, public socket_base { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The native representation of a socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename ASIO_SVC_T::native_handle_type native_handle_type; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; #if !defined(ASIO_NO_EXTENSIONS) /// A basic_socket is always the lowest layer. typedef basic_socket lowest_layer_type; #endif // !defined(ASIO_NO_EXTENSIONS) /// Construct a basic_socket without opening it. /** * This constructor creates a socket without opening it. * * @param io_context The io_context object that the socket will use to * dispatch handlers for any asynchronous operations performed on the socket. */ explicit basic_socket(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct and open a basic_socket. /** * This constructor creates and opens a socket. * * @param io_context The io_context object that the socket will use to * dispatch handlers for any asynchronous operations performed on the socket. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. */ basic_socket(asio::io_context& io_context, const protocol_type& protocol) : basic_io_object(io_context) { asio::error_code ec; this->get_service().open(this->get_implementation(), protocol, ec); asio::detail::throw_error(ec, "open"); } /// Construct a basic_socket, opening it and binding it to the given local /// endpoint. /** * This constructor creates a socket and automatically opens it bound to the * specified endpoint on the local machine. The protocol used is the protocol * associated with the given endpoint. * * @param io_context The io_context object that the socket will use to * dispatch handlers for any asynchronous operations performed on the socket. * * @param endpoint An endpoint on the local machine to which the socket will * be bound. * * @throws asio::system_error Thrown on failure. */ basic_socket(asio::io_context& io_context, const endpoint_type& endpoint) : basic_io_object(io_context) { asio::error_code ec; const protocol_type protocol = endpoint.protocol(); this->get_service().open(this->get_implementation(), protocol, ec); asio::detail::throw_error(ec, "open"); this->get_service().bind(this->get_implementation(), endpoint, ec); asio::detail::throw_error(ec, "bind"); } /// Construct a basic_socket on an existing native socket. /** * This constructor creates a socket object to hold an existing native socket. * * @param io_context The io_context object that the socket will use to * dispatch handlers for any asynchronous operations performed on the socket. * * @param protocol An object specifying protocol parameters to be used. * * @param native_socket A native socket. * * @throws asio::system_error Thrown on failure. */ basic_socket(asio::io_context& io_context, const protocol_type& protocol, const native_handle_type& native_socket) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), protocol, native_socket, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_socket from another. /** * This constructor moves a socket from one object to another. * * @param other The other basic_socket object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket(io_context&) constructor. */ basic_socket(basic_socket&& other) : basic_io_object(std::move(other)) { } /// Move-assign a basic_socket from another. /** * This assignment operator moves a socket from one object to another. * * @param other The other basic_socket object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket(io_context&) constructor. */ basic_socket& operator=(basic_socket&& other) { basic_io_object::operator=(std::move(other)); return *this; } // All sockets have access to each other's implementations. template friend class basic_socket; /// Move-construct a basic_socket from a socket of another protocol type. /** * This constructor moves a socket from one object to another. * * @param other The other basic_socket object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket(io_context&) constructor. */ template basic_socket(basic_socket&& other, typename enable_if::value>::type* = 0) : basic_io_object( other.get_service(), other.get_implementation()) { } /// Move-assign a basic_socket from a socket of another protocol type. /** * This assignment operator moves a socket from one object to another. * * @param other The other basic_socket object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket(io_context&) constructor. */ template typename enable_if::value, basic_socket>::type& operator=( basic_socket&& other) { basic_socket tmp(std::move(other)); basic_io_object::operator=(std::move(tmp)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) #if defined(ASIO_ENABLE_OLD_SERVICES) // These functions are provided by basic_io_object<>. #else // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } #endif // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_NO_EXTENSIONS) /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since a basic_socket cannot contain any further layers, it simply * returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since a basic_socket cannot contain any further layers, it simply * returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } #endif // !defined(ASIO_NO_EXTENSIONS) /// Open the socket using the specified protocol. /** * This function opens the socket so that it will use the specified protocol. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * socket.open(asio::ip::tcp::v4()); * @endcode */ void open(const protocol_type& protocol = protocol_type()) { asio::error_code ec; this->get_service().open(this->get_implementation(), protocol, ec); asio::detail::throw_error(ec, "open"); } /// Open the socket using the specified protocol. /** * This function opens the socket so that it will use the specified protocol. * * @param protocol An object specifying which protocol is to be used. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * asio::error_code ec; * socket.open(asio::ip::tcp::v4(), ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID open(const protocol_type& protocol, asio::error_code& ec) { this->get_service().open(this->get_implementation(), protocol, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native socket to the socket. /* * This function opens the socket to hold an existing native socket. * * @param protocol An object specifying which protocol is to be used. * * @param native_socket A native socket. * * @throws asio::system_error Thrown on failure. */ void assign(const protocol_type& protocol, const native_handle_type& native_socket) { asio::error_code ec; this->get_service().assign(this->get_implementation(), protocol, native_socket, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native socket to the socket. /* * This function opens the socket to hold an existing native socket. * * @param protocol An object specifying which protocol is to be used. * * @param native_socket A native socket. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), protocol, native_socket, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the socket. /** * This function is used to close the socket. Any asynchronous send, receive * or connect operations will be cancelled immediately, and will complete * with the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. Note that, even if * the function indicates an error, the underlying descriptor is closed. * * @note For portable behaviour with respect to graceful closure of a * connected socket, call shutdown() before closing the socket. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the socket. /** * This function is used to close the socket. Any asynchronous send, receive * or connect operations will be cancelled immediately, and will complete * with the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. Note that, even if * the function indicates an error, the underlying descriptor is closed. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::error_code ec; * socket.close(ec); * if (ec) * { * // An error occurred. * } * @endcode * * @note For portable behaviour with respect to graceful closure of a * connected socket, call shutdown() before closing the socket. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying native socket. /** * This function causes all outstanding asynchronous connect, send and receive * operations to finish immediately, and the handlers for cancelled operations * will be passed the asio::error::operation_aborted error. Ownership * of the native socket is then transferred to the caller. * * @throws asio::system_error Thrown on failure. * * @note This function is unsupported on Windows versions prior to Windows * 8.1, and will fail with asio::error::operation_not_supported on * these platforms. */ #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) __declspec(deprecated("This function always fails with " "operation_not_supported when used on Windows versions " "prior to Windows 8.1.")) #endif native_handle_type release() { asio::error_code ec; native_handle_type s = this->get_service().release( this->get_implementation(), ec); asio::detail::throw_error(ec, "release"); return s; } /// Release ownership of the underlying native socket. /** * This function causes all outstanding asynchronous connect, send and receive * operations to finish immediately, and the handlers for cancelled operations * will be passed the asio::error::operation_aborted error. Ownership * of the native socket is then transferred to the caller. * * @param ec Set to indicate what error occurred, if any. * * @note This function is unsupported on Windows versions prior to Windows * 8.1, and will fail with asio::error::operation_not_supported on * these platforms. */ #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) __declspec(deprecated("This function always fails with " "operation_not_supported when used on Windows versions " "prior to Windows 8.1.")) #endif native_handle_type release(asio::error_code& ec) { return this->get_service().release(this->get_implementation(), ec); } /// Get the native socket representation. /** * This function may be used to obtain the underlying representation of the * socket. This is intended to allow access to native socket functionality * that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the socket. /** * This function causes all outstanding asynchronous connect, send and receive * operations to finish immediately, and the handlers for cancelled operations * will be passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. * * @note Calls to cancel() will always fail with * asio::error::operation_not_supported when run on Windows XP, Windows * Server 2003, and earlier versions of Windows, unless * ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has * two issues that should be considered before enabling its use: * * @li It will only cancel asynchronous operations that were initiated in the * current thread. * * @li It can appear to complete without error, but the request to cancel the * unfinished operations may be silently ignored by the operating system. * Whether it works or not seems to depend on the drivers that are installed. * * For portable cancellation, consider using one of the following * alternatives: * * @li Disable asio's I/O completion port backend by defining * ASIO_DISABLE_IOCP. * * @li Use the close() function to simultaneously cancel the outstanding * operations and close the socket. * * When running on Windows Vista, Windows Server 2008, and later, the * CancelIoEx function is always used. This function does not have the * problems described above. */ #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600) \ && !defined(ASIO_ENABLE_CANCELIO) __declspec(deprecated("By default, this function always fails with " "operation_not_supported when used on Windows XP, Windows Server 2003, " "or earlier. Consult documentation for details.")) #endif void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the socket. /** * This function causes all outstanding asynchronous connect, send and receive * operations to finish immediately, and the handlers for cancelled operations * will be passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. * * @note Calls to cancel() will always fail with * asio::error::operation_not_supported when run on Windows XP, Windows * Server 2003, and earlier versions of Windows, unless * ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has * two issues that should be considered before enabling its use: * * @li It will only cancel asynchronous operations that were initiated in the * current thread. * * @li It can appear to complete without error, but the request to cancel the * unfinished operations may be silently ignored by the operating system. * Whether it works or not seems to depend on the drivers that are installed. * * For portable cancellation, consider using one of the following * alternatives: * * @li Disable asio's I/O completion port backend by defining * ASIO_DISABLE_IOCP. * * @li Use the close() function to simultaneously cancel the outstanding * operations and close the socket. * * When running on Windows Vista, Windows Server 2008, and later, the * CancelIoEx function is always used. This function does not have the * problems described above. */ #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600) \ && !defined(ASIO_ENABLE_CANCELIO) __declspec(deprecated("By default, this function always fails with " "operation_not_supported when used on Windows XP, Windows Server 2003, " "or earlier. Consult documentation for details.")) #endif ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is at the out-of-band data mark. /** * This function is used to check whether the socket input is currently * positioned at the out-of-band data mark. * * @return A bool indicating whether the socket is at the out-of-band data * mark. * * @throws asio::system_error Thrown on failure. */ bool at_mark() const { asio::error_code ec; bool b = this->get_service().at_mark(this->get_implementation(), ec); asio::detail::throw_error(ec, "at_mark"); return b; } /// Determine whether the socket is at the out-of-band data mark. /** * This function is used to check whether the socket input is currently * positioned at the out-of-band data mark. * * @param ec Set to indicate what error occurred, if any. * * @return A bool indicating whether the socket is at the out-of-band data * mark. */ bool at_mark(asio::error_code& ec) const { return this->get_service().at_mark(this->get_implementation(), ec); } /// Determine the number of bytes available for reading. /** * This function is used to determine the number of bytes that may be read * without blocking. * * @return The number of bytes that may be read without blocking, or 0 if an * error occurs. * * @throws asio::system_error Thrown on failure. */ std::size_t available() const { asio::error_code ec; std::size_t s = this->get_service().available( this->get_implementation(), ec); asio::detail::throw_error(ec, "available"); return s; } /// Determine the number of bytes available for reading. /** * This function is used to determine the number of bytes that may be read * without blocking. * * @param ec Set to indicate what error occurred, if any. * * @return The number of bytes that may be read without blocking, or 0 if an * error occurs. */ std::size_t available(asio::error_code& ec) const { return this->get_service().available(this->get_implementation(), ec); } /// Bind the socket to the given local endpoint. /** * This function binds the socket to the specified endpoint on the local * machine. * * @param endpoint An endpoint on the local machine to which the socket will * be bound. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * socket.open(asio::ip::tcp::v4()); * socket.bind(asio::ip::tcp::endpoint( * asio::ip::tcp::v4(), 12345)); * @endcode */ void bind(const endpoint_type& endpoint) { asio::error_code ec; this->get_service().bind(this->get_implementation(), endpoint, ec); asio::detail::throw_error(ec, "bind"); } /// Bind the socket to the given local endpoint. /** * This function binds the socket to the specified endpoint on the local * machine. * * @param endpoint An endpoint on the local machine to which the socket will * be bound. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * socket.open(asio::ip::tcp::v4()); * asio::error_code ec; * socket.bind(asio::ip::tcp::endpoint( * asio::ip::tcp::v4(), 12345), ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID bind(const endpoint_type& endpoint, asio::error_code& ec) { this->get_service().bind(this->get_implementation(), endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Connect the socket to the specified endpoint. /** * This function is used to connect a socket to the specified remote endpoint. * The function call will block until the connection is successfully made or * an error occurs. * * The socket is automatically opened if it is not already open. If the * connect fails, and the socket was automatically opened, the socket is * not returned to the closed state. * * @param peer_endpoint The remote endpoint to which the socket will be * connected. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * asio::ip::tcp::endpoint endpoint( * asio::ip::address::from_string("1.2.3.4"), 12345); * socket.connect(endpoint); * @endcode */ void connect(const endpoint_type& peer_endpoint) { asio::error_code ec; if (!is_open()) { this->get_service().open(this->get_implementation(), peer_endpoint.protocol(), ec); asio::detail::throw_error(ec, "connect"); } this->get_service().connect(this->get_implementation(), peer_endpoint, ec); asio::detail::throw_error(ec, "connect"); } /// Connect the socket to the specified endpoint. /** * This function is used to connect a socket to the specified remote endpoint. * The function call will block until the connection is successfully made or * an error occurs. * * The socket is automatically opened if it is not already open. If the * connect fails, and the socket was automatically opened, the socket is * not returned to the closed state. * * @param peer_endpoint The remote endpoint to which the socket will be * connected. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * asio::ip::tcp::endpoint endpoint( * asio::ip::address::from_string("1.2.3.4"), 12345); * asio::error_code ec; * socket.connect(endpoint, ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID connect(const endpoint_type& peer_endpoint, asio::error_code& ec) { if (!is_open()) { this->get_service().open(this->get_implementation(), peer_endpoint.protocol(), ec); if (ec) { ASIO_SYNC_OP_VOID_RETURN(ec); } } this->get_service().connect(this->get_implementation(), peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous connect. /** * This function is used to asynchronously connect a socket to the specified * remote endpoint. The function call always returns immediately. * * The socket is automatically opened if it is not already open. If the * connect fails, and the socket was automatically opened, the socket is * not returned to the closed state. * * @param peer_endpoint The remote endpoint to which the socket will be * connected. Copies will be made of the endpoint object as required. * * @param handler The handler to be called when the connection operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void connect_handler(const asio::error_code& error) * { * if (!error) * { * // Connect succeeded. * } * } * * ... * * asio::ip::tcp::socket socket(io_context); * asio::ip::tcp::endpoint endpoint( * asio::ip::address::from_string("1.2.3.4"), 12345); * socket.async_connect(endpoint, connect_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(ConnectHandler, void (asio::error_code)) async_connect(const endpoint_type& peer_endpoint, ASIO_MOVE_ARG(ConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ConnectHandler. ASIO_CONNECT_HANDLER_CHECK(ConnectHandler, handler) type_check; if (!is_open()) { asio::error_code ec; const protocol_type protocol = peer_endpoint.protocol(); this->get_service().open(this->get_implementation(), protocol, ec); if (ec) { async_completion init(handler); asio::post(this->get_executor(), asio::detail::bind_handler( ASIO_MOVE_CAST(ASIO_HANDLER_TYPE( ConnectHandler, void (asio::error_code)))( init.completion_handler), ec)); return init.result.get(); } } #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_connect(this->get_implementation(), peer_endpoint, ASIO_MOVE_CAST(ConnectHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_connect( this->get_implementation(), peer_endpoint, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Set an option on the socket. /** * This function is used to set an option on the socket. * * @param option The new option value to be set on the socket. * * @throws asio::system_error Thrown on failure. * * @sa SettableSocketOption @n * asio::socket_base::broadcast @n * asio::socket_base::do_not_route @n * asio::socket_base::keep_alive @n * asio::socket_base::linger @n * asio::socket_base::receive_buffer_size @n * asio::socket_base::receive_low_watermark @n * asio::socket_base::reuse_address @n * asio::socket_base::send_buffer_size @n * asio::socket_base::send_low_watermark @n * asio::ip::multicast::join_group @n * asio::ip::multicast::leave_group @n * asio::ip::multicast::enable_loopback @n * asio::ip::multicast::outbound_interface @n * asio::ip::multicast::hops @n * asio::ip::tcp::no_delay * * @par Example * Setting the IPPROTO_TCP/TCP_NODELAY option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::no_delay option(true); * socket.set_option(option); * @endcode */ template void set_option(const SettableSocketOption& option) { asio::error_code ec; this->get_service().set_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "set_option"); } /// Set an option on the socket. /** * This function is used to set an option on the socket. * * @param option The new option value to be set on the socket. * * @param ec Set to indicate what error occurred, if any. * * @sa SettableSocketOption @n * asio::socket_base::broadcast @n * asio::socket_base::do_not_route @n * asio::socket_base::keep_alive @n * asio::socket_base::linger @n * asio::socket_base::receive_buffer_size @n * asio::socket_base::receive_low_watermark @n * asio::socket_base::reuse_address @n * asio::socket_base::send_buffer_size @n * asio::socket_base::send_low_watermark @n * asio::ip::multicast::join_group @n * asio::ip::multicast::leave_group @n * asio::ip::multicast::enable_loopback @n * asio::ip::multicast::outbound_interface @n * asio::ip::multicast::hops @n * asio::ip::tcp::no_delay * * @par Example * Setting the IPPROTO_TCP/TCP_NODELAY option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::no_delay option(true); * asio::error_code ec; * socket.set_option(option, ec); * if (ec) * { * // An error occurred. * } * @endcode */ template ASIO_SYNC_OP_VOID set_option(const SettableSocketOption& option, asio::error_code& ec) { this->get_service().set_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get an option from the socket. /** * This function is used to get the current value of an option on the socket. * * @param option The option value to be obtained from the socket. * * @throws asio::system_error Thrown on failure. * * @sa GettableSocketOption @n * asio::socket_base::broadcast @n * asio::socket_base::do_not_route @n * asio::socket_base::keep_alive @n * asio::socket_base::linger @n * asio::socket_base::receive_buffer_size @n * asio::socket_base::receive_low_watermark @n * asio::socket_base::reuse_address @n * asio::socket_base::send_buffer_size @n * asio::socket_base::send_low_watermark @n * asio::ip::multicast::join_group @n * asio::ip::multicast::leave_group @n * asio::ip::multicast::enable_loopback @n * asio::ip::multicast::outbound_interface @n * asio::ip::multicast::hops @n * asio::ip::tcp::no_delay * * @par Example * Getting the value of the SOL_SOCKET/SO_KEEPALIVE option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::socket::keep_alive option; * socket.get_option(option); * bool is_set = option.value(); * @endcode */ template void get_option(GettableSocketOption& option) const { asio::error_code ec; this->get_service().get_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "get_option"); } /// Get an option from the socket. /** * This function is used to get the current value of an option on the socket. * * @param option The option value to be obtained from the socket. * * @param ec Set to indicate what error occurred, if any. * * @sa GettableSocketOption @n * asio::socket_base::broadcast @n * asio::socket_base::do_not_route @n * asio::socket_base::keep_alive @n * asio::socket_base::linger @n * asio::socket_base::receive_buffer_size @n * asio::socket_base::receive_low_watermark @n * asio::socket_base::reuse_address @n * asio::socket_base::send_buffer_size @n * asio::socket_base::send_low_watermark @n * asio::ip::multicast::join_group @n * asio::ip::multicast::leave_group @n * asio::ip::multicast::enable_loopback @n * asio::ip::multicast::outbound_interface @n * asio::ip::multicast::hops @n * asio::ip::tcp::no_delay * * @par Example * Getting the value of the SOL_SOCKET/SO_KEEPALIVE option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::socket::keep_alive option; * asio::error_code ec; * socket.get_option(option, ec); * if (ec) * { * // An error occurred. * } * bool is_set = option.value(); * @endcode */ template ASIO_SYNC_OP_VOID get_option(GettableSocketOption& option, asio::error_code& ec) const { this->get_service().get_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the socket. /** * This function is used to execute an IO control command on the socket. * * @param command The IO control command to be performed on the socket. * * @throws asio::system_error Thrown on failure. * * @sa IoControlCommand @n * asio::socket_base::bytes_readable @n * asio::socket_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::socket::bytes_readable command; * socket.io_control(command); * std::size_t bytes_readable = command.get(); * @endcode */ template void io_control(IoControlCommand& command) { asio::error_code ec; this->get_service().io_control(this->get_implementation(), command, ec); asio::detail::throw_error(ec, "io_control"); } /// Perform an IO control command on the socket. /** * This function is used to execute an IO control command on the socket. * * @param command The IO control command to be performed on the socket. * * @param ec Set to indicate what error occurred, if any. * * @sa IoControlCommand @n * asio::socket_base::bytes_readable @n * asio::socket_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::socket::bytes_readable command; * asio::error_code ec; * socket.io_control(command, ec); * if (ec) * { * // An error occurred. * } * std::size_t bytes_readable = command.get(); * @endcode */ template ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, asio::error_code& ec) { this->get_service().io_control(this->get_implementation(), command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the socket. /** * @returns @c true if the socket's synchronous operations will fail with * asio::error::would_block if they are unable to perform the requested * operation immediately. If @c false, synchronous operations will block * until complete. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ bool non_blocking() const { return this->get_service().non_blocking(this->get_implementation()); } /// Sets the non-blocking mode of the socket. /** * @param mode If @c true, the socket's synchronous operations will fail with * asio::error::would_block if they are unable to perform the requested * operation immediately. If @c false, synchronous operations will block * until complete. * * @throws asio::system_error Thrown on failure. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ void non_blocking(bool mode) { asio::error_code ec; this->get_service().non_blocking(this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "non_blocking"); } /// Sets the non-blocking mode of the socket. /** * @param mode If @c true, the socket's synchronous operations will fail with * asio::error::would_block if they are unable to perform the requested * operation immediately. If @c false, synchronous operations will block * until complete. * * @param ec Set to indicate what error occurred, if any. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ ASIO_SYNC_OP_VOID non_blocking( bool mode, asio::error_code& ec) { this->get_service().non_blocking(this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native socket implementation. /** * This function is used to retrieve the non-blocking mode of the underlying * native socket. This mode has no effect on the behaviour of the socket * object's synchronous operations. * * @returns @c true if the underlying socket is in non-blocking mode and * direct system calls may fail with asio::error::would_block (or the * equivalent system error). * * @note The current non-blocking mode is cached by the socket object. * Consequently, the return value may be incorrect if the non-blocking mode * was set directly on the native socket. * * @par Example * This function is intended to allow the encapsulation of arbitrary * non-blocking system calls as asynchronous operations, in a way that is * transparent to the user of the socket object. The following example * illustrates how Linux's @c sendfile system call might be encapsulated: * @code template * struct sendfile_op * { * tcp::socket& sock_; * int fd_; * Handler handler_; * off_t offset_; * std::size_t total_bytes_transferred_; * * // Function call operator meeting WriteHandler requirements. * // Used as the handler for the async_write_some operation. * void operator()(asio::error_code ec, std::size_t) * { * // Put the underlying socket into non-blocking mode. * if (!ec) * if (!sock_.native_non_blocking()) * sock_.native_non_blocking(true, ec); * * if (!ec) * { * for (;;) * { * // Try the system call. * errno = 0; * int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536); * ec = asio::error_code(n < 0 ? errno : 0, * asio::error::get_system_category()); * total_bytes_transferred_ += ec ? 0 : n; * * // Retry operation immediately if interrupted by signal. * if (ec == asio::error::interrupted) * continue; * * // Check if we need to run the operation again. * if (ec == asio::error::would_block * || ec == asio::error::try_again) * { * // We have to wait for the socket to become ready again. * sock_.async_wait(tcp::socket::wait_write, *this); * return; * } * * if (ec || n == 0) * { * // An error occurred, or we have reached the end of the file. * // Either way we must exit the loop so we can call the handler. * break; * } * * // Loop around to try calling sendfile again. * } * } * * // Pass result back to user's handler. * handler_(ec, total_bytes_transferred_); * } * }; * * template * void async_sendfile(tcp::socket& sock, int fd, Handler h) * { * sendfile_op op = { sock, fd, h, 0, 0 }; * sock.async_wait(tcp::socket::wait_write, op); * } @endcode */ bool native_non_blocking() const { return this->get_service().native_non_blocking(this->get_implementation()); } /// Sets the non-blocking mode of the native socket implementation. /** * This function is used to modify the non-blocking mode of the underlying * native socket. It has no effect on the behaviour of the socket object's * synchronous operations. * * @param mode If @c true, the underlying socket is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @throws asio::system_error Thrown on failure. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. * * @par Example * This function is intended to allow the encapsulation of arbitrary * non-blocking system calls as asynchronous operations, in a way that is * transparent to the user of the socket object. The following example * illustrates how Linux's @c sendfile system call might be encapsulated: * @code template * struct sendfile_op * { * tcp::socket& sock_; * int fd_; * Handler handler_; * off_t offset_; * std::size_t total_bytes_transferred_; * * // Function call operator meeting WriteHandler requirements. * // Used as the handler for the async_write_some operation. * void operator()(asio::error_code ec, std::size_t) * { * // Put the underlying socket into non-blocking mode. * if (!ec) * if (!sock_.native_non_blocking()) * sock_.native_non_blocking(true, ec); * * if (!ec) * { * for (;;) * { * // Try the system call. * errno = 0; * int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536); * ec = asio::error_code(n < 0 ? errno : 0, * asio::error::get_system_category()); * total_bytes_transferred_ += ec ? 0 : n; * * // Retry operation immediately if interrupted by signal. * if (ec == asio::error::interrupted) * continue; * * // Check if we need to run the operation again. * if (ec == asio::error::would_block * || ec == asio::error::try_again) * { * // We have to wait for the socket to become ready again. * sock_.async_wait(tcp::socket::wait_write, *this); * return; * } * * if (ec || n == 0) * { * // An error occurred, or we have reached the end of the file. * // Either way we must exit the loop so we can call the handler. * break; * } * * // Loop around to try calling sendfile again. * } * } * * // Pass result back to user's handler. * handler_(ec, total_bytes_transferred_); * } * }; * * template * void async_sendfile(tcp::socket& sock, int fd, Handler h) * { * sendfile_op op = { sock, fd, h, 0, 0 }; * sock.async_wait(tcp::socket::wait_write, op); * } @endcode */ void native_non_blocking(bool mode) { asio::error_code ec; this->get_service().native_non_blocking( this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "native_non_blocking"); } /// Sets the non-blocking mode of the native socket implementation. /** * This function is used to modify the non-blocking mode of the underlying * native socket. It has no effect on the behaviour of the socket object's * synchronous operations. * * @param mode If @c true, the underlying socket is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @param ec Set to indicate what error occurred, if any. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. * * @par Example * This function is intended to allow the encapsulation of arbitrary * non-blocking system calls as asynchronous operations, in a way that is * transparent to the user of the socket object. The following example * illustrates how Linux's @c sendfile system call might be encapsulated: * @code template * struct sendfile_op * { * tcp::socket& sock_; * int fd_; * Handler handler_; * off_t offset_; * std::size_t total_bytes_transferred_; * * // Function call operator meeting WriteHandler requirements. * // Used as the handler for the async_write_some operation. * void operator()(asio::error_code ec, std::size_t) * { * // Put the underlying socket into non-blocking mode. * if (!ec) * if (!sock_.native_non_blocking()) * sock_.native_non_blocking(true, ec); * * if (!ec) * { * for (;;) * { * // Try the system call. * errno = 0; * int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536); * ec = asio::error_code(n < 0 ? errno : 0, * asio::error::get_system_category()); * total_bytes_transferred_ += ec ? 0 : n; * * // Retry operation immediately if interrupted by signal. * if (ec == asio::error::interrupted) * continue; * * // Check if we need to run the operation again. * if (ec == asio::error::would_block * || ec == asio::error::try_again) * { * // We have to wait for the socket to become ready again. * sock_.async_wait(tcp::socket::wait_write, *this); * return; * } * * if (ec || n == 0) * { * // An error occurred, or we have reached the end of the file. * // Either way we must exit the loop so we can call the handler. * break; * } * * // Loop around to try calling sendfile again. * } * } * * // Pass result back to user's handler. * handler_(ec, total_bytes_transferred_); * } * }; * * template * void async_sendfile(tcp::socket& sock, int fd, Handler h) * { * sendfile_op op = { sock, fd, h, 0, 0 }; * sock.async_wait(tcp::socket::wait_write, op); * } @endcode */ ASIO_SYNC_OP_VOID native_non_blocking( bool mode, asio::error_code& ec) { this->get_service().native_non_blocking( this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint of the socket. /** * This function is used to obtain the locally bound endpoint of the socket. * * @returns An object that represents the local endpoint of the socket. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::endpoint endpoint = socket.local_endpoint(); * @endcode */ endpoint_type local_endpoint() const { asio::error_code ec; endpoint_type ep = this->get_service().local_endpoint( this->get_implementation(), ec); asio::detail::throw_error(ec, "local_endpoint"); return ep; } /// Get the local endpoint of the socket. /** * This function is used to obtain the locally bound endpoint of the socket. * * @param ec Set to indicate what error occurred, if any. * * @returns An object that represents the local endpoint of the socket. * Returns a default-constructed endpoint object if an error occurred. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::error_code ec; * asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec); * if (ec) * { * // An error occurred. * } * @endcode */ endpoint_type local_endpoint(asio::error_code& ec) const { return this->get_service().local_endpoint(this->get_implementation(), ec); } /// Get the remote endpoint of the socket. /** * This function is used to obtain the remote endpoint of the socket. * * @returns An object that represents the remote endpoint of the socket. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(); * @endcode */ endpoint_type remote_endpoint() const { asio::error_code ec; endpoint_type ep = this->get_service().remote_endpoint( this->get_implementation(), ec); asio::detail::throw_error(ec, "remote_endpoint"); return ep; } /// Get the remote endpoint of the socket. /** * This function is used to obtain the remote endpoint of the socket. * * @param ec Set to indicate what error occurred, if any. * * @returns An object that represents the remote endpoint of the socket. * Returns a default-constructed endpoint object if an error occurred. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::error_code ec; * asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec); * if (ec) * { * // An error occurred. * } * @endcode */ endpoint_type remote_endpoint(asio::error_code& ec) const { return this->get_service().remote_endpoint(this->get_implementation(), ec); } /// Disable sends or receives on the socket. /** * This function is used to disable send operations, receive operations, or * both. * * @param what Determines what types of operation will no longer be allowed. * * @throws asio::system_error Thrown on failure. * * @par Example * Shutting down the send side of the socket: * @code * asio::ip::tcp::socket socket(io_context); * ... * socket.shutdown(asio::ip::tcp::socket::shutdown_send); * @endcode */ void shutdown(shutdown_type what) { asio::error_code ec; this->get_service().shutdown(this->get_implementation(), what, ec); asio::detail::throw_error(ec, "shutdown"); } /// Disable sends or receives on the socket. /** * This function is used to disable send operations, receive operations, or * both. * * @param what Determines what types of operation will no longer be allowed. * * @param ec Set to indicate what error occurred, if any. * * @par Example * Shutting down the send side of the socket: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::error_code ec; * socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID shutdown(shutdown_type what, asio::error_code& ec) { this->get_service().shutdown(this->get_implementation(), what, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the socket to become ready to read, ready to write, or to have /// pending error conditions. /** * This function is used to perform a blocking wait for a socket to enter * a ready to read, write or error condition state. * * @param w Specifies the desired socket state. * * @par Example * Waiting for a socket to become readable. * @code * asio::ip::tcp::socket socket(io_context); * ... * socket.wait(asio::ip::tcp::socket::wait_read); * @endcode */ void wait(wait_type w) { asio::error_code ec; this->get_service().wait(this->get_implementation(), w, ec); asio::detail::throw_error(ec, "wait"); } /// Wait for the socket to become ready to read, ready to write, or to have /// pending error conditions. /** * This function is used to perform a blocking wait for a socket to enter * a ready to read, write or error condition state. * * @param w Specifies the desired socket state. * * @param ec Set to indicate what error occurred, if any. * * @par Example * Waiting for a socket to become readable. * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::error_code ec; * socket.wait(asio::ip::tcp::socket::wait_read, ec); * @endcode */ ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) { this->get_service().wait(this->get_implementation(), w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the socket to become ready to read, ready to /// write, or to have pending error conditions. /** * This function is used to perform an asynchronous wait for a socket to enter * a ready to read, write or error condition state. * * @param w Specifies the desired socket state. * * @param handler The handler to be called when the wait operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error // Result of operation * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void wait_handler(const asio::error_code& error) * { * if (!error) * { * // Wait succeeded. * } * } * * ... * * asio::ip::tcp::socket socket(io_context); * ... * socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WaitHandler. ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_wait(this->get_implementation(), w, ASIO_MOVE_CAST(WaitHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_wait(this->get_implementation(), w, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } protected: /// Protected destructor to prevent deletion through this type. /** * This function destroys the socket, cancelling any outstanding asynchronous * operations associated with the socket as if by calling @c cancel. */ ~basic_socket() { } private: // Disallow copying and assignment. basic_socket(const basic_socket&) ASIO_DELETED; basic_socket& operator=(const basic_socket&) ASIO_DELETED; }; } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_BASIC_SOCKET_HPP asio-1.12.2/include/asio/basic_socket_acceptor.hpp000066400000000000000000002042551340672067200221470ustar00rootroot00000000000000// // basic_socket_acceptor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SOCKET_ACCEPTOR_HPP #define ASIO_BASIC_SOCKET_ACCEPTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/basic_io_object.hpp" #include "asio/basic_socket.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/socket_base.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/socket_acceptor_service.hpp" #else // defined(ASIO_ENABLE_OLD_SERVICES) # if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/null_socket_service.hpp" # define ASIO_SVC_T detail::null_socket_service # elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" # define ASIO_SVC_T detail::win_iocp_socket_service # else # include "asio/detail/reactive_socket_service.hpp" # define ASIO_SVC_T detail::reactive_socket_service # endif #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides the ability to accept new connections. /** * The basic_socket_acceptor class template is used for accepting new socket * connections. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Example * Opening a socket acceptor with the SO_REUSEADDR option enabled: * @code * asio::ip::tcp::acceptor acceptor(io_context); * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port); * acceptor.open(endpoint.protocol()); * acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true)); * acceptor.bind(endpoint); * acceptor.listen(); * @endcode */ template )> class basic_socket_acceptor : ASIO_SVC_ACCESS basic_io_object, public socket_base { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The native representation of an acceptor. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename ASIO_SVC_T::native_handle_type native_handle_type; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// Construct an acceptor without opening it. /** * This constructor creates an acceptor without opening it to listen for new * connections. The open() function must be called before the acceptor can * accept new socket connections. * * @param io_context The io_context object that the acceptor will use to * dispatch handlers for any asynchronous operations performed on the * acceptor. */ explicit basic_socket_acceptor(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct an open acceptor. /** * This constructor creates an acceptor and automatically opens it. * * @param io_context The io_context object that the acceptor will use to * dispatch handlers for any asynchronous operations performed on the * acceptor. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. */ basic_socket_acceptor(asio::io_context& io_context, const protocol_type& protocol) : basic_io_object(io_context) { asio::error_code ec; this->get_service().open(this->get_implementation(), protocol, ec); asio::detail::throw_error(ec, "open"); } /// Construct an acceptor opened on the given endpoint. /** * This constructor creates an acceptor and automatically opens it to listen * for new connections on the specified endpoint. * * @param io_context The io_context object that the acceptor will use to * dispatch handlers for any asynchronous operations performed on the * acceptor. * * @param endpoint An endpoint on the local machine on which the acceptor * will listen for new connections. * * @param reuse_addr Whether the constructor should set the socket option * socket_base::reuse_address. * * @throws asio::system_error Thrown on failure. * * @note This constructor is equivalent to the following code: * @code * basic_socket_acceptor acceptor(io_context); * acceptor.open(endpoint.protocol()); * if (reuse_addr) * acceptor.set_option(socket_base::reuse_address(true)); * acceptor.bind(endpoint); * acceptor.listen(listen_backlog); * @endcode */ basic_socket_acceptor(asio::io_context& io_context, const endpoint_type& endpoint, bool reuse_addr = true) : basic_io_object(io_context) { asio::error_code ec; const protocol_type protocol = endpoint.protocol(); this->get_service().open(this->get_implementation(), protocol, ec); asio::detail::throw_error(ec, "open"); if (reuse_addr) { this->get_service().set_option(this->get_implementation(), socket_base::reuse_address(true), ec); asio::detail::throw_error(ec, "set_option"); } this->get_service().bind(this->get_implementation(), endpoint, ec); asio::detail::throw_error(ec, "bind"); this->get_service().listen(this->get_implementation(), socket_base::max_listen_connections, ec); asio::detail::throw_error(ec, "listen"); } /// Construct a basic_socket_acceptor on an existing native acceptor. /** * This constructor creates an acceptor object to hold an existing native * acceptor. * * @param io_context The io_context object that the acceptor will use to * dispatch handlers for any asynchronous operations performed on the * acceptor. * * @param protocol An object specifying protocol parameters to be used. * * @param native_acceptor A native acceptor. * * @throws asio::system_error Thrown on failure. */ basic_socket_acceptor(asio::io_context& io_context, const protocol_type& protocol, const native_handle_type& native_acceptor) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), protocol, native_acceptor, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_socket_acceptor from another. /** * This constructor moves an acceptor from one object to another. * * @param other The other basic_socket_acceptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket_acceptor(io_context&) constructor. */ basic_socket_acceptor(basic_socket_acceptor&& other) : basic_io_object(std::move(other)) { } /// Move-assign a basic_socket_acceptor from another. /** * This assignment operator moves an acceptor from one object to another. * * @param other The other basic_socket_acceptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket_acceptor(io_context&) constructor. */ basic_socket_acceptor& operator=(basic_socket_acceptor&& other) { basic_io_object::operator=(std::move(other)); return *this; } // All socket acceptors have access to each other's implementations. template friend class basic_socket_acceptor; /// Move-construct a basic_socket_acceptor from an acceptor of another /// protocol type. /** * This constructor moves an acceptor from one object to another. * * @param other The other basic_socket_acceptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket(io_context&) constructor. */ template basic_socket_acceptor( basic_socket_acceptor&& other, typename enable_if::value>::type* = 0) : basic_io_object( other.get_service(), other.get_implementation()) { } /// Move-assign a basic_socket_acceptor from an acceptor of another protocol /// type. /** * This assignment operator moves an acceptor from one object to another. * * @param other The other basic_socket_acceptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_socket(io_context&) constructor. */ template typename enable_if::value, basic_socket_acceptor>::type& operator=( basic_socket_acceptor&& other) { basic_socket_acceptor tmp(std::move(other)); basic_io_object::operator=(std::move(tmp)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the acceptor. /** * This function destroys the acceptor, cancelling any outstanding * asynchronous operations associated with the acceptor as if by calling * @c cancel. */ ~basic_socket_acceptor() { } #if defined(ASIO_ENABLE_OLD_SERVICES) // These functions are provided by basic_io_object<>. #else // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } #endif // defined(ASIO_ENABLE_OLD_SERVICES) /// Open the acceptor using the specified protocol. /** * This function opens the socket acceptor so that it will use the specified * protocol. * * @param protocol An object specifying which protocol is to be used. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * acceptor.open(asio::ip::tcp::v4()); * @endcode */ void open(const protocol_type& protocol = protocol_type()) { asio::error_code ec; this->get_service().open(this->get_implementation(), protocol, ec); asio::detail::throw_error(ec, "open"); } /// Open the acceptor using the specified protocol. /** * This function opens the socket acceptor so that it will use the specified * protocol. * * @param protocol An object specifying which protocol is to be used. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * asio::error_code ec; * acceptor.open(asio::ip::tcp::v4(), ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID open(const protocol_type& protocol, asio::error_code& ec) { this->get_service().open(this->get_implementation(), protocol, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assigns an existing native acceptor to the acceptor. /* * This function opens the acceptor to hold an existing native acceptor. * * @param protocol An object specifying which protocol is to be used. * * @param native_acceptor A native acceptor. * * @throws asio::system_error Thrown on failure. */ void assign(const protocol_type& protocol, const native_handle_type& native_acceptor) { asio::error_code ec; this->get_service().assign(this->get_implementation(), protocol, native_acceptor, ec); asio::detail::throw_error(ec, "assign"); } /// Assigns an existing native acceptor to the acceptor. /* * This function opens the acceptor to hold an existing native acceptor. * * @param protocol An object specifying which protocol is to be used. * * @param native_acceptor A native acceptor. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const protocol_type& protocol, const native_handle_type& native_acceptor, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), protocol, native_acceptor, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the acceptor is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Bind the acceptor to the given local endpoint. /** * This function binds the socket acceptor to the specified endpoint on the * local machine. * * @param endpoint An endpoint on the local machine to which the socket * acceptor will be bound. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345); * acceptor.open(endpoint.protocol()); * acceptor.bind(endpoint); * @endcode */ void bind(const endpoint_type& endpoint) { asio::error_code ec; this->get_service().bind(this->get_implementation(), endpoint, ec); asio::detail::throw_error(ec, "bind"); } /// Bind the acceptor to the given local endpoint. /** * This function binds the socket acceptor to the specified endpoint on the * local machine. * * @param endpoint An endpoint on the local machine to which the socket * acceptor will be bound. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345); * acceptor.open(endpoint.protocol()); * asio::error_code ec; * acceptor.bind(endpoint, ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID bind(const endpoint_type& endpoint, asio::error_code& ec) { this->get_service().bind(this->get_implementation(), endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Place the acceptor into the state where it will listen for new /// connections. /** * This function puts the socket acceptor into the state where it may accept * new connections. * * @param backlog The maximum length of the queue of pending connections. * * @throws asio::system_error Thrown on failure. */ void listen(int backlog = socket_base::max_listen_connections) { asio::error_code ec; this->get_service().listen(this->get_implementation(), backlog, ec); asio::detail::throw_error(ec, "listen"); } /// Place the acceptor into the state where it will listen for new /// connections. /** * This function puts the socket acceptor into the state where it may accept * new connections. * * @param backlog The maximum length of the queue of pending connections. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::error_code ec; * acceptor.listen(asio::socket_base::max_listen_connections, ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID listen(int backlog, asio::error_code& ec) { this->get_service().listen(this->get_implementation(), backlog, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Close the acceptor. /** * This function is used to close the acceptor. Any asynchronous accept * operations will be cancelled immediately. * * A subsequent call to open() is required before the acceptor can again be * used to again perform socket accept operations. * * @throws asio::system_error Thrown on failure. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the acceptor. /** * This function is used to close the acceptor. Any asynchronous accept * operations will be cancelled immediately. * * A subsequent call to open() is required before the acceptor can again be * used to again perform socket accept operations. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::error_code ec; * acceptor.close(ec); * if (ec) * { * // An error occurred. * } * @endcode */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying native acceptor. /** * This function causes all outstanding asynchronous accept operations to * finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. Ownership of the * native acceptor is then transferred to the caller. * * @throws asio::system_error Thrown on failure. * * @note This function is unsupported on Windows versions prior to Windows * 8.1, and will fail with asio::error::operation_not_supported on * these platforms. */ #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) __declspec(deprecated("This function always fails with " "operation_not_supported when used on Windows versions " "prior to Windows 8.1.")) #endif native_handle_type release() { asio::error_code ec; native_handle_type s = this->get_service().release( this->get_implementation(), ec); asio::detail::throw_error(ec, "release"); return s; } /// Release ownership of the underlying native acceptor. /** * This function causes all outstanding asynchronous accept operations to * finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. Ownership of the * native acceptor is then transferred to the caller. * * @param ec Set to indicate what error occurred, if any. * * @note This function is unsupported on Windows versions prior to Windows * 8.1, and will fail with asio::error::operation_not_supported on * these platforms. */ #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) __declspec(deprecated("This function always fails with " "operation_not_supported when used on Windows versions " "prior to Windows 8.1.")) #endif native_handle_type release(asio::error_code& ec) { return this->get_service().release(this->get_implementation(), ec); } /// Get the native acceptor representation. /** * This function may be used to obtain the underlying representation of the * acceptor. This is intended to allow access to native acceptor functionality * that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the acceptor. /** * This function causes all outstanding asynchronous connect, send and receive * operations to finish immediately, and the handlers for cancelled operations * will be passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the acceptor. /** * This function causes all outstanding asynchronous connect, send and receive * operations to finish immediately, and the handlers for cancelled operations * will be passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Set an option on the acceptor. /** * This function is used to set an option on the acceptor. * * @param option The new option value to be set on the acceptor. * * @throws asio::system_error Thrown on failure. * * @sa SettableSocketOption @n * asio::socket_base::reuse_address * asio::socket_base::enable_connection_aborted * * @par Example * Setting the SOL_SOCKET/SO_REUSEADDR option: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::acceptor::reuse_address option(true); * acceptor.set_option(option); * @endcode */ template void set_option(const SettableSocketOption& option) { asio::error_code ec; this->get_service().set_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "set_option"); } /// Set an option on the acceptor. /** * This function is used to set an option on the acceptor. * * @param option The new option value to be set on the acceptor. * * @param ec Set to indicate what error occurred, if any. * * @sa SettableSocketOption @n * asio::socket_base::reuse_address * asio::socket_base::enable_connection_aborted * * @par Example * Setting the SOL_SOCKET/SO_REUSEADDR option: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::acceptor::reuse_address option(true); * asio::error_code ec; * acceptor.set_option(option, ec); * if (ec) * { * // An error occurred. * } * @endcode */ template ASIO_SYNC_OP_VOID set_option(const SettableSocketOption& option, asio::error_code& ec) { this->get_service().set_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get an option from the acceptor. /** * This function is used to get the current value of an option on the * acceptor. * * @param option The option value to be obtained from the acceptor. * * @throws asio::system_error Thrown on failure. * * @sa GettableSocketOption @n * asio::socket_base::reuse_address * * @par Example * Getting the value of the SOL_SOCKET/SO_REUSEADDR option: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::acceptor::reuse_address option; * acceptor.get_option(option); * bool is_set = option.get(); * @endcode */ template void get_option(GettableSocketOption& option) const { asio::error_code ec; this->get_service().get_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "get_option"); } /// Get an option from the acceptor. /** * This function is used to get the current value of an option on the * acceptor. * * @param option The option value to be obtained from the acceptor. * * @param ec Set to indicate what error occurred, if any. * * @sa GettableSocketOption @n * asio::socket_base::reuse_address * * @par Example * Getting the value of the SOL_SOCKET/SO_REUSEADDR option: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::acceptor::reuse_address option; * asio::error_code ec; * acceptor.get_option(option, ec); * if (ec) * { * // An error occurred. * } * bool is_set = option.get(); * @endcode */ template ASIO_SYNC_OP_VOID get_option(GettableSocketOption& option, asio::error_code& ec) const { this->get_service().get_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the acceptor. /** * This function is used to execute an IO control command on the acceptor. * * @param command The IO control command to be performed on the acceptor. * * @throws asio::system_error Thrown on failure. * * @sa IoControlCommand @n * asio::socket_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::acceptor::non_blocking_io command(true); * socket.io_control(command); * @endcode */ template void io_control(IoControlCommand& command) { asio::error_code ec; this->get_service().io_control(this->get_implementation(), command, ec); asio::detail::throw_error(ec, "io_control"); } /// Perform an IO control command on the acceptor. /** * This function is used to execute an IO control command on the acceptor. * * @param command The IO control command to be performed on the acceptor. * * @param ec Set to indicate what error occurred, if any. * * @sa IoControlCommand @n * asio::socket_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::acceptor::non_blocking_io command(true); * asio::error_code ec; * socket.io_control(command, ec); * if (ec) * { * // An error occurred. * } * @endcode */ template ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, asio::error_code& ec) { this->get_service().io_control(this->get_implementation(), command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the acceptor. /** * @returns @c true if the acceptor's synchronous operations will fail with * asio::error::would_block if they are unable to perform the requested * operation immediately. If @c false, synchronous operations will block * until complete. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ bool non_blocking() const { return this->get_service().non_blocking(this->get_implementation()); } /// Sets the non-blocking mode of the acceptor. /** * @param mode If @c true, the acceptor's synchronous operations will fail * with asio::error::would_block if they are unable to perform the * requested operation immediately. If @c false, synchronous operations will * block until complete. * * @throws asio::system_error Thrown on failure. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ void non_blocking(bool mode) { asio::error_code ec; this->get_service().non_blocking(this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "non_blocking"); } /// Sets the non-blocking mode of the acceptor. /** * @param mode If @c true, the acceptor's synchronous operations will fail * with asio::error::would_block if they are unable to perform the * requested operation immediately. If @c false, synchronous operations will * block until complete. * * @param ec Set to indicate what error occurred, if any. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ ASIO_SYNC_OP_VOID non_blocking( bool mode, asio::error_code& ec) { this->get_service().non_blocking(this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native acceptor implementation. /** * This function is used to retrieve the non-blocking mode of the underlying * native acceptor. This mode has no effect on the behaviour of the acceptor * object's synchronous operations. * * @returns @c true if the underlying acceptor is in non-blocking mode and * direct system calls may fail with asio::error::would_block (or the * equivalent system error). * * @note The current non-blocking mode is cached by the acceptor object. * Consequently, the return value may be incorrect if the non-blocking mode * was set directly on the native acceptor. */ bool native_non_blocking() const { return this->get_service().native_non_blocking(this->get_implementation()); } /// Sets the non-blocking mode of the native acceptor implementation. /** * This function is used to modify the non-blocking mode of the underlying * native acceptor. It has no effect on the behaviour of the acceptor object's * synchronous operations. * * @param mode If @c true, the underlying acceptor is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @throws asio::system_error Thrown on failure. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. */ void native_non_blocking(bool mode) { asio::error_code ec; this->get_service().native_non_blocking( this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "native_non_blocking"); } /// Sets the non-blocking mode of the native acceptor implementation. /** * This function is used to modify the non-blocking mode of the underlying * native acceptor. It has no effect on the behaviour of the acceptor object's * synchronous operations. * * @param mode If @c true, the underlying acceptor is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @param ec Set to indicate what error occurred, if any. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. */ ASIO_SYNC_OP_VOID native_non_blocking( bool mode, asio::error_code& ec) { this->get_service().native_non_blocking( this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint of the acceptor. /** * This function is used to obtain the locally bound endpoint of the acceptor. * * @returns An object that represents the local endpoint of the acceptor. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(); * @endcode */ endpoint_type local_endpoint() const { asio::error_code ec; endpoint_type ep = this->get_service().local_endpoint( this->get_implementation(), ec); asio::detail::throw_error(ec, "local_endpoint"); return ep; } /// Get the local endpoint of the acceptor. /** * This function is used to obtain the locally bound endpoint of the acceptor. * * @param ec Set to indicate what error occurred, if any. * * @returns An object that represents the local endpoint of the acceptor. * Returns a default-constructed endpoint object if an error occurred and the * error handler did not throw an exception. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::error_code ec; * asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(ec); * if (ec) * { * // An error occurred. * } * @endcode */ endpoint_type local_endpoint(asio::error_code& ec) const { return this->get_service().local_endpoint(this->get_implementation(), ec); } /// Wait for the acceptor to become ready to read, ready to write, or to have /// pending error conditions. /** * This function is used to perform a blocking wait for an acceptor to enter * a ready to read, write or error condition state. * * @param w Specifies the desired acceptor state. * * @par Example * Waiting for an acceptor to become readable. * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * acceptor.wait(asio::ip::tcp::acceptor::wait_read); * @endcode */ void wait(wait_type w) { asio::error_code ec; this->get_service().wait(this->get_implementation(), w, ec); asio::detail::throw_error(ec, "wait"); } /// Wait for the acceptor to become ready to read, ready to write, or to have /// pending error conditions. /** * This function is used to perform a blocking wait for an acceptor to enter * a ready to read, write or error condition state. * * @param w Specifies the desired acceptor state. * * @param ec Set to indicate what error occurred, if any. * * @par Example * Waiting for an acceptor to become readable. * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::error_code ec; * acceptor.wait(asio::ip::tcp::acceptor::wait_read, ec); * @endcode */ ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) { this->get_service().wait(this->get_implementation(), w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the acceptor to become ready to read, ready to /// write, or to have pending error conditions. /** * This function is used to perform an asynchronous wait for an acceptor to * enter a ready to read, write or error condition state. * * @param w Specifies the desired acceptor state. * * @param handler The handler to be called when the wait operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error // Result of operation * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void wait_handler(const asio::error_code& error) * { * if (!error) * { * // Wait succeeded. * } * } * * ... * * asio::ip::tcp::acceptor acceptor(io_context); * ... * acceptor.async_wait( * asio::ip::tcp::acceptor::wait_read, * wait_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WaitHandler. ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_wait(this->get_implementation(), w, ASIO_MOVE_CAST(WaitHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_wait(this->get_implementation(), w, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } #if !defined(ASIO_NO_EXTENSIONS) /// Accept a new connection. /** * This function is used to accept a new connection from a peer into the * given socket. The function call will block until a new connection has been * accepted successfully or an error occurs. * * @param peer The socket into which the new connection will be accepted. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(io_context); * acceptor.accept(socket); * @endcode */ #if defined(ASIO_ENABLE_OLD_SERVICES) template void accept(basic_socket& peer, typename enable_if::value>::type* = 0) #else // defined(ASIO_ENABLE_OLD_SERVICES) template void accept(basic_socket& peer, typename enable_if::value>::type* = 0) #endif // defined(ASIO_ENABLE_OLD_SERVICES) { asio::error_code ec; this->get_service().accept(this->get_implementation(), peer, static_cast(0), ec); asio::detail::throw_error(ec, "accept"); } /// Accept a new connection. /** * This function is used to accept a new connection from a peer into the * given socket. The function call will block until a new connection has been * accepted successfully or an error occurs. * * @param peer The socket into which the new connection will be accepted. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(io_context); * asio::error_code ec; * acceptor.accept(socket, ec); * if (ec) * { * // An error occurred. * } * @endcode */ #if defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_SYNC_OP_VOID accept( basic_socket& peer, asio::error_code& ec, typename enable_if::value>::type* = 0) #else // defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_SYNC_OP_VOID accept( basic_socket& peer, asio::error_code& ec, typename enable_if::value>::type* = 0) #endif // defined(ASIO_ENABLE_OLD_SERVICES) { this->get_service().accept(this->get_implementation(), peer, static_cast(0), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous accept. /** * This function is used to asynchronously accept a new connection into a * socket. The function call always returns immediately. * * @param peer The socket into which the new connection will be accepted. * Ownership of the peer object is retained by the caller, which must * guarantee that it is valid until the handler is called. * * @param handler The handler to be called when the accept operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void accept_handler(const asio::error_code& error) * { * if (!error) * { * // Accept succeeded. * } * } * * ... * * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(io_context); * acceptor.async_accept(socket, accept_handler); * @endcode */ #if defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_INITFN_RESULT_TYPE(AcceptHandler, void (asio::error_code)) async_accept(basic_socket& peer, ASIO_MOVE_ARG(AcceptHandler) handler, typename enable_if::value>::type* = 0) #else // defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_INITFN_RESULT_TYPE(AcceptHandler, void (asio::error_code)) async_accept(basic_socket& peer, ASIO_MOVE_ARG(AcceptHandler) handler, typename enable_if::value>::type* = 0) #endif // defined(ASIO_ENABLE_OLD_SERVICES) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a AcceptHandler. ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_accept(this->get_implementation(), peer, static_cast(0), ASIO_MOVE_CAST(AcceptHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_accept(this->get_implementation(), peer, static_cast(0), init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Accept a new connection and obtain the endpoint of the peer /** * This function is used to accept a new connection from a peer into the * given socket, and additionally provide the endpoint of the remote peer. * The function call will block until a new connection has been accepted * successfully or an error occurs. * * @param peer The socket into which the new connection will be accepted. * * @param peer_endpoint An endpoint object which will receive the endpoint of * the remote peer. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(io_context); * asio::ip::tcp::endpoint endpoint; * acceptor.accept(socket, endpoint); * @endcode */ #if defined(ASIO_ENABLE_OLD_SERVICES) template void accept(basic_socket& peer, endpoint_type& peer_endpoint) #else // defined(ASIO_ENABLE_OLD_SERVICES) void accept(basic_socket& peer, endpoint_type& peer_endpoint) #endif // defined(ASIO_ENABLE_OLD_SERVICES) { asio::error_code ec; this->get_service().accept(this->get_implementation(), peer, &peer_endpoint, ec); asio::detail::throw_error(ec, "accept"); } /// Accept a new connection and obtain the endpoint of the peer /** * This function is used to accept a new connection from a peer into the * given socket, and additionally provide the endpoint of the remote peer. * The function call will block until a new connection has been accepted * successfully or an error occurs. * * @param peer The socket into which the new connection will be accepted. * * @param peer_endpoint An endpoint object which will receive the endpoint of * the remote peer. * * @param ec Set to indicate what error occurred, if any. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(io_context); * asio::ip::tcp::endpoint endpoint; * asio::error_code ec; * acceptor.accept(socket, endpoint, ec); * if (ec) * { * // An error occurred. * } * @endcode */ #if defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_SYNC_OP_VOID accept( basic_socket& peer, endpoint_type& peer_endpoint, asio::error_code& ec) #else // defined(ASIO_ENABLE_OLD_SERVICES) ASIO_SYNC_OP_VOID accept(basic_socket& peer, endpoint_type& peer_endpoint, asio::error_code& ec) #endif // defined(ASIO_ENABLE_OLD_SERVICES) { this->get_service().accept( this->get_implementation(), peer, &peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous accept. /** * This function is used to asynchronously accept a new connection into a * socket, and additionally obtain the endpoint of the remote peer. The * function call always returns immediately. * * @param peer The socket into which the new connection will be accepted. * Ownership of the peer object is retained by the caller, which must * guarantee that it is valid until the handler is called. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. Ownership of the peer_endpoint object is * retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param handler The handler to be called when the accept operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ #if defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_INITFN_RESULT_TYPE(AcceptHandler, void (asio::error_code)) async_accept(basic_socket& peer, endpoint_type& peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler) #else // defined(ASIO_ENABLE_OLD_SERVICES) template ASIO_INITFN_RESULT_TYPE(AcceptHandler, void (asio::error_code)) async_accept(basic_socket& peer, endpoint_type& peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler) #endif // defined(ASIO_ENABLE_OLD_SERVICES) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a AcceptHandler. ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_accept(this->get_implementation(), peer, &peer_endpoint, ASIO_MOVE_CAST(AcceptHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_accept(this->get_implementation(), peer, &peer_endpoint, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } #endif // !defined(ASIO_NO_EXTENSIONS) #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @returns A socket object representing the newly accepted connection. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(acceptor.accept()); * @endcode */ typename Protocol::socket accept() { asio::error_code ec; typename Protocol::socket peer( this->get_service().accept( this->get_implementation(), 0, 0, ec)); asio::detail::throw_error(ec, "accept"); return peer; } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param ec Set to indicate what error occurred, if any. * * @returns On success, a socket object representing the newly accepted * connection. On error, a socket object where is_open() is false. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(acceptor.accept(ec)); * if (ec) * { * // An error occurred. * } * @endcode */ typename Protocol::socket accept(asio::error_code& ec) { return this->get_service().accept(this->get_implementation(), 0, 0, ec); } /// Start an asynchronous accept. /** * This function is used to asynchronously accept a new connection. The * function call always returns immediately. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param handler The handler to be called when the accept operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * typename Protocol::socket peer // On success, the newly accepted socket. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void accept_handler(const asio::error_code& error, * asio::ip::tcp::socket peer) * { * if (!error) * { * // Accept succeeded. * } * } * * ... * * asio::ip::tcp::acceptor acceptor(io_context); * ... * acceptor.async_accept(accept_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, void (asio::error_code, typename Protocol::socket)) async_accept(ASIO_MOVE_ARG(MoveAcceptHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a MoveAcceptHandler. ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, handler, typename Protocol::socket) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_accept( this->get_implementation(), static_cast(0), static_cast(0), ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_accept( this->get_implementation(), static_cast(0), static_cast(0), init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param io_context The io_context object to be used for the newly accepted * socket. * * @returns A socket object representing the newly accepted connection. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(acceptor.accept()); * @endcode */ typename Protocol::socket accept(asio::io_context& io_context) { asio::error_code ec; typename Protocol::socket peer( this->get_service().accept(this->get_implementation(), &io_context, static_cast(0), ec)); asio::detail::throw_error(ec, "accept"); return peer; } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param io_context The io_context object to be used for the newly accepted * socket. * * @param ec Set to indicate what error occurred, if any. * * @returns On success, a socket object representing the newly accepted * connection. On error, a socket object where is_open() is false. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::socket socket(acceptor.accept(io_context2, ec)); * if (ec) * { * // An error occurred. * } * @endcode */ typename Protocol::socket accept( asio::io_context& io_context, asio::error_code& ec) { return this->get_service().accept(this->get_implementation(), &io_context, static_cast(0), ec); } /// Start an asynchronous accept. /** * This function is used to asynchronously accept a new connection. The * function call always returns immediately. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param io_context The io_context object to be used for the newly accepted * socket. * * @param handler The handler to be called when the accept operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * typename Protocol::socket peer // On success, the newly accepted socket. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void accept_handler(const asio::error_code& error, * asio::ip::tcp::socket peer) * { * if (!error) * { * // Accept succeeded. * } * } * * ... * * asio::ip::tcp::acceptor acceptor(io_context); * ... * acceptor.async_accept(io_context2, accept_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, void (asio::error_code, typename Protocol::socket)) async_accept(asio::io_context& io_context, ASIO_MOVE_ARG(MoveAcceptHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a MoveAcceptHandler. ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, handler, typename Protocol::socket) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_accept(this->get_implementation(), &io_context, static_cast(0), ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_accept(this->get_implementation(), &io_context, static_cast(0), init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. * * @returns A socket object representing the newly accepted connection. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint; * asio::ip::tcp::socket socket(acceptor.accept(endpoint)); * @endcode */ typename Protocol::socket accept(endpoint_type& peer_endpoint) { asio::error_code ec; typename Protocol::socket peer( this->get_service().accept(this->get_implementation(), static_cast(0), &peer_endpoint, ec)); asio::detail::throw_error(ec, "accept"); return peer; } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. * * @param ec Set to indicate what error occurred, if any. * * @returns On success, a socket object representing the newly accepted * connection. On error, a socket object where is_open() is false. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint; * asio::ip::tcp::socket socket(acceptor.accept(endpoint, ec)); * if (ec) * { * // An error occurred. * } * @endcode */ typename Protocol::socket accept( endpoint_type& peer_endpoint, asio::error_code& ec) { return this->get_service().accept(this->get_implementation(), static_cast(0), &peer_endpoint, ec); } /// Start an asynchronous accept. /** * This function is used to asynchronously accept a new connection. The * function call always returns immediately. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. Ownership of the peer_endpoint object is * retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param handler The handler to be called when the accept operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * typename Protocol::socket peer // On success, the newly accepted socket. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void accept_handler(const asio::error_code& error, * asio::ip::tcp::socket peer) * { * if (!error) * { * // Accept succeeded. * } * } * * ... * * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint; * acceptor.async_accept(endpoint, accept_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, void (asio::error_code, typename Protocol::socket)) async_accept(endpoint_type& peer_endpoint, ASIO_MOVE_ARG(MoveAcceptHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a MoveAcceptHandler. ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, handler, typename Protocol::socket) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_accept(this->get_implementation(), static_cast(0), &peer_endpoint, ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_accept(this->get_implementation(), static_cast(0), &peer_endpoint, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param io_context The io_context object to be used for the newly accepted * socket. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. * * @returns A socket object representing the newly accepted connection. * * @throws asio::system_error Thrown on failure. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint; * asio::ip::tcp::socket socket( * acceptor.accept(io_context2, endpoint)); * @endcode */ typename Protocol::socket accept( asio::io_context& io_context, endpoint_type& peer_endpoint) { asio::error_code ec; typename Protocol::socket peer( this->get_service().accept(this->get_implementation(), &io_context, &peer_endpoint, ec)); asio::detail::throw_error(ec, "accept"); return peer; } /// Accept a new connection. /** * This function is used to accept a new connection from a peer. The function * call will block until a new connection has been accepted successfully or * an error occurs. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param io_context The io_context object to be used for the newly accepted * socket. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. * * @param ec Set to indicate what error occurred, if any. * * @returns On success, a socket object representing the newly accepted * connection. On error, a socket object where is_open() is false. * * @par Example * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint; * asio::ip::tcp::socket socket( * acceptor.accept(io_context2, endpoint, ec)); * if (ec) * { * // An error occurred. * } * @endcode */ typename Protocol::socket accept(asio::io_context& io_context, endpoint_type& peer_endpoint, asio::error_code& ec) { return this->get_service().accept(this->get_implementation(), &io_context, &peer_endpoint, ec); } /// Start an asynchronous accept. /** * This function is used to asynchronously accept a new connection. The * function call always returns immediately. * * This overload requires that the Protocol template parameter satisfy the * AcceptableProtocol type requirements. * * @param io_context The io_context object to be used for the newly accepted * socket. * * @param peer_endpoint An endpoint object into which the endpoint of the * remote peer will be written. Ownership of the peer_endpoint object is * retained by the caller, which must guarantee that it is valid until the * handler is called. * * @param handler The handler to be called when the accept operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * typename Protocol::socket peer // On success, the newly accepted socket. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void accept_handler(const asio::error_code& error, * asio::ip::tcp::socket peer) * { * if (!error) * { * // Accept succeeded. * } * } * * ... * * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::ip::tcp::endpoint endpoint; * acceptor.async_accept(io_context2, endpoint, accept_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, void (asio::error_code, typename Protocol::socket)) async_accept(asio::io_context& io_context, endpoint_type& peer_endpoint, ASIO_MOVE_ARG(MoveAcceptHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a MoveAcceptHandler. ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, handler, typename Protocol::socket) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_accept( this->get_implementation(), &io_context, &peer_endpoint, ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_accept(this->get_implementation(), &io_context, &peer_endpoint, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) }; } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_BASIC_SOCKET_ACCEPTOR_HPP asio-1.12.2/include/asio/basic_socket_iostream.hpp000066400000000000000000000327511340672067200221720ustar00rootroot00000000000000// // basic_socket_iostream.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SOCKET_IOSTREAM_HPP #define ASIO_BASIC_SOCKET_IOSTREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_NO_IOSTREAM) #include #include #include "asio/basic_socket_streambuf.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/stream_socket_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_HAS_VARIADIC_TEMPLATES) # include "asio/detail/variadic_templates.hpp" // A macro that should expand to: // template // explicit basic_socket_iostream(T1 x1, ..., Tn xn) // : std::basic_iostream( // &this->detail::socket_iostream_base< // Protocol ASIO_SVC_TARG, Clock, // WaitTraits ASIO_SVC_TARG1>::streambuf_) // { // if (rdbuf()->connect(x1, ..., xn) == 0) // this->setstate(std::ios_base::failbit); // } // This macro should only persist within this file. # define ASIO_PRIVATE_CTR_DEF(n) \ template \ explicit basic_socket_iostream(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ : std::basic_iostream( \ &this->detail::socket_iostream_base< \ Protocol ASIO_SVC_TARG, Clock, \ WaitTraits ASIO_SVC_TARG1>::streambuf_) \ { \ this->setf(std::ios_base::unitbuf); \ if (rdbuf()->connect(ASIO_VARIADIC_BYVAL_ARGS(n)) == 0) \ this->setstate(std::ios_base::failbit); \ } \ /**/ // A macro that should expand to: // template // void connect(T1 x1, ..., Tn xn) // { // if (rdbuf()->connect(x1, ..., xn) == 0) // this->setstate(std::ios_base::failbit); // } // This macro should only persist within this file. # define ASIO_PRIVATE_CONNECT_DEF(n) \ template \ void connect(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ { \ if (rdbuf()->connect(ASIO_VARIADIC_BYVAL_ARGS(n)) == 0) \ this->setstate(std::ios_base::failbit); \ } \ /**/ #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // A separate base class is used to ensure that the streambuf is initialised // prior to the basic_socket_iostream's basic_iostream base class. template class socket_iostream_base { protected: socket_iostream_base() { } #if defined(ASIO_HAS_MOVE) socket_iostream_base(socket_iostream_base&& other) : streambuf_(std::move(other.streambuf_)) { } socket_iostream_base(basic_stream_socket s) : streambuf_(std::move(s)) { } socket_iostream_base& operator=(socket_iostream_base&& other) { streambuf_ = std::move(other.streambuf_); return *this; } #endif // defined(ASIO_HAS_MOVE) basic_socket_streambuf streambuf_; }; } // namespace detail #if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) #define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL // Forward declaration with defaulted arguments. template ), #if defined(ASIO_HAS_BOOST_DATE_TIME) \ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typename Clock = boost::posix_time::ptime, typename WaitTraits = time_traits ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> #else // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typename Clock = chrono::steady_clock, typename WaitTraits = wait_traits ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) class basic_socket_iostream; #endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) /// Iostream interface for a socket. #if defined(GENERATING_DOCUMENTATION) template > #else // defined(GENERATING_DOCUMENTATION) template #endif // defined(GENERATING_DOCUMENTATION) class basic_socket_iostream : private detail::socket_iostream_base, public std::basic_iostream { private: // These typedefs are intended keep this class's implementation independent // of whether it's using Boost.DateClock, Boost.Chrono or std::chrono. #if defined(ASIO_HAS_BOOST_DATE_TIME) \ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typedef WaitTraits traits_helper; #else // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typedef detail::chrono_time_traits traits_helper; #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) public: /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// The clock type. typedef Clock clock_type; #if defined(GENERATING_DOCUMENTATION) /// (Deprecated: Use time_point.) The time type. typedef typename WaitTraits::time_type time_type; /// The time type. typedef typename WaitTraits::time_point time_point; /// (Deprecated: Use duration.) The duration type. typedef typename WaitTraits::duration_type duration_type; /// The duration type. typedef typename WaitTraits::duration duration; #else # if !defined(ASIO_NO_DEPRECATED) typedef typename traits_helper::time_type time_type; typedef typename traits_helper::duration_type duration_type; # endif // !defined(ASIO_NO_DEPRECATED) typedef typename traits_helper::time_type time_point; typedef typename traits_helper::duration_type duration; #endif /// Construct a basic_socket_iostream without establishing a connection. basic_socket_iostream() : std::basic_iostream( &this->detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>::streambuf_) { this->setf(std::ios_base::unitbuf); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Construct a basic_socket_iostream from the supplied socket. explicit basic_socket_iostream(basic_stream_socket s) : detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>(std::move(s)), std::basic_iostream( &this->detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>::streambuf_) { this->setf(std::ios_base::unitbuf); } #if defined(ASIO_HAS_STD_IOSTREAM_MOVE) \ || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_socket_iostream from another. basic_socket_iostream(basic_socket_iostream&& other) : detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>(std::move(other)), std::basic_iostream(std::move(other)) { this->set_rdbuf(&this->detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>::streambuf_); } /// Move-assign a basic_socket_iostream from another. basic_socket_iostream& operator=(basic_socket_iostream&& other) { std::basic_iostream::operator=(std::move(other)); detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_STD_IOSTREAM_MOVE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) #if defined(GENERATING_DOCUMENTATION) /// Establish a connection to an endpoint corresponding to a resolver query. /** * This constructor automatically establishes a connection based on the * supplied resolver query parameters. The arguments are used to construct * a resolver query object. */ template explicit basic_socket_iostream(T1 t1, ..., TN tn); #elif defined(ASIO_HAS_VARIADIC_TEMPLATES) template explicit basic_socket_iostream(T... x) : std::basic_iostream( &this->detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>::streambuf_) { this->setf(std::ios_base::unitbuf); if (rdbuf()->connect(x...) == 0) this->setstate(std::ios_base::failbit); } #else ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CTR_DEF) #endif #if defined(GENERATING_DOCUMENTATION) /// Establish a connection to an endpoint corresponding to a resolver query. /** * This function automatically establishes a connection based on the supplied * resolver query parameters. The arguments are used to construct a resolver * query object. */ template void connect(T1 t1, ..., TN tn); #elif defined(ASIO_HAS_VARIADIC_TEMPLATES) template void connect(T... x) { if (rdbuf()->connect(x...) == 0) this->setstate(std::ios_base::failbit); } #else ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CONNECT_DEF) #endif /// Close the connection. void close() { if (rdbuf()->close() == 0) this->setstate(std::ios_base::failbit); } /// Return a pointer to the underlying streambuf. basic_socket_streambuf* rdbuf() const { return const_cast*>( &this->detail::socket_iostream_base< Protocol ASIO_SVC_TARG, Clock, WaitTraits ASIO_SVC_TARG1>::streambuf_); } /// Get a reference to the underlying socket. basic_socket& socket() { return rdbuf()->socket(); } /// Get the last error associated with the stream. /** * @return An \c error_code corresponding to the last error from the stream. * * @par Example * To print the error associated with a failure to establish a connection: * @code tcp::iostream s("www.boost.org", "http"); * if (!s) * { * std::cout << "Error: " << s.error().message() << std::endl; * } @endcode */ const asio::error_code& error() const { return rdbuf()->error(); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use expiry().) Get the stream's expiry time as an absolute /// time. /** * @return An absolute time value representing the stream's expiry time. */ time_point expires_at() const { return rdbuf()->expires_at(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the stream's expiry time as an absolute time. /** * @return An absolute time value representing the stream's expiry time. */ time_point expiry() const { return rdbuf()->expiry(); } /// Set the stream's expiry time as an absolute time. /** * This function sets the expiry time associated with the stream. Stream * operations performed after this time (where the operations cannot be * completed using the internal buffers) will fail with the error * asio::error::operation_aborted. * * @param expiry_time The expiry time to be used for the stream. */ void expires_at(const time_point& expiry_time) { rdbuf()->expires_at(expiry_time); } /// Set the stream's expiry time relative to now. /** * This function sets the expiry time associated with the stream. Stream * operations performed after this time (where the operations cannot be * completed using the internal buffers) will fail with the error * asio::error::operation_aborted. * * @param expiry_time The expiry time to be used for the timer. */ void expires_after(const duration& expiry_time) { rdbuf()->expires_after(expiry_time); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use expiry().) Get the stream's expiry time relative to now. /** * @return A relative time value representing the stream's expiry time. */ duration expires_from_now() const { return rdbuf()->expires_from_now(); } /// (Deprecated: Use expires_after().) Set the stream's expiry time relative /// to now. /** * This function sets the expiry time associated with the stream. Stream * operations performed after this time (where the operations cannot be * completed using the internal buffers) will fail with the error * asio::error::operation_aborted. * * @param expiry_time The expiry time to be used for the timer. */ void expires_from_now(const duration& expiry_time) { rdbuf()->expires_from_now(expiry_time); } #endif // !defined(ASIO_NO_DEPRECATED) private: // Disallow copying and assignment. basic_socket_iostream(const basic_socket_iostream&) ASIO_DELETED; basic_socket_iostream& operator=( const basic_socket_iostream&) ASIO_DELETED; }; } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_HAS_VARIADIC_TEMPLATES) # undef ASIO_PRIVATE_CTR_DEF # undef ASIO_PRIVATE_CONNECT_DEF #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_BASIC_SOCKET_IOSTREAM_HPP asio-1.12.2/include/asio/basic_socket_streambuf.hpp000066400000000000000000000526011340672067200223330ustar00rootroot00000000000000// // basic_socket_streambuf.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_SOCKET_STREAMBUF_HPP #define ASIO_BASIC_SOCKET_STREAMBUF_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_NO_IOSTREAM) #include #include #include "asio/basic_socket.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/throw_error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/stream_socket_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_BOOST_DATE_TIME) \ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) # if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/deadline_timer_service.hpp" # else // defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/detail/deadline_timer_service.hpp" # endif // defined(ASIO_ENABLE_OLD_SERVICES) #else // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) # include "asio/steady_timer.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) #if !defined(ASIO_HAS_VARIADIC_TEMPLATES) # include "asio/detail/variadic_templates.hpp" // A macro that should expand to: // template // basic_socket_streambuf* connect(T1 x1, ..., Tn xn) // { // init_buffers(); // typedef typename Protocol::resolver resolver_type; // resolver_type resolver(socket().get_executor().context()); // connect_to_endpoints( // resolver.resolve(x1, ..., xn, ec_)); // return !ec_ ? this : 0; // } // This macro should only persist within this file. # define ASIO_PRIVATE_CONNECT_DEF(n) \ template \ basic_socket_streambuf* connect(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ { \ init_buffers(); \ typedef typename Protocol::resolver resolver_type; \ resolver_type resolver(socket().get_executor().context()); \ connect_to_endpoints( \ resolver.resolve(ASIO_VARIADIC_BYVAL_ARGS(n), ec_)); \ return !ec_ ? this : 0; \ } \ /**/ #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) #if !defined(ASIO_ENABLE_OLD_SERVICES) # define ASIO_SVC_T1 detail::deadline_timer_service #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // A separate base class is used to ensure that the io_context member is // initialised prior to the basic_socket_streambuf's basic_socket base class. class socket_streambuf_io_context { protected: socket_streambuf_io_context(io_context* ctx) : default_io_context_(ctx) { } shared_ptr default_io_context_; }; // A separate base class is used to ensure that the dynamically allocated // buffers are constructed prior to the basic_socket_streambuf's basic_socket // base class. This makes moving the socket is the last potentially throwing // step in the streambuf's move constructor, giving the constructor a strong // exception safety guarantee. class socket_streambuf_buffers { protected: socket_streambuf_buffers() : get_buffer_(buffer_size), put_buffer_(buffer_size) { } enum { buffer_size = 512 }; std::vector get_buffer_; std::vector put_buffer_; }; } // namespace detail #if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) #define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL // Forward declaration with defaulted arguments. template ), #if defined(ASIO_HAS_BOOST_DATE_TIME) \ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typename Clock = boost::posix_time::ptime, typename WaitTraits = time_traits ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> #else // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typename Clock = chrono::steady_clock, typename WaitTraits = wait_traits ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) class basic_socket_streambuf; #endif // !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) /// Iostream streambuf for a socket. #if defined(GENERATING_DOCUMENTATION) template > #else // defined(GENERATING_DOCUMENTATION) template #endif // defined(GENERATING_DOCUMENTATION) class basic_socket_streambuf : public std::streambuf, private detail::socket_streambuf_io_context, private detail::socket_streambuf_buffers, #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) private basic_socket #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) public basic_socket #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) { private: // These typedefs are intended keep this class's implementation independent // of whether it's using Boost.DateClock, Boost.Chrono or std::chrono. #if defined(ASIO_HAS_BOOST_DATE_TIME) \ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typedef WaitTraits traits_helper; #else // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) typedef detail::chrono_time_traits traits_helper; #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) public: /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// The clock type. typedef Clock clock_type; #if defined(GENERATING_DOCUMENTATION) /// (Deprecated: Use time_point.) The time type. typedef typename WaitTraits::time_type time_type; /// The time type. typedef typename WaitTraits::time_point time_point; /// (Deprecated: Use duration.) The duration type. typedef typename WaitTraits::duration_type duration_type; /// The duration type. typedef typename WaitTraits::duration duration; #else # if !defined(ASIO_NO_DEPRECATED) typedef typename traits_helper::time_type time_type; typedef typename traits_helper::duration_type duration_type; # endif // !defined(ASIO_NO_DEPRECATED) typedef typename traits_helper::time_type time_point; typedef typename traits_helper::duration_type duration; #endif /// Construct a basic_socket_streambuf without establishing a connection. basic_socket_streambuf() : detail::socket_streambuf_io_context(new io_context), basic_socket(*default_io_context_), expiry_time_(max_expiry_time()) { init_buffers(); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Construct a basic_socket_streambuf from the supplied socket. explicit basic_socket_streambuf(basic_stream_socket s) : detail::socket_streambuf_io_context(0), basic_socket(std::move(s)), expiry_time_(max_expiry_time()) { init_buffers(); } /// Move-construct a basic_socket_streambuf from another. basic_socket_streambuf(basic_socket_streambuf&& other) : detail::socket_streambuf_io_context(other), basic_socket(std::move(other.socket())), ec_(other.ec_), expiry_time_(other.expiry_time_) { get_buffer_.swap(other.get_buffer_); put_buffer_.swap(other.put_buffer_); setg(other.eback(), other.gptr(), other.egptr()); setp(other.pptr(), other.epptr()); other.ec_ = asio::error_code(); other.expiry_time_ = max_expiry_time(); other.init_buffers(); } /// Move-assign a basic_socket_streambuf from another. basic_socket_streambuf& operator=(basic_socket_streambuf&& other) { this->close(); socket() = std::move(other.socket()); detail::socket_streambuf_io_context::operator=(other); ec_ = other.ec_; expiry_time_ = other.expiry_time_; get_buffer_.swap(other.get_buffer_); put_buffer_.swap(other.put_buffer_); setg(other.eback(), other.gptr(), other.egptr()); setp(other.pptr(), other.epptr()); other.ec_ = asio::error_code(); other.expiry_time_ = max_expiry_time(); other.put_buffer_.resize(buffer_size); other.init_buffers(); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destructor flushes buffered data. virtual ~basic_socket_streambuf() { if (pptr() != pbase()) overflow(traits_type::eof()); } /// Establish a connection. /** * This function establishes a connection to the specified endpoint. * * @return \c this if a connection was successfully established, a null * pointer otherwise. */ basic_socket_streambuf* connect(const endpoint_type& endpoint) { init_buffers(); ec_ = asio::error_code(); this->connect_to_endpoints(&endpoint, &endpoint + 1); return !ec_ ? this : 0; } #if defined(GENERATING_DOCUMENTATION) /// Establish a connection. /** * This function automatically establishes a connection based on the supplied * resolver query parameters. The arguments are used to construct a resolver * query object. * * @return \c this if a connection was successfully established, a null * pointer otherwise. */ template basic_socket_streambuf* connect(T1 t1, ..., TN tn); #elif defined(ASIO_HAS_VARIADIC_TEMPLATES) template basic_socket_streambuf* connect(T... x) { init_buffers(); typedef typename Protocol::resolver resolver_type; resolver_type resolver(socket().get_executor().context()); connect_to_endpoints(resolver.resolve(x..., ec_)); return !ec_ ? this : 0; } #else ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CONNECT_DEF) #endif /// Close the connection. /** * @return \c this if a connection was successfully established, a null * pointer otherwise. */ basic_socket_streambuf* close() { sync(); socket().close(ec_); if (!ec_) init_buffers(); return !ec_ ? this : 0; } /// Get a reference to the underlying socket. basic_socket& socket() { return *this; } /// Get the last error associated with the stream buffer. /** * @return An \c error_code corresponding to the last error from the stream * buffer. */ const asio::error_code& error() const { return ec_; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use error().) Get the last error associated with the stream /// buffer. /** * @return An \c error_code corresponding to the last error from the stream * buffer. */ const asio::error_code& puberror() const { return error(); } /// (Deprecated: Use expiry().) Get the stream buffer's expiry time as an /// absolute time. /** * @return An absolute time value representing the stream buffer's expiry * time. */ time_point expires_at() const { return expiry_time_; } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the stream buffer's expiry time as an absolute time. /** * @return An absolute time value representing the stream buffer's expiry * time. */ time_point expiry() const { return expiry_time_; } /// Set the stream buffer's expiry time as an absolute time. /** * This function sets the expiry time associated with the stream. Stream * operations performed after this time (where the operations cannot be * completed using the internal buffers) will fail with the error * asio::error::operation_aborted. * * @param expiry_time The expiry time to be used for the stream. */ void expires_at(const time_point& expiry_time) { expiry_time_ = expiry_time; } /// Set the stream buffer's expiry time relative to now. /** * This function sets the expiry time associated with the stream. Stream * operations performed after this time (where the operations cannot be * completed using the internal buffers) will fail with the error * asio::error::operation_aborted. * * @param expiry_time The expiry time to be used for the timer. */ void expires_after(const duration& expiry_time) { expiry_time_ = traits_helper::add(traits_helper::now(), expiry_time); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use expiry().) Get the stream buffer's expiry time relative /// to now. /** * @return A relative time value representing the stream buffer's expiry time. */ duration expires_from_now() const { return traits_helper::subtract(expires_at(), traits_helper::now()); } /// (Deprecated: Use expires_after().) Set the stream buffer's expiry time /// relative to now. /** * This function sets the expiry time associated with the stream. Stream * operations performed after this time (where the operations cannot be * completed using the internal buffers) will fail with the error * asio::error::operation_aborted. * * @param expiry_time The expiry time to be used for the timer. */ void expires_from_now(const duration& expiry_time) { expiry_time_ = traits_helper::add(traits_helper::now(), expiry_time); } #endif // !defined(ASIO_NO_DEPRECATED) protected: int_type underflow() { #if defined(ASIO_WINDOWS_RUNTIME) ec_ = asio::error::operation_not_supported; return traits_type::eof(); #else // defined(ASIO_WINDOWS_RUNTIME) if (gptr() != egptr()) return traits_type::eof(); for (;;) { // Check if we are past the expiry time. if (traits_helper::less_than(expiry_time_, traits_helper::now())) { ec_ = asio::error::timed_out; return traits_type::eof(); } // Try to complete the operation without blocking. if (!socket().native_non_blocking()) socket().native_non_blocking(true, ec_); detail::buffer_sequence_adapter bufs(asio::buffer(get_buffer_) + putback_max); detail::signed_size_type bytes = detail::socket_ops::recv( socket().native_handle(), bufs.buffers(), bufs.count(), 0, ec_); // Check if operation succeeded. if (bytes > 0) { setg(&get_buffer_[0], &get_buffer_[0] + putback_max, &get_buffer_[0] + putback_max + bytes); return traits_type::to_int_type(*gptr()); } // Check for EOF. if (bytes == 0) { ec_ = asio::error::eof; return traits_type::eof(); } // Operation failed. if (ec_ != asio::error::would_block && ec_ != asio::error::try_again) return traits_type::eof(); // Wait for socket to become ready. if (detail::socket_ops::poll_read( socket().native_handle(), 0, timeout(), ec_) < 0) return traits_type::eof(); } #endif // defined(ASIO_WINDOWS_RUNTIME) } int_type overflow(int_type c) { #if defined(ASIO_WINDOWS_RUNTIME) ec_ = asio::error::operation_not_supported; return traits_type::eof(); #else // defined(ASIO_WINDOWS_RUNTIME) char_type ch = traits_type::to_char_type(c); // Determine what needs to be sent. const_buffer output_buffer; if (put_buffer_.empty()) { if (traits_type::eq_int_type(c, traits_type::eof())) return traits_type::not_eof(c); // Nothing to do. output_buffer = asio::buffer(&ch, sizeof(char_type)); } else { output_buffer = asio::buffer(pbase(), (pptr() - pbase()) * sizeof(char_type)); } while (output_buffer.size() > 0) { // Check if we are past the expiry time. if (traits_helper::less_than(expiry_time_, traits_helper::now())) { ec_ = asio::error::timed_out; return traits_type::eof(); } // Try to complete the operation without blocking. if (!socket().native_non_blocking()) socket().native_non_blocking(true, ec_); detail::buffer_sequence_adapter< const_buffer, const_buffer> bufs(output_buffer); detail::signed_size_type bytes = detail::socket_ops::send( socket().native_handle(), bufs.buffers(), bufs.count(), 0, ec_); // Check if operation succeeded. if (bytes > 0) { output_buffer += static_cast(bytes); continue; } // Operation failed. if (ec_ != asio::error::would_block && ec_ != asio::error::try_again) return traits_type::eof(); // Wait for socket to become ready. if (detail::socket_ops::poll_write( socket().native_handle(), 0, timeout(), ec_) < 0) return traits_type::eof(); } if (!put_buffer_.empty()) { setp(&put_buffer_[0], &put_buffer_[0] + put_buffer_.size()); // If the new character is eof then our work here is done. if (traits_type::eq_int_type(c, traits_type::eof())) return traits_type::not_eof(c); // Add the new character to the output buffer. *pptr() = ch; pbump(1); } return c; #endif // defined(ASIO_WINDOWS_RUNTIME) } int sync() { return overflow(traits_type::eof()); } std::streambuf* setbuf(char_type* s, std::streamsize n) { if (pptr() == pbase() && s == 0 && n == 0) { put_buffer_.clear(); setp(0, 0); sync(); return this; } return 0; } private: // Disallow copying and assignment. basic_socket_streambuf(const basic_socket_streambuf&) ASIO_DELETED; basic_socket_streambuf& operator=( const basic_socket_streambuf&) ASIO_DELETED; void init_buffers() { setg(&get_buffer_[0], &get_buffer_[0] + putback_max, &get_buffer_[0] + putback_max); if (put_buffer_.empty()) setp(0, 0); else setp(&put_buffer_[0], &put_buffer_[0] + put_buffer_.size()); } int timeout() const { int64_t msec = traits_helper::to_posix_duration( traits_helper::subtract(expiry_time_, traits_helper::now())).total_milliseconds(); if (msec > (std::numeric_limits::max)()) msec = (std::numeric_limits::max)(); else if (msec < 0) msec = 0; return static_cast(msec); } template void connect_to_endpoints(const EndpointSequence& endpoints) { this->connect_to_endpoints(endpoints.begin(), endpoints.end()); } template void connect_to_endpoints(EndpointIterator begin, EndpointIterator end) { #if defined(ASIO_WINDOWS_RUNTIME) ec_ = asio::error::operation_not_supported; #else // defined(ASIO_WINDOWS_RUNTIME) if (ec_) return; ec_ = asio::error::not_found; for (EndpointIterator i = begin; i != end; ++i) { // Check if we are past the expiry time. if (traits_helper::less_than(expiry_time_, traits_helper::now())) { ec_ = asio::error::timed_out; return; } // Close and reopen the socket. typename Protocol::endpoint ep(*i); socket().close(ec_); socket().open(ep.protocol(), ec_); if (ec_) continue; // Try to complete the operation without blocking. if (!socket().native_non_blocking()) socket().native_non_blocking(true, ec_); detail::socket_ops::connect(socket().native_handle(), ep.data(), ep.size(), ec_); // Check if operation succeeded. if (!ec_) return; // Operation failed. if (ec_ != asio::error::in_progress && ec_ != asio::error::would_block) continue; // Wait for socket to become ready. if (detail::socket_ops::poll_connect( socket().native_handle(), timeout(), ec_) < 0) continue; // Get the error code from the connect operation. int connect_error = 0; size_t connect_error_len = sizeof(connect_error); if (detail::socket_ops::getsockopt(socket().native_handle(), 0, SOL_SOCKET, SO_ERROR, &connect_error, &connect_error_len, ec_) == detail::socket_error_retval) return; // Check the result of the connect operation. ec_ = asio::error_code(connect_error, asio::error::get_system_category()); if (!ec_) return; } #endif // defined(ASIO_WINDOWS_RUNTIME) } // Helper function to get the maximum expiry time. static time_point max_expiry_time() { #if defined(ASIO_HAS_BOOST_DATE_TIME) \ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) return boost::posix_time::pos_infin; #else // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) return (time_point::max)(); #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) } enum { putback_max = 8 }; asio::error_code ec_; time_point expiry_time_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T1 #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_HAS_VARIADIC_TEMPLATES) # undef ASIO_PRIVATE_CONNECT_DEF #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_BASIC_SOCKET_STREAMBUF_HPP asio-1.12.2/include/asio/basic_stream_socket.hpp000066400000000000000000001066201340672067200216370ustar00rootroot00000000000000// // basic_stream_socket.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_STREAM_SOCKET_HPP #define ASIO_BASIC_STREAM_SOCKET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/basic_socket.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/stream_socket_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { /// Provides stream-oriented socket functionality. /** * The basic_stream_socket class template provides asynchronous and blocking * stream-oriented socket functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template )> class basic_stream_socket : public basic_socket { public: /// The native representation of a socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename basic_socket< Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; /// Construct a basic_stream_socket without opening it. /** * This constructor creates a stream socket without opening it. The socket * needs to be opened and then connected or accepted before data can be sent * or received on it. * * @param io_context The io_context object that the stream socket will use to * dispatch handlers for any asynchronous operations performed on the socket. */ explicit basic_stream_socket(asio::io_context& io_context) : basic_socket(io_context) { } /// Construct and open a basic_stream_socket. /** * This constructor creates and opens a stream socket. The socket needs to be * connected or accepted before data can be sent or received on it. * * @param io_context The io_context object that the stream socket will use to * dispatch handlers for any asynchronous operations performed on the socket. * * @param protocol An object specifying protocol parameters to be used. * * @throws asio::system_error Thrown on failure. */ basic_stream_socket(asio::io_context& io_context, const protocol_type& protocol) : basic_socket(io_context, protocol) { } /// Construct a basic_stream_socket, opening it and binding it to the given /// local endpoint. /** * This constructor creates a stream socket and automatically opens it bound * to the specified endpoint on the local machine. The protocol used is the * protocol associated with the given endpoint. * * @param io_context The io_context object that the stream socket will use to * dispatch handlers for any asynchronous operations performed on the socket. * * @param endpoint An endpoint on the local machine to which the stream * socket will be bound. * * @throws asio::system_error Thrown on failure. */ basic_stream_socket(asio::io_context& io_context, const endpoint_type& endpoint) : basic_socket(io_context, endpoint) { } /// Construct a basic_stream_socket on an existing native socket. /** * This constructor creates a stream socket object to hold an existing native * socket. * * @param io_context The io_context object that the stream socket will use to * dispatch handlers for any asynchronous operations performed on the socket. * * @param protocol An object specifying protocol parameters to be used. * * @param native_socket The new underlying socket implementation. * * @throws asio::system_error Thrown on failure. */ basic_stream_socket(asio::io_context& io_context, const protocol_type& protocol, const native_handle_type& native_socket) : basic_socket( io_context, protocol, native_socket) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_stream_socket from another. /** * This constructor moves a stream socket from one object to another. * * @param other The other basic_stream_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_socket(io_context&) constructor. */ basic_stream_socket(basic_stream_socket&& other) : basic_socket(std::move(other)) { } /// Move-assign a basic_stream_socket from another. /** * This assignment operator moves a stream socket from one object to another. * * @param other The other basic_stream_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_socket(io_context&) constructor. */ basic_stream_socket& operator=(basic_stream_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } /// Move-construct a basic_stream_socket from a socket of another protocol /// type. /** * This constructor moves a stream socket from one object to another. * * @param other The other basic_stream_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_socket(io_context&) constructor. */ template basic_stream_socket( basic_stream_socket&& other, typename enable_if::value>::type* = 0) : basic_socket(std::move(other)) { } /// Move-assign a basic_stream_socket from a socket of another protocol type. /** * This assignment operator moves a stream socket from one object to another. * * @param other The other basic_stream_socket object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_socket(io_context&) constructor. */ template typename enable_if::value, basic_stream_socket>::type& operator=( basic_stream_socket&& other) { basic_socket::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the socket. /** * This function destroys the socket, cancelling any outstanding asynchronous * operations associated with the socket as if by calling @c cancel. */ ~basic_stream_socket() { } /// Send some data on the socket. /** * This function is used to send data on the stream socket. The function * call will block until one or more bytes of the data has been sent * successfully, or an until error occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @note The send operation may not transmit all of the data to the peer. * Consider using the @ref write function if you need to ensure that all data * is written before the blocking operation completes. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.send(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on the socket. /** * This function is used to send data on the stream socket. The function * call will block until one or more bytes of the data has been sent * successfully, or an until error occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @returns The number of bytes sent. * * @throws asio::system_error Thrown on failure. * * @note The send operation may not transmit all of the data to the peer. * Consider using the @ref write function if you need to ensure that all data * is written before the blocking operation completes. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.send(asio::buffer(data, size), 0); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "send"); return s; } /// Send some data on the socket. /** * This function is used to send data on the stream socket. The function * call will block until one or more bytes of the data has been sent * successfully, or an until error occurs. * * @param buffers One or more data buffers to be sent on the socket. * * @param flags Flags specifying how the send call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes sent. Returns 0 if an error occurred. * * @note The send operation may not transmit all of the data to the peer. * Consider using the @ref write function if you need to ensure that all data * is written before the blocking operation completes. */ template std::size_t send(const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().send( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous send. /** * This function is used to asynchronously send data on the stream socket. * The function call always returns immediately. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The send operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.async_send(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send( this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send( this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous send. /** * This function is used to asynchronously send data on the stream socket. * The function call always returns immediately. * * @param buffers One or more data buffers to be sent on the socket. Although * the buffers object may be copied as necessary, ownership of the underlying * memory blocks is retained by the caller, which must guarantee that they * remain valid until the handler is called. * * @param flags Flags specifying how the send call is to be made. * * @param handler The handler to be called when the send operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes sent. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The send operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To send a single data buffer use the @ref buffer function as follows: * @code * socket.async_send(asio::buffer(data, size), 0, handler); * @endcode * See the @ref buffer documentation for information on sending multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send( this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send( this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Receive some data on the socket. /** * This function is used to receive data on the stream socket. The function * call will block until one or more bytes of data has been received * successfully, or until an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.receive(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on the socket. /** * This function is used to receive data on the stream socket. The function * call will block until one or more bytes of data has been received * successfully, or until an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param flags Flags specifying how the receive call is to be made. * * @returns The number of bytes received. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.receive(asio::buffer(data, size), 0); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags flags) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, flags, ec); asio::detail::throw_error(ec, "receive"); return s; } /// Receive some data on a connected socket. /** * This function is used to receive data on the stream socket. The function * call will block until one or more bytes of data has been received * successfully, or until an error occurs. * * @param buffers One or more buffers into which the data will be received. * * @param flags Flags specifying how the receive call is to be made. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes received. Returns 0 if an error occurred. * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. */ template std::size_t receive(const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return this->get_service().receive( this->get_implementation(), buffers, flags, ec); } /// Start an asynchronous receive. /** * This function is used to asynchronously receive data from the stream * socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref async_read function if you need to ensure * that the requested amount of data is received before the asynchronous * operation completes. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.async_receive(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Start an asynchronous receive. /** * This function is used to asynchronously receive data from the stream * socket. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be received. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param flags Flags specifying how the receive call is to be made. * * @param handler The handler to be called when the receive operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes received. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The receive operation may not receive all of the requested number of * bytes. Consider using the @ref async_read function if you need to ensure * that the requested amount of data is received before the asynchronous * operation completes. * * @par Example * To receive into a single data buffer use the @ref buffer function as * follows: * @code * socket.async_receive(asio::buffer(data, size), 0, handler); * @endcode * See the @ref buffer documentation for information on receiving into * multiple buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(const MutableBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, flags, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Write some data to the socket. /** * This function is used to write data to the stream socket. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the socket. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * socket.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().send( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the socket. /** * This function is used to write data to the stream socket. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the socket. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().send(this->get_implementation(), buffers, 0, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the stream socket. * The function call always returns immediately. * * @param buffers One or more data buffers to be written to the socket. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * socket.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_send(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_send(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Read some data from the socket. /** * This function is used to read data from the stream socket. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * socket.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().receive( this->get_implementation(), buffers, 0, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the socket. /** * This function is used to read data from the stream socket. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().receive( this->get_implementation(), buffers, 0, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the stream socket. * The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * socket.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_receive(this->get_implementation(), buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_receive(this->get_implementation(), buffers, 0, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BASIC_STREAM_SOCKET_HPP asio-1.12.2/include/asio/basic_streambuf.hpp000066400000000000000000000322121340672067200207570ustar00rootroot00000000000000// // basic_streambuf.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_STREAMBUF_HPP #define ASIO_BASIC_STREAMBUF_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_NO_IOSTREAM) #include #include #include #include #include #include "asio/basic_streambuf_fwd.hpp" #include "asio/buffer.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Automatically resizable buffer class based on std::streambuf. /** * The @c basic_streambuf class is derived from @c std::streambuf to associate * the streambuf's input and output sequences with one or more character * arrays. These character arrays are internal to the @c basic_streambuf * object, but direct access to the array elements is provided to permit them * to be used efficiently with I/O operations. Characters written to the output * sequence of a @c basic_streambuf object are appended to the input sequence * of the same object. * * The @c basic_streambuf class's public interface is intended to permit the * following implementation strategies: * * @li A single contiguous character array, which is reallocated as necessary * to accommodate changes in the size of the character sequence. This is the * implementation approach currently used in Asio. * * @li A sequence of one or more character arrays, where each array is of the * same size. Additional character array objects are appended to the sequence * to accommodate changes in the size of the character sequence. * * @li A sequence of one or more character arrays of varying sizes. Additional * character array objects are appended to the sequence to accommodate changes * in the size of the character sequence. * * The constructor for basic_streambuf accepts a @c size_t argument specifying * the maximum of the sum of the sizes of the input sequence and output * sequence. During the lifetime of the @c basic_streambuf object, the following * invariant holds: * @code size() <= max_size()@endcode * Any member function that would, if successful, cause the invariant to be * violated shall throw an exception of class @c std::length_error. * * The constructor for @c basic_streambuf takes an Allocator argument. A copy * of this argument is used for any memory allocation performed, by the * constructor and by all member functions, during the lifetime of each @c * basic_streambuf object. * * @par Examples * Writing directly from an streambuf to a socket: * @code * asio::streambuf b; * std::ostream os(&b); * os << "Hello, World!\n"; * * // try sending some data in input sequence * size_t n = sock.send(b.data()); * * b.consume(n); // sent data is removed from input sequence * @endcode * * Reading from a socket directly into a streambuf: * @code * asio::streambuf b; * * // reserve 512 bytes in output sequence * asio::streambuf::mutable_buffers_type bufs = b.prepare(512); * * size_t n = sock.receive(bufs); * * // received data is "committed" from output sequence to input sequence * b.commit(n); * * std::istream is(&b); * std::string s; * is >> s; * @endcode */ #if defined(GENERATING_DOCUMENTATION) template > #else template #endif class basic_streambuf : public std::streambuf, private noncopyable { public: #if defined(GENERATING_DOCUMENTATION) /// The type used to represent the input sequence as a list of buffers. typedef implementation_defined const_buffers_type; /// The type used to represent the output sequence as a list of buffers. typedef implementation_defined mutable_buffers_type; #else typedef ASIO_CONST_BUFFER const_buffers_type; typedef ASIO_MUTABLE_BUFFER mutable_buffers_type; #endif /// Construct a basic_streambuf object. /** * Constructs a streambuf with the specified maximum size. The initial size * of the streambuf's input sequence is 0. */ explicit basic_streambuf( std::size_t maximum_size = (std::numeric_limits::max)(), const Allocator& allocator = Allocator()) : max_size_(maximum_size), buffer_(allocator) { std::size_t pend = (std::min)(max_size_, buffer_delta); buffer_.resize((std::max)(pend, 1)); setg(&buffer_[0], &buffer_[0], &buffer_[0]); setp(&buffer_[0], &buffer_[0] + pend); } /// Get the size of the input sequence. /** * @returns The size of the input sequence. The value is equal to that * calculated for @c s in the following code: * @code * size_t s = 0; * const_buffers_type bufs = data(); * const_buffers_type::const_iterator i = bufs.begin(); * while (i != bufs.end()) * { * const_buffer buf(*i++); * s += buf.size(); * } * @endcode */ std::size_t size() const ASIO_NOEXCEPT { return pptr() - gptr(); } /// Get the maximum size of the basic_streambuf. /** * @returns The allowed maximum of the sum of the sizes of the input sequence * and output sequence. */ std::size_t max_size() const ASIO_NOEXCEPT { return max_size_; } /// Get the current capacity of the basic_streambuf. /** * @returns The current total capacity of the streambuf, i.e. for both the * input sequence and output sequence. */ std::size_t capacity() const ASIO_NOEXCEPT { return buffer_.capacity(); } /// Get a list of buffers that represents the input sequence. /** * @returns An object of type @c const_buffers_type that satisfies * ConstBufferSequence requirements, representing all character arrays in the * input sequence. * * @note The returned object is invalidated by any @c basic_streambuf member * function that modifies the input sequence or output sequence. */ const_buffers_type data() const ASIO_NOEXCEPT { return asio::buffer(asio::const_buffer(gptr(), (pptr() - gptr()) * sizeof(char_type))); } /// Get a list of buffers that represents the output sequence, with the given /// size. /** * Ensures that the output sequence can accommodate @c n characters, * reallocating character array objects as necessary. * * @returns An object of type @c mutable_buffers_type that satisfies * MutableBufferSequence requirements, representing character array objects * at the start of the output sequence such that the sum of the buffer sizes * is @c n. * * @throws std::length_error If size() + n > max_size(). * * @note The returned object is invalidated by any @c basic_streambuf member * function that modifies the input sequence or output sequence. */ mutable_buffers_type prepare(std::size_t n) { reserve(n); return asio::buffer(asio::mutable_buffer( pptr(), n * sizeof(char_type))); } /// Move characters from the output sequence to the input sequence. /** * Appends @c n characters from the start of the output sequence to the input * sequence. The beginning of the output sequence is advanced by @c n * characters. * * Requires a preceding call prepare(x) where x >= n, and * no intervening operations that modify the input or output sequence. * * @note If @c n is greater than the size of the output sequence, the entire * output sequence is moved to the input sequence and no error is issued. */ void commit(std::size_t n) { n = std::min(n, epptr() - pptr()); pbump(static_cast(n)); setg(eback(), gptr(), pptr()); } /// Remove characters from the input sequence. /** * Removes @c n characters from the beginning of the input sequence. * * @note If @c n is greater than the size of the input sequence, the entire * input sequence is consumed and no error is issued. */ void consume(std::size_t n) { if (egptr() < pptr()) setg(&buffer_[0], gptr(), pptr()); if (gptr() + n > pptr()) n = pptr() - gptr(); gbump(static_cast(n)); } protected: enum { buffer_delta = 128 }; /// Override std::streambuf behaviour. /** * Behaves according to the specification of @c std::streambuf::underflow(). */ int_type underflow() { if (gptr() < pptr()) { setg(&buffer_[0], gptr(), pptr()); return traits_type::to_int_type(*gptr()); } else { return traits_type::eof(); } } /// Override std::streambuf behaviour. /** * Behaves according to the specification of @c std::streambuf::overflow(), * with the specialisation that @c std::length_error is thrown if appending * the character to the input sequence would require the condition * size() > max_size() to be true. */ int_type overflow(int_type c) { if (!traits_type::eq_int_type(c, traits_type::eof())) { if (pptr() == epptr()) { std::size_t buffer_size = pptr() - gptr(); if (buffer_size < max_size_ && max_size_ - buffer_size < buffer_delta) { reserve(max_size_ - buffer_size); } else { reserve(buffer_delta); } } *pptr() = traits_type::to_char_type(c); pbump(1); return c; } return traits_type::not_eof(c); } void reserve(std::size_t n) { // Get current stream positions as offsets. std::size_t gnext = gptr() - &buffer_[0]; std::size_t pnext = pptr() - &buffer_[0]; std::size_t pend = epptr() - &buffer_[0]; // Check if there is already enough space in the put area. if (n <= pend - pnext) { return; } // Shift existing contents of get area to start of buffer. if (gnext > 0) { pnext -= gnext; std::memmove(&buffer_[0], &buffer_[0] + gnext, pnext); } // Ensure buffer is large enough to hold at least the specified size. if (n > pend - pnext) { if (n <= max_size_ && pnext <= max_size_ - n) { pend = pnext + n; buffer_.resize((std::max)(pend, 1)); } else { std::length_error ex("asio::streambuf too long"); asio::detail::throw_exception(ex); } } // Update stream positions. setg(&buffer_[0], &buffer_[0], &buffer_[0] + pnext); setp(&buffer_[0] + pnext, &buffer_[0] + pend); } private: std::size_t max_size_; std::vector buffer_; // Helper function to get the preferred size for reading data. friend std::size_t read_size_helper( basic_streambuf& sb, std::size_t max_size) { return std::min( std::max(512, sb.buffer_.capacity() - sb.size()), std::min(max_size, sb.max_size() - sb.size())); } }; /// Adapts basic_streambuf to the dynamic buffer sequence type requirements. #if defined(GENERATING_DOCUMENTATION) template > #else template #endif class basic_streambuf_ref { public: /// The type used to represent the input sequence as a list of buffers. typedef typename basic_streambuf::const_buffers_type const_buffers_type; /// The type used to represent the output sequence as a list of buffers. typedef typename basic_streambuf::mutable_buffers_type mutable_buffers_type; /// Construct a basic_streambuf_ref for the given basic_streambuf object. explicit basic_streambuf_ref(basic_streambuf& sb) : sb_(sb) { } /// Copy construct a basic_streambuf_ref. basic_streambuf_ref(const basic_streambuf_ref& other) ASIO_NOEXCEPT : sb_(other.sb_) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move construct a basic_streambuf_ref. basic_streambuf_ref(basic_streambuf_ref&& other) ASIO_NOEXCEPT : sb_(other.sb_) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Get the size of the input sequence. std::size_t size() const ASIO_NOEXCEPT { return sb_.size(); } /// Get the maximum size of the dynamic buffer. std::size_t max_size() const ASIO_NOEXCEPT { return sb_.max_size(); } /// Get the current capacity of the dynamic buffer. std::size_t capacity() const ASIO_NOEXCEPT { return sb_.capacity(); } /// Get a list of buffers that represents the input sequence. const_buffers_type data() const ASIO_NOEXCEPT { return sb_.data(); } /// Get a list of buffers that represents the output sequence, with the given /// size. mutable_buffers_type prepare(std::size_t n) { return sb_.prepare(n); } /// Move bytes from the output sequence to the input sequence. void commit(std::size_t n) { return sb_.commit(n); } /// Remove characters from the input sequence. void consume(std::size_t n) { return sb_.consume(n); } private: basic_streambuf& sb_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_BASIC_STREAMBUF_HPP asio-1.12.2/include/asio/basic_streambuf_fwd.hpp000066400000000000000000000015151340672067200216210ustar00rootroot00000000000000// // basic_streambuf_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_STREAMBUF_FWD_HPP #define ASIO_BASIC_STREAMBUF_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_NO_IOSTREAM) #include namespace asio { template > class basic_streambuf; template > class basic_streambuf_ref; } // namespace asio #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_BASIC_STREAMBUF_FWD_HPP asio-1.12.2/include/asio/basic_waitable_timer.hpp000066400000000000000000000600131340672067200217570ustar00rootroot00000000000000// // basic_waitable_timer.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BASIC_WAITABLE_TIMER_HPP #define ASIO_BASIC_WAITABLE_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/wait_traits.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/waitable_timer_service.hpp" #else // defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/detail/chrono_time_traits.hpp" # include "asio/detail/deadline_timer_service.hpp" # define ASIO_SVC_T \ detail::deadline_timer_service< \ detail::chrono_time_traits > #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { #if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) #define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL // Forward declaration with defaulted arguments. template ASIO_SVC_TPARAM_DEF2(= waitable_timer_service)> class basic_waitable_timer; #endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) /// Provides waitable timer functionality. /** * The basic_waitable_timer class template provides the ability to perform a * blocking or asynchronous wait for a timer to expire. * * A waitable timer is always in one of two states: "expired" or "not expired". * If the wait() or async_wait() function is called on an expired timer, the * wait operation will complete immediately. * * Most applications will use one of the asio::steady_timer, * asio::system_timer or asio::high_resolution_timer typedefs. * * @note This waitable timer functionality is for use with the C++11 standard * library's @c <chrono> facility, or with the Boost.Chrono library. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Examples * Performing a blocking wait (C++11): * @code * // Construct a timer without setting an expiry time. * asio::steady_timer timer(io_context); * * // Set an expiry time relative to now. * timer.expires_after(std::chrono::seconds(5)); * * // Wait for the timer to expire. * timer.wait(); * @endcode * * @par * Performing an asynchronous wait (C++11): * @code * void handler(const asio::error_code& error) * { * if (!error) * { * // Timer expired. * } * } * * ... * * // Construct a timer with an absolute expiry time. * asio::steady_timer timer(io_context, * std::chrono::steady_clock::now() + std::chrono::seconds(60)); * * // Start an asynchronous wait. * timer.async_wait(handler); * @endcode * * @par Changing an active waitable timer's expiry time * * Changing the expiry time of a timer while there are pending asynchronous * waits causes those wait operations to be cancelled. To ensure that the action * associated with the timer is performed only once, use something like this: * used: * * @code * void on_some_event() * { * if (my_timer.expires_after(seconds(5)) > 0) * { * // We managed to cancel the timer. Start new asynchronous wait. * my_timer.async_wait(on_timeout); * } * else * { * // Too late, timer has already expired! * } * } * * void on_timeout(const asio::error_code& e) * { * if (e != asio::error::operation_aborted) * { * // Timer was not cancelled, take necessary action. * } * } * @endcode * * @li The asio::basic_waitable_timer::expires_after() function * cancels any pending asynchronous waits, and returns the number of * asynchronous waits that were cancelled. If it returns 0 then you were too * late and the wait handler has already been executed, or will soon be * executed. If it returns 1 then the wait handler was successfully cancelled. * * @li If a wait handler is cancelled, the asio::error_code passed to * it contains the value asio::error::operation_aborted. */ template class basic_waitable_timer : ASIO_SVC_ACCESS basic_io_object { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The clock type. typedef Clock clock_type; /// The duration type of the clock. typedef typename clock_type::duration duration; /// The time point type of the clock. typedef typename clock_type::time_point time_point; /// The wait traits type. typedef WaitTraits traits_type; /// Constructor. /** * This constructor creates a timer without setting an expiry time. The * expires_at() or expires_after() functions must be called to set an expiry * time before the timer can be waited on. * * @param io_context The io_context object that the timer will use to dispatch * handlers for any asynchronous operations performed on the timer. */ explicit basic_waitable_timer(asio::io_context& io_context) : basic_io_object(io_context) { } /// Constructor to set a particular expiry time as an absolute time. /** * This constructor creates a timer and sets the expiry time. * * @param io_context The io_context object that the timer will use to dispatch * handlers for any asynchronous operations performed on the timer. * * @param expiry_time The expiry time to be used for the timer, expressed * as an absolute time. */ basic_waitable_timer(asio::io_context& io_context, const time_point& expiry_time) : basic_io_object(io_context) { asio::error_code ec; this->get_service().expires_at(this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_at"); } /// Constructor to set a particular expiry time relative to now. /** * This constructor creates a timer and sets the expiry time. * * @param io_context The io_context object that the timer will use to dispatch * handlers for any asynchronous operations performed on the timer. * * @param expiry_time The expiry time to be used for the timer, relative to * now. */ basic_waitable_timer(asio::io_context& io_context, const duration& expiry_time) : basic_io_object(io_context) { asio::error_code ec; this->get_service().expires_after( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_after"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_waitable_timer from another. /** * This constructor moves a timer from one object to another. * * @param other The other basic_waitable_timer object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_waitable_timer(io_context&) constructor. */ basic_waitable_timer(basic_waitable_timer&& other) : basic_io_object(std::move(other)) { } /// Move-assign a basic_waitable_timer from another. /** * This assignment operator moves a timer from one object to another. Cancels * any outstanding asynchronous operations associated with the target object. * * @param other The other basic_waitable_timer object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_waitable_timer(io_context&) constructor. */ basic_waitable_timer& operator=(basic_waitable_timer&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the timer. /** * This function destroys the timer, cancelling any outstanding asynchronous * wait operations associated with the timer as if by calling @c cancel. */ ~basic_waitable_timer() { } #if defined(ASIO_ENABLE_OLD_SERVICES) // These functions are provided by basic_io_object<>. #else // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } #endif // defined(ASIO_ENABLE_OLD_SERVICES) /// Cancel any asynchronous operations that are waiting on the timer. /** * This function forces the completion of any pending asynchronous wait * operations against the timer. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel() { asio::error_code ec; std::size_t s = this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); return s; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overload.) Cancel any asynchronous /// operations that are waiting on the timer. /** * This function forces the completion of any pending asynchronous wait * operations against the timer. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. * * @note If the timer has already expired when cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel(asio::error_code& ec) { return this->get_service().cancel(this->get_implementation(), ec); } #endif // !defined(ASIO_NO_DEPRECATED) /// Cancels one asynchronous operation that is waiting on the timer. /** * This function forces the completion of one pending asynchronous wait * operation against the timer. Handlers are cancelled in FIFO order. The * handler for the cancelled operation will be invoked with the * asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @return The number of asynchronous operations that were cancelled. That is, * either 0 or 1. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when cancel_one() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel_one() { asio::error_code ec; std::size_t s = this->get_service().cancel_one( this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel_one"); return s; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overload.) Cancels one asynchronous /// operation that is waiting on the timer. /** * This function forces the completion of one pending asynchronous wait * operation against the timer. Handlers are cancelled in FIFO order. The * handler for the cancelled operation will be invoked with the * asio::error::operation_aborted error code. * * Cancelling the timer does not change the expiry time. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. That is, * either 0 or 1. * * @note If the timer has already expired when cancel_one() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t cancel_one(asio::error_code& ec) { return this->get_service().cancel_one(this->get_implementation(), ec); } /// (Deprecated: Use expiry().) Get the timer's expiry time as an absolute /// time. /** * This function may be used to obtain the timer's current expiry time. * Whether the timer has expired or not does not affect this value. */ time_point expires_at() const { return this->get_service().expires_at(this->get_implementation()); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the timer's expiry time as an absolute time. /** * This function may be used to obtain the timer's current expiry time. * Whether the timer has expired or not does not affect this value. */ time_point expiry() const { return this->get_service().expiry(this->get_implementation()); } /// Set the timer's expiry time as an absolute time. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when expires_at() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_at(const time_point& expiry_time) { asio::error_code ec; std::size_t s = this->get_service().expires_at( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_at"); return s; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overload.) Set the timer's expiry time as /// an absolute time. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. * * @note If the timer has already expired when expires_at() is called, then * the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_at(const time_point& expiry_time, asio::error_code& ec) { return this->get_service().expires_at( this->get_implementation(), expiry_time, ec); } #endif // !defined(ASIO_NO_DEPRECATED) /// Set the timer's expiry time relative to now. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when expires_after() is called, * then the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_after(const duration& expiry_time) { asio::error_code ec; std::size_t s = this->get_service().expires_after( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_after"); return s; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use expiry().) Get the timer's expiry time relative to now. /** * This function may be used to obtain the timer's current expiry time. * Whether the timer has expired or not does not affect this value. */ duration expires_from_now() const { return this->get_service().expires_from_now(this->get_implementation()); } /// (Deprecated: Use expires_after().) Set the timer's expiry time relative /// to now. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @return The number of asynchronous operations that were cancelled. * * @throws asio::system_error Thrown on failure. * * @note If the timer has already expired when expires_from_now() is called, * then the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_from_now(const duration& expiry_time) { asio::error_code ec; std::size_t s = this->get_service().expires_from_now( this->get_implementation(), expiry_time, ec); asio::detail::throw_error(ec, "expires_from_now"); return s; } /// (Deprecated: Use expires_after().) Set the timer's expiry time relative /// to now. /** * This function sets the expiry time. Any pending asynchronous wait * operations will be cancelled. The handler for each cancelled operation will * be invoked with the asio::error::operation_aborted error code. * * @param expiry_time The expiry time to be used for the timer. * * @param ec Set to indicate what error occurred, if any. * * @return The number of asynchronous operations that were cancelled. * * @note If the timer has already expired when expires_from_now() is called, * then the handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ std::size_t expires_from_now(const duration& expiry_time, asio::error_code& ec) { return this->get_service().expires_from_now( this->get_implementation(), expiry_time, ec); } #endif // !defined(ASIO_NO_DEPRECATED) /// Perform a blocking wait on the timer. /** * This function is used to wait for the timer to expire. This function * blocks and does not return until the timer has expired. * * @throws asio::system_error Thrown on failure. */ void wait() { asio::error_code ec; this->get_service().wait(this->get_implementation(), ec); asio::detail::throw_error(ec, "wait"); } /// Perform a blocking wait on the timer. /** * This function is used to wait for the timer to expire. This function * blocks and does not return until the timer has expired. * * @param ec Set to indicate what error occurred, if any. */ void wait(asio::error_code& ec) { this->get_service().wait(this->get_implementation(), ec); } /// Start an asynchronous wait on the timer. /** * This function may be used to initiate an asynchronous wait against the * timer. It always returns immediately. * * For each call to async_wait(), the supplied handler will be called exactly * once. The handler will be called when: * * @li The timer has expired. * * @li The timer was cancelled, in which case the handler is passed the error * code asio::error::operation_aborted. * * @param handler The handler to be called when the timer expires. Copies * will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(ASIO_MOVE_ARG(WaitHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WaitHandler. ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_wait(this->get_implementation(), ASIO_MOVE_CAST(WaitHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) async_completion init(handler); this->get_service().async_wait(this->get_implementation(), init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } private: // Disallow copying and assignment. basic_waitable_timer(const basic_waitable_timer&) ASIO_DELETED; basic_waitable_timer& operator=( const basic_waitable_timer&) ASIO_DELETED; }; } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_BASIC_WAITABLE_TIMER_HPP asio-1.12.2/include/asio/bind_executor.hpp000066400000000000000000000405671340672067200204740ustar00rootroot00000000000000// // bind_executor.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BIND_EXECUTOR_HPP #define ASIO_BIND_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/variadic_templates.hpp" #include "asio/associated_executor.hpp" #include "asio/associated_allocator.hpp" #include "asio/async_result.hpp" #include "asio/execution_context.hpp" #include "asio/is_executor.hpp" #include "asio/uses_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct executor_binder_check { typedef void type; }; // Helper to automatically define nested typedef result_type. template struct executor_binder_result_type { protected: typedef void result_type_or_void; }; template struct executor_binder_result_type::type> { typedef typename T::result_type result_type; protected: typedef result_type result_type_or_void; }; template struct executor_binder_result_type { typedef R result_type; protected: typedef result_type result_type_or_void; }; template struct executor_binder_result_type { typedef R result_type; protected: typedef result_type result_type_or_void; }; template struct executor_binder_result_type { typedef R result_type; protected: typedef result_type result_type_or_void; }; template struct executor_binder_result_type { typedef R result_type; protected: typedef result_type result_type_or_void; }; template struct executor_binder_result_type { typedef R result_type; protected: typedef result_type result_type_or_void; }; template struct executor_binder_result_type { typedef R result_type; protected: typedef result_type result_type_or_void; }; // Helper to automatically define nested typedef argument_type. template struct executor_binder_argument_type {}; template struct executor_binder_argument_type::type> { typedef typename T::argument_type argument_type; }; template struct executor_binder_argument_type { typedef A1 argument_type; }; template struct executor_binder_argument_type { typedef A1 argument_type; }; // Helper to automatically define nested typedefs first_argument_type and // second_argument_type. template struct executor_binder_argument_types {}; template struct executor_binder_argument_types::type> { typedef typename T::first_argument_type first_argument_type; typedef typename T::second_argument_type second_argument_type; }; template struct executor_binder_argument_type { typedef A1 first_argument_type; typedef A2 second_argument_type; }; template struct executor_binder_argument_type { typedef A1 first_argument_type; typedef A2 second_argument_type; }; // Helper to: // - Apply the empty base optimisation to the executor. // - Perform uses_executor construction of the target type, if required. template class executor_binder_base; template class executor_binder_base : protected Executor { protected: template executor_binder_base(ASIO_MOVE_ARG(E) e, ASIO_MOVE_ARG(U) u) : executor_(ASIO_MOVE_CAST(E)(e)), target_(executor_arg_t(), executor_, ASIO_MOVE_CAST(U)(u)) { } Executor executor_; T target_; }; template class executor_binder_base { protected: template executor_binder_base(ASIO_MOVE_ARG(E) e, ASIO_MOVE_ARG(U) u) : executor_(ASIO_MOVE_CAST(E)(e)), target_(ASIO_MOVE_CAST(U)(u)) { } Executor executor_; T target_; }; // Helper to enable SFINAE on zero-argument operator() below. template struct executor_binder_result_of0 { typedef void type; }; template struct executor_binder_result_of0::type>::type> { typedef typename result_of::type type; }; } // namespace detail /// A call wrapper type to bind an executor of type @c Executor to an object of /// type @c T. template class executor_binder #if !defined(GENERATING_DOCUMENTATION) : public detail::executor_binder_result_type, public detail::executor_binder_argument_type, public detail::executor_binder_argument_types, private detail::executor_binder_base< T, Executor, uses_executor::value> #endif // !defined(GENERATING_DOCUMENTATION) { public: /// The type of the target object. typedef T target_type; /// The type of the associated executor. typedef Executor executor_type; #if defined(GENERATING_DOCUMENTATION) /// The return type if a function. /** * The type of @c result_type is based on the type @c T of the wrapper's * target object: * * @li if @c T is a pointer to function type, @c result_type is a synonym for * the return type of @c T; * * @li if @c T is a class type with a member type @c result_type, then @c * result_type is a synonym for @c T::result_type; * * @li otherwise @c result_type is not defined. */ typedef see_below result_type; /// The type of the function's argument. /** * The type of @c argument_type is based on the type @c T of the wrapper's * target object: * * @li if @c T is a pointer to a function type accepting a single argument, * @c argument_type is a synonym for the return type of @c T; * * @li if @c T is a class type with a member type @c argument_type, then @c * argument_type is a synonym for @c T::argument_type; * * @li otherwise @c argument_type is not defined. */ typedef see_below argument_type; /// The type of the function's first argument. /** * The type of @c first_argument_type is based on the type @c T of the * wrapper's target object: * * @li if @c T is a pointer to a function type accepting two arguments, @c * first_argument_type is a synonym for the return type of @c T; * * @li if @c T is a class type with a member type @c first_argument_type, * then @c first_argument_type is a synonym for @c T::first_argument_type; * * @li otherwise @c first_argument_type is not defined. */ typedef see_below first_argument_type; /// The type of the function's second argument. /** * The type of @c second_argument_type is based on the type @c T of the * wrapper's target object: * * @li if @c T is a pointer to a function type accepting two arguments, @c * second_argument_type is a synonym for the return type of @c T; * * @li if @c T is a class type with a member type @c first_argument_type, * then @c second_argument_type is a synonym for @c T::second_argument_type; * * @li otherwise @c second_argument_type is not defined. */ typedef see_below second_argument_type; #endif // defined(GENERATING_DOCUMENTATION) /// Construct an executor wrapper for the specified object. /** * This constructor is only valid if the type @c T is constructible from type * @c U. */ template executor_binder(executor_arg_t, const executor_type& e, ASIO_MOVE_ARG(U) u) : base_type(e, ASIO_MOVE_CAST(U)(u)) { } /// Copy constructor. executor_binder(const executor_binder& other) : base_type(other.get_executor(), other.get()) { } /// Construct a copy, but specify a different executor. executor_binder(executor_arg_t, const executor_type& e, const executor_binder& other) : base_type(e, other.get()) { } /// Construct a copy of a different executor wrapper type. /** * This constructor is only valid if the @c Executor type is constructible * from type @c OtherExecutor, and the type @c T is constructible from type * @c U. */ template executor_binder(const executor_binder& other) : base_type(other.get_executor(), other.get()) { } /// Construct a copy of a different executor wrapper type, but specify a /// different executor. /** * This constructor is only valid if the type @c T is constructible from type * @c U. */ template executor_binder(executor_arg_t, const executor_type& e, const executor_binder& other) : base_type(e, other.get()) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. executor_binder(executor_binder&& other) : base_type(ASIO_MOVE_CAST(executor_type)(other.get_executor()), ASIO_MOVE_CAST(T)(other.get())) { } /// Move construct the target object, but specify a different executor. executor_binder(executor_arg_t, const executor_type& e, executor_binder&& other) : base_type(e, ASIO_MOVE_CAST(T)(other.get())) { } /// Move construct from a different executor wrapper type. template executor_binder(executor_binder&& other) : base_type(ASIO_MOVE_CAST(OtherExecutor)(other.get_executor()), ASIO_MOVE_CAST(U)(other.get())) { } /// Move construct from a different executor wrapper type, but specify a /// different executor. template executor_binder(executor_arg_t, const executor_type& e, executor_binder&& other) : base_type(e, ASIO_MOVE_CAST(U)(other.get())) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destructor. ~executor_binder() { } /// Obtain a reference to the target object. target_type& get() ASIO_NOEXCEPT { return this->target_; } /// Obtain a reference to the target object. const target_type& get() const ASIO_NOEXCEPT { return this->target_; } /// Obtain the associated executor. executor_type get_executor() const ASIO_NOEXCEPT { return this->executor_; } #if defined(GENERATING_DOCUMENTATION) template auto operator()(Args&& ...); template auto operator()(Args&& ...) const; #elif defined(ASIO_HAS_VARIADIC_TEMPLATES) /// Forwarding function call operator. template typename result_of::type operator()( ASIO_MOVE_ARG(Args)... args) { return this->target_(ASIO_MOVE_CAST(Args)(args)...); } /// Forwarding function call operator. template typename result_of::type operator()( ASIO_MOVE_ARG(Args)... args) const { return this->target_(ASIO_MOVE_CAST(Args)(args)...); } #elif defined(ASIO_HAS_STD_TYPE_TRAITS) && !defined(_MSC_VER) typename detail::executor_binder_result_of0::type operator()() { return this->target_(); } typename detail::executor_binder_result_of0::type operator()() const { return this->target_(); } #define ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF(n) \ template \ typename result_of::type operator()( \ ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ \ template \ typename result_of::type operator()( \ ASIO_VARIADIC_MOVE_PARAMS(n)) const \ { \ return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF) #undef ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF #else // defined(ASIO_HAS_STD_TYPE_TRAITS) && !defined(_MSC_VER) typedef typename detail::executor_binder_result_type::result_type_or_void result_type_or_void; result_type_or_void operator()() { return this->target_(); } result_type_or_void operator()() const { return this->target_(); } #define ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF(n) \ template \ result_type_or_void operator()( \ ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ \ template \ result_type_or_void operator()( \ ASIO_VARIADIC_MOVE_PARAMS(n)) const \ { \ return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF) #undef ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF #endif // defined(ASIO_HAS_STD_TYPE_TRAITS) && !defined(_MSC_VER) private: typedef detail::executor_binder_base::value> base_type; }; /// Associate an object of type @c T with an executor of type @c Executor. template inline executor_binder::type, Executor> bind_executor(const Executor& ex, ASIO_MOVE_ARG(T) t, typename enable_if::value>::type* = 0) { return executor_binder::type, Executor>( executor_arg_t(), ex, ASIO_MOVE_CAST(T)(t)); } /// Associate an object of type @c T with an execution context's executor. template inline executor_binder::type, typename ExecutionContext::executor_type> bind_executor(ExecutionContext& ctx, ASIO_MOVE_ARG(T) t, typename enable_if::value>::type* = 0) { return executor_binder::type, typename ExecutionContext::executor_type>( executor_arg_t(), ctx.get_executor(), ASIO_MOVE_CAST(T)(t)); } #if !defined(GENERATING_DOCUMENTATION) template struct uses_executor, Executor> : true_type {}; template class async_result, Signature> { public: typedef executor_binder< typename async_result::completion_handler_type, Executor> completion_handler_type; typedef typename async_result::return_type return_type; explicit async_result(executor_binder& b) : target_(b.get()) { } return_type get() { return target_.get(); } private: async_result(const async_result&) ASIO_DELETED; async_result& operator=(const async_result&) ASIO_DELETED; async_result target_; }; #if !defined(ASIO_NO_DEPRECATED) template struct handler_type, Signature> { typedef executor_binder< typename handler_type::type, Executor> type; }; template class async_result > { public: typedef typename async_result::type type; explicit async_result(executor_binder& b) : target_(b.get()) { } type get() { return target_.get(); } private: async_result target_; }; #endif // !defined(ASIO_NO_DEPRECATED) template struct associated_allocator, Allocator> { typedef typename associated_allocator::type type; static type get(const executor_binder& b, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(b.get(), a); } }; template struct associated_executor, Executor1> { typedef Executor type; static type get(const executor_binder& b, const Executor1& = Executor1()) ASIO_NOEXCEPT { return b.get_executor(); } }; #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BIND_EXECUTOR_HPP asio-1.12.2/include/asio/buffer.hpp000066400000000000000000002040001340672067200170730ustar00rootroot00000000000000// // buffer.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFER_HPP #define ASIO_BUFFER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include #include #include #include "asio/detail/array_fwd.hpp" #include "asio/detail/string_view.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/detail/type_traits.hpp" #if defined(ASIO_MSVC) && (ASIO_MSVC >= 1700) # if defined(_HAS_ITERATOR_DEBUGGING) && (_HAS_ITERATOR_DEBUGGING != 0) # if !defined(ASIO_DISABLE_BUFFER_DEBUGGING) # define ASIO_ENABLE_BUFFER_DEBUGGING # endif // !defined(ASIO_DISABLE_BUFFER_DEBUGGING) # endif // defined(_HAS_ITERATOR_DEBUGGING) #endif // defined(ASIO_MSVC) && (ASIO_MSVC >= 1700) #if defined(__GNUC__) # if defined(_GLIBCXX_DEBUG) # if !defined(ASIO_DISABLE_BUFFER_DEBUGGING) # define ASIO_ENABLE_BUFFER_DEBUGGING # endif // !defined(ASIO_DISABLE_BUFFER_DEBUGGING) # endif // defined(_GLIBCXX_DEBUG) #endif // defined(__GNUC__) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) # include "asio/detail/functional.hpp" #endif // ASIO_ENABLE_BUFFER_DEBUGGING #if defined(ASIO_HAS_BOOST_WORKAROUND) # include # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) \ || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) # define ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND # endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) // || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) #endif // defined(ASIO_HAS_BOOST_WORKAROUND) #if defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) # include "asio/detail/type_traits.hpp" #endif // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) #include "asio/detail/push_options.hpp" namespace asio { class mutable_buffer; class const_buffer; /// Holds a buffer that can be modified. /** * The mutable_buffer class provides a safe representation of a buffer that can * be modified. It does not own the underlying data, and so is cheap to copy or * assign. * * @par Accessing Buffer Contents * * The contents of a buffer may be accessed using the @c data() and @c size() * member functions: * * @code asio::mutable_buffer b1 = ...; * std::size_t s1 = b1.size(); * unsigned char* p1 = static_cast(b1.data()); * @endcode * * The @c data() member function permits violations of type safety, so uses of * it in application code should be carefully considered. */ class mutable_buffer { public: /// Construct an empty buffer. mutable_buffer() ASIO_NOEXCEPT : data_(0), size_(0) { } /// Construct a buffer to represent a given memory range. mutable_buffer(void* data, std::size_t size) ASIO_NOEXCEPT : data_(data), size_(size) { } #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) mutable_buffer(void* data, std::size_t size, asio::detail::function debug_check) : data_(data), size_(size), debug_check_(debug_check) { } const asio::detail::function& get_debug_check() const { return debug_check_; } #endif // ASIO_ENABLE_BUFFER_DEBUGGING /// Get a pointer to the beginning of the memory range. void* data() const ASIO_NOEXCEPT { #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) if (size_ && debug_check_) debug_check_(); #endif // ASIO_ENABLE_BUFFER_DEBUGGING return data_; } /// Get the size of the memory range. std::size_t size() const ASIO_NOEXCEPT { return size_; } /// Move the start of the buffer by the specified number of bytes. mutable_buffer& operator+=(std::size_t n) ASIO_NOEXCEPT { std::size_t offset = n < size_ ? n : size_; data_ = static_cast(data_) + offset; size_ -= offset; return *this; } private: void* data_; std::size_t size_; #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) asio::detail::function debug_check_; #endif // ASIO_ENABLE_BUFFER_DEBUGGING }; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use mutable_buffer.) Adapts a single modifiable buffer so that /// it meets the requirements of the MutableBufferSequence concept. class mutable_buffers_1 : public mutable_buffer { public: /// The type for each element in the list of buffers. typedef mutable_buffer value_type; /// A random-access iterator type that may be used to read elements. typedef const mutable_buffer* const_iterator; /// Construct to represent a given memory range. mutable_buffers_1(void* data, std::size_t size) ASIO_NOEXCEPT : mutable_buffer(data, size) { } #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) mutable_buffers_1(void* data, std::size_t size, asio::detail::function debug_check) : mutable_buffer(data, size, debug_check) { } #endif // ASIO_ENABLE_BUFFER_DEBUGGING /// Construct to represent a single modifiable buffer. explicit mutable_buffers_1(const mutable_buffer& b) ASIO_NOEXCEPT : mutable_buffer(b) { } /// Get a random-access iterator to the first element. const_iterator begin() const ASIO_NOEXCEPT { return this; } /// Get a random-access iterator for one past the last element. const_iterator end() const ASIO_NOEXCEPT { return begin() + 1; } }; #endif // !defined(ASIO_NO_DEPRECATED) /// Holds a buffer that cannot be modified. /** * The const_buffer class provides a safe representation of a buffer that cannot * be modified. It does not own the underlying data, and so is cheap to copy or * assign. * * @par Accessing Buffer Contents * * The contents of a buffer may be accessed using the @c data() and @c size() * member functions: * * @code asio::const_buffer b1 = ...; * std::size_t s1 = b1.size(); * const unsigned char* p1 = static_cast(b1.data()); * @endcode * * The @c data() member function permits violations of type safety, so uses of * it in application code should be carefully considered. */ class const_buffer { public: /// Construct an empty buffer. const_buffer() ASIO_NOEXCEPT : data_(0), size_(0) { } /// Construct a buffer to represent a given memory range. const_buffer(const void* data, std::size_t size) ASIO_NOEXCEPT : data_(data), size_(size) { } /// Construct a non-modifiable buffer from a modifiable one. const_buffer(const mutable_buffer& b) ASIO_NOEXCEPT : data_(b.data()), size_(b.size()) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , debug_check_(b.get_debug_check()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING { } #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) const_buffer(const void* data, std::size_t size, asio::detail::function debug_check) : data_(data), size_(size), debug_check_(debug_check) { } const asio::detail::function& get_debug_check() const { return debug_check_; } #endif // ASIO_ENABLE_BUFFER_DEBUGGING /// Get a pointer to the beginning of the memory range. const void* data() const ASIO_NOEXCEPT { #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) if (size_ && debug_check_) debug_check_(); #endif // ASIO_ENABLE_BUFFER_DEBUGGING return data_; } /// Get the size of the memory range. std::size_t size() const ASIO_NOEXCEPT { return size_; } /// Move the start of the buffer by the specified number of bytes. const_buffer& operator+=(std::size_t n) ASIO_NOEXCEPT { std::size_t offset = n < size_ ? n : size_; data_ = static_cast(data_) + offset; size_ -= offset; return *this; } private: const void* data_; std::size_t size_; #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) asio::detail::function debug_check_; #endif // ASIO_ENABLE_BUFFER_DEBUGGING }; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use const_buffer.) Adapts a single non-modifiable buffer so /// that it meets the requirements of the ConstBufferSequence concept. class const_buffers_1 : public const_buffer { public: /// The type for each element in the list of buffers. typedef const_buffer value_type; /// A random-access iterator type that may be used to read elements. typedef const const_buffer* const_iterator; /// Construct to represent a given memory range. const_buffers_1(const void* data, std::size_t size) ASIO_NOEXCEPT : const_buffer(data, size) { } #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) const_buffers_1(const void* data, std::size_t size, asio::detail::function debug_check) : const_buffer(data, size, debug_check) { } #endif // ASIO_ENABLE_BUFFER_DEBUGGING /// Construct to represent a single non-modifiable buffer. explicit const_buffers_1(const const_buffer& b) ASIO_NOEXCEPT : const_buffer(b) { } /// Get a random-access iterator to the first element. const_iterator begin() const ASIO_NOEXCEPT { return this; } /// Get a random-access iterator for one past the last element. const_iterator end() const ASIO_NOEXCEPT { return begin() + 1; } }; #endif // !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use the socket/descriptor wait() and async_wait() member /// functions.) An implementation of both the ConstBufferSequence and /// MutableBufferSequence concepts to represent a null buffer sequence. class null_buffers { public: /// The type for each element in the list of buffers. typedef mutable_buffer value_type; /// A random-access iterator type that may be used to read elements. typedef const mutable_buffer* const_iterator; /// Get a random-access iterator to the first element. const_iterator begin() const ASIO_NOEXCEPT { return &buf_; } /// Get a random-access iterator for one past the last element. const_iterator end() const ASIO_NOEXCEPT { return &buf_; } private: mutable_buffer buf_; }; /** @defgroup buffer_sequence_begin asio::buffer_sequence_begin * * @brief The asio::buffer_sequence_begin function returns an iterator * pointing to the first element in a buffer sequence. */ /*@{*/ /// Get an iterator to the first element in a buffer sequence. inline const mutable_buffer* buffer_sequence_begin(const mutable_buffer& b) { return &b; } /// Get an iterator to the first element in a buffer sequence. inline const const_buffer* buffer_sequence_begin(const const_buffer& b) { return &b; } #if defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) /// Get an iterator to the first element in a buffer sequence. template inline auto buffer_sequence_begin(C& c) -> decltype(c.begin()) { return c.begin(); } /// Get an iterator to the first element in a buffer sequence. template inline auto buffer_sequence_begin(const C& c) -> decltype(c.begin()) { return c.begin(); } #else // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) template inline typename C::iterator buffer_sequence_begin(C& c) { return c.begin(); } template inline typename C::const_iterator buffer_sequence_begin(const C& c) { return c.begin(); } #endif // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) /*@}*/ /** @defgroup buffer_sequence_end asio::buffer_sequence_end * * @brief The asio::buffer_sequence_end function returns an iterator * pointing to one past the end element in a buffer sequence. */ /*@{*/ /// Get an iterator to one past the end element in a buffer sequence. inline const mutable_buffer* buffer_sequence_end(const mutable_buffer& b) { return &b + 1; } /// Get an iterator to one past the end element in a buffer sequence. inline const const_buffer* buffer_sequence_end(const const_buffer& b) { return &b + 1; } #if defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) /// Get an iterator to one past the end element in a buffer sequence. template inline auto buffer_sequence_end(C& c) -> decltype(c.end()) { return c.end(); } /// Get an iterator to one past the end element in a buffer sequence. template inline auto buffer_sequence_end(const C& c) -> decltype(c.end()) { return c.end(); } #else // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) template inline typename C::iterator buffer_sequence_end(C& c) { return c.end(); } template inline typename C::const_iterator buffer_sequence_end(const C& c) { return c.end(); } #endif // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) /*@}*/ namespace detail { // Tag types used to select appropriately optimised overloads. struct one_buffer {}; struct multiple_buffers {}; // Helper trait to detect single buffers. template struct buffer_sequence_cardinality : conditional< is_same::value #if !defined(ASIO_NO_DEPRECATED) || is_same::value || is_same::value #endif // !defined(ASIO_NO_DEPRECATED) || is_same::value, one_buffer, multiple_buffers>::type {}; template inline std::size_t buffer_size(one_buffer, Iterator begin, Iterator) ASIO_NOEXCEPT { return const_buffer(*begin).size(); } template inline std::size_t buffer_size(multiple_buffers, Iterator begin, Iterator end) ASIO_NOEXCEPT { std::size_t total_buffer_size = 0; Iterator iter = begin; for (; iter != end; ++iter) { const_buffer b(*iter); total_buffer_size += b.size(); } return total_buffer_size; } } // namespace detail /// Get the total number of bytes in a buffer sequence. /** * The @c buffer_size function determines the total size of all buffers in the * buffer sequence, as if computed as follows: * * @code size_t total_size = 0; * auto i = asio::buffer_sequence_begin(buffers); * auto end = asio::buffer_sequence_end(buffers); * for (; i != end; ++i) * { * const_buffer b(*i); * total_size += b.size(); * } * return total_size; @endcode * * The @c BufferSequence template parameter may meet either of the @c * ConstBufferSequence or @c MutableBufferSequence type requirements. */ template inline std::size_t buffer_size(const BufferSequence& b) ASIO_NOEXCEPT { return detail::buffer_size( detail::buffer_sequence_cardinality(), asio::buffer_sequence_begin(b), asio::buffer_sequence_end(b)); } #if !defined(ASIO_NO_DEPRECATED) /** @defgroup buffer_cast asio::buffer_cast * * @brief (Deprecated: Use the @c data() member function.) The * asio::buffer_cast function is used to obtain a pointer to the * underlying memory region associated with a buffer. * * @par Examples: * * To access the memory of a non-modifiable buffer, use: * @code asio::const_buffer b1 = ...; * const unsigned char* p1 = asio::buffer_cast(b1); * @endcode * * To access the memory of a modifiable buffer, use: * @code asio::mutable_buffer b2 = ...; * unsigned char* p2 = asio::buffer_cast(b2); * @endcode * * The asio::buffer_cast function permits violations of type safety, so * uses of it in application code should be carefully considered. */ /*@{*/ /// Cast a non-modifiable buffer to a specified pointer to POD type. template inline PointerToPodType buffer_cast(const mutable_buffer& b) ASIO_NOEXCEPT { return static_cast(b.data()); } /// Cast a non-modifiable buffer to a specified pointer to POD type. template inline PointerToPodType buffer_cast(const const_buffer& b) ASIO_NOEXCEPT { return static_cast(b.data()); } /*@}*/ #endif // !defined(ASIO_NO_DEPRECATED) /// Create a new modifiable buffer that is offset from the start of another. /** * @relates mutable_buffer */ inline mutable_buffer operator+(const mutable_buffer& b, std::size_t n) ASIO_NOEXCEPT { std::size_t offset = n < b.size() ? n : b.size(); char* new_data = static_cast(b.data()) + offset; std::size_t new_size = b.size() - offset; return mutable_buffer(new_data, new_size #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check() #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new modifiable buffer that is offset from the start of another. /** * @relates mutable_buffer */ inline mutable_buffer operator+(std::size_t n, const mutable_buffer& b) ASIO_NOEXCEPT { return b + n; } /// Create a new non-modifiable buffer that is offset from the start of another. /** * @relates const_buffer */ inline const_buffer operator+(const const_buffer& b, std::size_t n) ASIO_NOEXCEPT { std::size_t offset = n < b.size() ? n : b.size(); const char* new_data = static_cast(b.data()) + offset; std::size_t new_size = b.size() - offset; return const_buffer(new_data, new_size #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check() #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new non-modifiable buffer that is offset from the start of another. /** * @relates const_buffer */ inline const_buffer operator+(std::size_t n, const const_buffer& b) ASIO_NOEXCEPT { return b + n; } #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) namespace detail { template class buffer_debug_check { public: buffer_debug_check(Iterator iter) : iter_(iter) { } ~buffer_debug_check() { #if defined(ASIO_MSVC) && (ASIO_MSVC == 1400) // MSVC 8's string iterator checking may crash in a std::string::iterator // object's destructor when the iterator points to an already-destroyed // std::string object, unless the iterator is cleared first. iter_ = Iterator(); #endif // defined(ASIO_MSVC) && (ASIO_MSVC == 1400) } void operator()() { (void)*iter_; } private: Iterator iter_; }; } // namespace detail #endif // ASIO_ENABLE_BUFFER_DEBUGGING /** @defgroup buffer asio::buffer * * @brief The asio::buffer function is used to create a buffer object to * represent raw memory, an array of POD elements, a vector of POD elements, * or a std::string. * * A buffer object represents a contiguous region of memory as a 2-tuple * consisting of a pointer and size in bytes. A tuple of the form {void*, * size_t} specifies a mutable (modifiable) region of memory. Similarly, a * tuple of the form {const void*, size_t} specifies a const * (non-modifiable) region of memory. These two forms correspond to the classes * mutable_buffer and const_buffer, respectively. To mirror C++'s conversion * rules, a mutable_buffer is implicitly convertible to a const_buffer, and the * opposite conversion is not permitted. * * The simplest use case involves reading or writing a single buffer of a * specified size: * * @code sock.send(asio::buffer(data, size)); @endcode * * In the above example, the return value of asio::buffer meets the * requirements of the ConstBufferSequence concept so that it may be directly * passed to the socket's write function. A buffer created for modifiable * memory also meets the requirements of the MutableBufferSequence concept. * * An individual buffer may be created from a builtin array, std::vector, * std::array or boost::array of POD elements. This helps prevent buffer * overruns by automatically determining the size of the buffer: * * @code char d1[128]; * size_t bytes_transferred = sock.receive(asio::buffer(d1)); * * std::vector d2(128); * bytes_transferred = sock.receive(asio::buffer(d2)); * * std::array d3; * bytes_transferred = sock.receive(asio::buffer(d3)); * * boost::array d4; * bytes_transferred = sock.receive(asio::buffer(d4)); @endcode * * In all three cases above, the buffers created are exactly 128 bytes long. * Note that a vector is @e never automatically resized when creating or using * a buffer. The buffer size is determined using the vector's size() * member function, and not its capacity. * * @par Accessing Buffer Contents * * The contents of a buffer may be accessed using the @c data() and @c size() * member functions: * * @code asio::mutable_buffer b1 = ...; * std::size_t s1 = b1.size(); * unsigned char* p1 = static_cast(b1.data()); * * asio::const_buffer b2 = ...; * std::size_t s2 = b2.size(); * const void* p2 = b2.data(); @endcode * * The @c data() member function permits violations of type safety, so * uses of it in application code should be carefully considered. * * For convenience, a @ref buffer_size function is provided that works with * both buffers and buffer sequences (that is, types meeting the * ConstBufferSequence or MutableBufferSequence type requirements). In this * case, the function returns the total size of all buffers in the sequence. * * @par Buffer Copying * * The @ref buffer_copy function may be used to copy raw bytes between * individual buffers and buffer sequences. * * In particular, when used with the @ref buffer_size function, the @ref * buffer_copy function can be used to linearise a sequence of buffers. For * example: * * @code vector buffers = ...; * * vector data(asio::buffer_size(buffers)); * asio::buffer_copy(asio::buffer(data), buffers); @endcode * * Note that @ref buffer_copy is implemented in terms of @c memcpy, and * consequently it cannot be used to copy between overlapping memory regions. * * @par Buffer Invalidation * * A buffer object does not have any ownership of the memory it refers to. It * is the responsibility of the application to ensure the memory region remains * valid until it is no longer required for an I/O operation. When the memory * is no longer available, the buffer is said to have been invalidated. * * For the asio::buffer overloads that accept an argument of type * std::vector, the buffer objects returned are invalidated by any vector * operation that also invalidates all references, pointers and iterators * referring to the elements in the sequence (C++ Std, 23.2.4) * * For the asio::buffer overloads that accept an argument of type * std::basic_string, the buffer objects returned are invalidated according to * the rules defined for invalidation of references, pointers and iterators * referring to elements of the sequence (C++ Std, 21.3). * * @par Buffer Arithmetic * * Buffer objects may be manipulated using simple arithmetic in a safe way * which helps prevent buffer overruns. Consider an array initialised as * follows: * * @code boost::array a = { 'a', 'b', 'c', 'd', 'e' }; @endcode * * A buffer object @c b1 created using: * * @code b1 = asio::buffer(a); @endcode * * represents the entire array, { 'a', 'b', 'c', 'd', 'e' }. An * optional second argument to the asio::buffer function may be used to * limit the size, in bytes, of the buffer: * * @code b2 = asio::buffer(a, 3); @endcode * * such that @c b2 represents the data { 'a', 'b', 'c' }. Even if the * size argument exceeds the actual size of the array, the size of the buffer * object created will be limited to the array size. * * An offset may be applied to an existing buffer to create a new one: * * @code b3 = b1 + 2; @endcode * * where @c b3 will set to represent { 'c', 'd', 'e' }. If the offset * exceeds the size of the existing buffer, the newly created buffer will be * empty. * * Both an offset and size may be specified to create a buffer that corresponds * to a specific range of bytes within an existing buffer: * * @code b4 = asio::buffer(b1 + 1, 3); @endcode * * so that @c b4 will refer to the bytes { 'b', 'c', 'd' }. * * @par Buffers and Scatter-Gather I/O * * To read or write using multiple buffers (i.e. scatter-gather I/O), multiple * buffer objects may be assigned into a container that supports the * MutableBufferSequence (for read) or ConstBufferSequence (for write) concepts: * * @code * char d1[128]; * std::vector d2(128); * boost::array d3; * * boost::array bufs1 = { * asio::buffer(d1), * asio::buffer(d2), * asio::buffer(d3) }; * bytes_transferred = sock.receive(bufs1); * * std::vector bufs2; * bufs2.push_back(asio::buffer(d1)); * bufs2.push_back(asio::buffer(d2)); * bufs2.push_back(asio::buffer(d3)); * bytes_transferred = sock.send(bufs2); @endcode */ /*@{*/ #if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) # define ASIO_MUTABLE_BUFFER mutable_buffer # define ASIO_CONST_BUFFER const_buffer #else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) # define ASIO_MUTABLE_BUFFER mutable_buffers_1 # define ASIO_CONST_BUFFER const_buffers_1 #endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) /// Create a new modifiable buffer from an existing buffer. /** * @returns mutable_buffer(b). */ inline ASIO_MUTABLE_BUFFER buffer( const mutable_buffer& b) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(b); } /// Create a new modifiable buffer from an existing buffer. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * b.data(), * min(b.size(), max_size_in_bytes)); @endcode */ inline ASIO_MUTABLE_BUFFER buffer(const mutable_buffer& b, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER( mutable_buffer(b.data(), b.size() < max_size_in_bytes ? b.size() : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check() #endif // ASIO_ENABLE_BUFFER_DEBUGGING )); } /// Create a new non-modifiable buffer from an existing buffer. /** * @returns const_buffer(b). */ inline ASIO_CONST_BUFFER buffer( const const_buffer& b) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(b); } /// Create a new non-modifiable buffer from an existing buffer. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * b.data(), * min(b.size(), max_size_in_bytes)); @endcode */ inline ASIO_CONST_BUFFER buffer(const const_buffer& b, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(b.data(), b.size() < max_size_in_bytes ? b.size() : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , b.get_debug_check() #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new modifiable buffer that represents the given memory range. /** * @returns mutable_buffer(data, size_in_bytes). */ inline ASIO_MUTABLE_BUFFER buffer(void* data, std::size_t size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data, size_in_bytes); } /// Create a new non-modifiable buffer that represents the given memory range. /** * @returns const_buffer(data, size_in_bytes). */ inline ASIO_CONST_BUFFER buffer(const void* data, std::size_t size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data, size_in_bytes); } /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * static_cast(data), * N * sizeof(PodType)); @endcode */ template inline ASIO_MUTABLE_BUFFER buffer(PodType (&data)[N]) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data, N * sizeof(PodType)); } /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * static_cast(data), * min(N * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_MUTABLE_BUFFER buffer(PodType (&data)[N], std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data, N * sizeof(PodType) < max_size_in_bytes ? N * sizeof(PodType) : max_size_in_bytes); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * static_cast(data), * N * sizeof(PodType)); @endcode */ template inline ASIO_CONST_BUFFER buffer( const PodType (&data)[N]) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data, N * sizeof(PodType)); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * static_cast(data), * min(N * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_CONST_BUFFER buffer(const PodType (&data)[N], std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data, N * sizeof(PodType) < max_size_in_bytes ? N * sizeof(PodType) : max_size_in_bytes); } #if defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) // Borland C++ and Sun Studio think the overloads: // // unspecified buffer(boost::array& array ...); // // and // // unspecified buffer(boost::array& array ...); // // are ambiguous. This will be worked around by using a buffer_types traits // class that contains typedefs for the appropriate buffer and container // classes, based on whether PodType is const or non-const. namespace detail { template struct buffer_types_base; template <> struct buffer_types_base { typedef mutable_buffer buffer_type; typedef ASIO_MUTABLE_BUFFER container_type; }; template <> struct buffer_types_base { typedef const_buffer buffer_type; typedef ASIO_CONST_BUFFER container_type; }; template struct buffer_types : public buffer_types_base::value> { }; } // namespace detail template inline typename detail::buffer_types::container_type buffer(boost::array& data) ASIO_NOEXCEPT { typedef typename asio::detail::buffer_types::buffer_type buffer_type; typedef typename asio::detail::buffer_types::container_type container_type; return container_type( buffer_type(data.c_array(), data.size() * sizeof(PodType))); } template inline typename detail::buffer_types::container_type buffer(boost::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { typedef typename asio::detail::buffer_types::buffer_type buffer_type; typedef typename asio::detail::buffer_types::container_type container_type; return container_type( buffer_type(data.c_array(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes)); } #else // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template inline ASIO_MUTABLE_BUFFER buffer( boost::array& data) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER( data.c_array(), data.size() * sizeof(PodType)); } /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.data(), * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_MUTABLE_BUFFER buffer(boost::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data.c_array(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template inline ASIO_CONST_BUFFER buffer( boost::array& data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_CONST_BUFFER buffer(boost::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes); } #endif // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template inline ASIO_CONST_BUFFER buffer( const boost::array& data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_CONST_BUFFER buffer(const boost::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes); } #if defined(ASIO_HAS_STD_ARRAY) || defined(GENERATING_DOCUMENTATION) /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template inline ASIO_MUTABLE_BUFFER buffer( std::array& data) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data.data(), data.size() * sizeof(PodType)); } /// Create a new modifiable buffer that represents the given POD array. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.data(), * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_MUTABLE_BUFFER buffer(std::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data.data(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template inline ASIO_CONST_BUFFER buffer( std::array& data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_CONST_BUFFER buffer(std::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * data.size() * sizeof(PodType)); @endcode */ template inline ASIO_CONST_BUFFER buffer( const std::array& data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); } /// Create a new non-modifiable buffer that represents the given POD array. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode */ template inline ASIO_CONST_BUFFER buffer(const std::array& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes); } #endif // defined(ASIO_HAS_STD_ARRAY) || defined(GENERATING_DOCUMENTATION) /// Create a new modifiable buffer that represents the given POD vector. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.size() ? &data[0] : 0, * data.size() * sizeof(PodType)); @endcode * * @note The buffer is invalidated by any vector operation that would also * invalidate iterators. */ template inline ASIO_MUTABLE_BUFFER buffer( std::vector& data) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER( data.size() ? &data[0] : 0, data.size() * sizeof(PodType) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::vector::iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new modifiable buffer that represents the given POD vector. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.size() ? &data[0] : 0, * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode * * @note The buffer is invalidated by any vector operation that would also * invalidate iterators. */ template inline ASIO_MUTABLE_BUFFER buffer(std::vector& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data.size() ? &data[0] : 0, data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::vector::iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new non-modifiable buffer that represents the given POD vector. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.size() ? &data[0] : 0, * data.size() * sizeof(PodType)); @endcode * * @note The buffer is invalidated by any vector operation that would also * invalidate iterators. */ template inline ASIO_CONST_BUFFER buffer( const std::vector& data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER( data.size() ? &data[0] : 0, data.size() * sizeof(PodType) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::vector::const_iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new non-modifiable buffer that represents the given POD vector. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.size() ? &data[0] : 0, * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode * * @note The buffer is invalidated by any vector operation that would also * invalidate iterators. */ template inline ASIO_CONST_BUFFER buffer( const std::vector& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.size() ? &data[0] : 0, data.size() * sizeof(PodType) < max_size_in_bytes ? data.size() * sizeof(PodType) : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::vector::const_iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new modifiable buffer that represents the given string. /** * @returns mutable_buffer(data.size() ? &data[0] : 0, * data.size() * sizeof(Elem)). * * @note The buffer is invalidated by any non-const operation called on the * given string object. */ template inline ASIO_MUTABLE_BUFFER buffer( std::basic_string& data) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data.size() ? &data[0] : 0, data.size() * sizeof(Elem) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::basic_string::iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new modifiable buffer that represents the given string. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.size() ? &data[0] : 0, * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode * * @note The buffer is invalidated by any non-const operation called on the * given string object. */ template inline ASIO_MUTABLE_BUFFER buffer( std::basic_string& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_MUTABLE_BUFFER(data.size() ? &data[0] : 0, data.size() * sizeof(Elem) < max_size_in_bytes ? data.size() * sizeof(Elem) : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::basic_string::iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new non-modifiable buffer that represents the given string. /** * @returns const_buffer(data.data(), data.size() * sizeof(Elem)). * * @note The buffer is invalidated by any non-const operation called on the * given string object. */ template inline ASIO_CONST_BUFFER buffer( const std::basic_string& data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(Elem) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::basic_string::const_iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new non-modifiable buffer that represents the given string. /** * @returns A const_buffer value equivalent to: * @code const_buffer( * data.data(), * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode * * @note The buffer is invalidated by any non-const operation called on the * given string object. */ template inline ASIO_CONST_BUFFER buffer( const std::basic_string& data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(Elem) < max_size_in_bytes ? data.size() * sizeof(Elem) : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename std::basic_string::const_iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } #if defined(ASIO_HAS_STRING_VIEW) \ || defined(GENERATING_DOCUMENTATION) /// Create a new modifiable buffer that represents the given string_view. /** * @returns mutable_buffer(data.size() ? &data[0] : 0, * data.size() * sizeof(Elem)). */ template inline ASIO_CONST_BUFFER buffer( basic_string_view data) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.size() ? &data[0] : 0, data.size() * sizeof(Elem) #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename basic_string_view::iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } /// Create a new non-modifiable buffer that represents the given string. /** * @returns A mutable_buffer value equivalent to: * @code mutable_buffer( * data.size() ? &data[0] : 0, * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode */ template inline ASIO_CONST_BUFFER buffer( basic_string_view data, std::size_t max_size_in_bytes) ASIO_NOEXCEPT { return ASIO_CONST_BUFFER(data.size() ? &data[0] : 0, data.size() * sizeof(Elem) < max_size_in_bytes ? data.size() * sizeof(Elem) : max_size_in_bytes #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) , detail::buffer_debug_check< typename basic_string_view::iterator >(data.begin()) #endif // ASIO_ENABLE_BUFFER_DEBUGGING ); } #endif // defined(ASIO_HAS_STRING_VIEW) // || defined(GENERATING_DOCUMENTATION) /*@}*/ /// Adapt a basic_string to the DynamicBuffer requirements. /** * Requires that sizeof(Elem) == 1. */ template class dynamic_string_buffer { public: /// The type used to represent the input sequence as a list of buffers. typedef ASIO_CONST_BUFFER const_buffers_type; /// The type used to represent the output sequence as a list of buffers. typedef ASIO_MUTABLE_BUFFER mutable_buffers_type; /// Construct a dynamic buffer from a string. /** * @param s The string to be used as backing storage for the dynamic buffer. * Any existing data in the string is treated as the dynamic buffer's input * sequence. The object stores a reference to the string and the user is * responsible for ensuring that the string object remains valid until the * dynamic_string_buffer object is destroyed. * * @param maximum_size Specifies a maximum size for the buffer, in bytes. */ explicit dynamic_string_buffer(std::basic_string& s, std::size_t maximum_size = (std::numeric_limits::max)()) ASIO_NOEXCEPT : string_(s), size_(string_.size()), max_size_(maximum_size) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move construct a dynamic buffer. dynamic_string_buffer(dynamic_string_buffer&& other) ASIO_NOEXCEPT : string_(other.string_), size_(other.size_), max_size_(other.max_size_) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Get the size of the input sequence. std::size_t size() const ASIO_NOEXCEPT { return size_; } /// Get the maximum size of the dynamic buffer. /** * @returns The allowed maximum of the sum of the sizes of the input sequence * and output sequence. */ std::size_t max_size() const ASIO_NOEXCEPT { return max_size_; } /// Get the current capacity of the dynamic buffer. /** * @returns The current total capacity of the buffer, i.e. for both the input * sequence and output sequence. */ std::size_t capacity() const ASIO_NOEXCEPT { return string_.capacity(); } /// Get a list of buffers that represents the input sequence. /** * @returns An object of type @c const_buffers_type that satisfies * ConstBufferSequence requirements, representing the basic_string memory in * input sequence. * * @note The returned object is invalidated by any @c dynamic_string_buffer * or @c basic_string member function that modifies the input sequence or * output sequence. */ const_buffers_type data() const ASIO_NOEXCEPT { return const_buffers_type(asio::buffer(string_, size_)); } /// Get a list of buffers that represents the output sequence, with the given /// size. /** * Ensures that the output sequence can accommodate @c n bytes, resizing the * basic_string object as necessary. * * @returns An object of type @c mutable_buffers_type that satisfies * MutableBufferSequence requirements, representing basic_string memory * at the start of the output sequence of size @c n. * * @throws std::length_error If size() + n > max_size(). * * @note The returned object is invalidated by any @c dynamic_string_buffer * or @c basic_string member function that modifies the input sequence or * output sequence. */ mutable_buffers_type prepare(std::size_t n) { if (size () > max_size() || max_size() - size() < n) { std::length_error ex("dynamic_string_buffer too long"); asio::detail::throw_exception(ex); } string_.resize(size_ + n); return asio::buffer(asio::buffer(string_) + size_, n); } /// Move bytes from the output sequence to the input sequence. /** * @param n The number of bytes to append from the start of the output * sequence to the end of the input sequence. The remainder of the output * sequence is discarded. * * Requires a preceding call prepare(x) where x >= n, and * no intervening operations that modify the input or output sequence. * * @note If @c n is greater than the size of the output sequence, the entire * output sequence is moved to the input sequence and no error is issued. */ void commit(std::size_t n) { size_ += (std::min)(n, string_.size() - size_); string_.resize(size_); } /// Remove characters from the input sequence. /** * Removes @c n characters from the beginning of the input sequence. * * @note If @c n is greater than the size of the input sequence, the entire * input sequence is consumed and no error is issued. */ void consume(std::size_t n) { std::size_t consume_length = (std::min)(n, size_); string_.erase(0, consume_length); size_ -= consume_length; } private: std::basic_string& string_; std::size_t size_; const std::size_t max_size_; }; /// Adapt a vector to the DynamicBuffer requirements. /** * Requires that sizeof(Elem) == 1. */ template class dynamic_vector_buffer { public: /// The type used to represent the input sequence as a list of buffers. typedef ASIO_CONST_BUFFER const_buffers_type; /// The type used to represent the output sequence as a list of buffers. typedef ASIO_MUTABLE_BUFFER mutable_buffers_type; /// Construct a dynamic buffer from a string. /** * @param v The vector to be used as backing storage for the dynamic buffer. * Any existing data in the vector is treated as the dynamic buffer's input * sequence. The object stores a reference to the vector and the user is * responsible for ensuring that the vector object remains valid until the * dynamic_vector_buffer object is destroyed. * * @param maximum_size Specifies a maximum size for the buffer, in bytes. */ explicit dynamic_vector_buffer(std::vector& v, std::size_t maximum_size = (std::numeric_limits::max)()) ASIO_NOEXCEPT : vector_(v), size_(vector_.size()), max_size_(maximum_size) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move construct a dynamic buffer. dynamic_vector_buffer(dynamic_vector_buffer&& other) ASIO_NOEXCEPT : vector_(other.vector_), size_(other.size_), max_size_(other.max_size_) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Get the size of the input sequence. std::size_t size() const ASIO_NOEXCEPT { return size_; } /// Get the maximum size of the dynamic buffer. /** * @returns The allowed maximum of the sum of the sizes of the input sequence * and output sequence. */ std::size_t max_size() const ASIO_NOEXCEPT { return max_size_; } /// Get the current capacity of the dynamic buffer. /** * @returns The current total capacity of the buffer, i.e. for both the input * sequence and output sequence. */ std::size_t capacity() const ASIO_NOEXCEPT { return vector_.capacity(); } /// Get a list of buffers that represents the input sequence. /** * @returns An object of type @c const_buffers_type that satisfies * ConstBufferSequence requirements, representing the basic_string memory in * input sequence. * * @note The returned object is invalidated by any @c dynamic_vector_buffer * or @c basic_string member function that modifies the input sequence or * output sequence. */ const_buffers_type data() const ASIO_NOEXCEPT { return const_buffers_type(asio::buffer(vector_, size_)); } /// Get a list of buffers that represents the output sequence, with the given /// size. /** * Ensures that the output sequence can accommodate @c n bytes, resizing the * basic_string object as necessary. * * @returns An object of type @c mutable_buffers_type that satisfies * MutableBufferSequence requirements, representing basic_string memory * at the start of the output sequence of size @c n. * * @throws std::length_error If size() + n > max_size(). * * @note The returned object is invalidated by any @c dynamic_vector_buffer * or @c basic_string member function that modifies the input sequence or * output sequence. */ mutable_buffers_type prepare(std::size_t n) { if (size () > max_size() || max_size() - size() < n) { std::length_error ex("dynamic_vector_buffer too long"); asio::detail::throw_exception(ex); } vector_.resize(size_ + n); return asio::buffer(asio::buffer(vector_) + size_, n); } /// Move bytes from the output sequence to the input sequence. /** * @param n The number of bytes to append from the start of the output * sequence to the end of the input sequence. The remainder of the output * sequence is discarded. * * Requires a preceding call prepare(x) where x >= n, and * no intervening operations that modify the input or output sequence. * * @note If @c n is greater than the size of the output sequence, the entire * output sequence is moved to the input sequence and no error is issued. */ void commit(std::size_t n) { size_ += (std::min)(n, vector_.size() - size_); vector_.resize(size_); } /// Remove characters from the input sequence. /** * Removes @c n characters from the beginning of the input sequence. * * @note If @c n is greater than the size of the input sequence, the entire * input sequence is consumed and no error is issued. */ void consume(std::size_t n) { std::size_t consume_length = (std::min)(n, size_); vector_.erase(vector_.begin(), vector_.begin() + consume_length); size_ -= consume_length; } private: std::vector& vector_; std::size_t size_; const std::size_t max_size_; }; /** @defgroup dynamic_buffer asio::dynamic_buffer * * @brief The asio::dynamic_buffer function is used to create a * dynamically resized buffer from a @c std::basic_string or @c std::vector. */ /*@{*/ /// Create a new dynamic buffer that represents the given string. /** * @returns dynamic_string_buffer(data). */ template inline dynamic_string_buffer dynamic_buffer( std::basic_string& data) ASIO_NOEXCEPT { return dynamic_string_buffer(data); } /// Create a new dynamic buffer that represents the given string. /** * @returns dynamic_string_buffer(data, * max_size). */ template inline dynamic_string_buffer dynamic_buffer( std::basic_string& data, std::size_t max_size) ASIO_NOEXCEPT { return dynamic_string_buffer(data, max_size); } /// Create a new dynamic buffer that represents the given vector. /** * @returns dynamic_vector_buffer(data). */ template inline dynamic_vector_buffer dynamic_buffer( std::vector& data) ASIO_NOEXCEPT { return dynamic_vector_buffer(data); } /// Create a new dynamic buffer that represents the given vector. /** * @returns dynamic_vector_buffer(data, max_size). */ template inline dynamic_vector_buffer dynamic_buffer( std::vector& data, std::size_t max_size) ASIO_NOEXCEPT { return dynamic_vector_buffer(data, max_size); } /*@}*/ /** @defgroup buffer_copy asio::buffer_copy * * @brief The asio::buffer_copy function is used to copy bytes from a * source buffer (or buffer sequence) to a target buffer (or buffer sequence). * * The @c buffer_copy function is available in two forms: * * @li A 2-argument form: @c buffer_copy(target, source) * * @li A 3-argument form: @c buffer_copy(target, source, max_bytes_to_copy) * * Both forms return the number of bytes actually copied. The number of bytes * copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c If specified, @c max_bytes_to_copy. * * This prevents buffer overflow, regardless of the buffer sizes used in the * copy operation. * * Note that @ref buffer_copy is implemented in terms of @c memcpy, and * consequently it cannot be used to copy between overlapping memory regions. */ /*@{*/ namespace detail { inline std::size_t buffer_copy_1(const mutable_buffer& target, const const_buffer& source) { using namespace std; // For memcpy. std::size_t target_size = target.size(); std::size_t source_size = source.size(); std::size_t n = target_size < source_size ? target_size : source_size; if (n > 0) memcpy(target.data(), source.data(), n); return n; } template inline std::size_t buffer_copy(one_buffer, one_buffer, TargetIterator target_begin, TargetIterator, SourceIterator source_begin, SourceIterator) ASIO_NOEXCEPT { return (buffer_copy_1)(*target_begin, *source_begin); } template inline std::size_t buffer_copy(one_buffer, one_buffer, TargetIterator target_begin, TargetIterator, SourceIterator source_begin, SourceIterator, std::size_t max_bytes_to_copy) ASIO_NOEXCEPT { return (buffer_copy_1)(*target_begin, asio::buffer(*source_begin, max_bytes_to_copy)); } template std::size_t buffer_copy(one_buffer, multiple_buffers, TargetIterator target_begin, TargetIterator, SourceIterator source_begin, SourceIterator source_end, std::size_t max_bytes_to_copy = (std::numeric_limits::max)()) ASIO_NOEXCEPT { std::size_t total_bytes_copied = 0; SourceIterator source_iter = source_begin; for (mutable_buffer target_buffer( asio::buffer(*target_begin, max_bytes_to_copy)); target_buffer.size() && source_iter != source_end; ++source_iter) { const_buffer source_buffer(*source_iter); std::size_t bytes_copied = (buffer_copy_1)(target_buffer, source_buffer); total_bytes_copied += bytes_copied; target_buffer += bytes_copied; } return total_bytes_copied; } template std::size_t buffer_copy(multiple_buffers, one_buffer, TargetIterator target_begin, TargetIterator target_end, SourceIterator source_begin, SourceIterator, std::size_t max_bytes_to_copy = (std::numeric_limits::max)()) ASIO_NOEXCEPT { std::size_t total_bytes_copied = 0; TargetIterator target_iter = target_begin; for (const_buffer source_buffer( asio::buffer(*source_begin, max_bytes_to_copy)); source_buffer.size() && target_iter != target_end; ++target_iter) { mutable_buffer target_buffer(*target_iter); std::size_t bytes_copied = (buffer_copy_1)(target_buffer, source_buffer); total_bytes_copied += bytes_copied; source_buffer += bytes_copied; } return total_bytes_copied; } template std::size_t buffer_copy(multiple_buffers, multiple_buffers, TargetIterator target_begin, TargetIterator target_end, SourceIterator source_begin, SourceIterator source_end) ASIO_NOEXCEPT { std::size_t total_bytes_copied = 0; TargetIterator target_iter = target_begin; std::size_t target_buffer_offset = 0; SourceIterator source_iter = source_begin; std::size_t source_buffer_offset = 0; while (target_iter != target_end && source_iter != source_end) { mutable_buffer target_buffer = mutable_buffer(*target_iter) + target_buffer_offset; const_buffer source_buffer = const_buffer(*source_iter) + source_buffer_offset; std::size_t bytes_copied = (buffer_copy_1)(target_buffer, source_buffer); total_bytes_copied += bytes_copied; if (bytes_copied == target_buffer.size()) { ++target_iter; target_buffer_offset = 0; } else target_buffer_offset += bytes_copied; if (bytes_copied == source_buffer.size()) { ++source_iter; source_buffer_offset = 0; } else source_buffer_offset += bytes_copied; } return total_bytes_copied; } template std::size_t buffer_copy(multiple_buffers, multiple_buffers, TargetIterator target_begin, TargetIterator target_end, SourceIterator source_begin, SourceIterator source_end, std::size_t max_bytes_to_copy) ASIO_NOEXCEPT { std::size_t total_bytes_copied = 0; TargetIterator target_iter = target_begin; std::size_t target_buffer_offset = 0; SourceIterator source_iter = source_begin; std::size_t source_buffer_offset = 0; while (total_bytes_copied != max_bytes_to_copy && target_iter != target_end && source_iter != source_end) { mutable_buffer target_buffer = mutable_buffer(*target_iter) + target_buffer_offset; const_buffer source_buffer = const_buffer(*source_iter) + source_buffer_offset; std::size_t bytes_copied = (buffer_copy_1)( target_buffer, asio::buffer(source_buffer, max_bytes_to_copy - total_bytes_copied)); total_bytes_copied += bytes_copied; if (bytes_copied == target_buffer.size()) { ++target_iter; target_buffer_offset = 0; } else target_buffer_offset += bytes_copied; if (bytes_copied == source_buffer.size()) { ++source_iter; source_buffer_offset = 0; } else source_buffer_offset += bytes_copied; } return total_bytes_copied; } } // namespace detail /// Copies bytes from a source buffer sequence to a target buffer sequence. /** * @param target A modifiable buffer sequence representing the memory regions to * which the bytes will be copied. * * @param source A non-modifiable buffer sequence representing the memory * regions from which the bytes will be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * This function is implemented in terms of @c memcpy, and consequently it * cannot be used to copy between overlapping memory regions. */ template inline std::size_t buffer_copy(const MutableBufferSequence& target, const ConstBufferSequence& source) ASIO_NOEXCEPT { return detail::buffer_copy( detail::buffer_sequence_cardinality(), detail::buffer_sequence_cardinality(), asio::buffer_sequence_begin(target), asio::buffer_sequence_end(target), asio::buffer_sequence_begin(source), asio::buffer_sequence_end(source)); } /// Copies a limited number of bytes from a source buffer sequence to a target /// buffer sequence. /** * @param target A modifiable buffer sequence representing the memory regions to * which the bytes will be copied. * * @param source A non-modifiable buffer sequence representing the memory * regions from which the bytes will be copied. * * @param max_bytes_to_copy The maximum number of bytes to be copied. * * @returns The number of bytes copied. * * @note The number of bytes copied is the lesser of: * * @li @c buffer_size(target) * * @li @c buffer_size(source) * * @li @c max_bytes_to_copy * * This function is implemented in terms of @c memcpy, and consequently it * cannot be used to copy between overlapping memory regions. */ template inline std::size_t buffer_copy(const MutableBufferSequence& target, const ConstBufferSequence& source, std::size_t max_bytes_to_copy) ASIO_NOEXCEPT { return detail::buffer_copy( detail::buffer_sequence_cardinality(), detail::buffer_sequence_cardinality(), asio::buffer_sequence_begin(target), asio::buffer_sequence_end(target), asio::buffer_sequence_begin(source), asio::buffer_sequence_end(source), max_bytes_to_copy); } /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/is_buffer_sequence.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Trait to determine whether a type satisfies the MutableBufferSequence /// requirements. template struct is_mutable_buffer_sequence #if defined(GENERATING_DOCUMENTATION) : integral_constant #else // defined(GENERATING_DOCUMENTATION) : asio::detail::is_buffer_sequence #endif // defined(GENERATING_DOCUMENTATION) { }; /// Trait to determine whether a type satisfies the ConstBufferSequence /// requirements. template struct is_const_buffer_sequence #if defined(GENERATING_DOCUMENTATION) : integral_constant #else // defined(GENERATING_DOCUMENTATION) : asio::detail::is_buffer_sequence #endif // defined(GENERATING_DOCUMENTATION) { }; /// Trait to determine whether a type satisfies the DynamicBuffer requirements. template struct is_dynamic_buffer #if defined(GENERATING_DOCUMENTATION) : integral_constant #else // defined(GENERATING_DOCUMENTATION) : asio::detail::is_dynamic_buffer #endif // defined(GENERATING_DOCUMENTATION) { }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BUFFER_HPP asio-1.12.2/include/asio/buffered_read_stream.hpp000066400000000000000000000173741340672067200217720ustar00rootroot00000000000000// // buffered_read_stream.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERED_READ_STREAM_HPP #define ASIO_BUFFERED_READ_STREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/buffered_read_stream_fwd.hpp" #include "asio/buffer.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_resize_guard.hpp" #include "asio/detail/buffered_stream_storage.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Adds buffering to the read-related operations of a stream. /** * The buffered_read_stream class template can be used to add buffering to the * synchronous and asynchronous read operations of a stream. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template class buffered_read_stream : private noncopyable { public: /// The type of the next layer. typedef typename remove_reference::type next_layer_type; /// The type of the lowest layer. typedef typename next_layer_type::lowest_layer_type lowest_layer_type; /// The type of the executor associated with the object. typedef typename lowest_layer_type::executor_type executor_type; #if defined(GENERATING_DOCUMENTATION) /// The default buffer size. static const std::size_t default_buffer_size = implementation_defined; #else ASIO_STATIC_CONSTANT(std::size_t, default_buffer_size = 1024); #endif /// Construct, passing the specified argument to initialise the next layer. template explicit buffered_read_stream(Arg& a) : next_layer_(a), storage_(default_buffer_size) { } /// Construct, passing the specified argument to initialise the next layer. template buffered_read_stream(Arg& a, std::size_t buffer_size) : next_layer_(a), storage_(buffer_size) { } /// Get a reference to the next layer. next_layer_type& next_layer() { return next_layer_; } /// Get a reference to the lowest layer. lowest_layer_type& lowest_layer() { return next_layer_.lowest_layer(); } /// Get a const reference to the lowest layer. const lowest_layer_type& lowest_layer() const { return next_layer_.lowest_layer(); } /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return next_layer_.lowest_layer().get_executor(); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_context() { return next_layer_.get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_service() { return next_layer_.get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Close the stream. void close() { next_layer_.close(); } /// Close the stream. ASIO_SYNC_OP_VOID close(asio::error_code& ec) { next_layer_.close(ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Write the given data to the stream. Returns the number of bytes written. /// Throws an exception on failure. template std::size_t write_some(const ConstBufferSequence& buffers) { return next_layer_.write_some(buffers); } /// Write the given data to the stream. Returns the number of bytes written, /// or 0 if an error occurred. template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return next_layer_.write_some(buffers, ec); } /// Start an asynchronous write. The data being written must be valid for the /// lifetime of the asynchronous operation. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { return next_layer_.async_write_some(buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Fill the buffer with some data. Returns the number of bytes placed in the /// buffer as a result of the operation. Throws an exception on failure. std::size_t fill(); /// Fill the buffer with some data. Returns the number of bytes placed in the /// buffer as a result of the operation, or 0 if an error occurred. std::size_t fill(asio::error_code& ec); /// Start an asynchronous fill. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_fill(ASIO_MOVE_ARG(ReadHandler) handler); /// Read some data from the stream. Returns the number of bytes read. Throws /// an exception on failure. template std::size_t read_some(const MutableBufferSequence& buffers); /// Read some data from the stream. Returns the number of bytes read or 0 if /// an error occurred. template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec); /// Start an asynchronous read. The buffer into which the data will be read /// must be valid for the lifetime of the asynchronous operation. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler); /// Peek at the incoming data on the stream. Returns the number of bytes read. /// Throws an exception on failure. template std::size_t peek(const MutableBufferSequence& buffers); /// Peek at the incoming data on the stream. Returns the number of bytes read, /// or 0 if an error occurred. template std::size_t peek(const MutableBufferSequence& buffers, asio::error_code& ec); /// Determine the amount of data that may be read without blocking. std::size_t in_avail() { return storage_.size(); } /// Determine the amount of data that may be read without blocking. std::size_t in_avail(asio::error_code& ec) { ec = asio::error_code(); return storage_.size(); } private: /// Copy data out of the internal buffer to the specified target buffer. /// Returns the number of bytes copied. template std::size_t copy(const MutableBufferSequence& buffers) { std::size_t bytes_copied = asio::buffer_copy( buffers, storage_.data(), storage_.size()); storage_.consume(bytes_copied); return bytes_copied; } /// Copy data from the internal buffer to the specified target buffer, without /// removing the data from the internal buffer. Returns the number of bytes /// copied. template std::size_t peek_copy(const MutableBufferSequence& buffers) { return asio::buffer_copy(buffers, storage_.data(), storage_.size()); } /// The next layer. Stream next_layer_; // The data in the buffer. detail::buffered_stream_storage storage_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/buffered_read_stream.hpp" #endif // ASIO_BUFFERED_READ_STREAM_HPP asio-1.12.2/include/asio/buffered_read_stream_fwd.hpp000066400000000000000000000012021340672067200226110ustar00rootroot00000000000000// // buffered_read_stream_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERED_READ_STREAM_FWD_HPP #define ASIO_BUFFERED_READ_STREAM_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) namespace asio { template class buffered_read_stream; } // namespace asio #endif // ASIO_BUFFERED_READ_STREAM_FWD_HPP asio-1.12.2/include/asio/buffered_stream.hpp000066400000000000000000000202571340672067200207710ustar00rootroot00000000000000// // buffered_stream.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERED_STREAM_HPP #define ASIO_BUFFERED_STREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/buffered_read_stream.hpp" #include "asio/buffered_write_stream.hpp" #include "asio/buffered_stream_fwd.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Adds buffering to the read- and write-related operations of a stream. /** * The buffered_stream class template can be used to add buffering to the * synchronous and asynchronous read and write operations of a stream. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template class buffered_stream : private noncopyable { public: /// The type of the next layer. typedef typename remove_reference::type next_layer_type; /// The type of the lowest layer. typedef typename next_layer_type::lowest_layer_type lowest_layer_type; /// The type of the executor associated with the object. typedef typename lowest_layer_type::executor_type executor_type; /// Construct, passing the specified argument to initialise the next layer. template explicit buffered_stream(Arg& a) : inner_stream_impl_(a), stream_impl_(inner_stream_impl_) { } /// Construct, passing the specified argument to initialise the next layer. template explicit buffered_stream(Arg& a, std::size_t read_buffer_size, std::size_t write_buffer_size) : inner_stream_impl_(a, write_buffer_size), stream_impl_(inner_stream_impl_, read_buffer_size) { } /// Get a reference to the next layer. next_layer_type& next_layer() { return stream_impl_.next_layer().next_layer(); } /// Get a reference to the lowest layer. lowest_layer_type& lowest_layer() { return stream_impl_.lowest_layer(); } /// Get a const reference to the lowest layer. const lowest_layer_type& lowest_layer() const { return stream_impl_.lowest_layer(); } /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return stream_impl_.lowest_layer().get_executor(); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_context() { return stream_impl_.get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_service() { return stream_impl_.get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Close the stream. void close() { stream_impl_.close(); } /// Close the stream. ASIO_SYNC_OP_VOID close(asio::error_code& ec) { stream_impl_.close(ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Flush all data from the buffer to the next layer. Returns the number of /// bytes written to the next layer on the last write operation. Throws an /// exception on failure. std::size_t flush() { return stream_impl_.next_layer().flush(); } /// Flush all data from the buffer to the next layer. Returns the number of /// bytes written to the next layer on the last write operation, or 0 if an /// error occurred. std::size_t flush(asio::error_code& ec) { return stream_impl_.next_layer().flush(ec); } /// Start an asynchronous flush. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_flush(ASIO_MOVE_ARG(WriteHandler) handler) { return stream_impl_.next_layer().async_flush( ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Write the given data to the stream. Returns the number of bytes written. /// Throws an exception on failure. template std::size_t write_some(const ConstBufferSequence& buffers) { return stream_impl_.write_some(buffers); } /// Write the given data to the stream. Returns the number of bytes written, /// or 0 if an error occurred. template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return stream_impl_.write_some(buffers, ec); } /// Start an asynchronous write. The data being written must be valid for the /// lifetime of the asynchronous operation. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { return stream_impl_.async_write_some(buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Fill the buffer with some data. Returns the number of bytes placed in the /// buffer as a result of the operation. Throws an exception on failure. std::size_t fill() { return stream_impl_.fill(); } /// Fill the buffer with some data. Returns the number of bytes placed in the /// buffer as a result of the operation, or 0 if an error occurred. std::size_t fill(asio::error_code& ec) { return stream_impl_.fill(ec); } /// Start an asynchronous fill. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_fill(ASIO_MOVE_ARG(ReadHandler) handler) { return stream_impl_.async_fill(ASIO_MOVE_CAST(ReadHandler)(handler)); } /// Read some data from the stream. Returns the number of bytes read. Throws /// an exception on failure. template std::size_t read_some(const MutableBufferSequence& buffers) { return stream_impl_.read_some(buffers); } /// Read some data from the stream. Returns the number of bytes read or 0 if /// an error occurred. template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return stream_impl_.read_some(buffers, ec); } /// Start an asynchronous read. The buffer into which the data will be read /// must be valid for the lifetime of the asynchronous operation. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { return stream_impl_.async_read_some(buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); } /// Peek at the incoming data on the stream. Returns the number of bytes read. /// Throws an exception on failure. template std::size_t peek(const MutableBufferSequence& buffers) { return stream_impl_.peek(buffers); } /// Peek at the incoming data on the stream. Returns the number of bytes read, /// or 0 if an error occurred. template std::size_t peek(const MutableBufferSequence& buffers, asio::error_code& ec) { return stream_impl_.peek(buffers, ec); } /// Determine the amount of data that may be read without blocking. std::size_t in_avail() { return stream_impl_.in_avail(); } /// Determine the amount of data that may be read without blocking. std::size_t in_avail(asio::error_code& ec) { return stream_impl_.in_avail(ec); } private: // The buffered write stream. typedef buffered_write_stream write_stream_type; write_stream_type inner_stream_impl_; // The buffered read stream. typedef buffered_read_stream read_stream_type; read_stream_type stream_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BUFFERED_STREAM_HPP asio-1.12.2/include/asio/buffered_stream_fwd.hpp000066400000000000000000000011441340672067200216230ustar00rootroot00000000000000// // buffered_stream_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERED_STREAM_FWD_HPP #define ASIO_BUFFERED_STREAM_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) namespace asio { template class buffered_stream; } // namespace asio #endif // ASIO_BUFFERED_STREAM_FWD_HPP asio-1.12.2/include/asio/buffered_write_stream.hpp000066400000000000000000000166251340672067200222070ustar00rootroot00000000000000// // buffered_write_stream.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERED_WRITE_STREAM_HPP #define ASIO_BUFFERED_WRITE_STREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/buffered_write_stream_fwd.hpp" #include "asio/buffer.hpp" #include "asio/completion_condition.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffered_stream_storage.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/write.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Adds buffering to the write-related operations of a stream. /** * The buffered_write_stream class template can be used to add buffering to the * synchronous and asynchronous write operations of a stream. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template class buffered_write_stream : private noncopyable { public: /// The type of the next layer. typedef typename remove_reference::type next_layer_type; /// The type of the lowest layer. typedef typename next_layer_type::lowest_layer_type lowest_layer_type; /// The type of the executor associated with the object. typedef typename lowest_layer_type::executor_type executor_type; #if defined(GENERATING_DOCUMENTATION) /// The default buffer size. static const std::size_t default_buffer_size = implementation_defined; #else ASIO_STATIC_CONSTANT(std::size_t, default_buffer_size = 1024); #endif /// Construct, passing the specified argument to initialise the next layer. template explicit buffered_write_stream(Arg& a) : next_layer_(a), storage_(default_buffer_size) { } /// Construct, passing the specified argument to initialise the next layer. template buffered_write_stream(Arg& a, std::size_t buffer_size) : next_layer_(a), storage_(buffer_size) { } /// Get a reference to the next layer. next_layer_type& next_layer() { return next_layer_; } /// Get a reference to the lowest layer. lowest_layer_type& lowest_layer() { return next_layer_.lowest_layer(); } /// Get a const reference to the lowest layer. const lowest_layer_type& lowest_layer() const { return next_layer_.lowest_layer(); } /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return next_layer_.lowest_layer().get_executor(); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_context() { return next_layer_.get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_service() { return next_layer_.get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Close the stream. void close() { next_layer_.close(); } /// Close the stream. ASIO_SYNC_OP_VOID close(asio::error_code& ec) { next_layer_.close(ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Flush all data from the buffer to the next layer. Returns the number of /// bytes written to the next layer on the last write operation. Throws an /// exception on failure. std::size_t flush(); /// Flush all data from the buffer to the next layer. Returns the number of /// bytes written to the next layer on the last write operation, or 0 if an /// error occurred. std::size_t flush(asio::error_code& ec); /// Start an asynchronous flush. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_flush(ASIO_MOVE_ARG(WriteHandler) handler); /// Write the given data to the stream. Returns the number of bytes written. /// Throws an exception on failure. template std::size_t write_some(const ConstBufferSequence& buffers); /// Write the given data to the stream. Returns the number of bytes written, /// or 0 if an error occurred and the error handler did not throw. template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec); /// Start an asynchronous write. The data being written must be valid for the /// lifetime of the asynchronous operation. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler); /// Read some data from the stream. Returns the number of bytes read. Throws /// an exception on failure. template std::size_t read_some(const MutableBufferSequence& buffers) { return next_layer_.read_some(buffers); } /// Read some data from the stream. Returns the number of bytes read or 0 if /// an error occurred. template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return next_layer_.read_some(buffers, ec); } /// Start an asynchronous read. The buffer into which the data will be read /// must be valid for the lifetime of the asynchronous operation. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { return next_layer_.async_read_some(buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); } /// Peek at the incoming data on the stream. Returns the number of bytes read. /// Throws an exception on failure. template std::size_t peek(const MutableBufferSequence& buffers) { return next_layer_.peek(buffers); } /// Peek at the incoming data on the stream. Returns the number of bytes read, /// or 0 if an error occurred. template std::size_t peek(const MutableBufferSequence& buffers, asio::error_code& ec) { return next_layer_.peek(buffers, ec); } /// Determine the amount of data that may be read without blocking. std::size_t in_avail() { return next_layer_.in_avail(); } /// Determine the amount of data that may be read without blocking. std::size_t in_avail(asio::error_code& ec) { return next_layer_.in_avail(ec); } private: /// Copy data into the internal buffer from the specified source buffer. /// Returns the number of bytes copied. template std::size_t copy(const ConstBufferSequence& buffers); /// The next layer. Stream next_layer_; // The data in the buffer. detail::buffered_stream_storage storage_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/buffered_write_stream.hpp" #endif // ASIO_BUFFERED_WRITE_STREAM_HPP asio-1.12.2/include/asio/buffered_write_stream_fwd.hpp000066400000000000000000000012101340672067200230270ustar00rootroot00000000000000// // buffered_write_stream_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERED_WRITE_STREAM_FWD_HPP #define ASIO_BUFFERED_WRITE_STREAM_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) namespace asio { template class buffered_write_stream; } // namespace asio #endif // ASIO_BUFFERED_WRITE_STREAM_FWD_HPP asio-1.12.2/include/asio/buffers_iterator.hpp000066400000000000000000000330521340672067200211760ustar00rootroot00000000000000// // buffers_iterator.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_BUFFERS_ITERATOR_HPP #define ASIO_BUFFERS_ITERATOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/buffer.hpp" #include "asio/detail/assert.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct buffers_iterator_types_helper; template <> struct buffers_iterator_types_helper { typedef const_buffer buffer_type; template struct byte_type { typedef typename add_const::type type; }; }; template <> struct buffers_iterator_types_helper { typedef mutable_buffer buffer_type; template struct byte_type { typedef ByteType type; }; }; template struct buffers_iterator_types { enum { is_mutable = is_convertible< typename BufferSequence::value_type, mutable_buffer>::value }; typedef buffers_iterator_types_helper helper; typedef typename helper::buffer_type buffer_type; typedef typename helper::template byte_type::type byte_type; typedef typename BufferSequence::const_iterator const_iterator; }; template struct buffers_iterator_types { typedef mutable_buffer buffer_type; typedef ByteType byte_type; typedef const mutable_buffer* const_iterator; }; template struct buffers_iterator_types { typedef const_buffer buffer_type; typedef typename add_const::type byte_type; typedef const const_buffer* const_iterator; }; #if !defined(ASIO_NO_DEPRECATED) template struct buffers_iterator_types { typedef mutable_buffer buffer_type; typedef ByteType byte_type; typedef const mutable_buffer* const_iterator; }; template struct buffers_iterator_types { typedef const_buffer buffer_type; typedef typename add_const::type byte_type; typedef const const_buffer* const_iterator; }; #endif // !defined(ASIO_NO_DEPRECATED) } /// A random access iterator over the bytes in a buffer sequence. template class buffers_iterator { private: typedef typename detail::buffers_iterator_types< BufferSequence, ByteType>::buffer_type buffer_type; typedef typename detail::buffers_iterator_types::const_iterator buffer_sequence_iterator_type; public: /// The type used for the distance between two iterators. typedef std::ptrdiff_t difference_type; /// The type of the value pointed to by the iterator. typedef ByteType value_type; #if defined(GENERATING_DOCUMENTATION) /// The type of the result of applying operator->() to the iterator. /** * If the buffer sequence stores buffer objects that are convertible to * mutable_buffer, this is a pointer to a non-const ByteType. Otherwise, a * pointer to a const ByteType. */ typedef const_or_non_const_ByteType* pointer; #else // defined(GENERATING_DOCUMENTATION) typedef typename detail::buffers_iterator_types< BufferSequence, ByteType>::byte_type* pointer; #endif // defined(GENERATING_DOCUMENTATION) #if defined(GENERATING_DOCUMENTATION) /// The type of the result of applying operator*() to the iterator. /** * If the buffer sequence stores buffer objects that are convertible to * mutable_buffer, this is a reference to a non-const ByteType. Otherwise, a * reference to a const ByteType. */ typedef const_or_non_const_ByteType& reference; #else // defined(GENERATING_DOCUMENTATION) typedef typename detail::buffers_iterator_types< BufferSequence, ByteType>::byte_type& reference; #endif // defined(GENERATING_DOCUMENTATION) /// The iterator category. typedef std::random_access_iterator_tag iterator_category; /// Default constructor. Creates an iterator in an undefined state. buffers_iterator() : current_buffer_(), current_buffer_position_(0), begin_(), current_(), end_(), position_(0) { } /// Construct an iterator representing the beginning of the buffers' data. static buffers_iterator begin(const BufferSequence& buffers) #if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) __attribute__ ((__noinline__)) #endif // defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) { buffers_iterator new_iter; new_iter.begin_ = asio::buffer_sequence_begin(buffers); new_iter.current_ = asio::buffer_sequence_begin(buffers); new_iter.end_ = asio::buffer_sequence_end(buffers); while (new_iter.current_ != new_iter.end_) { new_iter.current_buffer_ = *new_iter.current_; if (new_iter.current_buffer_.size() > 0) break; ++new_iter.current_; } return new_iter; } /// Construct an iterator representing the end of the buffers' data. static buffers_iterator end(const BufferSequence& buffers) #if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) __attribute__ ((__noinline__)) #endif // defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) { buffers_iterator new_iter; new_iter.begin_ = asio::buffer_sequence_begin(buffers); new_iter.current_ = asio::buffer_sequence_begin(buffers); new_iter.end_ = asio::buffer_sequence_end(buffers); while (new_iter.current_ != new_iter.end_) { buffer_type buffer = *new_iter.current_; new_iter.position_ += buffer.size(); ++new_iter.current_; } return new_iter; } /// Dereference an iterator. reference operator*() const { return dereference(); } /// Dereference an iterator. pointer operator->() const { return &dereference(); } /// Access an individual element. reference operator[](std::ptrdiff_t difference) const { buffers_iterator tmp(*this); tmp.advance(difference); return *tmp; } /// Increment operator (prefix). buffers_iterator& operator++() { increment(); return *this; } /// Increment operator (postfix). buffers_iterator operator++(int) { buffers_iterator tmp(*this); ++*this; return tmp; } /// Decrement operator (prefix). buffers_iterator& operator--() { decrement(); return *this; } /// Decrement operator (postfix). buffers_iterator operator--(int) { buffers_iterator tmp(*this); --*this; return tmp; } /// Addition operator. buffers_iterator& operator+=(std::ptrdiff_t difference) { advance(difference); return *this; } /// Subtraction operator. buffers_iterator& operator-=(std::ptrdiff_t difference) { advance(-difference); return *this; } /// Addition operator. friend buffers_iterator operator+(const buffers_iterator& iter, std::ptrdiff_t difference) { buffers_iterator tmp(iter); tmp.advance(difference); return tmp; } /// Addition operator. friend buffers_iterator operator+(std::ptrdiff_t difference, const buffers_iterator& iter) { buffers_iterator tmp(iter); tmp.advance(difference); return tmp; } /// Subtraction operator. friend buffers_iterator operator-(const buffers_iterator& iter, std::ptrdiff_t difference) { buffers_iterator tmp(iter); tmp.advance(-difference); return tmp; } /// Subtraction operator. friend std::ptrdiff_t operator-(const buffers_iterator& a, const buffers_iterator& b) { return b.distance_to(a); } /// Test two iterators for equality. friend bool operator==(const buffers_iterator& a, const buffers_iterator& b) { return a.equal(b); } /// Test two iterators for inequality. friend bool operator!=(const buffers_iterator& a, const buffers_iterator& b) { return !a.equal(b); } /// Compare two iterators. friend bool operator<(const buffers_iterator& a, const buffers_iterator& b) { return a.distance_to(b) > 0; } /// Compare two iterators. friend bool operator<=(const buffers_iterator& a, const buffers_iterator& b) { return !(b < a); } /// Compare two iterators. friend bool operator>(const buffers_iterator& a, const buffers_iterator& b) { return b < a; } /// Compare two iterators. friend bool operator>=(const buffers_iterator& a, const buffers_iterator& b) { return !(a < b); } private: // Dereference the iterator. reference dereference() const { return static_cast( current_buffer_.data())[current_buffer_position_]; } // Compare two iterators for equality. bool equal(const buffers_iterator& other) const { return position_ == other.position_; } // Increment the iterator. void increment() { ASIO_ASSERT(current_ != end_ && "iterator out of bounds"); ++position_; // Check if the increment can be satisfied by the current buffer. ++current_buffer_position_; if (current_buffer_position_ != current_buffer_.size()) return; // Find the next non-empty buffer. ++current_; current_buffer_position_ = 0; while (current_ != end_) { current_buffer_ = *current_; if (current_buffer_.size() > 0) return; ++current_; } } // Decrement the iterator. void decrement() { ASIO_ASSERT(position_ > 0 && "iterator out of bounds"); --position_; // Check if the decrement can be satisfied by the current buffer. if (current_buffer_position_ != 0) { --current_buffer_position_; return; } // Find the previous non-empty buffer. buffer_sequence_iterator_type iter = current_; while (iter != begin_) { --iter; buffer_type buffer = *iter; std::size_t buffer_size = buffer.size(); if (buffer_size > 0) { current_ = iter; current_buffer_ = buffer; current_buffer_position_ = buffer_size - 1; return; } } } // Advance the iterator by the specified distance. void advance(std::ptrdiff_t n) { if (n > 0) { ASIO_ASSERT(current_ != end_ && "iterator out of bounds"); for (;;) { std::ptrdiff_t current_buffer_balance = current_buffer_.size() - current_buffer_position_; // Check if the advance can be satisfied by the current buffer. if (current_buffer_balance > n) { position_ += n; current_buffer_position_ += n; return; } // Update position. n -= current_buffer_balance; position_ += current_buffer_balance; // Move to next buffer. If it is empty then it will be skipped on the // next iteration of this loop. if (++current_ == end_) { ASIO_ASSERT(n == 0 && "iterator out of bounds"); current_buffer_ = buffer_type(); current_buffer_position_ = 0; return; } current_buffer_ = *current_; current_buffer_position_ = 0; } } else if (n < 0) { std::size_t abs_n = -n; ASIO_ASSERT(position_ >= abs_n && "iterator out of bounds"); for (;;) { // Check if the advance can be satisfied by the current buffer. if (current_buffer_position_ >= abs_n) { position_ -= abs_n; current_buffer_position_ -= abs_n; return; } // Update position. abs_n -= current_buffer_position_; position_ -= current_buffer_position_; // Check if we've reached the beginning of the buffers. if (current_ == begin_) { ASIO_ASSERT(abs_n == 0 && "iterator out of bounds"); current_buffer_position_ = 0; return; } // Find the previous non-empty buffer. buffer_sequence_iterator_type iter = current_; while (iter != begin_) { --iter; buffer_type buffer = *iter; std::size_t buffer_size = buffer.size(); if (buffer_size > 0) { current_ = iter; current_buffer_ = buffer; current_buffer_position_ = buffer_size; break; } } } } } // Determine the distance between two iterators. std::ptrdiff_t distance_to(const buffers_iterator& other) const { return other.position_ - position_; } buffer_type current_buffer_; std::size_t current_buffer_position_; buffer_sequence_iterator_type begin_; buffer_sequence_iterator_type current_; buffer_sequence_iterator_type end_; std::size_t position_; }; /// Construct an iterator representing the beginning of the buffers' data. template inline buffers_iterator buffers_begin( const BufferSequence& buffers) { return buffers_iterator::begin(buffers); } /// Construct an iterator representing the end of the buffers' data. template inline buffers_iterator buffers_end( const BufferSequence& buffers) { return buffers_iterator::end(buffers); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_BUFFERS_ITERATOR_HPP asio-1.12.2/include/asio/completion_condition.hpp000066400000000000000000000123271340672067200220520ustar00rootroot00000000000000// // completion_condition.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_COMPLETION_CONDITION_HPP #define ASIO_COMPLETION_CONDITION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // The default maximum number of bytes to transfer in a single operation. enum default_max_transfer_size_t { default_max_transfer_size = 65536 }; // Adapt result of old-style completion conditions (which had a bool result // where true indicated that the operation was complete). inline std::size_t adapt_completion_condition_result(bool result) { return result ? 0 : default_max_transfer_size; } // Adapt result of current completion conditions (which have a size_t result // where 0 means the operation is complete, and otherwise the result is the // maximum number of bytes to transfer on the next underlying operation). inline std::size_t adapt_completion_condition_result(std::size_t result) { return result; } class transfer_all_t { public: typedef std::size_t result_type; template std::size_t operator()(const Error& err, std::size_t) { return !!err ? 0 : default_max_transfer_size; } }; class transfer_at_least_t { public: typedef std::size_t result_type; explicit transfer_at_least_t(std::size_t minimum) : minimum_(minimum) { } template std::size_t operator()(const Error& err, std::size_t bytes_transferred) { return (!!err || bytes_transferred >= minimum_) ? 0 : default_max_transfer_size; } private: std::size_t minimum_; }; class transfer_exactly_t { public: typedef std::size_t result_type; explicit transfer_exactly_t(std::size_t size) : size_(size) { } template std::size_t operator()(const Error& err, std::size_t bytes_transferred) { return (!!err || bytes_transferred >= size_) ? 0 : (size_ - bytes_transferred < default_max_transfer_size ? size_ - bytes_transferred : std::size_t(default_max_transfer_size)); } private: std::size_t size_; }; } // namespace detail /** * @defgroup completion_condition Completion Condition Function Objects * * Function objects used for determining when a read or write operation should * complete. */ /*@{*/ /// Return a completion condition function object that indicates that a read or /// write operation should continue until all of the data has been transferred, /// or until an error occurs. /** * This function is used to create an object, of unspecified type, that meets * CompletionCondition requirements. * * @par Example * Reading until a buffer is full: * @code * boost::array buf; * asio::error_code ec; * std::size_t n = asio::read( * sock, asio::buffer(buf), * asio::transfer_all(), ec); * if (ec) * { * // An error occurred. * } * else * { * // n == 128 * } * @endcode */ #if defined(GENERATING_DOCUMENTATION) unspecified transfer_all(); #else inline detail::transfer_all_t transfer_all() { return detail::transfer_all_t(); } #endif /// Return a completion condition function object that indicates that a read or /// write operation should continue until a minimum number of bytes has been /// transferred, or until an error occurs. /** * This function is used to create an object, of unspecified type, that meets * CompletionCondition requirements. * * @par Example * Reading until a buffer is full or contains at least 64 bytes: * @code * boost::array buf; * asio::error_code ec; * std::size_t n = asio::read( * sock, asio::buffer(buf), * asio::transfer_at_least(64), ec); * if (ec) * { * // An error occurred. * } * else * { * // n >= 64 && n <= 128 * } * @endcode */ #if defined(GENERATING_DOCUMENTATION) unspecified transfer_at_least(std::size_t minimum); #else inline detail::transfer_at_least_t transfer_at_least(std::size_t minimum) { return detail::transfer_at_least_t(minimum); } #endif /// Return a completion condition function object that indicates that a read or /// write operation should continue until an exact number of bytes has been /// transferred, or until an error occurs. /** * This function is used to create an object, of unspecified type, that meets * CompletionCondition requirements. * * @par Example * Reading until a buffer is full or contains exactly 64 bytes: * @code * boost::array buf; * asio::error_code ec; * std::size_t n = asio::read( * sock, asio::buffer(buf), * asio::transfer_exactly(64), ec); * if (ec) * { * // An error occurred. * } * else * { * // n == 64 * } * @endcode */ #if defined(GENERATING_DOCUMENTATION) unspecified transfer_exactly(std::size_t size); #else inline detail::transfer_exactly_t transfer_exactly(std::size_t size) { return detail::transfer_exactly_t(size); } #endif /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_COMPLETION_CONDITION_HPP asio-1.12.2/include/asio/connect.hpp000066400000000000000000001177261340672067200172750ustar00rootroot00000000000000// // connect.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_CONNECT_HPP #define ASIO_CONNECT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/basic_socket.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { char (&has_iterator_helper(...))[2]; template char has_iterator_helper(T*, typename T::iterator* = 0); template struct has_iterator_typedef { enum { value = (sizeof((has_iterator_helper)((T*)(0))) == 1) }; }; } // namespace detail /// Type trait used to determine whether a type is an endpoint sequence that can /// be used with with @c connect and @c async_connect. template struct is_endpoint_sequence { #if defined(GENERATING_DOCUMENTATION) /// The value member is true if the type may be used as an endpoint sequence. static const bool value; #else enum { value = detail::has_iterator_typedef::value }; #endif }; /** * @defgroup connect asio::connect * * @brief The @c connect function is a composed operation that establishes a * socket connection by trying each endpoint in a sequence. */ /*@{*/ /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param endpoints A sequence of endpoints. * * @returns The successfully connected endpoint. * * @throws asio::system_error Thrown on failure. If the sequence is * empty, the associated @c error_code is asio::error::not_found. * Otherwise, contains the error from the last connection attempt. * * @par Example * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * asio::connect(s, r.resolve(q)); @endcode */ template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, typename enable_if::value>::type* = 0); /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param endpoints A sequence of endpoints. * * @param ec Set to indicate what error occurred, if any. If the sequence is * empty, set to asio::error::not_found. Otherwise, contains the error * from the last connection attempt. * * @returns On success, the successfully connected endpoint. Otherwise, a * default-constructed endpoint. * * @par Example * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * asio::error_code ec; * asio::connect(s, r.resolve(q), ec); * if (ec) * { * // An error occurred. * } @endcode */ template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, asio::error_code& ec, typename enable_if::value>::type* = 0); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use range overload.) Establishes a socket connection by trying /// each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @returns On success, an iterator denoting the successfully connected * endpoint. Otherwise, the end iterator. * * @throws asio::system_error Thrown on failure. If the sequence is * empty, the associated @c error_code is asio::error::not_found. * Otherwise, contains the error from the last connection attempt. * * @note This overload assumes that a default constructed object of type @c * Iterator represents the end of the sequence. This is a valid assumption for * iterator types such as @c asio::ip::tcp::resolver::iterator. */ template Iterator connect(basic_socket& s, Iterator begin, typename enable_if::value>::type* = 0); /// (Deprecated: Use range overload.) Establishes a socket connection by trying /// each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param ec Set to indicate what error occurred, if any. If the sequence is * empty, set to asio::error::not_found. Otherwise, contains the error * from the last connection attempt. * * @returns On success, an iterator denoting the successfully connected * endpoint. Otherwise, the end iterator. * * @note This overload assumes that a default constructed object of type @c * Iterator represents the end of the sequence. This is a valid assumption for * iterator types such as @c asio::ip::tcp::resolver::iterator. */ template Iterator connect(basic_socket& s, Iterator begin, asio::error_code& ec, typename enable_if::value>::type* = 0); #endif // !defined(ASIO_NO_DEPRECATED) /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param end An iterator pointing to the end of a sequence of endpoints. * * @returns An iterator denoting the successfully connected endpoint. * * @throws asio::system_error Thrown on failure. If the sequence is * empty, the associated @c error_code is asio::error::not_found. * Otherwise, contains the error from the last connection attempt. * * @par Example * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::resolver::results_type e = r.resolve(q); * tcp::socket s(io_context); * asio::connect(s, e.begin(), e.end()); @endcode */ template Iterator connect(basic_socket& s, Iterator begin, Iterator end); /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param end An iterator pointing to the end of a sequence of endpoints. * * @param ec Set to indicate what error occurred, if any. If the sequence is * empty, set to asio::error::not_found. Otherwise, contains the error * from the last connection attempt. * * @returns On success, an iterator denoting the successfully connected * endpoint. Otherwise, the end iterator. * * @par Example * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::resolver::results_type e = r.resolve(q); * tcp::socket s(io_context); * asio::error_code ec; * asio::connect(s, e.begin(), e.end(), ec); * if (ec) * { * // An error occurred. * } @endcode */ template Iterator connect(basic_socket& s, Iterator begin, Iterator end, asio::error_code& ec); /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param endpoints A sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @returns The successfully connected endpoint. * * @throws asio::system_error Thrown on failure. If the sequence is * empty, the associated @c error_code is asio::error::not_found. * Otherwise, contains the error from the last connection attempt. * * @par Example * The following connect condition function object can be used to output * information about the individual connection attempts: * @code struct my_connect_condition * { * bool operator()( * const asio::error_code& ec, * const::tcp::endpoint& next) * { * if (ec) std::cout << "Error: " << ec.message() << std::endl; * std::cout << "Trying: " << next << std::endl; * return true; * } * }; @endcode * It would be used with the asio::connect function as follows: * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * tcp::endpoint e = asio::connect(s, * r.resolve(q), my_connect_condition()); * std::cout << "Connected to: " << e << std::endl; @endcode */ template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, ConnectCondition connect_condition, typename enable_if::value>::type* = 0); /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param endpoints A sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @param ec Set to indicate what error occurred, if any. If the sequence is * empty, set to asio::error::not_found. Otherwise, contains the error * from the last connection attempt. * * @returns On success, the successfully connected endpoint. Otherwise, a * default-constructed endpoint. * * @par Example * The following connect condition function object can be used to output * information about the individual connection attempts: * @code struct my_connect_condition * { * bool operator()( * const asio::error_code& ec, * const::tcp::endpoint& next) * { * if (ec) std::cout << "Error: " << ec.message() << std::endl; * std::cout << "Trying: " << next << std::endl; * return true; * } * }; @endcode * It would be used with the asio::connect function as follows: * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * asio::error_code ec; * tcp::endpoint e = asio::connect(s, * r.resolve(q), my_connect_condition(), ec); * if (ec) * { * // An error occurred. * } * else * { * std::cout << "Connected to: " << e << std::endl; * } @endcode */ template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, ConnectCondition connect_condition, asio::error_code& ec, typename enable_if::value>::type* = 0); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use range overload.) Establishes a socket connection by trying /// each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @returns On success, an iterator denoting the successfully connected * endpoint. Otherwise, the end iterator. * * @throws asio::system_error Thrown on failure. If the sequence is * empty, the associated @c error_code is asio::error::not_found. * Otherwise, contains the error from the last connection attempt. * * @note This overload assumes that a default constructed object of type @c * Iterator represents the end of the sequence. This is a valid assumption for * iterator types such as @c asio::ip::tcp::resolver::iterator. */ template Iterator connect(basic_socket& s, Iterator begin, ConnectCondition connect_condition, typename enable_if::value>::type* = 0); /// (Deprecated: Use range overload.) Establishes a socket connection by trying /// each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @param ec Set to indicate what error occurred, if any. If the sequence is * empty, set to asio::error::not_found. Otherwise, contains the error * from the last connection attempt. * * @returns On success, an iterator denoting the successfully connected * endpoint. Otherwise, the end iterator. * * @note This overload assumes that a default constructed object of type @c * Iterator represents the end of the sequence. This is a valid assumption for * iterator types such as @c asio::ip::tcp::resolver::iterator. */ template Iterator connect(basic_socket& s, Iterator begin, ConnectCondition connect_condition, asio::error_code& ec, typename enable_if::value>::type* = 0); #endif // !defined(ASIO_NO_DEPRECATED) /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param end An iterator pointing to the end of a sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @returns An iterator denoting the successfully connected endpoint. * * @throws asio::system_error Thrown on failure. If the sequence is * empty, the associated @c error_code is asio::error::not_found. * Otherwise, contains the error from the last connection attempt. * * @par Example * The following connect condition function object can be used to output * information about the individual connection attempts: * @code struct my_connect_condition * { * bool operator()( * const asio::error_code& ec, * const::tcp::endpoint& next) * { * if (ec) std::cout << "Error: " << ec.message() << std::endl; * std::cout << "Trying: " << next << std::endl; * return true; * } * }; @endcode * It would be used with the asio::connect function as follows: * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::resolver::results_type e = r.resolve(q); * tcp::socket s(io_context); * tcp::resolver::results_type::iterator i = asio::connect( * s, e.begin(), e.end(), my_connect_condition()); * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode */ template Iterator connect(basic_socket& s, Iterator begin, Iterator end, ConnectCondition connect_condition); /// Establishes a socket connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c connect member * function, once for each endpoint in the sequence, until a connection is * successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param end An iterator pointing to the end of a sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @param ec Set to indicate what error occurred, if any. If the sequence is * empty, set to asio::error::not_found. Otherwise, contains the error * from the last connection attempt. * * @returns On success, an iterator denoting the successfully connected * endpoint. Otherwise, the end iterator. * * @par Example * The following connect condition function object can be used to output * information about the individual connection attempts: * @code struct my_connect_condition * { * bool operator()( * const asio::error_code& ec, * const::tcp::endpoint& next) * { * if (ec) std::cout << "Error: " << ec.message() << std::endl; * std::cout << "Trying: " << next << std::endl; * return true; * } * }; @endcode * It would be used with the asio::connect function as follows: * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::resolver::results_type e = r.resolve(q); * tcp::socket s(io_context); * asio::error_code ec; * tcp::resolver::results_type::iterator i = asio::connect( * s, e.begin(), e.end(), my_connect_condition()); * if (ec) * { * // An error occurred. * } * else * { * std::cout << "Connected to: " << i->endpoint() << std::endl; * } @endcode */ template Iterator connect(basic_socket& s, Iterator begin, Iterator end, ConnectCondition connect_condition, asio::error_code& ec); /*@}*/ /** * @defgroup async_connect asio::async_connect * * @brief The @c async_connect function is a composed asynchronous operation * that establishes a socket connection by trying each endpoint in a sequence. */ /*@{*/ /// Asynchronously establishes a socket connection by trying each endpoint in a /// sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c async_connect * member function, once for each endpoint in the sequence, until a connection * is successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param endpoints A sequence of endpoints. * * @param handler The handler to be called when the connect operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * // Result of operation. if the sequence is empty, set to * // asio::error::not_found. Otherwise, contains the * // error from the last connection attempt. * const asio::error_code& error, * * // On success, the successfully connected endpoint. * // Otherwise, a default-constructed endpoint. * const typename Protocol::endpoint& endpoint * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * * // ... * * r.async_resolve(q, resolve_handler); * * // ... * * void resolve_handler( * const asio::error_code& ec, * tcp::resolver::results_type results) * { * if (!ec) * { * asio::async_connect(s, results, connect_handler); * } * } * * // ... * * void connect_handler( * const asio::error_code& ec, * const tcp::endpoint& endpoint) * { * // ... * } @endcode */ template ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, void (asio::error_code, typename Protocol::endpoint)) async_connect(basic_socket& s, const EndpointSequence& endpoints, ASIO_MOVE_ARG(RangeConnectHandler) handler, typename enable_if::value>::type* = 0); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use range overload.) Asynchronously establishes a socket /// connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c async_connect * member function, once for each endpoint in the sequence, until a connection * is successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param handler The handler to be called when the connect operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * // Result of operation. if the sequence is empty, set to * // asio::error::not_found. Otherwise, contains the * // error from the last connection attempt. * const asio::error_code& error, * * // On success, an iterator denoting the successfully * // connected endpoint. Otherwise, the end iterator. * Iterator iterator * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note This overload assumes that a default constructed object of type @c * Iterator represents the end of the sequence. This is a valid assumption for * iterator types such as @c asio::ip::tcp::resolver::iterator. */ template ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler, typename enable_if::value>::type* = 0); #endif // !defined(ASIO_NO_DEPRECATED) /// Asynchronously establishes a socket connection by trying each endpoint in a /// sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c async_connect * member function, once for each endpoint in the sequence, until a connection * is successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param end An iterator pointing to the end of a sequence of endpoints. * * @param handler The handler to be called when the connect operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * // Result of operation. if the sequence is empty, set to * // asio::error::not_found. Otherwise, contains the * // error from the last connection attempt. * const asio::error_code& error, * * // On success, an iterator denoting the successfully * // connected endpoint. Otherwise, the end iterator. * Iterator iterator * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code std::vector endpoints = ...; * tcp::socket s(io_context); * asio::async_connect(s, * endpoints.begin(), endpoints.end(), * connect_handler); * * // ... * * void connect_handler( * const asio::error_code& ec, * std::vector::iterator i) * { * // ... * } @endcode */ template ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, Iterator end, ASIO_MOVE_ARG(IteratorConnectHandler) handler); /// Asynchronously establishes a socket connection by trying each endpoint in a /// sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c async_connect * member function, once for each endpoint in the sequence, until a connection * is successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param endpoints A sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @param handler The handler to be called when the connect operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * // Result of operation. if the sequence is empty, set to * // asio::error::not_found. Otherwise, contains the * // error from the last connection attempt. * const asio::error_code& error, * * // On success, an iterator denoting the successfully * // connected endpoint. Otherwise, the end iterator. * Iterator iterator * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * The following connect condition function object can be used to output * information about the individual connection attempts: * @code struct my_connect_condition * { * bool operator()( * const asio::error_code& ec, * const::tcp::endpoint& next) * { * if (ec) std::cout << "Error: " << ec.message() << std::endl; * std::cout << "Trying: " << next << std::endl; * return true; * } * }; @endcode * It would be used with the asio::connect function as follows: * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * * // ... * * r.async_resolve(q, resolve_handler); * * // ... * * void resolve_handler( * const asio::error_code& ec, * tcp::resolver::results_type results) * { * if (!ec) * { * asio::async_connect(s, results, * my_connect_condition(), * connect_handler); * } * } * * // ... * * void connect_handler( * const asio::error_code& ec, * const tcp::endpoint& endpoint) * { * if (ec) * { * // An error occurred. * } * else * { * std::cout << "Connected to: " << endpoint << std::endl; * } * } @endcode */ template ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, void (asio::error_code, typename Protocol::endpoint)) async_connect(basic_socket& s, const EndpointSequence& endpoints, ConnectCondition connect_condition, ASIO_MOVE_ARG(RangeConnectHandler) handler, typename enable_if::value>::type* = 0); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use range overload.) Asynchronously establishes a socket /// connection by trying each endpoint in a sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c async_connect * member function, once for each endpoint in the sequence, until a connection * is successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @param handler The handler to be called when the connect operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * // Result of operation. if the sequence is empty, set to * // asio::error::not_found. Otherwise, contains the * // error from the last connection attempt. * const asio::error_code& error, * * // On success, an iterator denoting the successfully * // connected endpoint. Otherwise, the end iterator. * Iterator iterator * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note This overload assumes that a default constructed object of type @c * Iterator represents the end of the sequence. This is a valid assumption for * iterator types such as @c asio::ip::tcp::resolver::iterator. */ template ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, ConnectCondition connect_condition, ASIO_MOVE_ARG(IteratorConnectHandler) handler, typename enable_if::value>::type* = 0); #endif // !defined(ASIO_NO_DEPRECATED) /// Asynchronously establishes a socket connection by trying each endpoint in a /// sequence. /** * This function attempts to connect a socket to one of a sequence of * endpoints. It does this by repeated calls to the socket's @c async_connect * member function, once for each endpoint in the sequence, until a connection * is successfully established. * * @param s The socket to be connected. If the socket is already open, it will * be closed. * * @param begin An iterator pointing to the start of a sequence of endpoints. * * @param end An iterator pointing to the end of a sequence of endpoints. * * @param connect_condition A function object that is called prior to each * connection attempt. The signature of the function object must be: * @code bool connect_condition( * const asio::error_code& ec, * const typename Protocol::endpoint& next); @endcode * The @c ec parameter contains the result from the most recent connect * operation. Before the first connection attempt, @c ec is always set to * indicate success. The @c next parameter is the next endpoint to be tried. * The function object should return true if the next endpoint should be tried, * and false if it should be skipped. * * @param handler The handler to be called when the connect operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * // Result of operation. if the sequence is empty, set to * // asio::error::not_found. Otherwise, contains the * // error from the last connection attempt. * const asio::error_code& error, * * // On success, an iterator denoting the successfully * // connected endpoint. Otherwise, the end iterator. * Iterator iterator * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * The following connect condition function object can be used to output * information about the individual connection attempts: * @code struct my_connect_condition * { * bool operator()( * const asio::error_code& ec, * const::tcp::endpoint& next) * { * if (ec) std::cout << "Error: " << ec.message() << std::endl; * std::cout << "Trying: " << next << std::endl; * return true; * } * }; @endcode * It would be used with the asio::connect function as follows: * @code tcp::resolver r(io_context); * tcp::resolver::query q("host", "service"); * tcp::socket s(io_context); * * // ... * * r.async_resolve(q, resolve_handler); * * // ... * * void resolve_handler( * const asio::error_code& ec, * tcp::resolver::iterator i) * { * if (!ec) * { * tcp::resolver::iterator end; * asio::async_connect(s, i, end, * my_connect_condition(), * connect_handler); * } * } * * // ... * * void connect_handler( * const asio::error_code& ec, * tcp::resolver::iterator i) * { * if (ec) * { * // An error occurred. * } * else * { * std::cout << "Connected to: " << i->endpoint() << std::endl; * } * } @endcode */ template ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, Iterator end, ConnectCondition connect_condition, ASIO_MOVE_ARG(IteratorConnectHandler) handler); /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/connect.hpp" #endif asio-1.12.2/include/asio/coroutine.hpp000066400000000000000000000230101340672067200176310ustar00rootroot00000000000000// // coroutine.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_COROUTINE_HPP #define ASIO_COROUTINE_HPP namespace asio { namespace detail { class coroutine_ref; } // namespace detail /// Provides support for implementing stackless coroutines. /** * The @c coroutine class may be used to implement stackless coroutines. The * class itself is used to store the current state of the coroutine. * * Coroutines are copy-constructible and assignable, and the space overhead is * a single int. They can be used as a base class: * * @code class session : coroutine * { * ... * }; @endcode * * or as a data member: * * @code class session * { * ... * coroutine coro_; * }; @endcode * * or even bound in as a function argument using lambdas or @c bind(). The * important thing is that as the application maintains a copy of the object * for as long as the coroutine must be kept alive. * * @par Pseudo-keywords * * A coroutine is used in conjunction with certain "pseudo-keywords", which * are implemented as macros. These macros are defined by a header file: * * @code #include @endcode * * and may conversely be undefined as follows: * * @code #include @endcode * * reenter * * The @c reenter macro is used to define the body of a coroutine. It takes a * single argument: a pointer or reference to a coroutine object. For example, * if the base class is a coroutine object you may write: * * @code reenter (this) * { * ... coroutine body ... * } @endcode * * and if a data member or other variable you can write: * * @code reenter (coro_) * { * ... coroutine body ... * } @endcode * * When @c reenter is executed at runtime, control jumps to the location of the * last @c yield or @c fork. * * The coroutine body may also be a single statement, such as: * * @code reenter (this) for (;;) * { * ... * } @endcode * * @b Limitation: The @c reenter macro is implemented using a switch. This * means that you must take care when using local variables within the * coroutine body. The local variable is not allowed in a position where * reentering the coroutine could bypass the variable definition. * * yield statement * * This form of the @c yield keyword is often used with asynchronous operations: * * @code yield socket_->async_read_some(buffer(*buffer_), *this); @endcode * * This divides into four logical steps: * * @li @c yield saves the current state of the coroutine. * @li The statement initiates the asynchronous operation. * @li The resume point is defined immediately following the statement. * @li Control is transferred to the end of the coroutine body. * * When the asynchronous operation completes, the function object is invoked * and @c reenter causes control to transfer to the resume point. It is * important to remember to carry the coroutine state forward with the * asynchronous operation. In the above snippet, the current class is a * function object object with a coroutine object as base class or data member. * * The statement may also be a compound statement, and this permits us to * define local variables with limited scope: * * @code yield * { * mutable_buffers_1 b = buffer(*buffer_); * socket_->async_read_some(b, *this); * } @endcode * * yield return expression ; * * This form of @c yield is often used in generators or coroutine-based parsers. * For example, the function object: * * @code struct interleave : coroutine * { * istream& is1; * istream& is2; * char operator()(char c) * { * reenter (this) for (;;) * { * yield return is1.get(); * yield return is2.get(); * } * } * }; @endcode * * defines a trivial coroutine that interleaves the characters from two input * streams. * * This type of @c yield divides into three logical steps: * * @li @c yield saves the current state of the coroutine. * @li The resume point is defined immediately following the semicolon. * @li The value of the expression is returned from the function. * * yield ; * * This form of @c yield is equivalent to the following steps: * * @li @c yield saves the current state of the coroutine. * @li The resume point is defined immediately following the semicolon. * @li Control is transferred to the end of the coroutine body. * * This form might be applied when coroutines are used for cooperative * threading and scheduling is explicitly managed. For example: * * @code struct task : coroutine * { * ... * void operator()() * { * reenter (this) * { * while (... not finished ...) * { * ... do something ... * yield; * ... do some more ... * yield; * } * } * } * ... * }; * ... * task t1, t2; * for (;;) * { * t1(); * t2(); * } @endcode * * yield break ; * * The final form of @c yield is used to explicitly terminate the coroutine. * This form is comprised of two steps: * * @li @c yield sets the coroutine state to indicate termination. * @li Control is transferred to the end of the coroutine body. * * Once terminated, calls to is_complete() return true and the coroutine cannot * be reentered. * * Note that a coroutine may also be implicitly terminated if the coroutine * body is exited without a yield, e.g. by return, throw or by running to the * end of the body. * * fork statement * * The @c fork pseudo-keyword is used when "forking" a coroutine, i.e. splitting * it into two (or more) copies. One use of @c fork is in a server, where a new * coroutine is created to handle each client connection: * * @code reenter (this) * { * do * { * socket_.reset(new tcp::socket(io_context_)); * yield acceptor->async_accept(*socket_, *this); * fork server(*this)(); * } while (is_parent()); * ... client-specific handling follows ... * } @endcode * * The logical steps involved in a @c fork are: * * @li @c fork saves the current state of the coroutine. * @li The statement creates a copy of the coroutine and either executes it * immediately or schedules it for later execution. * @li The resume point is defined immediately following the semicolon. * @li For the "parent", control immediately continues from the next line. * * The functions is_parent() and is_child() can be used to differentiate * between parent and child. You would use these functions to alter subsequent * control flow. * * Note that @c fork doesn't do the actual forking by itself. It is the * application's responsibility to create a clone of the coroutine and call it. * The clone can be called immediately, as above, or scheduled for delayed * execution using something like io_context::post(). * * @par Alternate macro names * * If preferred, an application can use macro names that follow a more typical * naming convention, rather than the pseudo-keywords. These are: * * @li @c ASIO_CORO_REENTER instead of @c reenter * @li @c ASIO_CORO_YIELD instead of @c yield * @li @c ASIO_CORO_FORK instead of @c fork */ class coroutine { public: /// Constructs a coroutine in its initial state. coroutine() : value_(0) {} /// Returns true if the coroutine is the child of a fork. bool is_child() const { return value_ < 0; } /// Returns true if the coroutine is the parent of a fork. bool is_parent() const { return !is_child(); } /// Returns true if the coroutine has reached its terminal state. bool is_complete() const { return value_ == -1; } private: friend class detail::coroutine_ref; int value_; }; namespace detail { class coroutine_ref { public: coroutine_ref(coroutine& c) : value_(c.value_), modified_(false) {} coroutine_ref(coroutine* c) : value_(c->value_), modified_(false) {} ~coroutine_ref() { if (!modified_) value_ = -1; } operator int() const { return value_; } int& operator=(int v) { modified_ = true; return value_ = v; } private: void operator=(const coroutine_ref&); int& value_; bool modified_; }; } // namespace detail } // namespace asio #define ASIO_CORO_REENTER(c) \ switch (::asio::detail::coroutine_ref _coro_value = c) \ case -1: if (_coro_value) \ { \ goto terminate_coroutine; \ terminate_coroutine: \ _coro_value = -1; \ goto bail_out_of_coroutine; \ bail_out_of_coroutine: \ break; \ } \ else /* fall-through */ case 0: #define ASIO_CORO_YIELD_IMPL(n) \ for (_coro_value = (n);;) \ if (_coro_value == 0) \ { \ case (n): ; \ break; \ } \ else \ switch (_coro_value ? 0 : 1) \ for (;;) \ /* fall-through */ case -1: if (_coro_value) \ goto terminate_coroutine; \ else for (;;) \ /* fall-through */ case 1: if (_coro_value) \ goto bail_out_of_coroutine; \ else /* fall-through */ case 0: #define ASIO_CORO_FORK_IMPL(n) \ for (_coro_value = -(n);; _coro_value = (n)) \ if (_coro_value == (n)) \ { \ case -(n): ; \ break; \ } \ else #if defined(_MSC_VER) # define ASIO_CORO_YIELD ASIO_CORO_YIELD_IMPL(__COUNTER__ + 1) # define ASIO_CORO_FORK ASIO_CORO_FORK_IMPL(__COUNTER__ + 1) #else // defined(_MSC_VER) # define ASIO_CORO_YIELD ASIO_CORO_YIELD_IMPL(__LINE__) # define ASIO_CORO_FORK ASIO_CORO_FORK_IMPL(__LINE__) #endif // defined(_MSC_VER) #endif // ASIO_COROUTINE_HPP asio-1.12.2/include/asio/datagram_socket_service.hpp000066400000000000000000000343521340672067200225050ustar00rootroot00000000000000// // datagram_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DATAGRAM_SOCKET_SERVICE_HPP #define ASIO_DATAGRAM_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/null_socket_service.hpp" #elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" #else # include "asio/detail/reactive_socket_service.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a datagram socket. template class datagram_socket_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; private: // The type of the platform-specific implementation. #if defined(ASIO_WINDOWS_RUNTIME) typedef detail::null_socket_service service_impl_type; #elif defined(ASIO_HAS_IOCP) typedef detail::win_iocp_socket_service service_impl_type; #else typedef detail::reactive_socket_service service_impl_type; #endif public: /// The type of a datagram socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// The native socket type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new datagram socket service for the specified io_context. explicit datagram_socket_service(asio::io_context& io_context) : asio::detail::service_base< datagram_socket_service >(io_context), service_impl_(io_context) { } /// Construct a new datagram socket implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new datagram socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another datagram socket implementation. void move_assign(implementation_type& impl, datagram_socket_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } // All socket services have access to each other's implementations. template friend class datagram_socket_service; /// Move-construct a new datagram socket implementation from another protocol /// type. template void converting_move_construct(implementation_type& impl, datagram_socket_service& other_service, typename datagram_socket_service< Protocol1>::implementation_type& other_impl, typename enable_if::value>::type* = 0) { service_impl_.template converting_move_construct( impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a datagram socket implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } // Open a new datagram socket implementation. ASIO_SYNC_OP_VOID open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (protocol.type() == ASIO_OS_DEF(SOCK_DGRAM)) service_impl_.open(impl, protocol, ec); else ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native socket to a datagram socket. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { service_impl_.assign(impl, protocol, native_socket, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a datagram socket implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying socket. native_handle_type release(implementation_type& impl, asio::error_code& ec) { return service_impl_.release(impl, ec); } /// Get the native socket implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the socket. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is at the out-of-band data mark. bool at_mark(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.at_mark(impl, ec); } /// Determine the number of bytes available for reading. std::size_t available(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.available(impl, ec); } // Bind the datagram socket to the specified local endpoint. ASIO_SYNC_OP_VOID bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { service_impl_.bind(impl, endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Connect the datagram socket to the specified endpoint. ASIO_SYNC_OP_VOID connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { service_impl_.connect(impl, peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous connect. template ASIO_INITFN_RESULT_TYPE(ConnectHandler, void (asio::error_code)) async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, ASIO_MOVE_ARG(ConnectHandler) handler) { async_completion init(handler); service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); return init.result.get(); } /// Set a socket option. template ASIO_SYNC_OP_VOID set_option(implementation_type& impl, const SettableSocketOption& option, asio::error_code& ec) { service_impl_.set_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get a socket option. template ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, GettableSocketOption& option, asio::error_code& ec) const { service_impl_.get_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the socket. template ASIO_SYNC_OP_VOID io_control(implementation_type& impl, IoControlCommand& command, asio::error_code& ec) { service_impl_.io_control(impl, command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the socket. bool non_blocking(const implementation_type& impl) const { return service_impl_.non_blocking(impl); } /// Sets the non-blocking mode of the socket. ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const implementation_type& impl) const { return service_impl_.native_non_blocking(impl); } /// Sets the non-blocking mode of the native socket implementation. ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.native_non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.local_endpoint(impl, ec); } /// Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.remote_endpoint(impl, ec); } /// Disable sends or receives on the socket. ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, socket_base::shutdown_type what, asio::error_code& ec) { service_impl_.shutdown(impl, what, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the socket to become ready to read, ready to write, or to have /// pending error conditions. ASIO_SYNC_OP_VOID wait(implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { service_impl_.wait(impl, w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the socket to become ready to read, ready to /// write, or to have pending error conditions. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, socket_base::wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, w, init.completion_handler); return init.result.get(); } /// Send the given data to the peer. template std::size_t send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.send(impl, buffers, flags, ec); } /// Start an asynchronous send. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_send(impl, buffers, flags, init.completion_handler); return init.result.get(); } /// Send a datagram to the specified endpoint. template std::size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.send_to(impl, buffers, destination, flags, ec); } /// Start an asynchronous send. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_send_to(impl, buffers, destination, flags, init.completion_handler); return init.result.get(); } /// Receive some data from the peer. template std::size_t receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.receive(impl, buffers, flags, ec); } /// Start an asynchronous receive. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_receive(impl, buffers, flags, init.completion_handler); return init.result.get(); } /// Receive a datagram with the endpoint of the sender. template std::size_t receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.receive_from(impl, buffers, sender_endpoint, flags, ec); } /// Start an asynchronous receive that will get the endpoint of the sender. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_receive_from(impl, buffers, sender_endpoint, flags, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_DATAGRAM_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/deadline_timer.hpp000066400000000000000000000020331340672067200205710ustar00rootroot00000000000000// // deadline_timer.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DEADLINE_TIMER_HPP #define ASIO_DEADLINE_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_DATE_TIME) \ || defined(GENERATING_DOCUMENTATION) #include "asio/detail/socket_types.hpp" // Must come before posix_time. #include "asio/basic_deadline_timer.hpp" #include namespace asio { /// Typedef for the typical usage of timer. Uses a UTC clock. typedef basic_deadline_timer deadline_timer; } // namespace asio #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_DEADLINE_TIMER_HPP asio-1.12.2/include/asio/deadline_timer_service.hpp000066400000000000000000000112521340672067200223140ustar00rootroot00000000000000// // deadline_timer_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DEADLINE_TIMER_SERVICE_HPP #define ASIO_DEADLINE_TIMER_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_BOOST_DATE_TIME) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/async_result.hpp" #include "asio/detail/deadline_timer_service.hpp" #include "asio/io_context.hpp" #include "asio/time_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a timer. template > class deadline_timer_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base< deadline_timer_service > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The time traits type. typedef TimeTraits traits_type; /// The time type. typedef typename traits_type::time_type time_type; /// The duration type. typedef typename traits_type::duration_type duration_type; private: // The type of the platform-specific implementation. typedef detail::deadline_timer_service service_impl_type; public: /// The implementation type of the deadline timer. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// Construct a new timer service for the specified io_context. explicit deadline_timer_service(asio::io_context& io_context) : asio::detail::service_base< deadline_timer_service >(io_context), service_impl_(io_context) { } /// Construct a new timer implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } /// Destroy a timer implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Cancel any asynchronous wait operations associated with the timer. std::size_t cancel(implementation_type& impl, asio::error_code& ec) { return service_impl_.cancel(impl, ec); } /// Cancels one asynchronous wait operation associated with the timer. std::size_t cancel_one(implementation_type& impl, asio::error_code& ec) { return service_impl_.cancel_one(impl, ec); } /// Get the expiry time for the timer as an absolute time. time_type expires_at(const implementation_type& impl) const { return service_impl_.expiry(impl); } /// Set the expiry time for the timer as an absolute time. std::size_t expires_at(implementation_type& impl, const time_type& expiry_time, asio::error_code& ec) { return service_impl_.expires_at(impl, expiry_time, ec); } /// Get the expiry time for the timer relative to now. duration_type expires_from_now(const implementation_type& impl) const { return TimeTraits::subtract(service_impl_.expiry(impl), TimeTraits::now()); } /// Set the expiry time for the timer relative to now. std::size_t expires_from_now(implementation_type& impl, const duration_type& expiry_time, asio::error_code& ec) { return service_impl_.expires_after(impl, expiry_time, ec); } // Perform a blocking wait on the timer. void wait(implementation_type& impl, asio::error_code& ec) { service_impl_.wait(impl, ec); } // Start an asynchronous wait on the timer. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_DEADLINE_TIMER_SERVICE_HPP asio-1.12.2/include/asio/defer.hpp000066400000000000000000000073431340672067200167220ustar00rootroot00000000000000// // defer.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DEFER_HPP #define ASIO_DEFER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/execution_context.hpp" #include "asio/is_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the object's associated * executor. The function object is queued for execution, and is never called * from the current thread prior to returning from defer(). * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with handler(forward(token)). * * @li Constructs an object @c result of type async_result, * initializing the object as result(handler). * * @li Obtains the handler's associated executor object @c ex by performing * get_associated_executor(handler). * * @li Obtains the handler's associated allocator object @c alloc by performing * get_associated_allocator(handler). * * @li Performs ex.defer(std::move(handler), alloc). * * @li Returns result.get(). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( ASIO_MOVE_ARG(CompletionToken) token); /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the specified executor. * The function object is queued for execution, and is never called from the * current thread prior to returning from defer(). * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with handler(forward(token)). * * @li Constructs an object @c result of type async_result, * initializing the object as result(handler). * * @li Obtains the handler's associated executor object @c ex1 by performing * get_associated_executor(handler). * * @li Creates a work object @c w by performing make_work(ex1). * * @li Obtains the handler's associated allocator object @c alloc by performing * get_associated_allocator(handler). * * @li Constructs a function object @c f with a function call operator that * performs ex1.dispatch(std::move(handler), alloc) followed by * w.reset(). * * @li Performs Executor(ex).defer(std::move(f), alloc). * * @li Returns result.get(). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type* = 0); /// Submits a completion token or function object for execution. /** * @returns defer(ctx.get_executor(), forward(token)). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type* = 0); } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/defer.hpp" #endif // ASIO_DEFER_HPP asio-1.12.2/include/asio/detail/000077500000000000000000000000001340672067200163575ustar00rootroot00000000000000asio-1.12.2/include/asio/detail/array.hpp000066400000000000000000000016061340672067200202110ustar00rootroot00000000000000// // detail/array.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_ARRAY_HPP #define ASIO_DETAIL_ARRAY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_ARRAY) # include #else // defined(ASIO_HAS_STD_ARRAY) # include #endif // defined(ASIO_HAS_STD_ARRAY) namespace asio { namespace detail { #if defined(ASIO_HAS_STD_ARRAY) using std::array; #else // defined(ASIO_HAS_STD_ARRAY) using boost::array; #endif // defined(ASIO_HAS_STD_ARRAY) } // namespace detail } // namespace asio #endif // ASIO_DETAIL_ARRAY_HPP asio-1.12.2/include/asio/detail/array_fwd.hpp000066400000000000000000000016221340672067200210470ustar00rootroot00000000000000// // detail/array_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_ARRAY_FWD_HPP #define ASIO_DETAIL_ARRAY_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" namespace boost { template class array; } // namespace boost // Standard library components can't be forward declared, so we'll have to // include the array header. Fortunately, it's fairly lightweight and doesn't // add significantly to the compile time. #if defined(ASIO_HAS_STD_ARRAY) # include #endif // defined(ASIO_HAS_STD_ARRAY) #endif // ASIO_DETAIL_ARRAY_FWD_HPP asio-1.12.2/include/asio/detail/assert.hpp000066400000000000000000000016001340672067200203660ustar00rootroot00000000000000// // detail/assert.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_ASSERT_HPP #define ASIO_DETAIL_ASSERT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_ASSERT) # include #else // defined(ASIO_HAS_BOOST_ASSERT) # include #endif // defined(ASIO_HAS_BOOST_ASSERT) #if defined(ASIO_HAS_BOOST_ASSERT) # define ASIO_ASSERT(expr) BOOST_ASSERT(expr) #else // defined(ASIO_HAS_BOOST_ASSERT) # define ASIO_ASSERT(expr) assert(expr) #endif // defined(ASIO_HAS_BOOST_ASSERT) #endif // ASIO_DETAIL_ASSERT_HPP asio-1.12.2/include/asio/detail/atomic_count.hpp000066400000000000000000000024471340672067200215630ustar00rootroot00000000000000// // detail/atomic_count.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_ATOMIC_COUNT_HPP #define ASIO_DETAIL_ATOMIC_COUNT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) // Nothing to include. #elif defined(ASIO_HAS_STD_ATOMIC) # include #else // defined(ASIO_HAS_STD_ATOMIC) # include #endif // defined(ASIO_HAS_STD_ATOMIC) namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) typedef long atomic_count; inline void increment(atomic_count& a, long b) { a += b; } #elif defined(ASIO_HAS_STD_ATOMIC) typedef std::atomic atomic_count; inline void increment(atomic_count& a, long b) { a += b; } #else // defined(ASIO_HAS_STD_ATOMIC) typedef boost::detail::atomic_count atomic_count; inline void increment(atomic_count& a, long b) { while (b > 0) ++a, --b; } #endif // defined(ASIO_HAS_STD_ATOMIC) } // namespace detail } // namespace asio #endif // ASIO_DETAIL_ATOMIC_COUNT_HPP asio-1.12.2/include/asio/detail/base_from_completion_cond.hpp000066400000000000000000000031531340672067200242630ustar00rootroot00000000000000// // detail/base_from_completion_cond.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_BASE_FROM_COMPLETION_COND_HPP #define ASIO_DETAIL_BASE_FROM_COMPLETION_COND_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/completion_condition.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class base_from_completion_cond { protected: explicit base_from_completion_cond(CompletionCondition completion_condition) : completion_condition_(completion_condition) { } std::size_t check_for_completion( const asio::error_code& ec, std::size_t total_transferred) { return detail::adapt_completion_condition_result( completion_condition_(ec, total_transferred)); } private: CompletionCondition completion_condition_; }; template <> class base_from_completion_cond { protected: explicit base_from_completion_cond(transfer_all_t) { } static std::size_t check_for_completion( const asio::error_code& ec, std::size_t total_transferred) { return transfer_all_t()(ec, total_transferred); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_BASE_FROM_COMPLETION_COND_HPP asio-1.12.2/include/asio/detail/bind_handler.hpp000066400000000000000000000547471340672067200215220ustar00rootroot00000000000000// // detail/bind_handler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_BIND_HANDLER_HPP #define ASIO_DETAIL_BIND_HANDLER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class binder1 { public: template binder1(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1) : handler_(ASIO_MOVE_CAST(T)(handler)), arg1_(arg1) { } binder1(Handler& handler, const Arg1& arg1) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1) { } #if defined(ASIO_HAS_MOVE) binder1(const binder1& other) : handler_(other.handler_), arg1_(other.arg1_) { } binder1(binder1&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { handler_(static_cast(arg1_)); } void operator()() const { handler_(arg1_); } //private: Handler handler_; Arg1 arg1_; }; template inline void* asio_handler_allocate(std::size_t size, binder1* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, binder1* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( binder1* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, binder1* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, binder1* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline binder1::type, Arg1> bind_handler( ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1) { return binder1::type, Arg1>(0, ASIO_MOVE_CAST(Handler)(handler), arg1); } template class binder2 { public: template binder2(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, const Arg2& arg2) : handler_(ASIO_MOVE_CAST(T)(handler)), arg1_(arg1), arg2_(arg2) { } binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1), arg2_(arg2) { } #if defined(ASIO_HAS_MOVE) binder2(const binder2& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_) { } binder2(binder2&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { handler_(static_cast(arg1_), static_cast(arg2_)); } void operator()() const { handler_(arg1_, arg2_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; }; template inline void* asio_handler_allocate(std::size_t size, binder2* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, binder2* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( binder2* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, binder2* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, binder2* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline binder2::type, Arg1, Arg2> bind_handler( ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2) { return binder2::type, Arg1, Arg2>(0, ASIO_MOVE_CAST(Handler)(handler), arg1, arg2); } template class binder3 { public: template binder3(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) : handler_(ASIO_MOVE_CAST(T)(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3) { } binder3(Handler& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3) { } #if defined(ASIO_HAS_MOVE) binder3(const binder3& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_), arg3_(other.arg3_) { } binder3(binder3&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)), arg3_(ASIO_MOVE_CAST(Arg3)(other.arg3_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { handler_(static_cast(arg1_), static_cast(arg2_), static_cast(arg3_)); } void operator()() const { handler_(arg1_, arg2_, arg3_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; Arg3 arg3_; }; template inline void* asio_handler_allocate(std::size_t size, binder3* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, binder3* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( binder3* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, binder3* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, binder3* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline binder3::type, Arg1, Arg2, Arg3> bind_handler( ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { return binder3::type, Arg1, Arg2, Arg3>(0, ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3); } template class binder4 { public: template binder4(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) : handler_(ASIO_MOVE_CAST(T)(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4) { } binder4(Handler& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4) { } #if defined(ASIO_HAS_MOVE) binder4(const binder4& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_), arg3_(other.arg3_), arg4_(other.arg4_) { } binder4(binder4&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)), arg3_(ASIO_MOVE_CAST(Arg3)(other.arg3_)), arg4_(ASIO_MOVE_CAST(Arg4)(other.arg4_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { handler_(static_cast(arg1_), static_cast(arg2_), static_cast(arg3_), static_cast(arg4_)); } void operator()() const { handler_(arg1_, arg2_, arg3_, arg4_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; Arg3 arg3_; Arg4 arg4_; }; template inline void* asio_handler_allocate(std::size_t size, binder4* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, binder4* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( binder4* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, binder4* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, binder4* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline binder4::type, Arg1, Arg2, Arg3, Arg4> bind_handler(ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) { return binder4::type, Arg1, Arg2, Arg3, Arg4>(0, ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4); } template class binder5 { public: template binder5(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) : handler_(ASIO_MOVE_CAST(T)(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5) { } binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1), arg2_(arg2), arg3_(arg3), arg4_(arg4), arg5_(arg5) { } #if defined(ASIO_HAS_MOVE) binder5(const binder5& other) : handler_(other.handler_), arg1_(other.arg1_), arg2_(other.arg2_), arg3_(other.arg3_), arg4_(other.arg4_), arg5_(other.arg5_) { } binder5(binder5&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)), arg3_(ASIO_MOVE_CAST(Arg3)(other.arg3_)), arg4_(ASIO_MOVE_CAST(Arg4)(other.arg4_)), arg5_(ASIO_MOVE_CAST(Arg5)(other.arg5_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { handler_(static_cast(arg1_), static_cast(arg2_), static_cast(arg3_), static_cast(arg4_), static_cast(arg5_)); } void operator()() const { handler_(arg1_, arg2_, arg3_, arg4_, arg5_); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; Arg3 arg3_; Arg4 arg4_; Arg5 arg5_; }; template inline void* asio_handler_allocate(std::size_t size, binder5* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, binder5* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( binder5* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, binder5* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, binder5* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline binder5::type, Arg1, Arg2, Arg3, Arg4, Arg5> bind_handler(ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) { return binder5::type, Arg1, Arg2, Arg3, Arg4, Arg5>(0, ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4, arg5); } #if defined(ASIO_HAS_MOVE) template class move_binder1 { public: move_binder1(int, ASIO_MOVE_ARG(Handler) handler, ASIO_MOVE_ARG(Arg1) arg1) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(ASIO_MOVE_CAST(Arg1)(arg1)) { } move_binder1(move_binder1&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)) { } void operator()() { handler_(ASIO_MOVE_CAST(Arg1)(arg1_)); } //private: Handler handler_; Arg1 arg1_; }; template inline void* asio_handler_allocate(std::size_t size, move_binder1* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, move_binder1* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( move_binder1* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(ASIO_MOVE_ARG(Function) function, move_binder1* this_handler) { asio_handler_invoke_helpers::invoke( ASIO_MOVE_CAST(Function)(function), this_handler->handler_); } template class move_binder2 { public: move_binder2(int, ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, ASIO_MOVE_ARG(Arg2) arg2) : handler_(ASIO_MOVE_CAST(Handler)(handler)), arg1_(arg1), arg2_(ASIO_MOVE_CAST(Arg2)(arg2)) { } move_binder2(move_binder2&& other) : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)) { } void operator()() { handler_(static_cast(arg1_), ASIO_MOVE_CAST(Arg2)(arg2_)); } //private: Handler handler_; Arg1 arg1_; Arg2 arg2_; }; template inline void* asio_handler_allocate(std::size_t size, move_binder2* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, move_binder2* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( move_binder2* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(ASIO_MOVE_ARG(Function) function, move_binder2* this_handler) { asio_handler_invoke_helpers::invoke( ASIO_MOVE_CAST(Function)(function), this_handler->handler_); } #endif // defined(ASIO_HAS_MOVE) } // namespace detail template struct associated_allocator, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::binder1& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_allocator, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::binder2& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor, Executor> { typedef typename associated_executor::type type; static type get(const detail::binder1& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; template struct associated_executor, Executor> { typedef typename associated_executor::type type; static type get(const detail::binder2& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #if defined(ASIO_HAS_MOVE) template struct associated_allocator, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::move_binder1& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_allocator< detail::move_binder2, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::move_binder2& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor, Executor> { typedef typename associated_executor::type type; static type get(const detail::move_binder1& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; template struct associated_executor, Executor> { typedef typename associated_executor::type type; static type get(const detail::move_binder2& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // defined(ASIO_HAS_MOVE) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_BIND_HANDLER_HPP asio-1.12.2/include/asio/detail/buffer_resize_guard.hpp000066400000000000000000000027501340672067200231100ustar00rootroot00000000000000// // detail/buffer_resize_guard.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP #define ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper class to manage buffer resizing in an exception safe way. template class buffer_resize_guard { public: // Constructor. buffer_resize_guard(Buffer& buffer) : buffer_(buffer), old_size_(buffer.size()) { } // Destructor rolls back the buffer resize unless commit was called. ~buffer_resize_guard() { if (old_size_ != (std::numeric_limits::max)()) { buffer_.resize(old_size_); } } // Commit the resize transaction. void commit() { old_size_ = (std::numeric_limits::max)(); } private: // The buffer being managed. Buffer& buffer_; // The size of the buffer at the time the guard was constructed. size_t old_size_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP asio-1.12.2/include/asio/detail/buffer_sequence_adapter.hpp000066400000000000000000000276721340672067200237470ustar00rootroot00000000000000// // detail/buffer_sequence_adapter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP #define ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/buffer.hpp" #include "asio/detail/array_fwd.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class buffer_sequence_adapter_base { #if defined(ASIO_WINDOWS_RUNTIME) public: // The maximum number of buffers to support in a single operation. enum { max_buffers = 1 }; protected: typedef Windows::Storage::Streams::IBuffer^ native_buffer_type; ASIO_DECL static void init_native_buffer( native_buffer_type& buf, const asio::mutable_buffer& buffer); ASIO_DECL static void init_native_buffer( native_buffer_type& buf, const asio::const_buffer& buffer); #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) public: // The maximum number of buffers to support in a single operation. enum { max_buffers = 64 < max_iov_len ? 64 : max_iov_len }; protected: typedef WSABUF native_buffer_type; static void init_native_buffer(WSABUF& buf, const asio::mutable_buffer& buffer) { buf.buf = static_cast(buffer.data()); buf.len = static_cast(buffer.size()); } static void init_native_buffer(WSABUF& buf, const asio::const_buffer& buffer) { buf.buf = const_cast(static_cast(buffer.data())); buf.len = static_cast(buffer.size()); } #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) public: // The maximum number of buffers to support in a single operation. enum { max_buffers = 64 < max_iov_len ? 64 : max_iov_len }; protected: typedef iovec native_buffer_type; static void init_iov_base(void*& base, void* addr) { base = addr; } template static void init_iov_base(T& base, void* addr) { base = static_cast(addr); } static void init_native_buffer(iovec& iov, const asio::mutable_buffer& buffer) { init_iov_base(iov.iov_base, buffer.data()); iov.iov_len = buffer.size(); } static void init_native_buffer(iovec& iov, const asio::const_buffer& buffer) { init_iov_base(iov.iov_base, const_cast(buffer.data())); iov.iov_len = buffer.size(); } #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) }; // Helper class to translate buffers into the native buffer representation. template class buffer_sequence_adapter : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter(const Buffers& buffer_sequence) : count_(0), total_buffer_size_(0) { buffer_sequence_adapter::init( asio::buffer_sequence_begin(buffer_sequence), asio::buffer_sequence_end(buffer_sequence)); } native_buffer_type* buffers() { return buffers_; } std::size_t count() const { return count_; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const Buffers& buffer_sequence) { return buffer_sequence_adapter::all_empty( asio::buffer_sequence_begin(buffer_sequence), asio::buffer_sequence_end(buffer_sequence)); } static void validate(const Buffers& buffer_sequence) { buffer_sequence_adapter::validate( asio::buffer_sequence_begin(buffer_sequence), asio::buffer_sequence_end(buffer_sequence)); } static Buffer first(const Buffers& buffer_sequence) { return buffer_sequence_adapter::first( asio::buffer_sequence_begin(buffer_sequence), asio::buffer_sequence_end(buffer_sequence)); } private: template void init(Iterator begin, Iterator end) { Iterator iter = begin; for (; iter != end && count_ < max_buffers; ++iter, ++count_) { Buffer buffer(*iter); init_native_buffer(buffers_[count_], buffer); total_buffer_size_ += buffer.size(); } } template static bool all_empty(Iterator begin, Iterator end) { Iterator iter = begin; std::size_t i = 0; for (; iter != end && i < max_buffers; ++iter, ++i) if (Buffer(*iter).size() > 0) return false; return true; } template static void validate(Iterator begin, Iterator end) { Iterator iter = begin; for (; iter != end; ++iter) { Buffer buffer(*iter); buffer.data(); } } template static Buffer first(Iterator begin, Iterator end) { Iterator iter = begin; for (; iter != end; ++iter) { Buffer buffer(*iter); if (buffer.size() != 0) return buffer; } return Buffer(); } native_buffer_type buffers_[max_buffers]; std::size_t count_; std::size_t total_buffer_size_; }; template class buffer_sequence_adapter : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter( const asio::mutable_buffer& buffer_sequence) { init_native_buffer(buffer_, Buffer(buffer_sequence)); total_buffer_size_ = buffer_sequence.size(); } native_buffer_type* buffers() { return &buffer_; } std::size_t count() const { return 1; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const asio::mutable_buffer& buffer_sequence) { return buffer_sequence.size() == 0; } static void validate(const asio::mutable_buffer& buffer_sequence) { buffer_sequence.data(); } static Buffer first(const asio::mutable_buffer& buffer_sequence) { return Buffer(buffer_sequence); } private: native_buffer_type buffer_; std::size_t total_buffer_size_; }; template class buffer_sequence_adapter : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter( const asio::const_buffer& buffer_sequence) { init_native_buffer(buffer_, Buffer(buffer_sequence)); total_buffer_size_ = buffer_sequence.size(); } native_buffer_type* buffers() { return &buffer_; } std::size_t count() const { return 1; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const asio::const_buffer& buffer_sequence) { return buffer_sequence.size() == 0; } static void validate(const asio::const_buffer& buffer_sequence) { buffer_sequence.data(); } static Buffer first(const asio::const_buffer& buffer_sequence) { return Buffer(buffer_sequence); } private: native_buffer_type buffer_; std::size_t total_buffer_size_; }; #if !defined(ASIO_NO_DEPRECATED) template class buffer_sequence_adapter : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter( const asio::mutable_buffers_1& buffer_sequence) { init_native_buffer(buffer_, Buffer(buffer_sequence)); total_buffer_size_ = buffer_sequence.size(); } native_buffer_type* buffers() { return &buffer_; } std::size_t count() const { return 1; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const asio::mutable_buffers_1& buffer_sequence) { return buffer_sequence.size() == 0; } static void validate(const asio::mutable_buffers_1& buffer_sequence) { buffer_sequence.data(); } static Buffer first(const asio::mutable_buffers_1& buffer_sequence) { return Buffer(buffer_sequence); } private: native_buffer_type buffer_; std::size_t total_buffer_size_; }; template class buffer_sequence_adapter : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter( const asio::const_buffers_1& buffer_sequence) { init_native_buffer(buffer_, Buffer(buffer_sequence)); total_buffer_size_ = buffer_sequence.size(); } native_buffer_type* buffers() { return &buffer_; } std::size_t count() const { return 1; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const asio::const_buffers_1& buffer_sequence) { return buffer_sequence.size() == 0; } static void validate(const asio::const_buffers_1& buffer_sequence) { buffer_sequence.data(); } static Buffer first(const asio::const_buffers_1& buffer_sequence) { return Buffer(buffer_sequence); } private: native_buffer_type buffer_; std::size_t total_buffer_size_; }; #endif // !defined(ASIO_NO_DEPRECATED) template class buffer_sequence_adapter > : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter( const boost::array& buffer_sequence) { init_native_buffer(buffers_[0], Buffer(buffer_sequence[0])); init_native_buffer(buffers_[1], Buffer(buffer_sequence[1])); total_buffer_size_ = buffer_sequence[0].size() + buffer_sequence[1].size(); } native_buffer_type* buffers() { return buffers_; } std::size_t count() const { return 2; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const boost::array& buffer_sequence) { return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0; } static void validate(const boost::array& buffer_sequence) { buffer_sequence[0].data(); buffer_sequence[1].data(); } static Buffer first(const boost::array& buffer_sequence) { return Buffer(buffer_sequence[0].size() != 0 ? buffer_sequence[0] : buffer_sequence[1]); } private: native_buffer_type buffers_[2]; std::size_t total_buffer_size_; }; #if defined(ASIO_HAS_STD_ARRAY) template class buffer_sequence_adapter > : buffer_sequence_adapter_base { public: explicit buffer_sequence_adapter( const std::array& buffer_sequence) { init_native_buffer(buffers_[0], Buffer(buffer_sequence[0])); init_native_buffer(buffers_[1], Buffer(buffer_sequence[1])); total_buffer_size_ = buffer_sequence[0].size() + buffer_sequence[1].size(); } native_buffer_type* buffers() { return buffers_; } std::size_t count() const { return 2; } std::size_t total_size() const { return total_buffer_size_; } bool all_empty() const { return total_buffer_size_ == 0; } static bool all_empty(const std::array& buffer_sequence) { return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0; } static void validate(const std::array& buffer_sequence) { buffer_sequence[0].data(); buffer_sequence[1].data(); } static Buffer first(const std::array& buffer_sequence) { return Buffer(buffer_sequence[0].size() != 0 ? buffer_sequence[0] : buffer_sequence[1]); } private: native_buffer_type buffers_[2]; std::size_t total_buffer_size_; }; #endif // defined(ASIO_HAS_STD_ARRAY) } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/buffer_sequence_adapter.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP asio-1.12.2/include/asio/detail/buffered_stream_storage.hpp000066400000000000000000000054721340672067200237610ustar00rootroot00000000000000// // detail/buffered_stream_storage.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP #define ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/buffer.hpp" #include "asio/detail/assert.hpp" #include #include #include #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class buffered_stream_storage { public: // The type of the bytes stored in the buffer. typedef unsigned char byte_type; // The type used for offsets into the buffer. typedef std::size_t size_type; // Constructor. explicit buffered_stream_storage(std::size_t buffer_capacity) : begin_offset_(0), end_offset_(0), buffer_(buffer_capacity) { } /// Clear the buffer. void clear() { begin_offset_ = 0; end_offset_ = 0; } // Return a pointer to the beginning of the unread data. mutable_buffer data() { return asio::buffer(buffer_) + begin_offset_; } // Return a pointer to the beginning of the unread data. const_buffer data() const { return asio::buffer(buffer_) + begin_offset_; } // Is there no unread data in the buffer. bool empty() const { return begin_offset_ == end_offset_; } // Return the amount of unread data the is in the buffer. size_type size() const { return end_offset_ - begin_offset_; } // Resize the buffer to the specified length. void resize(size_type length) { ASIO_ASSERT(length <= capacity()); if (begin_offset_ + length <= capacity()) { end_offset_ = begin_offset_ + length; } else { using namespace std; // For memmove. memmove(&buffer_[0], &buffer_[0] + begin_offset_, size()); end_offset_ = length; begin_offset_ = 0; } } // Return the maximum size for data in the buffer. size_type capacity() const { return buffer_.size(); } // Consume multiple bytes from the beginning of the buffer. void consume(size_type count) { ASIO_ASSERT(begin_offset_ + count <= end_offset_); begin_offset_ += count; if (empty()) clear(); } private: // The offset to the beginning of the unread data. size_type begin_offset_; // The offset to the end of the unread data. size_type end_offset_; // The data in the buffer. std::vector buffer_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP asio-1.12.2/include/asio/detail/call_stack.hpp000066400000000000000000000055441340672067200212000ustar00rootroot00000000000000// // detail/call_stack.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CALL_STACK_HPP #define ASIO_DETAIL_CALL_STACK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/tss_ptr.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper class to determine whether or not the current thread is inside an // invocation of io_context::run() for a specified io_context object. template class call_stack { public: // Context class automatically pushes the key/value pair on to the stack. class context : private noncopyable { public: // Push the key on to the stack. explicit context(Key* k) : key_(k), next_(call_stack::top_) { value_ = reinterpret_cast(this); call_stack::top_ = this; } // Push the key/value pair on to the stack. context(Key* k, Value& v) : key_(k), value_(&v), next_(call_stack::top_) { call_stack::top_ = this; } // Pop the key/value pair from the stack. ~context() { call_stack::top_ = next_; } // Find the next context with the same key. Value* next_by_key() const { context* elem = next_; while (elem) { if (elem->key_ == key_) return elem->value_; elem = elem->next_; } return 0; } private: friend class call_stack; // The key associated with the context. Key* key_; // The value associated with the context. Value* value_; // The next element in the stack. context* next_; }; friend class context; // Determine whether the specified owner is on the stack. Returns address of // key if present, 0 otherwise. static Value* contains(Key* k) { context* elem = top_; while (elem) { if (elem->key_ == k) return elem->value_; elem = elem->next_; } return 0; } // Obtain the value at the top of the stack. static Value* top() { context* elem = top_; return elem ? elem->value_ : 0; } private: // The top of the stack of calls for the current thread. static tss_ptr top_; }; template tss_ptr::context> call_stack::top_; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_CALL_STACK_HPP asio-1.12.2/include/asio/detail/chrono.hpp000066400000000000000000000036541340672067200203700ustar00rootroot00000000000000// // detail/chrono.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CHRONO_HPP #define ASIO_DETAIL_CHRONO_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_CHRONO) # include #elif defined(ASIO_HAS_BOOST_CHRONO) # include #endif // defined(ASIO_HAS_BOOST_CHRONO) namespace asio { namespace chrono { #if defined(ASIO_HAS_STD_CHRONO) using std::chrono::duration; using std::chrono::time_point; using std::chrono::duration_cast; using std::chrono::nanoseconds; using std::chrono::microseconds; using std::chrono::milliseconds; using std::chrono::seconds; using std::chrono::minutes; using std::chrono::hours; using std::chrono::time_point_cast; #if defined(ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK) typedef std::chrono::monotonic_clock steady_clock; #else // defined(ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK) using std::chrono::steady_clock; #endif // defined(ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK) using std::chrono::system_clock; using std::chrono::high_resolution_clock; #elif defined(ASIO_HAS_BOOST_CHRONO) using boost::chrono::duration; using boost::chrono::time_point; using boost::chrono::duration_cast; using boost::chrono::nanoseconds; using boost::chrono::microseconds; using boost::chrono::milliseconds; using boost::chrono::seconds; using boost::chrono::minutes; using boost::chrono::hours; using boost::chrono::time_point_cast; using boost::chrono::system_clock; using boost::chrono::steady_clock; using boost::chrono::high_resolution_clock; #endif // defined(ASIO_HAS_BOOST_CHRONO) } // namespace chrono } // namespace asio #endif // ASIO_DETAIL_CHRONO_HPP asio-1.12.2/include/asio/detail/chrono_time_traits.hpp000066400000000000000000000104521340672067200227660ustar00rootroot00000000000000// // detail/chrono_time_traits.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP #define ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/cstdint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper template to compute the greatest common divisor. template struct gcd { enum { value = gcd::value }; }; template struct gcd { enum { value = v1 }; }; // Adapts std::chrono clocks for use with a deadline timer. template struct chrono_time_traits { // The clock type. typedef Clock clock_type; // The duration type of the clock. typedef typename clock_type::duration duration_type; // The time point type of the clock. typedef typename clock_type::time_point time_type; // The period of the clock. typedef typename duration_type::period period_type; // Get the current time. static time_type now() { return clock_type::now(); } // Add a duration to a time. static time_type add(const time_type& t, const duration_type& d) { const time_type epoch; if (t >= epoch) { if ((time_type::max)() - t < d) return (time_type::max)(); } else // t < epoch { if (-(t - (time_type::min)()) > d) return (time_type::min)(); } return t + d; } // Subtract one time from another. static duration_type subtract(const time_type& t1, const time_type& t2) { const time_type epoch; if (t1 >= epoch) { if (t2 >= epoch) { return t1 - t2; } else if (t2 == (time_type::min)()) { return (duration_type::max)(); } else if ((time_type::max)() - t1 < epoch - t2) { return (duration_type::max)(); } else { return t1 - t2; } } else // t1 < epoch { if (t2 < epoch) { return t1 - t2; } else if (t1 == (time_type::min)()) { return (duration_type::min)(); } else if ((time_type::max)() - t2 < epoch - t1) { return (duration_type::min)(); } else { return -(t2 - t1); } } } // Test whether one time is less than another. static bool less_than(const time_type& t1, const time_type& t2) { return t1 < t2; } // Implement just enough of the posix_time::time_duration interface to supply // what the timer_queue requires. class posix_time_duration { public: explicit posix_time_duration(const duration_type& d) : d_(d) { } int64_t ticks() const { return d_.count(); } int64_t total_seconds() const { return duration_cast<1, 1>(); } int64_t total_milliseconds() const { return duration_cast<1, 1000>(); } int64_t total_microseconds() const { return duration_cast<1, 1000000>(); } private: template int64_t duration_cast() const { const int64_t num1 = period_type::num / gcd::value; const int64_t num2 = Num / gcd::value; const int64_t den1 = period_type::den / gcd::value; const int64_t den2 = Den / gcd::value; const int64_t num = num1 * den2; const int64_t den = num2 * den1; if (num == 1 && den == 1) return ticks(); else if (num != 1 && den == 1) return ticks() * num; else if (num == 1 && period_type::den != 1) return ticks() / den; else return ticks() * num / den; } duration_type d_; }; // Convert to POSIX duration type. static posix_time_duration to_posix_duration(const duration_type& d) { return posix_time_duration(WaitTraits::to_wait_duration(d)); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP asio-1.12.2/include/asio/detail/completion_handler.hpp000066400000000000000000000046161340672067200227450ustar00rootroot00000000000000// // detail/completion_handler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_COMPLETION_HANDLER_HPP #define ASIO_DETAIL_COMPLETION_HANDLER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_work.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class completion_handler : public operation { public: ASIO_DEFINE_HANDLER_PTR(completion_handler); completion_handler(Handler& h) : operation(&completion_handler::do_complete), handler_(ASIO_MOVE_CAST(Handler)(h)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. completion_handler* h(static_cast(base)); ptr p = { asio::detail::addressof(h->handler_), h, h }; handler_work w(h->handler_); ASIO_HANDLER_COMPLETION((*h)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. Handler handler(ASIO_MOVE_CAST(Handler)(h->handler_)); p.h = asio::detail::addressof(handler); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN(()); w.complete(handler, handler); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_COMPLETION_HANDLER_HPP asio-1.12.2/include/asio/detail/concurrency_hint.hpp000066400000000000000000000074221340672067200224510ustar00rootroot00000000000000// // detail/concurrency_hint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CONCURRENCY_HINT_HPP #define ASIO_DETAIL_CONCURRENCY_HINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" // The concurrency hint ID and mask are used to identify when a "well-known" // concurrency hint value has been passed to the io_context. #define ASIO_CONCURRENCY_HINT_ID 0xA5100000u #define ASIO_CONCURRENCY_HINT_ID_MASK 0xFFFF0000u // If set, this bit indicates that the scheduler should perform locking. #define ASIO_CONCURRENCY_HINT_LOCKING_SCHEDULER 0x1u // If set, this bit indicates that the reactor should perform locking when // managing descriptor registrations. #define ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_REGISTRATION 0x2u // If set, this bit indicates that the reactor should perform locking for I/O. #define ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_IO 0x4u // Helper macro to determine if we have a special concurrency hint. #define ASIO_CONCURRENCY_HINT_IS_SPECIAL(hint) \ ((static_cast(hint) \ & ASIO_CONCURRENCY_HINT_ID_MASK) \ == ASIO_CONCURRENCY_HINT_ID) // Helper macro to determine if locking is enabled for a given facility. #define ASIO_CONCURRENCY_HINT_IS_LOCKING(facility, hint) \ (((static_cast(hint) \ & (ASIO_CONCURRENCY_HINT_ID_MASK \ | ASIO_CONCURRENCY_HINT_LOCKING_ ## facility)) \ ^ ASIO_CONCURRENCY_HINT_ID) != 0) // This special concurrency hint disables locking in both the scheduler and // reactor I/O. This hint has the following restrictions: // // - Care must be taken to ensure that all operations on the io_context and any // of its associated I/O objects (such as sockets and timers) occur in only // one thread at a time. // // - Asynchronous resolve operations fail with operation_not_supported. // // - If a signal_set is used with the io_context, signal_set objects cannot be // used with any other io_context in the program. #define ASIO_CONCURRENCY_HINT_UNSAFE \ static_cast(ASIO_CONCURRENCY_HINT_ID) // This special concurrency hint disables locking in the reactor I/O. This hint // has the following restrictions: // // - Care must be taken to ensure that run functions on the io_context, and all // operations on the io_context's associated I/O objects (such as sockets and // timers), occur in only one thread at a time. #define ASIO_CONCURRENCY_HINT_UNSAFE_IO \ static_cast(ASIO_CONCURRENCY_HINT_ID \ | ASIO_CONCURRENCY_HINT_LOCKING_SCHEDULER \ | ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_REGISTRATION) // The special concurrency hint provides full thread safety. #define ASIO_CONCURRENCY_HINT_SAFE \ static_cast(ASIO_CONCURRENCY_HINT_ID \ | ASIO_CONCURRENCY_HINT_LOCKING_SCHEDULER \ | ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_REGISTRATION \ | ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_IO) // This #define may be overridden at compile time to specify a program-wide // default concurrency hint, used by the zero-argument io_context constructor. #if !defined(ASIO_CONCURRENCY_HINT_DEFAULT) # define ASIO_CONCURRENCY_HINT_DEFAULT -1 #endif // !defined(ASIO_CONCURRENCY_HINT_DEFAULT) // This #define may be overridden at compile time to specify a program-wide // concurrency hint, used by the one-argument io_context constructor when // passed a value of 1. #if !defined(ASIO_CONCURRENCY_HINT_1) # define ASIO_CONCURRENCY_HINT_1 1 #endif // !defined(ASIO_CONCURRENCY_HINT_DEFAULT) #endif // ASIO_DETAIL_CONCURRENCY_HINT_HPP asio-1.12.2/include/asio/detail/conditionally_enabled_event.hpp000066400000000000000000000053171340672067200246210ustar00rootroot00000000000000// // detail/conditionally_enabled_event.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP #define ASIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/conditionally_enabled_mutex.hpp" #include "asio/detail/event.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/null_event.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Mutex adapter used to conditionally enable or disable locking. class conditionally_enabled_event : private noncopyable { public: // Constructor. conditionally_enabled_event() { } // Destructor. ~conditionally_enabled_event() { } // Signal the event. (Retained for backward compatibility.) void signal(conditionally_enabled_mutex::scoped_lock& lock) { if (lock.mutex_.enabled_) event_.signal(lock); } // Signal all waiters. void signal_all(conditionally_enabled_mutex::scoped_lock& lock) { if (lock.mutex_.enabled_) event_.signal_all(lock); } // Unlock the mutex and signal one waiter. void unlock_and_signal_one( conditionally_enabled_mutex::scoped_lock& lock) { if (lock.mutex_.enabled_) event_.unlock_and_signal_one(lock); } // If there's a waiter, unlock the mutex and signal it. bool maybe_unlock_and_signal_one( conditionally_enabled_mutex::scoped_lock& lock) { if (lock.mutex_.enabled_) return event_.maybe_unlock_and_signal_one(lock); else return false; } // Reset the event. void clear(conditionally_enabled_mutex::scoped_lock& lock) { if (lock.mutex_.enabled_) event_.clear(lock); } // Wait for the event to become signalled. void wait(conditionally_enabled_mutex::scoped_lock& lock) { if (lock.mutex_.enabled_) event_.wait(lock); else null_event().wait(lock); } // Timed wait for the event to become signalled. bool wait_for_usec( conditionally_enabled_mutex::scoped_lock& lock, long usec) { if (lock.mutex_.enabled_) return event_.wait_for_usec(lock, usec); else return null_event().wait_for_usec(lock, usec); } private: asio::detail::event event_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP asio-1.12.2/include/asio/detail/conditionally_enabled_mutex.hpp000066400000000000000000000057131340672067200246420ustar00rootroot00000000000000// // detail/conditionally_enabled_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP #define ASIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Mutex adapter used to conditionally enable or disable locking. class conditionally_enabled_mutex : private noncopyable { public: // Helper class to lock and unlock a mutex automatically. class scoped_lock : private noncopyable { public: // Tag type used to distinguish constructors. enum adopt_lock_t { adopt_lock }; // Constructor adopts a lock that is already held. scoped_lock(conditionally_enabled_mutex& m, adopt_lock_t) : mutex_(m), locked_(m.enabled_) { } // Constructor acquires the lock. explicit scoped_lock(conditionally_enabled_mutex& m) : mutex_(m) { if (m.enabled_) { mutex_.mutex_.lock(); locked_ = true; } else locked_ = false; } // Destructor releases the lock. ~scoped_lock() { if (locked_) mutex_.mutex_.unlock(); } // Explicitly acquire the lock. void lock() { if (mutex_.enabled_ && !locked_) { mutex_.mutex_.lock(); locked_ = true; } } // Explicitly release the lock. void unlock() { if (locked_) { mutex_.unlock(); locked_ = false; } } // Test whether the lock is held. bool locked() const { return locked_; } // Get the underlying mutex. asio::detail::mutex& mutex() { return mutex_.mutex_; } private: friend class conditionally_enabled_event; conditionally_enabled_mutex& mutex_; bool locked_; }; // Constructor. explicit conditionally_enabled_mutex(bool enabled) : enabled_(enabled) { } // Destructor. ~conditionally_enabled_mutex() { } // Determine whether locking is enabled. bool enabled() const { return enabled_; } // Lock the mutex. void lock() { if (enabled_) mutex_.lock(); } // Unlock the mutex. void unlock() { if (enabled_) mutex_.unlock(); } private: friend class scoped_lock; friend class conditionally_enabled_event; asio::detail::mutex mutex_; const bool enabled_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP asio-1.12.2/include/asio/detail/config.hpp000066400000000000000000001547201340672067200203460ustar00rootroot00000000000000// // detail/config.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CONFIG_HPP #define ASIO_DETAIL_CONFIG_HPP #if defined(ASIO_STANDALONE) # define ASIO_DISABLE_BOOST_ARRAY 1 # define ASIO_DISABLE_BOOST_ASSERT 1 # define ASIO_DISABLE_BOOST_BIND 1 # define ASIO_DISABLE_BOOST_CHRONO 1 # define ASIO_DISABLE_BOOST_DATE_TIME 1 # define ASIO_DISABLE_BOOST_LIMITS 1 # define ASIO_DISABLE_BOOST_REGEX 1 # define ASIO_DISABLE_BOOST_STATIC_CONSTANT 1 # define ASIO_DISABLE_BOOST_THROW_EXCEPTION 1 # define ASIO_DISABLE_BOOST_WORKAROUND 1 #else // defined(ASIO_STANDALONE) # include # include # define ASIO_HAS_BOOST_CONFIG 1 #endif // defined(ASIO_STANDALONE) // Default to a header-only implementation. The user must specifically request // separate compilation by defining either ASIO_SEPARATE_COMPILATION or // ASIO_DYN_LINK (as a DLL/shared library implies separate compilation). #if !defined(ASIO_HEADER_ONLY) # if !defined(ASIO_SEPARATE_COMPILATION) # if !defined(ASIO_DYN_LINK) # define ASIO_HEADER_ONLY 1 # endif // !defined(ASIO_DYN_LINK) # endif // !defined(ASIO_SEPARATE_COMPILATION) #endif // !defined(ASIO_HEADER_ONLY) #if defined(ASIO_HEADER_ONLY) # define ASIO_DECL inline #else // defined(ASIO_HEADER_ONLY) # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CODEGEARC__) // We need to import/export our code only if the user has specifically asked // for it by defining ASIO_DYN_LINK. # if defined(ASIO_DYN_LINK) // Export if this is our own source, otherwise import. # if defined(ASIO_SOURCE) # define ASIO_DECL __declspec(dllexport) # else // defined(ASIO_SOURCE) # define ASIO_DECL __declspec(dllimport) # endif // defined(ASIO_SOURCE) # endif // defined(ASIO_DYN_LINK) # endif // defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CODEGEARC__) #endif // defined(ASIO_HEADER_ONLY) // If ASIO_DECL isn't defined yet define it now. #if !defined(ASIO_DECL) # define ASIO_DECL #endif // !defined(ASIO_DECL) // Microsoft Visual C++ detection. #if !defined(ASIO_MSVC) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_MSVC) # define ASIO_MSVC BOOST_MSVC # elif defined(_MSC_VER) && (defined(__INTELLISENSE__) \ || (!defined(__MWERKS__) && !defined(__EDG_VERSION__))) # define ASIO_MSVC _MSC_VER # endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_MSVC) #endif // !defined(ASIO_MSVC) // Clang / libc++ detection. #if defined(__clang__) # if (__cplusplus >= 201103) # if __has_include(<__config>) # include <__config> # if defined(_LIBCPP_VERSION) # define ASIO_HAS_CLANG_LIBCXX 1 # endif // defined(_LIBCPP_VERSION) # endif // __has_include(<__config>) # endif // (__cplusplus >= 201103) #endif // defined(__clang__) // Android platform detection. #if defined(__ANDROID__) # include #endif // defined(__ANDROID__) // Support move construction and assignment on compilers known to allow it. #if !defined(ASIO_HAS_MOVE) # if !defined(ASIO_DISABLE_MOVE) # if defined(__clang__) # if __has_feature(__cxx_rvalue_references__) # define ASIO_HAS_MOVE 1 # endif // __has_feature(__cxx_rvalue_references__) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_MOVE 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_MOVE 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # if defined(__INTEL_CXX11_MODE__) # if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) # define BOOST_ASIO_HAS_MOVE 1 # endif // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) # if defined(__ICL) && (__ICL >= 1500) # define BOOST_ASIO_HAS_MOVE 1 # endif // defined(__ICL) && (__ICL >= 1500) # endif // defined(__INTEL_CXX11_MODE__) # endif // !defined(ASIO_DISABLE_MOVE) #endif // !defined(ASIO_HAS_MOVE) // If ASIO_MOVE_CAST isn't defined, and move support is available, define // ASIO_MOVE_ARG and ASIO_MOVE_CAST to take advantage of rvalue // references and perfect forwarding. #if defined(ASIO_HAS_MOVE) && !defined(ASIO_MOVE_CAST) # define ASIO_MOVE_ARG(type) type&& # define ASIO_MOVE_ARG2(type1, type2) type1, type2&& # define ASIO_MOVE_CAST(type) static_cast # define ASIO_MOVE_CAST2(type1, type2) static_cast #endif // defined(ASIO_HAS_MOVE) && !defined(ASIO_MOVE_CAST) // If ASIO_MOVE_CAST still isn't defined, default to a C++03-compatible // implementation. Note that older g++ and MSVC versions don't like it when you // pass a non-member function through a const reference, so for most compilers // we'll play it safe and stick with the old approach of passing the handler by // value. #if !defined(ASIO_MOVE_CAST) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4) # define ASIO_MOVE_ARG(type) const type& # else // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4) # define ASIO_MOVE_ARG(type) type # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4) # elif defined(ASIO_MSVC) # if (_MSC_VER >= 1400) # define ASIO_MOVE_ARG(type) const type& # else // (_MSC_VER >= 1400) # define ASIO_MOVE_ARG(type) type # endif // (_MSC_VER >= 1400) # else # define ASIO_MOVE_ARG(type) type # endif # define ASIO_MOVE_CAST(type) static_cast # define ASIO_MOVE_CAST2(type1, type2) static_cast #endif // !defined(ASIO_MOVE_CAST) // Support variadic templates on compilers known to allow it. #if !defined(ASIO_HAS_VARIADIC_TEMPLATES) # if !defined(ASIO_DISABLE_VARIADIC_TEMPLATES) # if defined(__clang__) # if __has_feature(__cxx_variadic_templates__) # define ASIO_HAS_VARIADIC_TEMPLATES 1 # endif // __has_feature(__cxx_variadic_templates__) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_VARIADIC_TEMPLATES 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1900) # define ASIO_HAS_VARIADIC_TEMPLATES 1 # endif // (_MSC_VER >= 1900) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_VARIADIC_TEMPLATES) #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) // Support deleted functions on compilers known to allow it. #if !defined(ASIO_DELETED) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_DELETED = delete # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(__clang__) # if __has_feature(__cxx_deleted_functions__) # define ASIO_DELETED = delete # endif // __has_feature(__cxx_deleted_functions__) # endif // defined(__clang__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1900) # define ASIO_DELETED = delete # endif // (_MSC_VER >= 1900) # endif // defined(ASIO_MSVC) # if !defined(ASIO_DELETED) # define ASIO_DELETED # endif // !defined(ASIO_DELETED) #endif // !defined(ASIO_DELETED) // Support constexpr on compilers known to allow it. #if !defined(ASIO_HAS_CONSTEXPR) # if !defined(ASIO_DISABLE_CONSTEXPR) # if defined(__clang__) # if __has_feature(__cxx_constexpr__) # define ASIO_HAS_CONSTEXPR 1 # endif // __has_feature(__cxx_constexr__) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_CONSTEXPR 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1900) # define ASIO_HAS_CONSTEXPR 1 # endif // (_MSC_VER >= 1900) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_CONSTEXPR) #endif // !defined(ASIO_HAS_CONSTEXPR) #if !defined(ASIO_CONSTEXPR) # if defined(ASIO_HAS_CONSTEXPR) # define ASIO_CONSTEXPR constexpr # else // defined(ASIO_HAS_CONSTEXPR) # define ASIO_CONSTEXPR # endif // defined(ASIO_HAS_CONSTEXPR) #endif // !defined(ASIO_CONSTEXPR) // Support noexcept on compilers known to allow it. #if !defined(ASIO_NOEXCEPT) # if !defined(ASIO_DISABLE_NOEXCEPT) # if defined(ASIO_HAS_BOOST_CONFIG) && (BOOST_VERSION >= 105300) # define ASIO_NOEXCEPT BOOST_NOEXCEPT # define ASIO_NOEXCEPT_OR_NOTHROW BOOST_NOEXCEPT_OR_NOTHROW # elif defined(__clang__) # if __has_feature(__cxx_noexcept__) # define ASIO_NOEXCEPT noexcept(true) # define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true) # endif // __has_feature(__cxx_noexcept__) # elif defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_NOEXCEPT noexcept(true) # define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true) # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # elif defined(ASIO_MSVC) # if (_MSC_VER >= 1900) # define ASIO_NOEXCEPT noexcept(true) # define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true) # endif // (_MSC_VER >= 1900) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_NOEXCEPT) # if !defined(ASIO_NOEXCEPT) # define ASIO_NOEXCEPT # endif // !defined(ASIO_NOEXCEPT) # if !defined(ASIO_NOEXCEPT_OR_NOTHROW) # define ASIO_NOEXCEPT_OR_NOTHROW throw() # endif // !defined(ASIO_NOEXCEPT_OR_NOTHROW) #endif // !defined(ASIO_NOEXCEPT) // Support automatic type deduction on compilers known to support it. #if !defined(ASIO_HAS_DECLTYPE) # if !defined(ASIO_DISABLE_DECLTYPE) # if defined(__clang__) # if __has_feature(__cxx_decltype__) # define ASIO_HAS_DECLTYPE 1 # endif // __has_feature(__cxx_decltype__) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_DECLTYPE 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_DECLTYPE 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_DECLTYPE) #endif // !defined(ASIO_HAS_DECLTYPE) // Support alias templates on compilers known to allow it. #if !defined(ASIO_HAS_ALIAS_TEMPLATES) # if !defined(ASIO_DISABLE_ALIAS_TEMPLATES) # if defined(__clang__) # if __has_feature(__cxx_alias_templates__) # define ASIO_HAS_ALIAS_TEMPLATES 1 # endif // __has_feature(__cxx_alias_templates__) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_ALIAS_TEMPLATES 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1900) # define ASIO_HAS_ALIAS_TEMPLATES 1 # endif // (_MSC_VER >= 1900) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_ALIAS_TEMPLATES) #endif // !defined(ASIO_HAS_ALIAS_TEMPLATES) // Standard library support for system errors. #if !defined(ASIO_HAS_STD_SYSTEM_ERROR) # if !defined(ASIO_DISABLE_STD_SYSTEM_ERROR) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_SYSTEM_ERROR 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_SYSTEM_ERROR 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_SYSTEM_ERROR 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_SYSTEM_ERROR 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_SYSTEM_ERROR) #endif // !defined(ASIO_HAS_STD_SYSTEM_ERROR) // Compliant C++11 compilers put noexcept specifiers on error_category members. #if !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) # if (BOOST_VERSION >= 105300) # define ASIO_ERROR_CATEGORY_NOEXCEPT BOOST_NOEXCEPT # elif defined(__clang__) # if __has_feature(__cxx_noexcept__) # define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true) # endif // __has_feature(__cxx_noexcept__) # elif defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true) # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # elif defined(ASIO_MSVC) # if (_MSC_VER >= 1900) # define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true) # endif // (_MSC_VER >= 1900) # endif // defined(ASIO_MSVC) # if !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) # define ASIO_ERROR_CATEGORY_NOEXCEPT # endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) #endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) // Standard library support for arrays. #if !defined(ASIO_HAS_STD_ARRAY) # if !defined(ASIO_DISABLE_STD_ARRAY) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_ARRAY 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_ARRAY 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_ARRAY 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1600) # define ASIO_HAS_STD_ARRAY 1 # endif // (_MSC_VER >= 1600) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_ARRAY) #endif // !defined(ASIO_HAS_STD_ARRAY) // Standard library support for shared_ptr and weak_ptr. #if !defined(ASIO_HAS_STD_SHARED_PTR) # if !defined(ASIO_DISABLE_STD_SHARED_PTR) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_SHARED_PTR 1 # elif (__cplusplus >= 201103) # define ASIO_HAS_STD_SHARED_PTR 1 # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_SHARED_PTR 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1600) # define ASIO_HAS_STD_SHARED_PTR 1 # endif // (_MSC_VER >= 1600) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_SHARED_PTR) #endif // !defined(ASIO_HAS_STD_SHARED_PTR) // Standard library support for allocator_arg_t. #if !defined(ASIO_HAS_STD_ALLOCATOR_ARG) # if !defined(ASIO_DISABLE_STD_ALLOCATOR_ARG) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_ALLOCATOR_ARG 1 # elif (__cplusplus >= 201103) # define ASIO_HAS_STD_ALLOCATOR_ARG 1 # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_ALLOCATOR_ARG 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1600) # define ASIO_HAS_STD_ALLOCATOR_ARG 1 # endif // (_MSC_VER >= 1600) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_ALLOCATOR_ARG) #endif // !defined(ASIO_HAS_STD_ALLOCATOR_ARG) // Standard library support for atomic operations. #if !defined(ASIO_HAS_STD_ATOMIC) # if !defined(ASIO_DISABLE_STD_ATOMIC) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_ATOMIC 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_ATOMIC 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_ATOMIC 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_ATOMIC 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_ATOMIC) #endif // !defined(ASIO_HAS_STD_ATOMIC) // Standard library support for chrono. Some standard libraries (such as the // libstdc++ shipped with gcc 4.6) provide monotonic_clock as per early C++0x // drafts, rather than the eventually standardised name of steady_clock. #if !defined(ASIO_HAS_STD_CHRONO) # if !defined(ASIO_DISABLE_STD_CHRONO) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_CHRONO 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_CHRONO 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_CHRONO 1 # if ((__GNUC__ == 4) && (__GNUC_MINOR__ == 6)) # define ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK 1 # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ == 6)) # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_CHRONO 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_CHRONO) #endif // !defined(ASIO_HAS_STD_CHRONO) // Boost support for chrono. #if !defined(ASIO_HAS_BOOST_CHRONO) # if !defined(ASIO_DISABLE_BOOST_CHRONO) # if (BOOST_VERSION >= 104700) # define ASIO_HAS_BOOST_CHRONO 1 # endif // (BOOST_VERSION >= 104700) # endif // !defined(ASIO_DISABLE_BOOST_CHRONO) #endif // !defined(ASIO_HAS_BOOST_CHRONO) // Some form of chrono library is available. #if !defined(ASIO_HAS_CHRONO) # if defined(ASIO_HAS_STD_CHRONO) \ || defined(ASIO_HAS_BOOST_CHRONO) # define ASIO_HAS_CHRONO 1 # endif // defined(ASIO_HAS_STD_CHRONO) // || defined(ASIO_HAS_BOOST_CHRONO) #endif // !defined(ASIO_HAS_CHRONO) // Boost support for the DateTime library. #if !defined(ASIO_HAS_BOOST_DATE_TIME) # if !defined(ASIO_DISABLE_BOOST_DATE_TIME) # define ASIO_HAS_BOOST_DATE_TIME 1 # endif // !defined(ASIO_DISABLE_BOOST_DATE_TIME) #endif // !defined(ASIO_HAS_BOOST_DATE_TIME) // Standard library support for addressof. #if !defined(ASIO_HAS_STD_ADDRESSOF) # if !defined(ASIO_DISABLE_STD_ADDRESSOF) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_ADDRESSOF 1 # elif (__cplusplus >= 201103) # define ASIO_HAS_STD_ADDRESSOF 1 # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_ADDRESSOF 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_ADDRESSOF 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_ADDRESSOF) #endif // !defined(ASIO_HAS_STD_ADDRESSOF) // Standard library support for the function class. #if !defined(ASIO_HAS_STD_FUNCTION) # if !defined(ASIO_DISABLE_STD_FUNCTION) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_FUNCTION 1 # elif (__cplusplus >= 201103) # define ASIO_HAS_STD_FUNCTION 1 # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_FUNCTION 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_FUNCTION 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_FUNCTION) #endif // !defined(ASIO_HAS_STD_FUNCTION) // Standard library support for type traits. #if !defined(ASIO_HAS_STD_TYPE_TRAITS) # if !defined(ASIO_DISABLE_STD_TYPE_TRAITS) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_TYPE_TRAITS 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_TYPE_TRAITS 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_TYPE_TRAITS 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_TYPE_TRAITS 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_TYPE_TRAITS) #endif // !defined(ASIO_HAS_STD_TYPE_TRAITS) // Standard library support for the nullptr_t type. #if !defined(ASIO_HAS_NULLPTR) # if !defined(ASIO_DISABLE_NULLPTR) # if defined(__clang__) # if __has_feature(__cxx_nullptr__) # define ASIO_HAS_NULLPTR 1 # endif // __has_feature(__cxx_rvalue_references__) # elif defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_NULLPTR 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_NULLPTR 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_NULLPTR) #endif // !defined(ASIO_HAS_NULLPTR) // Standard library support for the C++11 allocator additions. #if !defined(ASIO_HAS_CXX11_ALLOCATORS) # if !defined(ASIO_DISABLE_CXX11_ALLOCATORS) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_CXX11_ALLOCATORS 1 # elif (__cplusplus >= 201103) # define ASIO_HAS_CXX11_ALLOCATORS 1 # endif // (__cplusplus >= 201103) # elif defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_CXX11_ALLOCATORS 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1800) # define ASIO_HAS_CXX11_ALLOCATORS 1 # endif // (_MSC_VER >= 1800) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_CXX11_ALLOCATORS) #endif // !defined(ASIO_HAS_CXX11_ALLOCATORS) // Standard library support for the cstdint header. #if !defined(ASIO_HAS_CSTDINT) # if !defined(ASIO_DISABLE_CSTDINT) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_CSTDINT 1 # elif (__cplusplus >= 201103) # define ASIO_HAS_CSTDINT 1 # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_CSTDINT 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_CSTDINT 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_CSTDINT) #endif // !defined(ASIO_HAS_CSTDINT) // Standard library support for the thread class. #if !defined(ASIO_HAS_STD_THREAD) # if !defined(ASIO_DISABLE_STD_THREAD) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_THREAD 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_THREAD 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_THREAD 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_THREAD 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_THREAD) #endif // !defined(ASIO_HAS_STD_THREAD) // Standard library support for the mutex and condition variable classes. #if !defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) # if !defined(ASIO_DISABLE_STD_MUTEX_AND_CONDVAR) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_MUTEX_AND_CONDVAR) #endif // !defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) // Standard library support for the call_once function. #if !defined(ASIO_HAS_STD_CALL_ONCE) # if !defined(ASIO_DISABLE_STD_CALL_ONCE) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_CALL_ONCE 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_CALL_ONCE 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_CALL_ONCE 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_CALL_ONCE 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_CALL_ONCE) #endif // !defined(ASIO_HAS_STD_CALL_ONCE) // Standard library support for futures. #if !defined(ASIO_HAS_STD_FUTURE) # if !defined(ASIO_DISABLE_STD_FUTURE) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_FUTURE 1 # elif (__cplusplus >= 201103) # if __has_include() # define ASIO_HAS_STD_FUTURE 1 # endif // __has_include() # endif // (__cplusplus >= 201103) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_FUTURE 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_FUTURE 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_FUTURE) #endif // !defined(ASIO_HAS_STD_FUTURE) // Standard library support for std::string_view. #if !defined(ASIO_HAS_STD_STRING_VIEW) # if !defined(ASIO_DISABLE_STD_STRING_VIEW) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # if (__cplusplus >= 201402) # if __has_include() # define ASIO_HAS_STD_STRING_VIEW 1 # endif // __has_include() # endif // (__cplusplus >= 201402) # else // defined(ASIO_HAS_CLANG_LIBCXX) # if (__cplusplus >= 201703) # if __has_include() # define ASIO_HAS_STD_STRING_VIEW 1 # endif // __has_include() # endif // (__cplusplus >= 201703) # endif // defined(ASIO_HAS_CLANG_LIBCXX) # elif defined(__GNUC__) # if (__GNUC__ >= 7) # if (__cplusplus >= 201703) # define ASIO_HAS_STD_STRING_VIEW 1 # endif // (__cplusplus >= 201703) # endif // (__GNUC__ >= 7) # elif defined(ASIO_MSVC) # if (_MSC_VER >= 1910 && _MSVC_LANG >= 201703) # define ASIO_HAS_STD_STRING_VIEW 1 # endif // (_MSC_VER >= 1910 && _MSVC_LANG >= 201703) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_STRING_VIEW) #endif // !defined(ASIO_HAS_STD_STRING_VIEW) // Standard library support for std::experimental::string_view. #if !defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) # if !defined(ASIO_DISABLE_STD_EXPERIMENTAL_STRING_VIEW) # if defined(__clang__) # if defined(ASIO_HAS_CLANG_LIBCXX) # if (_LIBCPP_VERSION < 7000) # if (__cplusplus >= 201402) # if __has_include() # define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1 # endif // __has_include() # endif // (__cplusplus >= 201402) # endif // (_LIBCPP_VERSION < 7000) # else // defined(ASIO_HAS_CLANG_LIBCXX) # if (__cplusplus >= 201402) # if __has_include() # define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1 # endif // __has_include() # endif // (__cplusplus >= 201402) # endif // // defined(ASIO_HAS_CLANG_LIBCXX) # endif // defined(__clang__) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4) # if (__cplusplus >= 201402) # define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1 # endif // (__cplusplus >= 201402) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # endif // !defined(ASIO_DISABLE_STD_EXPERIMENTAL_STRING_VIEW) #endif // !defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) // Standard library has a string_view that we can use. #if !defined(ASIO_HAS_STRING_VIEW) # if !defined(ASIO_DISABLE_STRING_VIEW) # if defined(ASIO_HAS_STD_STRING_VIEW) # define ASIO_HAS_STRING_VIEW 1 # elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) # define ASIO_HAS_STRING_VIEW 1 # endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) # endif // !defined(ASIO_DISABLE_STRING_VIEW) #endif // !defined(ASIO_HAS_STRING_VIEW) // Standard library support for iostream move construction and assignment. #if !defined(ASIO_HAS_STD_IOSTREAM_MOVE) # if !defined(ASIO_DISABLE_STD_IOSTREAM_MOVE) # if defined(__GNUC__) # if (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_HAS_STD_IOSTREAM_MOVE 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1700) # define ASIO_HAS_STD_IOSTREAM_MOVE 1 # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_IOSTREAM_MOVE) #endif // !defined(ASIO_HAS_STD_IOSTREAM_MOVE) // Standard library has invoke_result (which supersedes result_of). #if !defined(ASIO_HAS_STD_INVOKE_RESULT) # if !defined(ASIO_DISABLE_STD_INVOKE_RESULT) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1911 && _MSVC_LANG >= 201703) # define ASIO_HAS_STD_INVOKE_RESULT 1 # endif // (_MSC_VER >= 1911 && _MSVC_LANG >= 201703) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_STD_INVOKE_RESULT) #endif // !defined(ASIO_HAS_STD_INVOKE_RESULT) // Windows App target. Windows but with a limited API. #if !defined(ASIO_WINDOWS_APP) # if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603) # include # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \ && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) # define ASIO_WINDOWS_APP 1 # endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) # endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603) #endif // !defined(ASIO_WINDOWS_APP) // Legacy WinRT target. Windows App is preferred. #if !defined(ASIO_WINDOWS_RUNTIME) # if !defined(ASIO_WINDOWS_APP) # if defined(__cplusplus_winrt) # include # if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \ && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) # define ASIO_WINDOWS_RUNTIME 1 # endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) # endif // defined(__cplusplus_winrt) # endif // !defined(ASIO_WINDOWS_APP) #endif // !defined(ASIO_WINDOWS_RUNTIME) // Windows target. Excludes WinRT but includes Windows App targets. #if !defined(ASIO_WINDOWS) # if !defined(ASIO_WINDOWS_RUNTIME) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS) # define ASIO_WINDOWS 1 # elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) # define ASIO_WINDOWS 1 # elif defined(ASIO_WINDOWS_APP) # define ASIO_WINDOWS 1 # endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS) # endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // !defined(ASIO_WINDOWS) // Windows: target OS version. #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if !defined(_WIN32_WINNT) && !defined(_WIN32_WINDOWS) # if defined(_MSC_VER) || defined(__BORLANDC__) # pragma message( \ "Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:\n"\ "- add -D_WIN32_WINNT=0x0501 to the compiler command line; or\n"\ "- add _WIN32_WINNT=0x0501 to your project's Preprocessor Definitions.\n"\ "Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).") # else // defined(_MSC_VER) || defined(__BORLANDC__) # warning Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. # warning For example, add -D_WIN32_WINNT=0x0501 to the compiler command line. # warning Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target). # endif // defined(_MSC_VER) || defined(__BORLANDC__) # define _WIN32_WINNT 0x0501 # endif // !defined(_WIN32_WINNT) && !defined(_WIN32_WINDOWS) # if defined(_MSC_VER) # if defined(_WIN32) && !defined(WIN32) # if !defined(_WINSOCK2API_) # define WIN32 // Needed for correct types in winsock2.h # else // !defined(_WINSOCK2API_) # error Please define the macro WIN32 in your compiler options # endif // !defined(_WINSOCK2API_) # endif // defined(_WIN32) && !defined(WIN32) # endif // defined(_MSC_VER) # if defined(__BORLANDC__) # if defined(__WIN32__) && !defined(WIN32) # if !defined(_WINSOCK2API_) # define WIN32 // Needed for correct types in winsock2.h # else // !defined(_WINSOCK2API_) # error Please define the macro WIN32 in your compiler options # endif // !defined(_WINSOCK2API_) # endif // defined(__WIN32__) && !defined(WIN32) # endif // defined(__BORLANDC__) # if defined(__CYGWIN__) # if !defined(__USE_W32_SOCKETS) # error You must add -D__USE_W32_SOCKETS to your compiler options. # endif // !defined(__USE_W32_SOCKETS) # endif // defined(__CYGWIN__) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Windows: minimise header inclusion. #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if !defined(ASIO_NO_WIN32_LEAN_AND_MEAN) # if !defined(WIN32_LEAN_AND_MEAN) # define WIN32_LEAN_AND_MEAN # endif // !defined(WIN32_LEAN_AND_MEAN) # endif // !defined(ASIO_NO_WIN32_LEAN_AND_MEAN) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Windows: suppress definition of "min" and "max" macros. #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if !defined(ASIO_NO_NOMINMAX) # if !defined(NOMINMAX) # define NOMINMAX 1 # endif // !defined(NOMINMAX) # endif // !defined(ASIO_NO_NOMINMAX) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Windows: IO Completion Ports. #if !defined(ASIO_HAS_IOCP) # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400) # if !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) # if !defined(ASIO_DISABLE_IOCP) # define ASIO_HAS_IOCP 1 # endif // !defined(ASIO_DISABLE_IOCP) # endif // !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) # endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400) # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #endif // !defined(ASIO_HAS_IOCP) // On POSIX (and POSIX-like) platforms we need to include unistd.h in order to // get access to the various platform feature macros, e.g. to be able to test // for threads support. #if !defined(ASIO_HAS_UNISTD_H) # if !defined(ASIO_HAS_BOOST_CONFIG) # if defined(unix) \ || defined(__unix) \ || defined(_XOPEN_SOURCE) \ || defined(_POSIX_SOURCE) \ || (defined(__MACH__) && defined(__APPLE__)) \ || defined(__FreeBSD__) \ || defined(__NetBSD__) \ || defined(__OpenBSD__) \ || defined(__linux__) # define ASIO_HAS_UNISTD_H 1 # endif # endif // !defined(ASIO_HAS_BOOST_CONFIG) #endif // !defined(ASIO_HAS_UNISTD_H) #if defined(ASIO_HAS_UNISTD_H) # include #endif // defined(ASIO_HAS_UNISTD_H) // Linux: epoll, eventfd and timerfd. #if defined(__linux__) # include # if !defined(ASIO_HAS_EPOLL) # if !defined(ASIO_DISABLE_EPOLL) # if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,45) # define ASIO_HAS_EPOLL 1 # endif // LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,45) # endif // !defined(ASIO_DISABLE_EPOLL) # endif // !defined(ASIO_HAS_EPOLL) # if !defined(ASIO_HAS_EVENTFD) # if !defined(ASIO_DISABLE_EVENTFD) # if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) # define ASIO_HAS_EVENTFD 1 # endif // LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) # endif // !defined(ASIO_DISABLE_EVENTFD) # endif // !defined(ASIO_HAS_EVENTFD) # if !defined(ASIO_HAS_TIMERFD) # if defined(ASIO_HAS_EPOLL) # if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) # define ASIO_HAS_TIMERFD 1 # endif // (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) # endif // defined(ASIO_HAS_EPOLL) # endif // !defined(ASIO_HAS_TIMERFD) #endif // defined(__linux__) // Mac OS X, FreeBSD, NetBSD, OpenBSD: kqueue. #if (defined(__MACH__) && defined(__APPLE__)) \ || defined(__FreeBSD__) \ || defined(__NetBSD__) \ || defined(__OpenBSD__) # if !defined(ASIO_HAS_KQUEUE) # if !defined(ASIO_DISABLE_KQUEUE) # define ASIO_HAS_KQUEUE 1 # endif // !defined(ASIO_DISABLE_KQUEUE) # endif // !defined(ASIO_HAS_KQUEUE) #endif // (defined(__MACH__) && defined(__APPLE__)) // || defined(__FreeBSD__) // || defined(__NetBSD__) // || defined(__OpenBSD__) // Solaris: /dev/poll. #if defined(__sun) # if !defined(ASIO_HAS_DEV_POLL) # if !defined(ASIO_DISABLE_DEV_POLL) # define ASIO_HAS_DEV_POLL 1 # endif // !defined(ASIO_DISABLE_DEV_POLL) # endif // !defined(ASIO_HAS_DEV_POLL) #endif // defined(__sun) // Serial ports. #if !defined(ASIO_HAS_SERIAL_PORT) # if defined(ASIO_HAS_IOCP) \ || !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) # if !defined(__SYMBIAN32__) # if !defined(ASIO_DISABLE_SERIAL_PORT) # define ASIO_HAS_SERIAL_PORT 1 # endif // !defined(ASIO_DISABLE_SERIAL_PORT) # endif // !defined(__SYMBIAN32__) # endif // defined(ASIO_HAS_IOCP) // || !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) #endif // !defined(ASIO_HAS_SERIAL_PORT) // Windows: stream handles. #if !defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) # if !defined(ASIO_DISABLE_WINDOWS_STREAM_HANDLE) # if defined(ASIO_HAS_IOCP) # define ASIO_HAS_WINDOWS_STREAM_HANDLE 1 # endif // defined(ASIO_HAS_IOCP) # endif // !defined(ASIO_DISABLE_WINDOWS_STREAM_HANDLE) #endif // !defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) // Windows: random access handles. #if !defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) # if !defined(ASIO_DISABLE_WINDOWS_RANDOM_ACCESS_HANDLE) # if defined(ASIO_HAS_IOCP) # define ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE 1 # endif // defined(ASIO_HAS_IOCP) # endif // !defined(ASIO_DISABLE_WINDOWS_RANDOM_ACCESS_HANDLE) #endif // !defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) // Windows: object handles. #if !defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) # if !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE) # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) # define ASIO_HAS_WINDOWS_OBJECT_HANDLE 1 # endif // !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) # endif // !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE) #endif // !defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) // Windows: OVERLAPPED wrapper. #if !defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) # if !defined(ASIO_DISABLE_WINDOWS_OVERLAPPED_PTR) # if defined(ASIO_HAS_IOCP) # define ASIO_HAS_WINDOWS_OVERLAPPED_PTR 1 # endif // defined(ASIO_HAS_IOCP) # endif // !defined(ASIO_DISABLE_WINDOWS_OVERLAPPED_PTR) #endif // !defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) // POSIX: stream-oriented file descriptors. #if !defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) # if !defined(ASIO_DISABLE_POSIX_STREAM_DESCRIPTOR) # if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) # define ASIO_HAS_POSIX_STREAM_DESCRIPTOR 1 # endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) # endif // !defined(ASIO_DISABLE_POSIX_STREAM_DESCRIPTOR) #endif // !defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // UNIX domain sockets. #if !defined(ASIO_HAS_LOCAL_SOCKETS) # if !defined(ASIO_DISABLE_LOCAL_SOCKETS) # if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) # define ASIO_HAS_LOCAL_SOCKETS 1 # endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) # endif // !defined(ASIO_DISABLE_LOCAL_SOCKETS) #endif // !defined(ASIO_HAS_LOCAL_SOCKETS) // Can use sigaction() instead of signal(). #if !defined(ASIO_HAS_SIGACTION) # if !defined(ASIO_DISABLE_SIGACTION) # if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) # define ASIO_HAS_SIGACTION 1 # endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) # endif // !defined(ASIO_DISABLE_SIGACTION) #endif // !defined(ASIO_HAS_SIGACTION) // Can use signal(). #if !defined(ASIO_HAS_SIGNAL) # if !defined(ASIO_DISABLE_SIGNAL) # if !defined(UNDER_CE) # define ASIO_HAS_SIGNAL 1 # endif // !defined(UNDER_CE) # endif // !defined(ASIO_DISABLE_SIGNAL) #endif // !defined(ASIO_HAS_SIGNAL) // Can use getaddrinfo() and getnameinfo(). #if !defined(ASIO_HAS_GETADDRINFO) # if !defined(ASIO_DISABLE_GETADDRINFO) # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) # define ASIO_HAS_GETADDRINFO 1 # elif defined(UNDER_CE) # define ASIO_HAS_GETADDRINFO 1 # endif // defined(UNDER_CE) # elif defined(__MACH__) && defined(__APPLE__) # if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) # if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) # define ASIO_HAS_GETADDRINFO 1 # endif // (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) # else // defined(__MAC_OS_X_VERSION_MIN_REQUIRED) # define ASIO_HAS_GETADDRINFO 1 # endif // defined(__MAC_OS_X_VERSION_MIN_REQUIRED) # else // defined(__MACH__) && defined(__APPLE__) # define ASIO_HAS_GETADDRINFO 1 # endif // defined(__MACH__) && defined(__APPLE__) # endif // !defined(ASIO_DISABLE_GETADDRINFO) #endif // !defined(ASIO_HAS_GETADDRINFO) // Whether standard iostreams are disabled. #if !defined(ASIO_NO_IOSTREAM) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_NO_IOSTREAM) # define ASIO_NO_IOSTREAM 1 # endif // !defined(BOOST_NO_IOSTREAM) #endif // !defined(ASIO_NO_IOSTREAM) // Whether exception handling is disabled. #if !defined(ASIO_NO_EXCEPTIONS) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_NO_EXCEPTIONS) # define ASIO_NO_EXCEPTIONS 1 # endif // !defined(BOOST_NO_EXCEPTIONS) #endif // !defined(ASIO_NO_EXCEPTIONS) // Whether the typeid operator is supported. #if !defined(ASIO_NO_TYPEID) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_NO_TYPEID) # define ASIO_NO_TYPEID 1 # endif // !defined(BOOST_NO_TYPEID) #endif // !defined(ASIO_NO_TYPEID) // Threads. #if !defined(ASIO_HAS_THREADS) # if !defined(ASIO_DISABLE_THREADS) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_THREADS) # define ASIO_HAS_THREADS 1 # elif defined(__GNUC__) && !defined(__MINGW32__) \ && !defined(linux) && !defined(__linux) && !defined(__linux__) # define ASIO_HAS_THREADS 1 # elif defined(_MT) || defined(__MT__) # define ASIO_HAS_THREADS 1 # elif defined(_REENTRANT) # define ASIO_HAS_THREADS 1 # elif defined(__APPLE__) # define ASIO_HAS_THREADS 1 # elif defined(_POSIX_THREADS) && (_POSIX_THREADS + 0 >= 0) # define ASIO_HAS_THREADS 1 # elif defined(_PTHREADS) # define ASIO_HAS_THREADS 1 # endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_THREADS) # endif // !defined(ASIO_DISABLE_THREADS) #endif // !defined(ASIO_HAS_THREADS) // POSIX threads. #if !defined(ASIO_HAS_PTHREADS) # if defined(ASIO_HAS_THREADS) # if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_PTHREADS) # define ASIO_HAS_PTHREADS 1 # elif defined(_POSIX_THREADS) && (_POSIX_THREADS + 0 >= 0) # define ASIO_HAS_PTHREADS 1 # endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_PTHREADS) # endif // defined(ASIO_HAS_THREADS) #endif // !defined(ASIO_HAS_PTHREADS) // Helper to prevent macro expansion. #define ASIO_PREVENT_MACRO_SUBSTITUTION // Helper to define in-class constants. #if !defined(ASIO_STATIC_CONSTANT) # if !defined(ASIO_DISABLE_BOOST_STATIC_CONSTANT) # define ASIO_STATIC_CONSTANT(type, assignment) \ BOOST_STATIC_CONSTANT(type, assignment) # else // !defined(ASIO_DISABLE_BOOST_STATIC_CONSTANT) # define ASIO_STATIC_CONSTANT(type, assignment) \ static const type assignment # endif // !defined(ASIO_DISABLE_BOOST_STATIC_CONSTANT) #endif // !defined(ASIO_STATIC_CONSTANT) // Boost array library. #if !defined(ASIO_HAS_BOOST_ARRAY) # if !defined(ASIO_DISABLE_BOOST_ARRAY) # define ASIO_HAS_BOOST_ARRAY 1 # endif // !defined(ASIO_DISABLE_BOOST_ARRAY) #endif // !defined(ASIO_HAS_BOOST_ARRAY) // Boost assert macro. #if !defined(ASIO_HAS_BOOST_ASSERT) # if !defined(ASIO_DISABLE_BOOST_ASSERT) # define ASIO_HAS_BOOST_ASSERT 1 # endif // !defined(ASIO_DISABLE_BOOST_ASSERT) #endif // !defined(ASIO_HAS_BOOST_ASSERT) // Boost limits header. #if !defined(ASIO_HAS_BOOST_LIMITS) # if !defined(ASIO_DISABLE_BOOST_LIMITS) # define ASIO_HAS_BOOST_LIMITS 1 # endif // !defined(ASIO_DISABLE_BOOST_LIMITS) #endif // !defined(ASIO_HAS_BOOST_LIMITS) // Boost throw_exception function. #if !defined(ASIO_HAS_BOOST_THROW_EXCEPTION) # if !defined(ASIO_DISABLE_BOOST_THROW_EXCEPTION) # define ASIO_HAS_BOOST_THROW_EXCEPTION 1 # endif // !defined(ASIO_DISABLE_BOOST_THROW_EXCEPTION) #endif // !defined(ASIO_HAS_BOOST_THROW_EXCEPTION) // Boost regex library. #if !defined(ASIO_HAS_BOOST_REGEX) # if !defined(ASIO_DISABLE_BOOST_REGEX) # define ASIO_HAS_BOOST_REGEX 1 # endif // !defined(ASIO_DISABLE_BOOST_REGEX) #endif // !defined(ASIO_HAS_BOOST_REGEX) // Boost bind function. #if !defined(ASIO_HAS_BOOST_BIND) # if !defined(ASIO_DISABLE_BOOST_BIND) # define ASIO_HAS_BOOST_BIND 1 # endif // !defined(ASIO_DISABLE_BOOST_BIND) #endif // !defined(ASIO_HAS_BOOST_BIND) // Boost's BOOST_WORKAROUND macro. #if !defined(ASIO_HAS_BOOST_WORKAROUND) # if !defined(ASIO_DISABLE_BOOST_WORKAROUND) # define ASIO_HAS_BOOST_WORKAROUND 1 # endif // !defined(ASIO_DISABLE_BOOST_WORKAROUND) #endif // !defined(ASIO_HAS_BOOST_WORKAROUND) // Microsoft Visual C++'s secure C runtime library. #if !defined(ASIO_HAS_SECURE_RTL) # if !defined(ASIO_DISABLE_SECURE_RTL) # if defined(ASIO_MSVC) \ && (ASIO_MSVC >= 1400) \ && !defined(UNDER_CE) # define ASIO_HAS_SECURE_RTL 1 # endif // defined(ASIO_MSVC) // && (ASIO_MSVC >= 1400) // && !defined(UNDER_CE) # endif // !defined(ASIO_DISABLE_SECURE_RTL) #endif // !defined(ASIO_HAS_SECURE_RTL) // Handler hooking. Disabled for ancient Borland C++ and gcc compilers. #if !defined(ASIO_HAS_HANDLER_HOOKS) # if !defined(ASIO_DISABLE_HANDLER_HOOKS) # if defined(__GNUC__) # if (__GNUC__ >= 3) # define ASIO_HAS_HANDLER_HOOKS 1 # endif // (__GNUC__ >= 3) # elif !defined(__BORLANDC__) # define ASIO_HAS_HANDLER_HOOKS 1 # endif // !defined(__BORLANDC__) # endif // !defined(ASIO_DISABLE_HANDLER_HOOKS) #endif // !defined(ASIO_HAS_HANDLER_HOOKS) // Support for the __thread keyword extension. #if !defined(ASIO_DISABLE_THREAD_KEYWORD_EXTENSION) # if defined(__linux__) # if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) # if ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3) # if !defined(__INTEL_COMPILER) && !defined(__ICL) \ && !(defined(__clang__) && defined(__ANDROID__)) # define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1 # define ASIO_THREAD_KEYWORD __thread # elif defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1100) # define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1 # endif // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1100) // && !(defined(__clang__) && defined(__ANDROID__)) # endif // ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3) # endif // defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) # endif // defined(__linux__) # if defined(ASIO_MSVC) && defined(ASIO_WINDOWS_RUNTIME) # if (_MSC_VER >= 1700) # define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1 # define ASIO_THREAD_KEYWORD __declspec(thread) # endif // (_MSC_VER >= 1700) # endif // defined(ASIO_MSVC) && defined(ASIO_WINDOWS_RUNTIME) #endif // !defined(ASIO_DISABLE_THREAD_KEYWORD_EXTENSION) #if !defined(ASIO_THREAD_KEYWORD) # define ASIO_THREAD_KEYWORD __thread #endif // !defined(ASIO_THREAD_KEYWORD) // Support for POSIX ssize_t typedef. #if !defined(ASIO_DISABLE_SSIZE_T) # if defined(__linux__) \ || (defined(__MACH__) && defined(__APPLE__)) # define ASIO_HAS_SSIZE_T 1 # endif // defined(__linux__) // || (defined(__MACH__) && defined(__APPLE__)) #endif // !defined(ASIO_DISABLE_SSIZE_T) // Helper macros to manage the transition away from the old services-based API. #if defined(ASIO_ENABLE_OLD_SERVICES) # define ASIO_SVC_TPARAM , typename Service # define ASIO_SVC_TPARAM_DEF1(d1) , typename Service d1 # define ASIO_SVC_TPARAM_DEF2(d1, d2) , typename Service d1, d2 # define ASIO_SVC_TARG , Service # define ASIO_SVC_T Service # define ASIO_SVC_TPARAM1 , typename Service1 # define ASIO_SVC_TPARAM1_DEF1(d1) , typename Service1 d1 # define ASIO_SVC_TPARAM1_DEF2(d1, d2) , typename Service1 d1, d2 # define ASIO_SVC_TARG1 , Service1 # define ASIO_SVC_T1 Service1 # define ASIO_SVC_ACCESS public #else // defined(ASIO_ENABLE_OLD_SERVICES) # define ASIO_SVC_TPARAM # define ASIO_SVC_TPARAM_DEF1(d1) # define ASIO_SVC_TPARAM_DEF2(d1, d2) # define ASIO_SVC_TARG // ASIO_SVC_T is defined at each point of use. # define ASIO_SVC_TPARAM1 # define ASIO_SVC_TPARAM1_DEF1(d1) # define ASIO_SVC_TPARAM1_DEF2(d1, d2) # define ASIO_SVC_TARG1 // ASIO_SVC_T1 is defined at each point of use. # define ASIO_SVC_ACCESS protected #endif // defined(ASIO_ENABLE_OLD_SERVICES) // Helper macros to manage transition away from error_code return values. #if defined(ASIO_NO_DEPRECATED) # define ASIO_SYNC_OP_VOID void # define ASIO_SYNC_OP_VOID_RETURN(e) return #else // defined(ASIO_NO_DEPRECATED) # define ASIO_SYNC_OP_VOID asio::error_code # define ASIO_SYNC_OP_VOID_RETURN(e) return e #endif // defined(ASIO_NO_DEPRECATED) // Newer gcc, clang need special treatment to suppress unused typedef warnings. #if defined(__clang__) # if defined(__apple_build_version__) # if (__clang_major__ >= 7) # define ASIO_UNUSED_TYPEDEF __attribute__((__unused__)) # endif // (__clang_major__ >= 7) # elif ((__clang_major__ == 3) && (__clang_minor__ >= 6)) \ || (__clang_major__ > 3) # define ASIO_UNUSED_TYPEDEF __attribute__((__unused__)) # endif // ((__clang_major__ == 3) && (__clang_minor__ >= 6)) // || (__clang_major__ > 3) #elif defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4) # define ASIO_UNUSED_TYPEDEF __attribute__((__unused__)) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4) #endif // defined(__GNUC__) #if !defined(ASIO_UNUSED_TYPEDEF) # define ASIO_UNUSED_TYPEDEF #endif // !defined(ASIO_UNUSED_TYPEDEF) // Some versions of gcc generate spurious warnings about unused variables. #if defined(__GNUC__) # if (__GNUC__ >= 4) # define ASIO_UNUSED_VARIABLE __attribute__((__unused__)) # endif // (__GNUC__ >= 4) #endif // defined(__GNUC__) #if !defined(ASIO_UNUSED_VARIABLE) # define ASIO_UNUSED_VARIABLE #endif // !defined(ASIO_UNUSED_VARIABLE) // Support co_await on compilers known to allow it. #if !defined(ASIO_HAS_CO_AWAIT) # if !defined(ASIO_DISABLE_CO_AWAIT) # if defined(ASIO_MSVC) # if (_MSC_FULL_VER >= 190023506) # if defined(_RESUMABLE_FUNCTIONS_SUPPORTED) # define ASIO_HAS_CO_AWAIT 1 # endif // defined(_RESUMABLE_FUNCTIONS_SUPPORTED) # endif // (_MSC_FULL_VER >= 190023506) # endif // defined(ASIO_MSVC) # endif // !defined(ASIO_DISABLE_CO_AWAIT) # if defined(__clang__) # if (__cpp_coroutines >= 201703) # if __has_include() # define ASIO_HAS_CO_AWAIT 1 # endif // __has_include() # endif // (__cpp_coroutines >= 201703) # endif // defined(__clang__) #endif // !defined(ASIO_HAS_CO_AWAIT) #endif // ASIO_DETAIL_CONFIG_HPP asio-1.12.2/include/asio/detail/consuming_buffers.hpp000066400000000000000000000241521340672067200226120ustar00rootroot00000000000000// // detail/consuming_buffers.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CONSUMING_BUFFERS_HPP #define ASIO_DETAIL_CONSUMING_BUFFERS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/buffer.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper template to determine the maximum number of prepared buffers. template struct prepared_buffers_max { enum { value = buffer_sequence_adapter_base::max_buffers }; }; template struct prepared_buffers_max > { enum { value = N }; }; #if defined(ASIO_HAS_STD_ARRAY) template struct prepared_buffers_max > { enum { value = N }; }; #endif // defined(ASIO_HAS_STD_ARRAY) // A buffer sequence used to represent a subsequence of the buffers. template struct prepared_buffers { typedef Buffer value_type; typedef const Buffer* const_iterator; enum { max_buffers = MaxBuffers < 16 ? MaxBuffers : 16 }; prepared_buffers() : count(0) {} const_iterator begin() const { return elems; } const_iterator end() const { return elems + count; } Buffer elems[max_buffers]; std::size_t count; }; // A proxy for a sub-range in a list of buffers. template class consuming_buffers { public: typedef prepared_buffers::value> prepared_buffers_type; // Construct to represent the entire list of buffers. explicit consuming_buffers(const Buffers& buffers) : buffers_(buffers), total_consumed_(0), next_elem_(0), next_elem_offset_(0) { using asio::buffer_size; total_size_ = buffer_size(buffers); } // Determine if we are at the end of the buffers. bool empty() const { return total_consumed_ >= total_size_; } // Get the buffer for a single transfer, with a size. prepared_buffers_type prepare(std::size_t max_size) { prepared_buffers_type result; Buffer_Iterator next = asio::buffer_sequence_begin(buffers_); Buffer_Iterator end = asio::buffer_sequence_end(buffers_); std::advance(next, next_elem_); std::size_t elem_offset = next_elem_offset_; while (next != end && max_size > 0 && (result.count) < result.max_buffers) { Buffer next_buf = Buffer(*next) + elem_offset; result.elems[result.count] = asio::buffer(next_buf, max_size); max_size -= result.elems[result.count].size(); elem_offset = 0; if (result.elems[result.count].size() > 0) ++result.count; ++next; } return result; } // Consume the specified number of bytes from the buffers. void consume(std::size_t size) { total_consumed_ += size; Buffer_Iterator next = asio::buffer_sequence_begin(buffers_); Buffer_Iterator end = asio::buffer_sequence_end(buffers_); std::advance(next, next_elem_); while (next != end && size > 0) { Buffer next_buf = Buffer(*next) + next_elem_offset_; if (size < next_buf.size()) { next_elem_offset_ += size; size = 0; } else { size -= next_buf.size(); next_elem_offset_ = 0; ++next_elem_; ++next; } } } // Get the total number of bytes consumed from the buffers. std::size_t total_consumed() const { return total_consumed_; } private: Buffers buffers_; std::size_t total_size_; std::size_t total_consumed_; std::size_t next_elem_; std::size_t next_elem_offset_; }; // Base class of all consuming_buffers specialisations for single buffers. template class consuming_single_buffer { public: // Construct to represent the entire list of buffers. template explicit consuming_single_buffer(const Buffer1& buffer) : buffer_(buffer), total_consumed_(0) { } // Determine if we are at the end of the buffers. bool empty() const { return total_consumed_ >= buffer_.size(); } // Get the buffer for a single transfer, with a size. Buffer prepare(std::size_t max_size) { return asio::buffer(buffer_ + total_consumed_, max_size); } // Consume the specified number of bytes from the buffers. void consume(std::size_t size) { total_consumed_ += size; } // Get the total number of bytes consumed from the buffers. std::size_t total_consumed() const { return total_consumed_; } private: Buffer buffer_; std::size_t total_consumed_; }; template <> class consuming_buffers : public consuming_single_buffer { public: explicit consuming_buffers(const mutable_buffer& buffer) : consuming_single_buffer(buffer) { } }; template <> class consuming_buffers : public consuming_single_buffer { public: explicit consuming_buffers(const mutable_buffer& buffer) : consuming_single_buffer(buffer) { } }; template <> class consuming_buffers : public consuming_single_buffer { public: explicit consuming_buffers(const const_buffer& buffer) : consuming_single_buffer(buffer) { } }; #if !defined(ASIO_NO_DEPRECATED) template <> class consuming_buffers : public consuming_single_buffer { public: explicit consuming_buffers(const mutable_buffers_1& buffer) : consuming_single_buffer(buffer) { } }; template <> class consuming_buffers : public consuming_single_buffer { public: explicit consuming_buffers(const mutable_buffers_1& buffer) : consuming_single_buffer(buffer) { } }; template <> class consuming_buffers : public consuming_single_buffer { public: explicit consuming_buffers(const const_buffers_1& buffer) : consuming_single_buffer(buffer) { } }; #endif // !defined(ASIO_NO_DEPRECATED) template class consuming_buffers, typename boost::array::const_iterator> { public: // Construct to represent the entire list of buffers. explicit consuming_buffers(const boost::array& buffers) : buffers_(buffers), total_consumed_(0) { } // Determine if we are at the end of the buffers. bool empty() const { return total_consumed_ >= Buffer(buffers_[0]).size() + Buffer(buffers_[1]).size(); } // Get the buffer for a single transfer, with a size. boost::array prepare(std::size_t max_size) { boost::array result = {{ Buffer(buffers_[0]), Buffer(buffers_[1]) }}; std::size_t buffer0_size = result[0].size(); result[0] = asio::buffer(result[0] + total_consumed_, max_size); result[1] = asio::buffer( result[1] + (total_consumed_ < buffer0_size ? 0 : total_consumed_ - buffer0_size), max_size - result[0].size()); return result; } // Consume the specified number of bytes from the buffers. void consume(std::size_t size) { total_consumed_ += size; } // Get the total number of bytes consumed from the buffers. std::size_t total_consumed() const { return total_consumed_; } private: boost::array buffers_; std::size_t total_consumed_; }; #if defined(ASIO_HAS_STD_ARRAY) template class consuming_buffers, typename std::array::const_iterator> { public: // Construct to represent the entire list of buffers. explicit consuming_buffers(const std::array& buffers) : buffers_(buffers), total_consumed_(0) { } // Determine if we are at the end of the buffers. bool empty() const { return total_consumed_ >= Buffer(buffers_[0]).size() + Buffer(buffers_[1]).size(); } // Get the buffer for a single transfer, with a size. std::array prepare(std::size_t max_size) { std::array result = {{ Buffer(buffers_[0]), Buffer(buffers_[1]) }}; std::size_t buffer0_size = result[0].size(); result[0] = asio::buffer(result[0] + total_consumed_, max_size); result[1] = asio::buffer( result[1] + (total_consumed_ < buffer0_size ? 0 : total_consumed_ - buffer0_size), max_size - result[0].size()); return result; } // Consume the specified number of bytes from the buffers. void consume(std::size_t size) { total_consumed_ += size; } // Get the total number of bytes consumed from the buffers. std::size_t total_consumed() const { return total_consumed_; } private: std::array buffers_; std::size_t total_consumed_; }; #endif // defined(ASIO_HAS_STD_ARRAY) // Specialisation for null_buffers to ensure that the null_buffers type is // always passed through to the underlying read or write operation. template class consuming_buffers : public asio::null_buffers { public: consuming_buffers(const null_buffers&) { // No-op. } bool empty() { return false; } null_buffers prepare(std::size_t) { return null_buffers(); } void consume(std::size_t) { // No-op. } std::size_t total_consumed() const { return 0; } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_CONSUMING_BUFFERS_HPP asio-1.12.2/include/asio/detail/cstddef.hpp000066400000000000000000000013371340672067200205100ustar00rootroot00000000000000// // detail/cstddef.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CSTDDEF_HPP #define ASIO_DETAIL_CSTDDEF_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include namespace asio { #if defined(ASIO_HAS_NULLPTR) using std::nullptr_t; #else // defined(ASIO_HAS_NULLPTR) struct nullptr_t {}; #endif // defined(ASIO_HAS_NULLPTR) } // namespace asio #endif // ASIO_DETAIL_CSTDDEF_HPP asio-1.12.2/include/asio/detail/cstdint.hpp000066400000000000000000000026631340672067200205470ustar00rootroot00000000000000// // detail/cstdint.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_CSTDINT_HPP #define ASIO_DETAIL_CSTDINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_CSTDINT) # include #else // defined(ASIO_HAS_CSTDINT) # include #endif // defined(ASIO_HAS_CSTDINT) namespace asio { #if defined(ASIO_HAS_CSTDINT) using std::int16_t; using std::int_least16_t; using std::uint16_t; using std::uint_least16_t; using std::int32_t; using std::int_least32_t; using std::uint32_t; using std::uint_least32_t; using std::int64_t; using std::int_least64_t; using std::uint64_t; using std::uint_least64_t; using std::uintmax_t; #else // defined(ASIO_HAS_CSTDINT) using boost::int16_t; using boost::int_least16_t; using boost::uint16_t; using boost::uint_least16_t; using boost::int32_t; using boost::int_least32_t; using boost::uint32_t; using boost::uint_least32_t; using boost::int64_t; using boost::int_least64_t; using boost::uint64_t; using boost::uint_least64_t; using boost::uintmax_t; #endif // defined(ASIO_HAS_CSTDINT) } // namespace asio #endif // ASIO_DETAIL_CSTDINT_HPP asio-1.12.2/include/asio/detail/date_time_fwd.hpp000066400000000000000000000014001340672067200216560ustar00rootroot00000000000000// // detail/date_time_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DATE_TIME_FWD_HPP #define ASIO_DETAIL_DATE_TIME_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" namespace boost { namespace date_time { template class base_time; } // namespace date_time namespace posix_time { class ptime; } // namespace posix_time } // namespace boost #endif // ASIO_DETAIL_DATE_TIME_FWD_HPP asio-1.12.2/include/asio/detail/deadline_timer_service.hpp000066400000000000000000000201661340672067200235620ustar00rootroot00000000000000// // detail/deadline_timer_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP #define ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/timer_queue.hpp" #include "asio/detail/timer_queue_ptime.hpp" #include "asio/detail/timer_scheduler.hpp" #include "asio/detail/wait_handler.hpp" #include "asio/detail/wait_op.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include # include #endif // defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class deadline_timer_service : public service_base > { public: // The time type. typedef typename Time_Traits::time_type time_type; // The duration type. typedef typename Time_Traits::duration_type duration_type; // The implementation type of the timer. This type is dependent on the // underlying implementation of the timer service. struct implementation_type : private asio::detail::noncopyable { time_type expiry; bool might_have_pending_waits; typename timer_queue::per_timer_data timer_data; }; // Constructor. deadline_timer_service(asio::io_context& io_context) : service_base >(io_context), scheduler_(asio::use_service(io_context)) { scheduler_.init_task(); scheduler_.add_timer_queue(timer_queue_); } // Destructor. ~deadline_timer_service() { scheduler_.remove_timer_queue(timer_queue_); } // Destroy all user-defined handler objects owned by the service. void shutdown() { } // Construct a new timer implementation. void construct(implementation_type& impl) { impl.expiry = time_type(); impl.might_have_pending_waits = false; } // Destroy a timer implementation. void destroy(implementation_type& impl) { asio::error_code ec; cancel(impl, ec); } // Move-construct a new serial port implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { scheduler_.move_timer(timer_queue_, impl.timer_data, other_impl.timer_data); impl.expiry = other_impl.expiry; other_impl.expiry = time_type(); impl.might_have_pending_waits = other_impl.might_have_pending_waits; other_impl.might_have_pending_waits = false; } // Move-assign from another serial port implementation. void move_assign(implementation_type& impl, deadline_timer_service& other_service, implementation_type& other_impl) { if (this != &other_service) if (impl.might_have_pending_waits) scheduler_.cancel_timer(timer_queue_, impl.timer_data); other_service.scheduler_.move_timer(other_service.timer_queue_, impl.timer_data, other_impl.timer_data); impl.expiry = other_impl.expiry; other_impl.expiry = time_type(); impl.might_have_pending_waits = other_impl.might_have_pending_waits; other_impl.might_have_pending_waits = false; } // Cancel any asynchronous wait operations associated with the timer. std::size_t cancel(implementation_type& impl, asio::error_code& ec) { if (!impl.might_have_pending_waits) { ec = asio::error_code(); return 0; } ASIO_HANDLER_OPERATION((scheduler_.context(), "deadline_timer", &impl, 0, "cancel")); std::size_t count = scheduler_.cancel_timer(timer_queue_, impl.timer_data); impl.might_have_pending_waits = false; ec = asio::error_code(); return count; } // Cancels one asynchronous wait operation associated with the timer. std::size_t cancel_one(implementation_type& impl, asio::error_code& ec) { if (!impl.might_have_pending_waits) { ec = asio::error_code(); return 0; } ASIO_HANDLER_OPERATION((scheduler_.context(), "deadline_timer", &impl, 0, "cancel_one")); std::size_t count = scheduler_.cancel_timer( timer_queue_, impl.timer_data, 1); if (count == 0) impl.might_have_pending_waits = false; ec = asio::error_code(); return count; } // Get the expiry time for the timer as an absolute time. time_type expiry(const implementation_type& impl) const { return impl.expiry; } // Get the expiry time for the timer as an absolute time. time_type expires_at(const implementation_type& impl) const { return impl.expiry; } // Get the expiry time for the timer relative to now. duration_type expires_from_now(const implementation_type& impl) const { return Time_Traits::subtract(this->expiry(impl), Time_Traits::now()); } // Set the expiry time for the timer as an absolute time. std::size_t expires_at(implementation_type& impl, const time_type& expiry_time, asio::error_code& ec) { std::size_t count = cancel(impl, ec); impl.expiry = expiry_time; ec = asio::error_code(); return count; } // Set the expiry time for the timer relative to now. std::size_t expires_after(implementation_type& impl, const duration_type& expiry_time, asio::error_code& ec) { return expires_at(impl, Time_Traits::add(Time_Traits::now(), expiry_time), ec); } // Set the expiry time for the timer relative to now. std::size_t expires_from_now(implementation_type& impl, const duration_type& expiry_time, asio::error_code& ec) { return expires_at(impl, Time_Traits::add(Time_Traits::now(), expiry_time), ec); } // Perform a blocking wait on the timer. void wait(implementation_type& impl, asio::error_code& ec) { time_type now = Time_Traits::now(); ec = asio::error_code(); while (Time_Traits::less_than(now, impl.expiry) && !ec) { this->do_wait(Time_Traits::to_posix_duration( Time_Traits::subtract(impl.expiry, now)), ec); now = Time_Traits::now(); } } // Start an asynchronous wait on the timer. template void async_wait(implementation_type& impl, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef wait_handler op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); impl.might_have_pending_waits = true; ASIO_HANDLER_CREATION((scheduler_.context(), *p.p, "deadline_timer", &impl, 0, "async_wait")); scheduler_.schedule_timer(timer_queue_, impl.expiry, impl.timer_data, p.p); p.v = p.p = 0; } private: // Helper function to wait given a duration type. The duration type should // either be of type boost::posix_time::time_duration, or implement the // required subset of its interface. template void do_wait(const Duration& timeout, asio::error_code& ec) { #if defined(ASIO_WINDOWS_RUNTIME) std::this_thread::sleep_for( std::chrono::seconds(timeout.total_seconds()) + std::chrono::microseconds(timeout.total_microseconds())); ec = asio::error_code(); #else // defined(ASIO_WINDOWS_RUNTIME) ::timeval tv; tv.tv_sec = timeout.total_seconds(); tv.tv_usec = timeout.total_microseconds() % 1000000; socket_ops::select(0, 0, 0, 0, &tv, ec); #endif // defined(ASIO_WINDOWS_RUNTIME) } // The queue of timers. timer_queue timer_queue_; // The object that schedules and executes timers. Usually a reactor. timer_scheduler& scheduler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP asio-1.12.2/include/asio/detail/dependent_type.hpp000066400000000000000000000014601340672067200221000ustar00rootroot00000000000000// // detail/dependent_type.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DEPENDENT_TYPE_HPP #define ASIO_DETAIL_DEPENDENT_TYPE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct dependent_type { typedef T type; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_DEPENDENT_TYPE_HPP asio-1.12.2/include/asio/detail/descriptor_ops.hpp000066400000000000000000000063071340672067200221350ustar00rootroot00000000000000// // detail/descriptor_ops.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DESCRIPTOR_OPS_HPP #define ASIO_DETAIL_DESCRIPTOR_OPS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) #include #include "asio/error.hpp" #include "asio/error_code.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace descriptor_ops { // Descriptor state bits. enum { // The user wants a non-blocking descriptor. user_set_non_blocking = 1, // The descriptor has been set non-blocking. internal_non_blocking = 2, // Helper "state" used to determine whether the descriptor is non-blocking. non_blocking = user_set_non_blocking | internal_non_blocking, // The descriptor may have been dup()-ed. possible_dup = 4 }; typedef unsigned char state_type; template inline ReturnType error_wrapper(ReturnType return_value, asio::error_code& ec) { ec = asio::error_code(errno, asio::error::get_system_category()); return return_value; } ASIO_DECL int open(const char* path, int flags, asio::error_code& ec); ASIO_DECL int close(int d, state_type& state, asio::error_code& ec); ASIO_DECL bool set_user_non_blocking(int d, state_type& state, bool value, asio::error_code& ec); ASIO_DECL bool set_internal_non_blocking(int d, state_type& state, bool value, asio::error_code& ec); typedef iovec buf; ASIO_DECL std::size_t sync_read(int d, state_type state, buf* bufs, std::size_t count, bool all_empty, asio::error_code& ec); ASIO_DECL bool non_blocking_read(int d, buf* bufs, std::size_t count, asio::error_code& ec, std::size_t& bytes_transferred); ASIO_DECL std::size_t sync_write(int d, state_type state, const buf* bufs, std::size_t count, bool all_empty, asio::error_code& ec); ASIO_DECL bool non_blocking_write(int d, const buf* bufs, std::size_t count, asio::error_code& ec, std::size_t& bytes_transferred); ASIO_DECL int ioctl(int d, state_type& state, long cmd, ioctl_arg_type* arg, asio::error_code& ec); ASIO_DECL int fcntl(int d, int cmd, asio::error_code& ec); ASIO_DECL int fcntl(int d, int cmd, long arg, asio::error_code& ec); ASIO_DECL int poll_read(int d, state_type state, asio::error_code& ec); ASIO_DECL int poll_write(int d, state_type state, asio::error_code& ec); ASIO_DECL int poll_error(int d, state_type state, asio::error_code& ec); } // namespace descriptor_ops } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/descriptor_ops.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) #endif // ASIO_DETAIL_DESCRIPTOR_OPS_HPP asio-1.12.2/include/asio/detail/descriptor_read_op.hpp000066400000000000000000000074661340672067200227540ustar00rootroot00000000000000// // detail/descriptor_read_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DESCRIPTOR_READ_OP_HPP #define ASIO_DETAIL_DESCRIPTOR_READ_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/descriptor_ops.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_work.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class descriptor_read_op_base : public reactor_op { public: descriptor_read_op_base(int descriptor, const MutableBufferSequence& buffers, func_type complete_func) : reactor_op(&descriptor_read_op_base::do_perform, complete_func), descriptor_(descriptor), buffers_(buffers) { } static status do_perform(reactor_op* base) { descriptor_read_op_base* o(static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); status result = descriptor_ops::non_blocking_read(o->descriptor_, bufs.buffers(), bufs.count(), o->ec_, o->bytes_transferred_) ? done : not_done; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_read", o->ec_, o->bytes_transferred_)); return result; } private: int descriptor_; MutableBufferSequence buffers_; }; template class descriptor_read_op : public descriptor_read_op_base { public: ASIO_DEFINE_HANDLER_PTR(descriptor_read_op); descriptor_read_op(int descriptor, const MutableBufferSequence& buffers, Handler& handler) : descriptor_read_op_base( descriptor, buffers, &descriptor_read_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. descriptor_read_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #endif // ASIO_DETAIL_DESCRIPTOR_READ_OP_HPP asio-1.12.2/include/asio/detail/descriptor_write_op.hpp000066400000000000000000000074701340672067200231660ustar00rootroot00000000000000// // detail/descriptor_write_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DESCRIPTOR_WRITE_OP_HPP #define ASIO_DETAIL_DESCRIPTOR_WRITE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/descriptor_ops.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_work.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class descriptor_write_op_base : public reactor_op { public: descriptor_write_op_base(int descriptor, const ConstBufferSequence& buffers, func_type complete_func) : reactor_op(&descriptor_write_op_base::do_perform, complete_func), descriptor_(descriptor), buffers_(buffers) { } static status do_perform(reactor_op* base) { descriptor_write_op_base* o(static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); status result = descriptor_ops::non_blocking_write(o->descriptor_, bufs.buffers(), bufs.count(), o->ec_, o->bytes_transferred_) ? done : not_done; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_write", o->ec_, o->bytes_transferred_)); return result; } private: int descriptor_; ConstBufferSequence buffers_; }; template class descriptor_write_op : public descriptor_write_op_base { public: ASIO_DEFINE_HANDLER_PTR(descriptor_write_op); descriptor_write_op(int descriptor, const ConstBufferSequence& buffers, Handler& handler) : descriptor_write_op_base( descriptor, buffers, &descriptor_write_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. descriptor_write_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #endif // ASIO_DETAIL_DESCRIPTOR_WRITE_OP_HPP asio-1.12.2/include/asio/detail/dev_poll_reactor.hpp000066400000000000000000000170241340672067200224170ustar00rootroot00000000000000// // detail/dev_poll_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_DEV_POLL_REACTOR_HPP #define ASIO_DETAIL_DEV_POLL_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_DEV_POLL) #include #include #include #include "asio/detail/hash_map.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/reactor_op_queue.hpp" #include "asio/detail/select_interrupter.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/wait_op.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class dev_poll_reactor : public execution_context_service_base { public: enum op_types { read_op = 0, write_op = 1, connect_op = 1, except_op = 2, max_ops = 3 }; // Per-descriptor data. struct per_descriptor_data { }; // Constructor. ASIO_DECL dev_poll_reactor(asio::execution_context& ctx); // Destructor. ASIO_DECL ~dev_poll_reactor(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Recreate internal descriptors following a fork. ASIO_DECL void notify_fork( asio::execution_context::fork_event fork_ev); // Initialise the task. ASIO_DECL void init_task(); // Register a socket with the reactor. Returns 0 on success, system error // code on failure. ASIO_DECL int register_descriptor(socket_type, per_descriptor_data&); // Register a descriptor with an associated single operation. Returns 0 on // success, system error code on failure. ASIO_DECL int register_internal_descriptor( int op_type, socket_type descriptor, per_descriptor_data& descriptor_data, reactor_op* op); // Move descriptor registration from one descriptor_data object to another. ASIO_DECL void move_descriptor(socket_type descriptor, per_descriptor_data& target_descriptor_data, per_descriptor_data& source_descriptor_data); // Post a reactor operation for immediate completion. void post_immediate_completion(reactor_op* op, bool is_continuation) { scheduler_.post_immediate_completion(op, is_continuation); } // Start a new operation. The reactor operation will be performed when the // given descriptor is flagged as ready, or an error has occurred. ASIO_DECL void start_op(int op_type, socket_type descriptor, per_descriptor_data&, reactor_op* op, bool is_continuation, bool allow_speculative); // Cancel all operations associated with the given descriptor. The // handlers associated with the descriptor will be invoked with the // operation_aborted error. ASIO_DECL void cancel_ops(socket_type descriptor, per_descriptor_data&); // Cancel any operations that are running against the descriptor and remove // its registration from the reactor. The reactor resources associated with // the descriptor must be released by calling cleanup_descriptor_data. ASIO_DECL void deregister_descriptor(socket_type descriptor, per_descriptor_data&, bool closing); // Remove the descriptor's registration from the reactor. The reactor // resources associated with the descriptor must be released by calling // cleanup_descriptor_data. ASIO_DECL void deregister_internal_descriptor( socket_type descriptor, per_descriptor_data&); // Perform any post-deregistration cleanup tasks associated with the // descriptor data. ASIO_DECL void cleanup_descriptor_data(per_descriptor_data&); // Add a new timer queue to the reactor. template void add_timer_queue(timer_queue& queue); // Remove a timer queue from the reactor. template void remove_timer_queue(timer_queue& queue); // Schedule a new operation in the given timer queue to expire at the // specified absolute time. template void schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op); // Cancel the timer operations associated with the given token. Returns the // number of operations that have been posted or dispatched. template std::size_t cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move the timer operations associated with the given timer. template void move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source); // Run /dev/poll once until interrupted or events are ready to be dispatched. ASIO_DECL void run(long usec, op_queue& ops); // Interrupt the select loop. ASIO_DECL void interrupt(); private: // Create the /dev/poll file descriptor. Throws an exception if the descriptor // cannot be created. ASIO_DECL static int do_dev_poll_create(); // Helper function to add a new timer queue. ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); // Helper function to remove a timer queue. ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); // Get the timeout value for the /dev/poll DP_POLL operation. The timeout // value is returned as a number of milliseconds. A return value of -1 // indicates that the poll should block indefinitely. ASIO_DECL int get_timeout(int msec); // Cancel all operations associated with the given descriptor. The do_cancel // function of the handler objects will be invoked. This function does not // acquire the dev_poll_reactor's mutex. ASIO_DECL void cancel_ops_unlocked(socket_type descriptor, const asio::error_code& ec); // Add a pending event entry for the given descriptor. ASIO_DECL ::pollfd& add_pending_event_change(int descriptor); // The scheduler implementation used to post completions. scheduler& scheduler_; // Mutex to protect access to internal data. asio::detail::mutex mutex_; // The /dev/poll file descriptor. int dev_poll_fd_; // Vector of /dev/poll events waiting to be written to the descriptor. std::vector< ::pollfd> pending_event_changes_; // Hash map to associate a descriptor with a pending event change index. hash_map pending_event_change_index_; // The interrupter is used to break a blocking DP_POLL operation. select_interrupter interrupter_; // The queues of read, write and except operations. reactor_op_queue op_queue_[max_ops]; // The timer queues. timer_queue_set timer_queues_; // Whether the service has been shut down. bool shutdown_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/dev_poll_reactor.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/dev_poll_reactor.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_DEV_POLL) #endif // ASIO_DETAIL_DEV_POLL_REACTOR_HPP asio-1.12.2/include/asio/detail/epoll_reactor.hpp000066400000000000000000000215631340672067200217310ustar00rootroot00000000000000// // detail/epoll_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_EPOLL_REACTOR_HPP #define ASIO_DETAIL_EPOLL_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_EPOLL) #include "asio/detail/atomic_count.hpp" #include "asio/detail/conditionally_enabled_mutex.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/object_pool.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/select_interrupter.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/wait_op.hpp" #include "asio/execution_context.hpp" #if defined(ASIO_HAS_TIMERFD) # include #endif // defined(ASIO_HAS_TIMERFD) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class epoll_reactor : public execution_context_service_base { private: // The mutex type used by this reactor. typedef conditionally_enabled_mutex mutex; public: enum op_types { read_op = 0, write_op = 1, connect_op = 1, except_op = 2, max_ops = 3 }; // Per-descriptor queues. class descriptor_state : operation { friend class epoll_reactor; friend class object_pool_access; descriptor_state* next_; descriptor_state* prev_; mutex mutex_; epoll_reactor* reactor_; int descriptor_; uint32_t registered_events_; op_queue op_queue_[max_ops]; bool try_speculative_[max_ops]; bool shutdown_; ASIO_DECL descriptor_state(bool locking); void set_ready_events(uint32_t events) { task_result_ = events; } void add_ready_events(uint32_t events) { task_result_ |= events; } ASIO_DECL operation* perform_io(uint32_t events); ASIO_DECL static void do_complete( void* owner, operation* base, const asio::error_code& ec, std::size_t bytes_transferred); }; // Per-descriptor data. typedef descriptor_state* per_descriptor_data; // Constructor. ASIO_DECL epoll_reactor(asio::execution_context& ctx); // Destructor. ASIO_DECL ~epoll_reactor(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Recreate internal descriptors following a fork. ASIO_DECL void notify_fork( asio::execution_context::fork_event fork_ev); // Initialise the task. ASIO_DECL void init_task(); // Register a socket with the reactor. Returns 0 on success, system error // code on failure. ASIO_DECL int register_descriptor(socket_type descriptor, per_descriptor_data& descriptor_data); // Register a descriptor with an associated single operation. Returns 0 on // success, system error code on failure. ASIO_DECL int register_internal_descriptor( int op_type, socket_type descriptor, per_descriptor_data& descriptor_data, reactor_op* op); // Move descriptor registration from one descriptor_data object to another. ASIO_DECL void move_descriptor(socket_type descriptor, per_descriptor_data& target_descriptor_data, per_descriptor_data& source_descriptor_data); // Post a reactor operation for immediate completion. void post_immediate_completion(reactor_op* op, bool is_continuation) { scheduler_.post_immediate_completion(op, is_continuation); } // Start a new operation. The reactor operation will be performed when the // given descriptor is flagged as ready, or an error has occurred. ASIO_DECL void start_op(int op_type, socket_type descriptor, per_descriptor_data& descriptor_data, reactor_op* op, bool is_continuation, bool allow_speculative); // Cancel all operations associated with the given descriptor. The // handlers associated with the descriptor will be invoked with the // operation_aborted error. ASIO_DECL void cancel_ops(socket_type descriptor, per_descriptor_data& descriptor_data); // Cancel any operations that are running against the descriptor and remove // its registration from the reactor. The reactor resources associated with // the descriptor must be released by calling cleanup_descriptor_data. ASIO_DECL void deregister_descriptor(socket_type descriptor, per_descriptor_data& descriptor_data, bool closing); // Remove the descriptor's registration from the reactor. The reactor // resources associated with the descriptor must be released by calling // cleanup_descriptor_data. ASIO_DECL void deregister_internal_descriptor( socket_type descriptor, per_descriptor_data& descriptor_data); // Perform any post-deregistration cleanup tasks associated with the // descriptor data. ASIO_DECL void cleanup_descriptor_data( per_descriptor_data& descriptor_data); // Add a new timer queue to the reactor. template void add_timer_queue(timer_queue& timer_queue); // Remove a timer queue from the reactor. template void remove_timer_queue(timer_queue& timer_queue); // Schedule a new operation in the given timer queue to expire at the // specified absolute time. template void schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op); // Cancel the timer operations associated with the given token. Returns the // number of operations that have been posted or dispatched. template std::size_t cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move the timer operations associated with the given timer. template void move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source); // Run epoll once until interrupted or events are ready to be dispatched. ASIO_DECL void run(long usec, op_queue& ops); // Interrupt the select loop. ASIO_DECL void interrupt(); private: // The hint to pass to epoll_create to size its data structures. enum { epoll_size = 20000 }; // Create the epoll file descriptor. Throws an exception if the descriptor // cannot be created. ASIO_DECL static int do_epoll_create(); // Create the timerfd file descriptor. Does not throw. ASIO_DECL static int do_timerfd_create(); // Allocate a new descriptor state object. ASIO_DECL descriptor_state* allocate_descriptor_state(); // Free an existing descriptor state object. ASIO_DECL void free_descriptor_state(descriptor_state* s); // Helper function to add a new timer queue. ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); // Helper function to remove a timer queue. ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); // Called to recalculate and update the timeout. ASIO_DECL void update_timeout(); // Get the timeout value for the epoll_wait call. The timeout value is // returned as a number of milliseconds. A return value of -1 indicates // that epoll_wait should block indefinitely. ASIO_DECL int get_timeout(int msec); #if defined(ASIO_HAS_TIMERFD) // Get the timeout value for the timer descriptor. The return value is the // flag argument to be used when calling timerfd_settime. ASIO_DECL int get_timeout(itimerspec& ts); #endif // defined(ASIO_HAS_TIMERFD) // The scheduler implementation used to post completions. scheduler& scheduler_; // Mutex to protect access to internal data. mutex mutex_; // The interrupter is used to break a blocking epoll_wait call. select_interrupter interrupter_; // The epoll file descriptor. int epoll_fd_; // The timer file descriptor. int timer_fd_; // The timer queues. timer_queue_set timer_queues_; // Whether the service has been shut down. bool shutdown_; // Mutex to protect access to the registered descriptors. mutex registered_descriptors_mutex_; // Keep track of all registered descriptors. object_pool registered_descriptors_; // Helper class to do post-perform_io cleanup. struct perform_io_cleanup_on_block_exit; friend struct perform_io_cleanup_on_block_exit; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/epoll_reactor.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/epoll_reactor.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_EPOLL) #endif // ASIO_DETAIL_EPOLL_REACTOR_HPP asio-1.12.2/include/asio/detail/event.hpp000066400000000000000000000023151340672067200202120ustar00rootroot00000000000000// // detail/event.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_EVENT_HPP #define ASIO_DETAIL_EVENT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) # include "asio/detail/null_event.hpp" #elif defined(ASIO_WINDOWS) # include "asio/detail/win_event.hpp" #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_event.hpp" #elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) # include "asio/detail/std_event.hpp" #else # error Only Windows, POSIX and std::condition_variable are supported! #endif namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) typedef null_event event; #elif defined(ASIO_WINDOWS) typedef win_event event; #elif defined(ASIO_HAS_PTHREADS) typedef posix_event event; #elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) typedef std_event event; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_EVENT_HPP asio-1.12.2/include/asio/detail/eventfd_select_interrupter.hpp000066400000000000000000000045071340672067200245330ustar00rootroot00000000000000// // detail/eventfd_select_interrupter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Roelof Naude (roelof.naude at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_EVENTFD_SELECT_INTERRUPTER_HPP #define ASIO_DETAIL_EVENTFD_SELECT_INTERRUPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_EVENTFD) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class eventfd_select_interrupter { public: // Constructor. ASIO_DECL eventfd_select_interrupter(); // Destructor. ASIO_DECL ~eventfd_select_interrupter(); // Recreate the interrupter's descriptors. Used after a fork. ASIO_DECL void recreate(); // Interrupt the select call. ASIO_DECL void interrupt(); // Reset the select interrupt. Returns true if the call was interrupted. ASIO_DECL bool reset(); // Get the read descriptor to be passed to select. int read_descriptor() const { return read_descriptor_; } private: // Open the descriptors. Throws on error. ASIO_DECL void open_descriptors(); // Close the descriptors. ASIO_DECL void close_descriptors(); // The read end of a connection used to interrupt the select call. This file // descriptor is passed to select such that when it is time to stop, a single // 64bit value will be written on the other end of the connection and this // descriptor will become readable. int read_descriptor_; // The write end of a connection used to interrupt the select call. A single // 64bit non-zero value may be written to this to wake up the select which is // waiting for the other end to become readable. This descriptor will only // differ from the read descriptor when a pipe is used. int write_descriptor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/eventfd_select_interrupter.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_EVENTFD) #endif // ASIO_DETAIL_EVENTFD_SELECT_INTERRUPTER_HPP asio-1.12.2/include/asio/detail/executor_op.hpp000066400000000000000000000046211340672067200214270ustar00rootroot00000000000000// // detail/executor_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_EXECUTOR_OP_HPP #define ASIO_DETAIL_EXECUTOR_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/scheduler_operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class executor_op : public Operation { public: ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(executor_op); template executor_op(ASIO_MOVE_ARG(H) h, const Alloc& allocator) : Operation(&executor_op::do_complete), handler_(ASIO_MOVE_CAST(H)(h)), allocator_(allocator) { } static void do_complete(void* owner, Operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. executor_op* o(static_cast(base)); Alloc allocator(o->allocator_); ptr p = { detail::addressof(allocator), o, o }; ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. Handler handler(ASIO_MOVE_CAST(Handler)(o->handler_)); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN(()); asio_handler_invoke_helpers::invoke(handler, handler); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; Alloc allocator_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_EXECUTOR_OP_HPP asio-1.12.2/include/asio/detail/fd_set_adapter.hpp000066400000000000000000000017131340672067200220360ustar00rootroot00000000000000// // detail/fd_set_adapter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_FD_SET_ADAPTER_HPP #define ASIO_DETAIL_FD_SET_ADAPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/posix_fd_set_adapter.hpp" #include "asio/detail/win_fd_set_adapter.hpp" namespace asio { namespace detail { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) typedef win_fd_set_adapter fd_set_adapter; #else typedef posix_fd_set_adapter fd_set_adapter; #endif } // namespace detail } // namespace asio #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_FD_SET_ADAPTER_HPP asio-1.12.2/include/asio/detail/fenced_block.hpp000066400000000000000000000055171340672067200214760ustar00rootroot00000000000000// // detail/fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_FENCED_BLOCK_HPP #define ASIO_DETAIL_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) \ || defined(ASIO_DISABLE_FENCED_BLOCK) # include "asio/detail/null_fenced_block.hpp" #elif defined(ASIO_HAS_STD_ATOMIC) # include "asio/detail/std_fenced_block.hpp" #elif defined(__MACH__) && defined(__APPLE__) # include "asio/detail/macos_fenced_block.hpp" #elif defined(__sun) # include "asio/detail/solaris_fenced_block.hpp" #elif defined(__GNUC__) && defined(__arm__) \ && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) # include "asio/detail/gcc_arm_fenced_block.hpp" #elif defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) # include "asio/detail/gcc_hppa_fenced_block.hpp" #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) # include "asio/detail/gcc_x86_fenced_block.hpp" #elif defined(__GNUC__) \ && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \ && !defined(__INTEL_COMPILER) && !defined(__ICL) \ && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) # include "asio/detail/gcc_sync_fenced_block.hpp" #elif defined(ASIO_WINDOWS) && !defined(UNDER_CE) # include "asio/detail/win_fenced_block.hpp" #else # include "asio/detail/null_fenced_block.hpp" #endif namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) \ || defined(ASIO_DISABLE_FENCED_BLOCK) typedef null_fenced_block fenced_block; #elif defined(ASIO_HAS_STD_ATOMIC) typedef std_fenced_block fenced_block; #elif defined(__MACH__) && defined(__APPLE__) typedef macos_fenced_block fenced_block; #elif defined(__sun) typedef solaris_fenced_block fenced_block; #elif defined(__GNUC__) && defined(__arm__) \ && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) typedef gcc_arm_fenced_block fenced_block; #elif defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) typedef gcc_hppa_fenced_block fenced_block; #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) typedef gcc_x86_fenced_block fenced_block; #elif defined(__GNUC__) \ && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \ && !defined(__INTEL_COMPILER) && !defined(__ICL) \ && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) typedef gcc_sync_fenced_block fenced_block; #elif defined(ASIO_WINDOWS) && !defined(UNDER_CE) typedef win_fenced_block fenced_block; #else typedef null_fenced_block fenced_block; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/functional.hpp000066400000000000000000000016311340672067200212330ustar00rootroot00000000000000// // detail/functional.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_FUNCTIONAL_HPP #define ASIO_DETAIL_FUNCTIONAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #if !defined(ASIO_HAS_STD_FUNCTION) # include #endif // !defined(ASIO_HAS_STD_FUNCTION) namespace asio { namespace detail { #if defined(ASIO_HAS_STD_FUNCTION) using std::function; #else // defined(ASIO_HAS_STD_FUNCTION) using boost::function; #endif // defined(ASIO_HAS_STD_FUNCTION) } // namespace detail } // namespace asio #endif // ASIO_DETAIL_FUNCTIONAL_HPP asio-1.12.2/include/asio/detail/future.hpp000066400000000000000000000022271340672067200204050ustar00rootroot00000000000000// // detail/future.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_FUTURE_HPP #define ASIO_DETAIL_FUTURE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_FUTURE) # include // Even though the future header is available, libstdc++ may not implement the // std::future class itself. However, we need to have already included the // future header to reliably test for _GLIBCXX_HAS_GTHREADS. # if defined(__GNUC__) && !defined(ASIO_HAS_CLANG_LIBCXX) # if defined(_GLIBCXX_HAS_GTHREADS) # define ASIO_HAS_STD_FUTURE_CLASS 1 # endif // defined(_GLIBCXX_HAS_GTHREADS) # else // defined(__GNUC__) && !defined(ASIO_HAS_CLANG_LIBCXX) # define ASIO_HAS_STD_FUTURE_CLASS 1 # endif // defined(__GNUC__) && !defined(ASIO_HAS_CLANG_LIBCXX) #endif // defined(ASIO_HAS_STD_FUTURE) #endif // ASIO_DETAIL_FUTURE_HPP asio-1.12.2/include/asio/detail/gcc_arm_fenced_block.hpp000066400000000000000000000041551340672067200231460ustar00rootroot00000000000000// // detail/gcc_arm_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_GCC_ARM_FENCED_BLOCK_HPP #define ASIO_DETAIL_GCC_ARM_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(__GNUC__) && defined(__arm__) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class gcc_arm_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit gcc_arm_fenced_block(half_t) { } // Constructor for a full fenced block. explicit gcc_arm_fenced_block(full_t) { barrier(); } // Destructor. ~gcc_arm_fenced_block() { barrier(); } private: static void barrier() { #if defined(__ARM_ARCH_4__) \ || defined(__ARM_ARCH_4T__) \ || defined(__ARM_ARCH_5__) \ || defined(__ARM_ARCH_5E__) \ || defined(__ARM_ARCH_5T__) \ || defined(__ARM_ARCH_5TE__) \ || defined(__ARM_ARCH_5TEJ__) \ || defined(__ARM_ARCH_6__) \ || defined(__ARM_ARCH_6J__) \ || defined(__ARM_ARCH_6K__) \ || defined(__ARM_ARCH_6Z__) \ || defined(__ARM_ARCH_6ZK__) \ || defined(__ARM_ARCH_6T2__) # if defined(__thumb__) // This is just a placeholder and almost certainly not sufficient. __asm__ __volatile__ ("" : : : "memory"); # else // defined(__thumb__) int a = 0, b = 0; __asm__ __volatile__ ("swp %0, %1, [%2]" : "=&r"(a) : "r"(1), "r"(&b) : "memory", "cc"); # endif // defined(__thumb__) #else // ARMv7 and later. __asm__ __volatile__ ("dmb" : : : "memory"); #endif } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(__GNUC__) && defined(__arm__) #endif // ASIO_DETAIL_GCC_ARM_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/gcc_hppa_fenced_block.hpp000066400000000000000000000027071340672067200233200ustar00rootroot00000000000000// // detail/gcc_hppa_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_GCC_HPPA_FENCED_BLOCK_HPP #define ASIO_DETAIL_GCC_HPPA_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class gcc_hppa_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit gcc_hppa_fenced_block(half_t) { } // Constructor for a full fenced block. explicit gcc_hppa_fenced_block(full_t) { barrier(); } // Destructor. ~gcc_hppa_fenced_block() { barrier(); } private: static void barrier() { // This is just a placeholder and almost certainly not sufficient. __asm__ __volatile__ ("" : : : "memory"); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) #endif // ASIO_DETAIL_GCC_HPPA_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/gcc_sync_fenced_block.hpp000066400000000000000000000030761340672067200233440ustar00rootroot00000000000000// // detail/gcc_sync_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_GCC_SYNC_FENCED_BLOCK_HPP #define ASIO_DETAIL_GCC_SYNC_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(__GNUC__) \ && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \ && !defined(__INTEL_COMPILER) && !defined(__ICL) \ && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class gcc_sync_fenced_block : private noncopyable { public: enum half_or_full_t { half, full }; // Constructor. explicit gcc_sync_fenced_block(half_or_full_t) : value_(0) { __sync_lock_test_and_set(&value_, 1); } // Destructor. ~gcc_sync_fenced_block() { __sync_lock_release(&value_); } private: int value_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(__GNUC__) // && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) // && !defined(__INTEL_COMPILER) && !defined(__ICL) // && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) #endif // ASIO_DETAIL_GCC_SYNC_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/gcc_x86_fenced_block.hpp000066400000000000000000000045131340672067200230120ustar00rootroot00000000000000// // detail/gcc_x86_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_GCC_X86_FENCED_BLOCK_HPP #define ASIO_DETAIL_GCC_X86_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class gcc_x86_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit gcc_x86_fenced_block(half_t) { } // Constructor for a full fenced block. explicit gcc_x86_fenced_block(full_t) { lbarrier(); } // Destructor. ~gcc_x86_fenced_block() { sbarrier(); } private: static int barrier() { int r = 0, m = 1; __asm__ __volatile__ ( "xchgl %0, %1" : "=r"(r), "=m"(m) : "0"(1), "m"(m) : "memory", "cc"); return r; } static void lbarrier() { #if defined(__SSE2__) # if (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) __builtin_ia32_lfence(); # else // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) __asm__ __volatile__ ("lfence" ::: "memory"); # endif // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) #else // defined(__SSE2__) barrier(); #endif // defined(__SSE2__) } static void sbarrier() { #if defined(__SSE2__) # if (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) __builtin_ia32_sfence(); # else // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) __asm__ __volatile__ ("sfence" ::: "memory"); # endif // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) #else // defined(__SSE2__) barrier(); #endif // defined(__SSE2__) } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) #endif // ASIO_DETAIL_GCC_X86_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/global.hpp000066400000000000000000000023561340672067200203360ustar00rootroot00000000000000// // detail/global.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_GLOBAL_HPP #define ASIO_DETAIL_GLOBAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) # include "asio/detail/null_global.hpp" #elif defined(ASIO_WINDOWS) # include "asio/detail/win_global.hpp" #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_global.hpp" #elif defined(ASIO_HAS_STD_CALL_ONCE) # include "asio/detail/std_global.hpp" #else # error Only Windows, POSIX and std::call_once are supported! #endif namespace asio { namespace detail { template inline T& global() { #if !defined(ASIO_HAS_THREADS) return null_global(); #elif defined(ASIO_WINDOWS) return win_global(); #elif defined(ASIO_HAS_PTHREADS) return posix_global(); #elif defined(ASIO_HAS_STD_CALL_ONCE) return std_global(); #endif } } // namespace detail } // namespace asio #endif // ASIO_DETAIL_GLOBAL_HPP asio-1.12.2/include/asio/detail/handler_alloc_helpers.hpp000066400000000000000000000130721340672067200234040ustar00rootroot00000000000000// // detail/handler_alloc_helpers.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP #define ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/recycling_allocator.hpp" #include "asio/associated_allocator.hpp" #include "asio/handler_alloc_hook.hpp" #include "asio/detail/push_options.hpp" // Calls to asio_handler_allocate and asio_handler_deallocate must be made from // a namespace that does not contain any overloads of these functions. The // asio_handler_alloc_helpers namespace is defined here for that purpose. namespace asio_handler_alloc_helpers { template inline void* allocate(std::size_t s, Handler& h) { #if !defined(ASIO_HAS_HANDLER_HOOKS) return ::operator new(s); #else using asio::asio_handler_allocate; return asio_handler_allocate(s, asio::detail::addressof(h)); #endif } template inline void deallocate(void* p, std::size_t s, Handler& h) { #if !defined(ASIO_HAS_HANDLER_HOOKS) ::operator delete(p); #else using asio::asio_handler_deallocate; asio_handler_deallocate(p, s, asio::detail::addressof(h)); #endif } } // namespace asio_handler_alloc_helpers namespace asio { namespace detail { template class hook_allocator { public: typedef T value_type; template struct rebind { typedef hook_allocator other; }; explicit hook_allocator(Handler& h) : handler_(h) { } template hook_allocator(const hook_allocator& a) : handler_(a.handler_) { } T* allocate(std::size_t n) { return static_cast( asio_handler_alloc_helpers::allocate(sizeof(T) * n, handler_)); } void deallocate(T* p, std::size_t n) { asio_handler_alloc_helpers::deallocate(p, sizeof(T) * n, handler_); } //private: Handler& handler_; }; template class hook_allocator { public: typedef void value_type; template struct rebind { typedef hook_allocator other; }; explicit hook_allocator(Handler& h) : handler_(h) { } template hook_allocator(const hook_allocator& a) : handler_(a.handler_) { } //private: Handler& handler_; }; template struct get_hook_allocator { typedef Allocator type; static type get(Handler&, const Allocator& a) { return a; } }; template struct get_hook_allocator > { typedef hook_allocator type; static type get(Handler& handler, const std::allocator&) { return type(handler); } }; } // namespace detail } // namespace asio #define ASIO_DEFINE_HANDLER_PTR(op) \ struct ptr \ { \ Handler* h; \ op* v; \ op* p; \ ~ptr() \ { \ reset(); \ } \ static op* allocate(Handler& handler) \ { \ typedef typename ::asio::associated_allocator< \ Handler>::type associated_allocator_type; \ typedef typename ::asio::detail::get_hook_allocator< \ Handler, associated_allocator_type>::type hook_allocator_type; \ ASIO_REBIND_ALLOC(hook_allocator_type, op) a( \ ::asio::detail::get_hook_allocator< \ Handler, associated_allocator_type>::get( \ handler, ::asio::get_associated_allocator(handler))); \ return a.allocate(1); \ } \ void reset() \ { \ if (p) \ { \ p->~op(); \ p = 0; \ } \ if (v) \ { \ typedef typename ::asio::associated_allocator< \ Handler>::type associated_allocator_type; \ typedef typename ::asio::detail::get_hook_allocator< \ Handler, associated_allocator_type>::type hook_allocator_type; \ ASIO_REBIND_ALLOC(hook_allocator_type, op) a( \ ::asio::detail::get_hook_allocator< \ Handler, associated_allocator_type>::get( \ *h, ::asio::get_associated_allocator(*h))); \ a.deallocate(static_cast(v), 1); \ v = 0; \ } \ } \ } \ /**/ #define ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(op) \ struct ptr \ { \ const Alloc* a; \ void* v; \ op* p; \ ~ptr() \ { \ reset(); \ } \ static op* allocate(const Alloc& a) \ { \ typedef typename ::asio::detail::get_recycling_allocator< \ Alloc>::type recycling_allocator_type; \ ASIO_REBIND_ALLOC(recycling_allocator_type, op) a1( \ ::asio::detail::get_recycling_allocator::get(a)); \ return a1.allocate(1); \ } \ void reset() \ { \ if (p) \ { \ p->~op(); \ p = 0; \ } \ if (v) \ { \ typedef typename ::asio::detail::get_recycling_allocator< \ Alloc>::type recycling_allocator_type; \ ASIO_REBIND_ALLOC(recycling_allocator_type, op) a1( \ ::asio::detail::get_recycling_allocator::get(*a)); \ a1.deallocate(static_cast(v), 1); \ v = 0; \ } \ } \ } \ /**/ #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP asio-1.12.2/include/asio/detail/handler_cont_helpers.hpp000066400000000000000000000024041340672067200232520ustar00rootroot00000000000000// // detail/handler_cont_helpers.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HANDLER_CONT_HELPERS_HPP #define ASIO_DETAIL_HANDLER_CONT_HELPERS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/memory.hpp" #include "asio/handler_continuation_hook.hpp" #include "asio/detail/push_options.hpp" // Calls to asio_handler_is_continuation must be made from a namespace that // does not contain overloads of this function. This namespace is defined here // for that purpose. namespace asio_handler_cont_helpers { template inline bool is_continuation(Context& context) { #if !defined(ASIO_HAS_HANDLER_HOOKS) return false; #else using asio::asio_handler_is_continuation; return asio_handler_is_continuation( asio::detail::addressof(context)); #endif } } // namespace asio_handler_cont_helpers #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_HANDLER_CONT_HELPERS_HPP asio-1.12.2/include/asio/detail/handler_invoke_helpers.hpp000066400000000000000000000031471340672067200236070ustar00rootroot00000000000000// // detail/handler_invoke_helpers.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP #define ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/memory.hpp" #include "asio/handler_invoke_hook.hpp" #include "asio/detail/push_options.hpp" // Calls to asio_handler_invoke must be made from a namespace that does not // contain overloads of this function. The asio_handler_invoke_helpers // namespace is defined here for that purpose. namespace asio_handler_invoke_helpers { template inline void invoke(Function& function, Context& context) { #if !defined(ASIO_HAS_HANDLER_HOOKS) Function tmp(function); tmp(); #else using asio::asio_handler_invoke; asio_handler_invoke(function, asio::detail::addressof(context)); #endif } template inline void invoke(const Function& function, Context& context) { #if !defined(ASIO_HAS_HANDLER_HOOKS) Function tmp(function); tmp(); #else using asio::asio_handler_invoke; asio_handler_invoke(function, asio::detail::addressof(context)); #endif } } // namespace asio_handler_invoke_helpers #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP asio-1.12.2/include/asio/detail/handler_tracking.hpp000066400000000000000000000170751340672067200224010ustar00rootroot00000000000000// // detail/handler_tracking.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HANDLER_TRACKING_HPP #define ASIO_DETAIL_HANDLER_TRACKING_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" namespace asio { class execution_context; } // namespace asio #if defined(ASIO_CUSTOM_HANDLER_TRACKING) # include ASIO_CUSTOM_HANDLER_TRACKING #elif defined(ASIO_ENABLE_HANDLER_TRACKING) # include "asio/error_code.hpp" # include "asio/detail/cstdint.hpp" # include "asio/detail/static_mutex.hpp" # include "asio/detail/tss_ptr.hpp" #endif // defined(ASIO_ENABLE_HANDLER_TRACKING) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { #if defined(ASIO_CUSTOM_HANDLER_TRACKING) // The user-specified header must define the following macros: // - ASIO_INHERIT_TRACKED_HANDLER // - ASIO_ALSO_INHERIT_TRACKED_HANDLER // - ASIO_HANDLER_TRACKING_INIT // - ASIO_HANDLER_CREATION(args) // - ASIO_HANDLER_COMPLETION(args) // - ASIO_HANDLER_INVOCATION_BEGIN(args) // - ASIO_HANDLER_INVOCATION_END // - ASIO_HANDLER_OPERATION(args) // - ASIO_HANDLER_REACTOR_REGISTRATION(args) // - ASIO_HANDLER_REACTOR_DEREGISTRATION(args) // - ASIO_HANDLER_REACTOR_READ_EVENT // - ASIO_HANDLER_REACTOR_WRITE_EVENT // - ASIO_HANDLER_REACTOR_ERROR_EVENT // - ASIO_HANDLER_REACTOR_EVENTS(args) // - ASIO_HANDLER_REACTOR_OPERATION(args) # if !defined(ASIO_ENABLE_HANDLER_TRACKING) # define ASIO_ENABLE_HANDLER_TRACKING 1 # endif /// !defined(ASIO_ENABLE_HANDLER_TRACKING) #elif defined(ASIO_ENABLE_HANDLER_TRACKING) class handler_tracking { public: class completion; // Base class for objects containing tracked handlers. class tracked_handler { private: // Only the handler_tracking class will have access to the id. friend class handler_tracking; friend class completion; uint64_t id_; protected: // Constructor initialises with no id. tracked_handler() : id_(0) {} // Prevent deletion through this type. ~tracked_handler() {} }; // Initialise the tracking system. ASIO_DECL static void init(); // Record the creation of a tracked handler. ASIO_DECL static void creation( execution_context& context, tracked_handler& h, const char* object_type, void* object, uintmax_t native_handle, const char* op_name); class completion { public: // Constructor records that handler is to be invoked with no arguments. ASIO_DECL explicit completion(const tracked_handler& h); // Destructor records only when an exception is thrown from the handler, or // if the memory is being freed without the handler having been invoked. ASIO_DECL ~completion(); // Records that handler is to be invoked with no arguments. ASIO_DECL void invocation_begin(); // Records that handler is to be invoked with one arguments. ASIO_DECL void invocation_begin(const asio::error_code& ec); // Constructor records that handler is to be invoked with two arguments. ASIO_DECL void invocation_begin( const asio::error_code& ec, std::size_t bytes_transferred); // Constructor records that handler is to be invoked with two arguments. ASIO_DECL void invocation_begin( const asio::error_code& ec, int signal_number); // Constructor records that handler is to be invoked with two arguments. ASIO_DECL void invocation_begin( const asio::error_code& ec, const char* arg); // Record that handler invocation has ended. ASIO_DECL void invocation_end(); private: friend class handler_tracking; uint64_t id_; bool invoked_; completion* next_; }; // Record an operation that is not directly associated with a handler. ASIO_DECL static void operation(execution_context& context, const char* object_type, void* object, uintmax_t native_handle, const char* op_name); // Record that a descriptor has been registered with the reactor. ASIO_DECL static void reactor_registration(execution_context& context, uintmax_t native_handle, uintmax_t registration); // Record that a descriptor has been deregistered from the reactor. ASIO_DECL static void reactor_deregistration(execution_context& context, uintmax_t native_handle, uintmax_t registration); // Record a reactor-based operation that is associated with a handler. ASIO_DECL static void reactor_events(execution_context& context, uintmax_t registration, unsigned events); // Record a reactor-based operation that is associated with a handler. ASIO_DECL static void reactor_operation( const tracked_handler& h, const char* op_name, const asio::error_code& ec); // Record a reactor-based operation that is associated with a handler. ASIO_DECL static void reactor_operation( const tracked_handler& h, const char* op_name, const asio::error_code& ec, std::size_t bytes_transferred); // Write a line of output. ASIO_DECL static void write_line(const char* format, ...); private: struct tracking_state; ASIO_DECL static tracking_state* get_state(); }; # define ASIO_INHERIT_TRACKED_HANDLER \ : public asio::detail::handler_tracking::tracked_handler # define ASIO_ALSO_INHERIT_TRACKED_HANDLER \ , public asio::detail::handler_tracking::tracked_handler # define ASIO_HANDLER_TRACKING_INIT \ asio::detail::handler_tracking::init() # define ASIO_HANDLER_CREATION(args) \ asio::detail::handler_tracking::creation args # define ASIO_HANDLER_COMPLETION(args) \ asio::detail::handler_tracking::completion tracked_completion args # define ASIO_HANDLER_INVOCATION_BEGIN(args) \ tracked_completion.invocation_begin args # define ASIO_HANDLER_INVOCATION_END \ tracked_completion.invocation_end() # define ASIO_HANDLER_OPERATION(args) \ asio::detail::handler_tracking::operation args # define ASIO_HANDLER_REACTOR_REGISTRATION(args) \ asio::detail::handler_tracking::reactor_registration args # define ASIO_HANDLER_REACTOR_DEREGISTRATION(args) \ asio::detail::handler_tracking::reactor_deregistration args # define ASIO_HANDLER_REACTOR_READ_EVENT 1 # define ASIO_HANDLER_REACTOR_WRITE_EVENT 2 # define ASIO_HANDLER_REACTOR_ERROR_EVENT 4 # define ASIO_HANDLER_REACTOR_EVENTS(args) \ asio::detail::handler_tracking::reactor_events args # define ASIO_HANDLER_REACTOR_OPERATION(args) \ asio::detail::handler_tracking::reactor_operation args #else // defined(ASIO_ENABLE_HANDLER_TRACKING) # define ASIO_INHERIT_TRACKED_HANDLER # define ASIO_ALSO_INHERIT_TRACKED_HANDLER # define ASIO_HANDLER_TRACKING_INIT (void)0 # define ASIO_HANDLER_CREATION(args) (void)0 # define ASIO_HANDLER_COMPLETION(args) (void)0 # define ASIO_HANDLER_INVOCATION_BEGIN(args) (void)0 # define ASIO_HANDLER_INVOCATION_END (void)0 # define ASIO_HANDLER_OPERATION(args) (void)0 # define ASIO_HANDLER_REACTOR_REGISTRATION(args) (void)0 # define ASIO_HANDLER_REACTOR_DEREGISTRATION(args) (void)0 # define ASIO_HANDLER_REACTOR_READ_EVENT 0 # define ASIO_HANDLER_REACTOR_WRITE_EVENT 0 # define ASIO_HANDLER_REACTOR_ERROR_EVENT 0 # define ASIO_HANDLER_REACTOR_EVENTS(args) (void)0 # define ASIO_HANDLER_REACTOR_OPERATION(args) (void)0 #endif // defined(ASIO_ENABLE_HANDLER_TRACKING) } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/handler_tracking.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_HANDLER_TRACKING_HPP asio-1.12.2/include/asio/detail/handler_type_requirements.hpp000066400000000000000000000441421340672067200243560ustar00rootroot00000000000000// // detail/handler_type_requirements.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HANDLER_TYPE_REQUIREMENTS_HPP #define ASIO_DETAIL_HANDLER_TYPE_REQUIREMENTS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" // Older versions of gcc have difficulty compiling the sizeof expressions where // we test the handler type requirements. We'll disable checking of handler type // requirements for those compilers, but otherwise enable it by default. #if !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS) # if !defined(__GNUC__) || (__GNUC__ >= 4) # define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS 1 # endif // !defined(__GNUC__) || (__GNUC__ >= 4) #endif // !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS) // With C++0x we can use a combination of enhanced SFINAE and static_assert to // generate better template error messages. As this technique is not yet widely // portable, we'll only enable it for tested compilers. #if !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) # if defined(__GNUC__) # if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # if defined(__GXX_EXPERIMENTAL_CXX0X__) # define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT 1 # endif // defined(__GXX_EXPERIMENTAL_CXX0X__) # endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) # endif // defined(__GNUC__) # if defined(ASIO_MSVC) # if (_MSC_VER >= 1600) # define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT 1 # endif // (_MSC_VER >= 1600) # endif // defined(ASIO_MSVC) # if defined(__clang__) # if __has_feature(__cxx_static_assert__) # define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT 1 # endif // __has_feature(cxx_static_assert) # endif // defined(__clang__) #endif // !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS) #if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) # include "asio/async_result.hpp" #endif // defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) namespace asio { namespace detail { #if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) # if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) template auto zero_arg_copyable_handler_test(Handler h, void*) -> decltype( sizeof(Handler(static_cast(h))), ((h)()), char(0)); template char (&zero_arg_copyable_handler_test(Handler, ...))[2]; template auto one_arg_handler_test(Handler h, Arg1* a1) -> decltype( sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))), ((h)(*a1)), char(0)); template char (&one_arg_handler_test(Handler h, ...))[2]; template auto two_arg_handler_test(Handler h, Arg1* a1, Arg2* a2) -> decltype( sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))), ((h)(*a1, *a2)), char(0)); template char (&two_arg_handler_test(Handler, ...))[2]; template auto two_arg_move_handler_test(Handler h, Arg1* a1, Arg2* a2) -> decltype( sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))), ((h)(*a1, ASIO_MOVE_CAST(Arg2)(*a2))), char(0)); template char (&two_arg_move_handler_test(Handler, ...))[2]; # define ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT(expr, msg) \ static_assert(expr, msg); # else // defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) # define ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT(expr, msg) # endif // defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) template T& lvref(); template T& lvref(T); template const T& clvref(); template const T& clvref(T); #if defined(ASIO_HAS_MOVE) template T rvref(); template T rvref(T); #else // defined(ASIO_HAS_MOVE) template const T& rvref(); template const T& rvref(T); #endif // defined(ASIO_HAS_MOVE) template char argbyv(T); template struct handler_type_requirements { }; #define ASIO_LEGACY_COMPLETION_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void()) asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::zero_arg_copyable_handler_test( \ asio::detail::clvref< \ asio_true_handler_type>(), 0)) == 1, \ "CompletionHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::clvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()(), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_READ_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, std::size_t)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "ReadHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_WRITE_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, std::size_t)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "WriteHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_ACCEPT_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::one_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0))) == 1, \ "AcceptHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_MOVE_ACCEPT_HANDLER_CHECK( \ handler_type, handler, socket_type) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, socket_type)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_move_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "MoveAcceptHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::rvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_CONNECT_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::one_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0))) == 1, \ "ConnectHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_RANGE_CONNECT_HANDLER_CHECK( \ handler_type, handler, endpoint_type) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, endpoint_type)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "RangeConnectHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_ITERATOR_CONNECT_HANDLER_CHECK( \ handler_type, handler, iter_type) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, iter_type)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "IteratorConnectHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_RESOLVE_HANDLER_CHECK( \ handler_type, handler, range_type) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, range_type)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "ResolveHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_WAIT_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::one_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0))) == 1, \ "WaitHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_SIGNAL_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, int)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "SignalHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_HANDSHAKE_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::one_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0))) == 1, \ "HandshakeHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_BUFFERED_HANDSHAKE_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code, std::size_t)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::two_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0), \ static_cast(0))) == 1, \ "BufferedHandshakeHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref(), \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #define ASIO_SHUTDOWN_HANDLER_CHECK( \ handler_type, handler) \ \ typedef ASIO_HANDLER_TYPE(handler_type, \ void(asio::error_code)) \ asio_true_handler_type; \ \ ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ sizeof(asio::detail::one_arg_handler_test( \ asio::detail::rvref< \ asio_true_handler_type>(), \ static_cast(0))) == 1, \ "ShutdownHandler type requirements not met") \ \ typedef asio::detail::handler_type_requirements< \ sizeof( \ asio::detail::argbyv( \ asio::detail::rvref< \ asio_true_handler_type>())) + \ sizeof( \ asio::detail::lvref< \ asio_true_handler_type>()( \ asio::detail::lvref()), \ char(0))> ASIO_UNUSED_TYPEDEF #else // !defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) #define ASIO_LEGACY_COMPLETION_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_READ_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_WRITE_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_ACCEPT_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_MOVE_ACCEPT_HANDLER_CHECK( \ handler_type, handler, socket_type) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_CONNECT_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_RANGE_CONNECT_HANDLER_CHECK( \ handler_type, handler, iter_type) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_ITERATOR_CONNECT_HANDLER_CHECK( \ handler_type, handler, iter_type) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_RESOLVE_HANDLER_CHECK( \ handler_type, handler, iter_type) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_WAIT_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_SIGNAL_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_HANDSHAKE_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_BUFFERED_HANDSHAKE_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #define ASIO_SHUTDOWN_HANDLER_CHECK( \ handler_type, handler) \ typedef int ASIO_UNUSED_TYPEDEF #endif // !defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) } // namespace detail } // namespace asio #endif // ASIO_DETAIL_HANDLER_TYPE_REQUIREMENTS_HPP asio-1.12.2/include/asio/detail/handler_work.hpp000066400000000000000000000051151340672067200215510ustar00rootroot00000000000000// // detail/handler_work.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HANDLER_WORK_HPP #define ASIO_DETAIL_HANDLER_WORK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // A helper class template to allow completion handlers to be dispatched // through either the new executors framework or the old invocaton hook. The // primary template uses the new executors framework. template ::type> class handler_work { public: explicit handler_work(Handler& handler) ASIO_NOEXCEPT : executor_(associated_executor::get(handler)) { } static void start(Handler& handler) ASIO_NOEXCEPT { Executor ex(associated_executor::get(handler)); ex.on_work_started(); } ~handler_work() { executor_.on_work_finished(); } template void complete(Function& function, Handler& handler) { executor_.dispatch(ASIO_MOVE_CAST(Function)(function), associated_allocator::get(handler)); } private: // Disallow copying and assignment. handler_work(const handler_work&); handler_work& operator=(const handler_work&); typename associated_executor::type executor_; }; // This specialisation dispatches a handler through the old invocation hook. // The specialisation is not strictly required for correctness, as the // system_executor will dispatch through the hook anyway. However, by doing // this we avoid an extra copy of the handler. template class handler_work { public: explicit handler_work(Handler&) ASIO_NOEXCEPT {} static void start(Handler&) ASIO_NOEXCEPT {} ~handler_work() {} template void complete(Function& function, Handler& handler) { asio_handler_invoke_helpers::invoke(function, handler); } private: // Disallow copying and assignment. handler_work(const handler_work&); handler_work& operator=(const handler_work&); }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_HANDLER_WORK_HPP asio-1.12.2/include/asio/detail/hash_map.hpp000066400000000000000000000177701340672067200206640ustar00rootroot00000000000000// // detail/hash_map.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_HASH_MAP_HPP #define ASIO_DETAIL_HASH_MAP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/detail/assert.hpp" #include "asio/detail/noncopyable.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # include "asio/detail/socket_types.hpp" #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { inline std::size_t calculate_hash_value(int i) { return static_cast(i); } inline std::size_t calculate_hash_value(void* p) { return reinterpret_cast(p) + (reinterpret_cast(p) >> 3); } #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) inline std::size_t calculate_hash_value(SOCKET s) { return static_cast(s); } #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Note: assumes K and V are POD types. template class hash_map : private noncopyable { public: // The type of a value in the map. typedef std::pair value_type; // The type of a non-const iterator over the hash map. typedef typename std::list::iterator iterator; // The type of a const iterator over the hash map. typedef typename std::list::const_iterator const_iterator; // Constructor. hash_map() : size_(0), buckets_(0), num_buckets_(0) { } // Destructor. ~hash_map() { delete[] buckets_; } // Get an iterator for the beginning of the map. iterator begin() { return values_.begin(); } // Get an iterator for the beginning of the map. const_iterator begin() const { return values_.begin(); } // Get an iterator for the end of the map. iterator end() { return values_.end(); } // Get an iterator for the end of the map. const_iterator end() const { return values_.end(); } // Check whether the map is empty. bool empty() const { return values_.empty(); } // Find an entry in the map. iterator find(const K& k) { if (num_buckets_) { size_t bucket = calculate_hash_value(k) % num_buckets_; iterator it = buckets_[bucket].first; if (it == values_.end()) return values_.end(); iterator end_it = buckets_[bucket].last; ++end_it; while (it != end_it) { if (it->first == k) return it; ++it; } } return values_.end(); } // Find an entry in the map. const_iterator find(const K& k) const { if (num_buckets_) { size_t bucket = calculate_hash_value(k) % num_buckets_; const_iterator it = buckets_[bucket].first; if (it == values_.end()) return it; const_iterator end_it = buckets_[bucket].last; ++end_it; while (it != end_it) { if (it->first == k) return it; ++it; } } return values_.end(); } // Insert a new entry into the map. std::pair insert(const value_type& v) { if (size_ + 1 >= num_buckets_) rehash(hash_size(size_ + 1)); size_t bucket = calculate_hash_value(v.first) % num_buckets_; iterator it = buckets_[bucket].first; if (it == values_.end()) { buckets_[bucket].first = buckets_[bucket].last = values_insert(values_.end(), v); ++size_; return std::pair(buckets_[bucket].last, true); } iterator end_it = buckets_[bucket].last; ++end_it; while (it != end_it) { if (it->first == v.first) return std::pair(it, false); ++it; } buckets_[bucket].last = values_insert(end_it, v); ++size_; return std::pair(buckets_[bucket].last, true); } // Erase an entry from the map. void erase(iterator it) { ASIO_ASSERT(it != values_.end()); ASIO_ASSERT(num_buckets_ != 0); size_t bucket = calculate_hash_value(it->first) % num_buckets_; bool is_first = (it == buckets_[bucket].first); bool is_last = (it == buckets_[bucket].last); if (is_first && is_last) buckets_[bucket].first = buckets_[bucket].last = values_.end(); else if (is_first) ++buckets_[bucket].first; else if (is_last) --buckets_[bucket].last; values_erase(it); --size_; } // Erase a key from the map. void erase(const K& k) { iterator it = find(k); if (it != values_.end()) erase(it); } // Remove all entries from the map. void clear() { // Clear the values. values_.clear(); size_ = 0; // Initialise all buckets to empty. iterator end_it = values_.end(); for (size_t i = 0; i < num_buckets_; ++i) buckets_[i].first = buckets_[i].last = end_it; } private: // Calculate the hash size for the specified number of elements. static std::size_t hash_size(std::size_t num_elems) { static std::size_t sizes[] = { #if defined(ASIO_HASH_MAP_BUCKETS) ASIO_HASH_MAP_BUCKETS #else // ASIO_HASH_MAP_BUCKETS 3, 13, 23, 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, 12582917, 25165843 #endif // ASIO_HASH_MAP_BUCKETS }; const std::size_t nth_size = sizeof(sizes) / sizeof(std::size_t) - 1; for (std::size_t i = 0; i < nth_size; ++i) if (num_elems < sizes[i]) return sizes[i]; return sizes[nth_size]; } // Re-initialise the hash from the values already contained in the list. void rehash(std::size_t num_buckets) { if (num_buckets == num_buckets_) return; ASIO_ASSERT(num_buckets != 0); iterator end_iter = values_.end(); // Update number of buckets and initialise all buckets to empty. bucket_type* tmp = new bucket_type[num_buckets]; delete[] buckets_; buckets_ = tmp; num_buckets_ = num_buckets; for (std::size_t i = 0; i < num_buckets_; ++i) buckets_[i].first = buckets_[i].last = end_iter; // Put all values back into the hash. iterator iter = values_.begin(); while (iter != end_iter) { std::size_t bucket = calculate_hash_value(iter->first) % num_buckets_; if (buckets_[bucket].last == end_iter) { buckets_[bucket].first = buckets_[bucket].last = iter++; } else if (++buckets_[bucket].last == iter) { ++iter; } else { values_.splice(buckets_[bucket].last, values_, iter++); --buckets_[bucket].last; } } } // Insert an element into the values list by splicing from the spares list, // if a spare is available, and otherwise by inserting a new element. iterator values_insert(iterator it, const value_type& v) { if (spares_.empty()) { return values_.insert(it, v); } else { spares_.front() = v; values_.splice(it, spares_, spares_.begin()); return --it; } } // Erase an element from the values list by splicing it to the spares list. void values_erase(iterator it) { *it = value_type(); spares_.splice(spares_.begin(), values_, it); } // The number of elements in the hash. std::size_t size_; // The list of all values in the hash map. std::list values_; // The list of spare nodes waiting to be recycled. Assumes that POD types only // are stored in the hash map. std::list spares_; // The type for a bucket in the hash table. struct bucket_type { iterator first; iterator last; }; // The buckets in the hash. bucket_type* buckets_; // The number of buckets in the hash. std::size_t num_buckets_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_HASH_MAP_HPP asio-1.12.2/include/asio/detail/impl/000077500000000000000000000000001340672067200173205ustar00rootroot00000000000000asio-1.12.2/include/asio/detail/impl/buffer_sequence_adapter.ipp000066400000000000000000000056371340672067200247060ustar00rootroot00000000000000// // detail/impl/buffer_sequence_adapter.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_BUFFER_SEQUENCE_ADAPTER_IPP #define ASIO_DETAIL_IMPL_BUFFER_SEQUENCE_ADAPTER_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include #include #include #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class winrt_buffer_impl : public Microsoft::WRL::RuntimeClass< Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix>, ABI::Windows::Storage::Streams::IBuffer, Windows::Storage::Streams::IBufferByteAccess> { public: explicit winrt_buffer_impl(const asio::const_buffer& b) { bytes_ = const_cast(static_cast(b.data())); length_ = b.size(); capacity_ = b.size(); } explicit winrt_buffer_impl(const asio::mutable_buffer& b) { bytes_ = static_cast(b.data()); length_ = 0; capacity_ = b.size(); } ~winrt_buffer_impl() { } STDMETHODIMP Buffer(byte** value) { *value = bytes_; return S_OK; } STDMETHODIMP get_Capacity(UINT32* value) { *value = capacity_; return S_OK; } STDMETHODIMP get_Length(UINT32 *value) { *value = length_; return S_OK; } STDMETHODIMP put_Length(UINT32 value) { if (value > capacity_) return E_INVALIDARG; length_ = value; return S_OK; } private: byte* bytes_; UINT32 length_; UINT32 capacity_; }; void buffer_sequence_adapter_base::init_native_buffer( buffer_sequence_adapter_base::native_buffer_type& buf, const asio::mutable_buffer& buffer) { std::memset(&buf, 0, sizeof(native_buffer_type)); Microsoft::WRL::ComPtr insp = Microsoft::WRL::Make(buffer); buf = reinterpret_cast(insp.Get()); } void buffer_sequence_adapter_base::init_native_buffer( buffer_sequence_adapter_base::native_buffer_type& buf, const asio::const_buffer& buffer) { std::memset(&buf, 0, sizeof(native_buffer_type)); Microsoft::WRL::ComPtr insp = Microsoft::WRL::Make(buffer); Platform::Object^ buf_obj = reinterpret_cast(insp.Get()); buf = reinterpret_cast(insp.Get()); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_BUFFER_SEQUENCE_ADAPTER_IPP asio-1.12.2/include/asio/detail/impl/descriptor_ops.ipp000066400000000000000000000262031340672067200230740ustar00rootroot00000000000000// // detail/impl/descriptor_ops.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_DESCRIPTOR_OPS_IPP #define ASIO_DETAIL_IMPL_DESCRIPTOR_OPS_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/descriptor_ops.hpp" #include "asio/error.hpp" #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace descriptor_ops { int open(const char* path, int flags, asio::error_code& ec) { errno = 0; int result = error_wrapper(::open(path, flags), ec); if (result >= 0) ec = asio::error_code(); return result; } int close(int d, state_type& state, asio::error_code& ec) { int result = 0; if (d != -1) { errno = 0; result = error_wrapper(::close(d), ec); if (result != 0 && (ec == asio::error::would_block || ec == asio::error::try_again)) { // According to UNIX Network Programming Vol. 1, it is possible for // close() to fail with EWOULDBLOCK under certain circumstances. What // isn't clear is the state of the descriptor after this error. The one // current OS where this behaviour is seen, Windows, says that the socket // remains open. Therefore we'll put the descriptor back into blocking // mode and have another attempt at closing it. #if defined(__SYMBIAN32__) int flags = ::fcntl(d, F_GETFL, 0); if (flags >= 0) ::fcntl(d, F_SETFL, flags & ~O_NONBLOCK); #else // defined(__SYMBIAN32__) ioctl_arg_type arg = 0; ::ioctl(d, FIONBIO, &arg); #endif // defined(__SYMBIAN32__) state &= ~non_blocking; errno = 0; result = error_wrapper(::close(d), ec); } } if (result == 0) ec = asio::error_code(); return result; } bool set_user_non_blocking(int d, state_type& state, bool value, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return false; } errno = 0; #if defined(__SYMBIAN32__) int result = error_wrapper(::fcntl(d, F_GETFL, 0), ec); if (result >= 0) { errno = 0; int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); result = error_wrapper(::fcntl(d, F_SETFL, flag), ec); } #else // defined(__SYMBIAN32__) ioctl_arg_type arg = (value ? 1 : 0); int result = error_wrapper(::ioctl(d, FIONBIO, &arg), ec); #endif // defined(__SYMBIAN32__) if (result >= 0) { ec = asio::error_code(); if (value) state |= user_set_non_blocking; else { // Clearing the user-set non-blocking mode always overrides any // internally-set non-blocking flag. Any subsequent asynchronous // operations will need to re-enable non-blocking I/O. state &= ~(user_set_non_blocking | internal_non_blocking); } return true; } return false; } bool set_internal_non_blocking(int d, state_type& state, bool value, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return false; } if (!value && (state & user_set_non_blocking)) { // It does not make sense to clear the internal non-blocking flag if the // user still wants non-blocking behaviour. Return an error and let the // caller figure out whether to update the user-set non-blocking flag. ec = asio::error::invalid_argument; return false; } errno = 0; #if defined(__SYMBIAN32__) int result = error_wrapper(::fcntl(d, F_GETFL, 0), ec); if (result >= 0) { errno = 0; int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); result = error_wrapper(::fcntl(d, F_SETFL, flag), ec); } #else // defined(__SYMBIAN32__) ioctl_arg_type arg = (value ? 1 : 0); int result = error_wrapper(::ioctl(d, FIONBIO, &arg), ec); #endif // defined(__SYMBIAN32__) if (result >= 0) { ec = asio::error_code(); if (value) state |= internal_non_blocking; else state &= ~internal_non_blocking; return true; } return false; } std::size_t sync_read(int d, state_type state, buf* bufs, std::size_t count, bool all_empty, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return 0; } // A request to read 0 bytes on a stream is a no-op. if (all_empty) { ec = asio::error_code(); return 0; } // Read some data. for (;;) { // Try to complete the operation without blocking. errno = 0; signed_size_type bytes = error_wrapper(::readv( d, bufs, static_cast(count)), ec); // Check if operation succeeded. if (bytes > 0) return bytes; // Check for EOF. if (bytes == 0) { ec = asio::error::eof; return 0; } // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for descriptor to become ready. if (descriptor_ops::poll_read(d, 0, ec) < 0) return 0; } } bool non_blocking_read(int d, buf* bufs, std::size_t count, asio::error_code& ec, std::size_t& bytes_transferred) { for (;;) { // Read some data. errno = 0; signed_size_type bytes = error_wrapper(::readv( d, bufs, static_cast(count)), ec); // Check for end of stream. if (bytes == 0) { ec = asio::error::eof; return true; } // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes > 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } std::size_t sync_write(int d, state_type state, const buf* bufs, std::size_t count, bool all_empty, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return 0; } // A request to write 0 bytes on a stream is a no-op. if (all_empty) { ec = asio::error_code(); return 0; } // Write some data. for (;;) { // Try to complete the operation without blocking. errno = 0; signed_size_type bytes = error_wrapper(::writev( d, bufs, static_cast(count)), ec); // Check if operation succeeded. if (bytes > 0) return bytes; // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for descriptor to become ready. if (descriptor_ops::poll_write(d, 0, ec) < 0) return 0; } } bool non_blocking_write(int d, const buf* bufs, std::size_t count, asio::error_code& ec, std::size_t& bytes_transferred) { for (;;) { // Write some data. errno = 0; signed_size_type bytes = error_wrapper(::writev( d, bufs, static_cast(count)), ec); // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes >= 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } int ioctl(int d, state_type& state, long cmd, ioctl_arg_type* arg, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return -1; } errno = 0; int result = error_wrapper(::ioctl(d, cmd, arg), ec); if (result >= 0) { ec = asio::error_code(); // When updating the non-blocking mode we always perform the ioctl syscall, // even if the flags would otherwise indicate that the descriptor is // already in the correct state. This ensures that the underlying // descriptor is put into the state that has been requested by the user. If // the ioctl syscall was successful then we need to update the flags to // match. if (cmd == static_cast(FIONBIO)) { if (*arg) { state |= user_set_non_blocking; } else { // Clearing the non-blocking mode always overrides any internally-set // non-blocking flag. Any subsequent asynchronous operations will need // to re-enable non-blocking I/O. state &= ~(user_set_non_blocking | internal_non_blocking); } } } return result; } int fcntl(int d, int cmd, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return -1; } errno = 0; int result = error_wrapper(::fcntl(d, cmd), ec); if (result != -1) ec = asio::error_code(); return result; } int fcntl(int d, int cmd, long arg, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return -1; } errno = 0; int result = error_wrapper(::fcntl(d, cmd, arg), ec); if (result != -1) ec = asio::error_code(); return result; } int poll_read(int d, state_type state, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return -1; } pollfd fds; fds.fd = d; fds.events = POLLIN; fds.revents = 0; int timeout = (state & user_set_non_blocking) ? 0 : -1; errno = 0; int result = error_wrapper(::poll(&fds, 1, timeout), ec); if (result == 0) ec = (state & user_set_non_blocking) ? asio::error::would_block : asio::error_code(); else if (result > 0) ec = asio::error_code(); return result; } int poll_write(int d, state_type state, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return -1; } pollfd fds; fds.fd = d; fds.events = POLLOUT; fds.revents = 0; int timeout = (state & user_set_non_blocking) ? 0 : -1; errno = 0; int result = error_wrapper(::poll(&fds, 1, timeout), ec); if (result == 0) ec = (state & user_set_non_blocking) ? asio::error::would_block : asio::error_code(); else if (result > 0) ec = asio::error_code(); return result; } int poll_error(int d, state_type state, asio::error_code& ec) { if (d == -1) { ec = asio::error::bad_descriptor; return -1; } pollfd fds; fds.fd = d; fds.events = POLLPRI | POLLERR | POLLHUP; fds.revents = 0; int timeout = (state & user_set_non_blocking) ? 0 : -1; errno = 0; int result = error_wrapper(::poll(&fds, 1, timeout), ec); if (result == 0) ec = (state & user_set_non_blocking) ? asio::error::would_block : asio::error_code(); else if (result > 0) ec = asio::error_code(); return result; } } // namespace descriptor_ops } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) #endif // ASIO_DETAIL_IMPL_DESCRIPTOR_OPS_IPP asio-1.12.2/include/asio/detail/impl/dev_poll_reactor.hpp000066400000000000000000000046571340672067200233700ustar00rootroot00000000000000// // detail/impl/dev_poll_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_HPP #define ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_DEV_POLL) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template void dev_poll_reactor::add_timer_queue(timer_queue& queue) { do_add_timer_queue(queue); } template void dev_poll_reactor::remove_timer_queue(timer_queue& queue) { do_remove_timer_queue(queue); } template void dev_poll_reactor::schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op) { asio::detail::mutex::scoped_lock lock(mutex_); if (shutdown_) { scheduler_.post_immediate_completion(op, false); return; } bool earliest = queue.enqueue_timer(time, timer, op); scheduler_.work_started(); if (earliest) interrupter_.interrupt(); } template std::size_t dev_poll_reactor::cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); lock.unlock(); scheduler_.post_deferred_completions(ops); return n; } template void dev_poll_reactor::move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; queue.cancel_timer(target, ops); queue.move_timer(target, source); lock.unlock(); scheduler_.post_deferred_completions(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_DEV_POLL) #endif // ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_HPP asio-1.12.2/include/asio/detail/impl/dev_poll_reactor.ipp000066400000000000000000000310661340672067200233630ustar00rootroot00000000000000// // detail/impl/dev_poll_reactor.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_IPP #define ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_DEV_POLL) #include "asio/detail/dev_poll_reactor.hpp" #include "asio/detail/assert.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { dev_poll_reactor::dev_poll_reactor(asio::execution_context& ctx) : asio::detail::execution_context_service_base(ctx), scheduler_(use_service(ctx)), mutex_(), dev_poll_fd_(do_dev_poll_create()), interrupter_(), shutdown_(false) { // Add the interrupter's descriptor to /dev/poll. ::pollfd ev = { 0, 0, 0 }; ev.fd = interrupter_.read_descriptor(); ev.events = POLLIN | POLLERR; ev.revents = 0; ::write(dev_poll_fd_, &ev, sizeof(ev)); } dev_poll_reactor::~dev_poll_reactor() { shutdown(); ::close(dev_poll_fd_); } void dev_poll_reactor::shutdown() { asio::detail::mutex::scoped_lock lock(mutex_); shutdown_ = true; lock.unlock(); op_queue ops; for (int i = 0; i < max_ops; ++i) op_queue_[i].get_all_operations(ops); timer_queues_.get_all_timers(ops); scheduler_.abandon_operations(ops); } void dev_poll_reactor::notify_fork( asio::execution_context::fork_event fork_ev) { if (fork_ev == asio::execution_context::fork_child) { detail::mutex::scoped_lock lock(mutex_); if (dev_poll_fd_ != -1) ::close(dev_poll_fd_); dev_poll_fd_ = -1; dev_poll_fd_ = do_dev_poll_create(); interrupter_.recreate(); // Add the interrupter's descriptor to /dev/poll. ::pollfd ev = { 0, 0, 0 }; ev.fd = interrupter_.read_descriptor(); ev.events = POLLIN | POLLERR; ev.revents = 0; ::write(dev_poll_fd_, &ev, sizeof(ev)); // Re-register all descriptors with /dev/poll. The changes will be written // to the /dev/poll descriptor the next time the reactor is run. for (int i = 0; i < max_ops; ++i) { reactor_op_queue::iterator iter = op_queue_[i].begin(); reactor_op_queue::iterator end = op_queue_[i].end(); for (; iter != end; ++iter) { ::pollfd& pending_ev = add_pending_event_change(iter->first); pending_ev.events |= POLLERR | POLLHUP; switch (i) { case read_op: pending_ev.events |= POLLIN; break; case write_op: pending_ev.events |= POLLOUT; break; case except_op: pending_ev.events |= POLLPRI; break; default: break; } } } interrupter_.interrupt(); } } void dev_poll_reactor::init_task() { scheduler_.init_task(); } int dev_poll_reactor::register_descriptor(socket_type, per_descriptor_data&) { return 0; } int dev_poll_reactor::register_internal_descriptor(int op_type, socket_type descriptor, per_descriptor_data&, reactor_op* op) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue_[op_type].enqueue_operation(descriptor, op); ::pollfd& ev = add_pending_event_change(descriptor); ev.events = POLLERR | POLLHUP; switch (op_type) { case read_op: ev.events |= POLLIN; break; case write_op: ev.events |= POLLOUT; break; case except_op: ev.events |= POLLPRI; break; default: break; } interrupter_.interrupt(); return 0; } void dev_poll_reactor::move_descriptor(socket_type, dev_poll_reactor::per_descriptor_data&, dev_poll_reactor::per_descriptor_data&) { } void dev_poll_reactor::start_op(int op_type, socket_type descriptor, dev_poll_reactor::per_descriptor_data&, reactor_op* op, bool is_continuation, bool allow_speculative) { asio::detail::mutex::scoped_lock lock(mutex_); if (shutdown_) { post_immediate_completion(op, is_continuation); return; } if (allow_speculative) { if (op_type != read_op || !op_queue_[except_op].has_operation(descriptor)) { if (!op_queue_[op_type].has_operation(descriptor)) { if (op->perform()) { lock.unlock(); scheduler_.post_immediate_completion(op, is_continuation); return; } } } } bool first = op_queue_[op_type].enqueue_operation(descriptor, op); scheduler_.work_started(); if (first) { ::pollfd& ev = add_pending_event_change(descriptor); ev.events = POLLERR | POLLHUP; if (op_type == read_op || op_queue_[read_op].has_operation(descriptor)) ev.events |= POLLIN; if (op_type == write_op || op_queue_[write_op].has_operation(descriptor)) ev.events |= POLLOUT; if (op_type == except_op || op_queue_[except_op].has_operation(descriptor)) ev.events |= POLLPRI; interrupter_.interrupt(); } } void dev_poll_reactor::cancel_ops(socket_type descriptor, dev_poll_reactor::per_descriptor_data&) { asio::detail::mutex::scoped_lock lock(mutex_); cancel_ops_unlocked(descriptor, asio::error::operation_aborted); } void dev_poll_reactor::deregister_descriptor(socket_type descriptor, dev_poll_reactor::per_descriptor_data&, bool) { asio::detail::mutex::scoped_lock lock(mutex_); // Remove the descriptor from /dev/poll. ::pollfd& ev = add_pending_event_change(descriptor); ev.events = POLLREMOVE; interrupter_.interrupt(); // Cancel any outstanding operations associated with the descriptor. cancel_ops_unlocked(descriptor, asio::error::operation_aborted); } void dev_poll_reactor::deregister_internal_descriptor( socket_type descriptor, dev_poll_reactor::per_descriptor_data&) { asio::detail::mutex::scoped_lock lock(mutex_); // Remove the descriptor from /dev/poll. Since this function is only called // during a fork, we can apply the change immediately. ::pollfd ev = { 0, 0, 0 }; ev.fd = descriptor; ev.events = POLLREMOVE; ev.revents = 0; ::write(dev_poll_fd_, &ev, sizeof(ev)); // Destroy all operations associated with the descriptor. op_queue ops; asio::error_code ec; for (int i = 0; i < max_ops; ++i) op_queue_[i].cancel_operations(descriptor, ops, ec); } void dev_poll_reactor::cleanup_descriptor_data( dev_poll_reactor::per_descriptor_data&) { } void dev_poll_reactor::run(long usec, op_queue& ops) { asio::detail::mutex::scoped_lock lock(mutex_); // We can return immediately if there's no work to do and the reactor is // not supposed to block. if (usec == 0 && op_queue_[read_op].empty() && op_queue_[write_op].empty() && op_queue_[except_op].empty() && timer_queues_.all_empty()) return; // Write the pending event registration changes to the /dev/poll descriptor. std::size_t events_size = sizeof(::pollfd) * pending_event_changes_.size(); if (events_size > 0) { errno = 0; int result = ::write(dev_poll_fd_, &pending_event_changes_[0], events_size); if (result != static_cast(events_size)) { asio::error_code ec = asio::error_code( errno, asio::error::get_system_category()); for (std::size_t i = 0; i < pending_event_changes_.size(); ++i) { int descriptor = pending_event_changes_[i].fd; for (int j = 0; j < max_ops; ++j) op_queue_[j].cancel_operations(descriptor, ops, ec); } } pending_event_changes_.clear(); pending_event_change_index_.clear(); } // Calculate timeout. int timeout; if (usec == 0) timeout = 0; else { timeout = (usec < 0) ? -1 : ((usec - 1) / 1000 + 1); timeout = get_timeout(timeout); } lock.unlock(); // Block on the /dev/poll descriptor. ::pollfd events[128] = { { 0, 0, 0 } }; ::dvpoll dp = { 0, 0, 0 }; dp.dp_fds = events; dp.dp_nfds = 128; dp.dp_timeout = timeout; int num_events = ::ioctl(dev_poll_fd_, DP_POLL, &dp); lock.lock(); // Dispatch the waiting events. for (int i = 0; i < num_events; ++i) { int descriptor = events[i].fd; if (descriptor == interrupter_.read_descriptor()) { interrupter_.reset(); } else { bool more_reads = false; bool more_writes = false; bool more_except = false; // Exception operations must be processed first to ensure that any // out-of-band data is read before normal data. if (events[i].events & (POLLPRI | POLLERR | POLLHUP)) more_except = op_queue_[except_op].perform_operations(descriptor, ops); else more_except = op_queue_[except_op].has_operation(descriptor); if (events[i].events & (POLLIN | POLLERR | POLLHUP)) more_reads = op_queue_[read_op].perform_operations(descriptor, ops); else more_reads = op_queue_[read_op].has_operation(descriptor); if (events[i].events & (POLLOUT | POLLERR | POLLHUP)) more_writes = op_queue_[write_op].perform_operations(descriptor, ops); else more_writes = op_queue_[write_op].has_operation(descriptor); if ((events[i].events & (POLLERR | POLLHUP)) != 0 && !more_except && !more_reads && !more_writes) { // If we have an event and no operations associated with the // descriptor then we need to delete the descriptor from /dev/poll. // The poll operation can produce POLLHUP or POLLERR events when there // is no operation pending, so if we do not remove the descriptor we // can end up in a tight polling loop. ::pollfd ev = { 0, 0, 0 }; ev.fd = descriptor; ev.events = POLLREMOVE; ev.revents = 0; ::write(dev_poll_fd_, &ev, sizeof(ev)); } else { ::pollfd ev = { 0, 0, 0 }; ev.fd = descriptor; ev.events = POLLERR | POLLHUP; if (more_reads) ev.events |= POLLIN; if (more_writes) ev.events |= POLLOUT; if (more_except) ev.events |= POLLPRI; ev.revents = 0; int result = ::write(dev_poll_fd_, &ev, sizeof(ev)); if (result != sizeof(ev)) { asio::error_code ec(errno, asio::error::get_system_category()); for (int j = 0; j < max_ops; ++j) op_queue_[j].cancel_operations(descriptor, ops, ec); } } } } timer_queues_.get_ready_timers(ops); } void dev_poll_reactor::interrupt() { interrupter_.interrupt(); } int dev_poll_reactor::do_dev_poll_create() { int fd = ::open("/dev/poll", O_RDWR); if (fd == -1) { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "/dev/poll"); } return fd; } void dev_poll_reactor::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.insert(&queue); } void dev_poll_reactor::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.erase(&queue); } int dev_poll_reactor::get_timeout(int msec) { // By default we will wait no longer than 5 minutes. This will ensure that // any changes to the system clock are detected after no longer than this. const int max_msec = 5 * 60 * 1000; return timer_queues_.wait_duration_msec( (msec < 0 || max_msec < msec) ? max_msec : msec); } void dev_poll_reactor::cancel_ops_unlocked(socket_type descriptor, const asio::error_code& ec) { bool need_interrupt = false; op_queue ops; for (int i = 0; i < max_ops; ++i) need_interrupt = op_queue_[i].cancel_operations( descriptor, ops, ec) || need_interrupt; scheduler_.post_deferred_completions(ops); if (need_interrupt) interrupter_.interrupt(); } ::pollfd& dev_poll_reactor::add_pending_event_change(int descriptor) { hash_map::iterator iter = pending_event_change_index_.find(descriptor); if (iter == pending_event_change_index_.end()) { std::size_t index = pending_event_changes_.size(); pending_event_changes_.reserve(pending_event_changes_.size() + 1); pending_event_change_index_.insert(std::make_pair(descriptor, index)); pending_event_changes_.push_back(::pollfd()); pending_event_changes_[index].fd = descriptor; pending_event_changes_[index].revents = 0; return pending_event_changes_[index]; } else { return pending_event_changes_[iter->second]; } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_DEV_POLL) #endif // ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_IPP asio-1.12.2/include/asio/detail/impl/epoll_reactor.hpp000066400000000000000000000044661340672067200226750ustar00rootroot00000000000000// // detail/impl/epoll_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_EPOLL_REACTOR_HPP #define ASIO_DETAIL_IMPL_EPOLL_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if defined(ASIO_HAS_EPOLL) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template void epoll_reactor::add_timer_queue(timer_queue& queue) { do_add_timer_queue(queue); } template void epoll_reactor::remove_timer_queue(timer_queue& queue) { do_remove_timer_queue(queue); } template void epoll_reactor::schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op) { mutex::scoped_lock lock(mutex_); if (shutdown_) { scheduler_.post_immediate_completion(op, false); return; } bool earliest = queue.enqueue_timer(time, timer, op); scheduler_.work_started(); if (earliest) update_timeout(); } template std::size_t epoll_reactor::cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled) { mutex::scoped_lock lock(mutex_); op_queue ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); lock.unlock(); scheduler_.post_deferred_completions(ops); return n; } template void epoll_reactor::move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source) { mutex::scoped_lock lock(mutex_); op_queue ops; queue.cancel_timer(target, ops); queue.move_timer(target, source); lock.unlock(); scheduler_.post_deferred_completions(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_EPOLL) #endif // ASIO_DETAIL_IMPL_EPOLL_REACTOR_HPP asio-1.12.2/include/asio/detail/impl/epoll_reactor.ipp000066400000000000000000000526661340672067200227030ustar00rootroot00000000000000// // detail/impl/epoll_reactor.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP #define ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_EPOLL) #include #include #include "asio/detail/epoll_reactor.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #if defined(ASIO_HAS_TIMERFD) # include #endif // defined(ASIO_HAS_TIMERFD) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { epoll_reactor::epoll_reactor(asio::execution_context& ctx) : execution_context_service_base(ctx), scheduler_(use_service(ctx)), mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING( REACTOR_REGISTRATION, scheduler_.concurrency_hint())), interrupter_(), epoll_fd_(do_epoll_create()), timer_fd_(do_timerfd_create()), shutdown_(false), registered_descriptors_mutex_(mutex_.enabled()) { // Add the interrupter's descriptor to epoll. epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLET; ev.data.ptr = &interrupter_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); interrupter_.interrupt(); // Add the timer descriptor to epoll. if (timer_fd_ != -1) { ev.events = EPOLLIN | EPOLLERR; ev.data.ptr = &timer_fd_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); } } epoll_reactor::~epoll_reactor() { if (epoll_fd_ != -1) close(epoll_fd_); if (timer_fd_ != -1) close(timer_fd_); } void epoll_reactor::shutdown() { mutex::scoped_lock lock(mutex_); shutdown_ = true; lock.unlock(); op_queue ops; while (descriptor_state* state = registered_descriptors_.first()) { for (int i = 0; i < max_ops; ++i) ops.push(state->op_queue_[i]); state->shutdown_ = true; registered_descriptors_.free(state); } timer_queues_.get_all_timers(ops); scheduler_.abandon_operations(ops); } void epoll_reactor::notify_fork( asio::execution_context::fork_event fork_ev) { if (fork_ev == asio::execution_context::fork_child) { if (epoll_fd_ != -1) ::close(epoll_fd_); epoll_fd_ = -1; epoll_fd_ = do_epoll_create(); if (timer_fd_ != -1) ::close(timer_fd_); timer_fd_ = -1; timer_fd_ = do_timerfd_create(); interrupter_.recreate(); // Add the interrupter's descriptor to epoll. epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLET; ev.data.ptr = &interrupter_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); interrupter_.interrupt(); // Add the timer descriptor to epoll. if (timer_fd_ != -1) { ev.events = EPOLLIN | EPOLLERR; ev.data.ptr = &timer_fd_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); } update_timeout(); // Re-register all descriptors with epoll. mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); for (descriptor_state* state = registered_descriptors_.first(); state != 0; state = state->next_) { ev.events = state->registered_events_; ev.data.ptr = state; int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev); if (result != 0) { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "epoll re-registration"); } } } } void epoll_reactor::init_task() { scheduler_.init_task(); } int epoll_reactor::register_descriptor(socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data) { descriptor_data = allocate_descriptor_state(); ASIO_HANDLER_REACTOR_REGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); { mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); descriptor_data->reactor_ = this; descriptor_data->descriptor_ = descriptor; descriptor_data->shutdown_ = false; for (int i = 0; i < max_ops; ++i) descriptor_data->try_speculative_[i] = true; } epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; descriptor_data->registered_events_ = ev.events; ev.data.ptr = descriptor_data; int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); if (result != 0) { if (errno == EPERM) { // This file descriptor type is not supported by epoll. However, if it is // a regular file then operations on it will not block. We will allow // this descriptor to be used and fail later if an operation on it would // otherwise require a trip through the reactor. descriptor_data->registered_events_ = 0; return 0; } return errno; } return 0; } int epoll_reactor::register_internal_descriptor( int op_type, socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op) { descriptor_data = allocate_descriptor_state(); ASIO_HANDLER_REACTOR_REGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); { mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); descriptor_data->reactor_ = this; descriptor_data->descriptor_ = descriptor; descriptor_data->shutdown_ = false; descriptor_data->op_queue_[op_type].push(op); for (int i = 0; i < max_ops; ++i) descriptor_data->try_speculative_[i] = true; } epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; descriptor_data->registered_events_ = ev.events; ev.data.ptr = descriptor_data; int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); if (result != 0) return errno; return 0; } void epoll_reactor::move_descriptor(socket_type, epoll_reactor::per_descriptor_data& target_descriptor_data, epoll_reactor::per_descriptor_data& source_descriptor_data) { target_descriptor_data = source_descriptor_data; source_descriptor_data = 0; } void epoll_reactor::start_op(int op_type, socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op, bool is_continuation, bool allow_speculative) { if (!descriptor_data) { op->ec_ = asio::error::bad_descriptor; post_immediate_completion(op, is_continuation); return; } mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (descriptor_data->shutdown_) { post_immediate_completion(op, is_continuation); return; } if (descriptor_data->op_queue_[op_type].empty()) { if (allow_speculative && (op_type != read_op || descriptor_data->op_queue_[except_op].empty())) { if (descriptor_data->try_speculative_[op_type]) { if (reactor_op::status status = op->perform()) { if (status == reactor_op::done_and_exhausted) if (descriptor_data->registered_events_ != 0) descriptor_data->try_speculative_[op_type] = false; descriptor_lock.unlock(); scheduler_.post_immediate_completion(op, is_continuation); return; } } if (descriptor_data->registered_events_ == 0) { op->ec_ = asio::error::operation_not_supported; scheduler_.post_immediate_completion(op, is_continuation); return; } if (op_type == write_op) { if ((descriptor_data->registered_events_ & EPOLLOUT) == 0) { epoll_event ev = { 0, { 0 } }; ev.events = descriptor_data->registered_events_ | EPOLLOUT; ev.data.ptr = descriptor_data; if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0) { descriptor_data->registered_events_ |= ev.events; } else { op->ec_ = asio::error_code(errno, asio::error::get_system_category()); scheduler_.post_immediate_completion(op, is_continuation); return; } } } } else if (descriptor_data->registered_events_ == 0) { op->ec_ = asio::error::operation_not_supported; scheduler_.post_immediate_completion(op, is_continuation); return; } else { if (op_type == write_op) { descriptor_data->registered_events_ |= EPOLLOUT; } epoll_event ev = { 0, { 0 } }; ev.events = descriptor_data->registered_events_; ev.data.ptr = descriptor_data; epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); } } descriptor_data->op_queue_[op_type].push(op); scheduler_.work_started(); } void epoll_reactor::cancel_ops(socket_type, epoll_reactor::per_descriptor_data& descriptor_data) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); op_queue ops; for (int i = 0; i < max_ops; ++i) { while (reactor_op* op = descriptor_data->op_queue_[i].front()) { op->ec_ = asio::error::operation_aborted; descriptor_data->op_queue_[i].pop(); ops.push(op); } } descriptor_lock.unlock(); scheduler_.post_deferred_completions(ops); } void epoll_reactor::deregister_descriptor(socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data, bool closing) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (!descriptor_data->shutdown_) { if (closing) { // The descriptor will be automatically removed from the epoll set when // it is closed. } else if (descriptor_data->registered_events_ != 0) { epoll_event ev = { 0, { 0 } }; epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); } op_queue ops; for (int i = 0; i < max_ops; ++i) { while (reactor_op* op = descriptor_data->op_queue_[i].front()) { op->ec_ = asio::error::operation_aborted; descriptor_data->op_queue_[i].pop(); ops.push(op); } } descriptor_data->descriptor_ = -1; descriptor_data->shutdown_ = true; descriptor_lock.unlock(); ASIO_HANDLER_REACTOR_DEREGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); scheduler_.post_deferred_completions(ops); // Leave descriptor_data set so that it will be freed by the subsequent // call to cleanup_descriptor_data. } else { // We are shutting down, so prevent cleanup_descriptor_data from freeing // the descriptor_data object and let the destructor free it instead. descriptor_data = 0; } } void epoll_reactor::deregister_internal_descriptor(socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (!descriptor_data->shutdown_) { epoll_event ev = { 0, { 0 } }; epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); op_queue ops; for (int i = 0; i < max_ops; ++i) ops.push(descriptor_data->op_queue_[i]); descriptor_data->descriptor_ = -1; descriptor_data->shutdown_ = true; descriptor_lock.unlock(); ASIO_HANDLER_REACTOR_DEREGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); // Leave descriptor_data set so that it will be freed by the subsequent // call to cleanup_descriptor_data. } else { // We are shutting down, so prevent cleanup_descriptor_data from freeing // the descriptor_data object and let the destructor free it instead. descriptor_data = 0; } } void epoll_reactor::cleanup_descriptor_data( per_descriptor_data& descriptor_data) { if (descriptor_data) { free_descriptor_state(descriptor_data); descriptor_data = 0; } } void epoll_reactor::run(long usec, op_queue& ops) { // This code relies on the fact that the scheduler queues the reactor task // behind all descriptor operations generated by this function. This means, // that by the time we reach this point, any previously returned descriptor // operations have already been dequeued. Therefore it is now safe for us to // reuse and return them for the scheduler to queue again. // Calculate timeout. Check the timer queues only if timerfd is not in use. int timeout; if (usec == 0) timeout = 0; else { timeout = (usec < 0) ? -1 : ((usec - 1) / 1000 + 1); if (timer_fd_ == -1) { mutex::scoped_lock lock(mutex_); timeout = get_timeout(timeout); } } // Block on the epoll descriptor. epoll_event events[128]; int num_events = epoll_wait(epoll_fd_, events, 128, timeout); #if defined(ASIO_ENABLE_HANDLER_TRACKING) // Trace the waiting events. for (int i = 0; i < num_events; ++i) { void* ptr = events[i].data.ptr; if (ptr == &interrupter_) { // Ignore. } # if defined(ASIO_HAS_TIMERFD) else if (ptr == &timer_fd_) { // Ignore. } # endif // defined(ASIO_HAS_TIMERFD) else { unsigned event_mask = 0; if ((events[i].events & EPOLLIN) != 0) event_mask |= ASIO_HANDLER_REACTOR_READ_EVENT; if ((events[i].events & EPOLLOUT)) event_mask |= ASIO_HANDLER_REACTOR_WRITE_EVENT; if ((events[i].events & (EPOLLERR | EPOLLHUP)) != 0) event_mask |= ASIO_HANDLER_REACTOR_ERROR_EVENT; ASIO_HANDLER_REACTOR_EVENTS((context(), reinterpret_cast(ptr), event_mask)); } } #endif // defined(ASIO_ENABLE_HANDLER_TRACKING) #if defined(ASIO_HAS_TIMERFD) bool check_timers = (timer_fd_ == -1); #else // defined(ASIO_HAS_TIMERFD) bool check_timers = true; #endif // defined(ASIO_HAS_TIMERFD) // Dispatch the waiting events. for (int i = 0; i < num_events; ++i) { void* ptr = events[i].data.ptr; if (ptr == &interrupter_) { // No need to reset the interrupter since we're leaving the descriptor // in a ready-to-read state and relying on edge-triggered notifications // to make it so that we only get woken up when the descriptor's epoll // registration is updated. #if defined(ASIO_HAS_TIMERFD) if (timer_fd_ == -1) check_timers = true; #else // defined(ASIO_HAS_TIMERFD) check_timers = true; #endif // defined(ASIO_HAS_TIMERFD) } #if defined(ASIO_HAS_TIMERFD) else if (ptr == &timer_fd_) { check_timers = true; } #endif // defined(ASIO_HAS_TIMERFD) else { // The descriptor operation doesn't count as work in and of itself, so we // don't call work_started() here. This still allows the scheduler to // stop if the only remaining operations are descriptor operations. descriptor_state* descriptor_data = static_cast(ptr); if (!ops.is_enqueued(descriptor_data)) { descriptor_data->set_ready_events(events[i].events); ops.push(descriptor_data); } else { descriptor_data->add_ready_events(events[i].events); } } } if (check_timers) { mutex::scoped_lock common_lock(mutex_); timer_queues_.get_ready_timers(ops); #if defined(ASIO_HAS_TIMERFD) if (timer_fd_ != -1) { itimerspec new_timeout; itimerspec old_timeout; int flags = get_timeout(new_timeout); timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); } #endif // defined(ASIO_HAS_TIMERFD) } } void epoll_reactor::interrupt() { epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLET; ev.data.ptr = &interrupter_; epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev); } int epoll_reactor::do_epoll_create() { #if defined(EPOLL_CLOEXEC) int fd = epoll_create1(EPOLL_CLOEXEC); #else // defined(EPOLL_CLOEXEC) int fd = -1; errno = EINVAL; #endif // defined(EPOLL_CLOEXEC) if (fd == -1 && (errno == EINVAL || errno == ENOSYS)) { fd = epoll_create(epoll_size); if (fd != -1) ::fcntl(fd, F_SETFD, FD_CLOEXEC); } if (fd == -1) { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "epoll"); } return fd; } int epoll_reactor::do_timerfd_create() { #if defined(ASIO_HAS_TIMERFD) # if defined(TFD_CLOEXEC) int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); # else // defined(TFD_CLOEXEC) int fd = -1; errno = EINVAL; # endif // defined(TFD_CLOEXEC) if (fd == -1 && errno == EINVAL) { fd = timerfd_create(CLOCK_MONOTONIC, 0); if (fd != -1) ::fcntl(fd, F_SETFD, FD_CLOEXEC); } return fd; #else // defined(ASIO_HAS_TIMERFD) return -1; #endif // defined(ASIO_HAS_TIMERFD) } epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state() { mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); return registered_descriptors_.alloc(ASIO_CONCURRENCY_HINT_IS_LOCKING( REACTOR_IO, scheduler_.concurrency_hint())); } void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s) { mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); registered_descriptors_.free(s); } void epoll_reactor::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.insert(&queue); } void epoll_reactor::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.erase(&queue); } void epoll_reactor::update_timeout() { #if defined(ASIO_HAS_TIMERFD) if (timer_fd_ != -1) { itimerspec new_timeout; itimerspec old_timeout; int flags = get_timeout(new_timeout); timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); return; } #endif // defined(ASIO_HAS_TIMERFD) interrupt(); } int epoll_reactor::get_timeout(int msec) { // By default we will wait no longer than 5 minutes. This will ensure that // any changes to the system clock are detected after no longer than this. const int max_msec = 5 * 60 * 1000; return timer_queues_.wait_duration_msec( (msec < 0 || max_msec < msec) ? max_msec : msec); } #if defined(ASIO_HAS_TIMERFD) int epoll_reactor::get_timeout(itimerspec& ts) { ts.it_interval.tv_sec = 0; ts.it_interval.tv_nsec = 0; long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000); ts.it_value.tv_sec = usec / 1000000; ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1; return usec ? 0 : TFD_TIMER_ABSTIME; } #endif // defined(ASIO_HAS_TIMERFD) struct epoll_reactor::perform_io_cleanup_on_block_exit { explicit perform_io_cleanup_on_block_exit(epoll_reactor* r) : reactor_(r), first_op_(0) { } ~perform_io_cleanup_on_block_exit() { if (first_op_) { // Post the remaining completed operations for invocation. if (!ops_.empty()) reactor_->scheduler_.post_deferred_completions(ops_); // A user-initiated operation has completed, but there's no need to // explicitly call work_finished() here. Instead, we'll take advantage of // the fact that the scheduler will call work_finished() once we return. } else { // No user-initiated operations have completed, so we need to compensate // for the work_finished() call that the scheduler will make once this // operation returns. reactor_->scheduler_.compensating_work_started(); } } epoll_reactor* reactor_; op_queue ops_; operation* first_op_; }; epoll_reactor::descriptor_state::descriptor_state(bool locking) : operation(&epoll_reactor::descriptor_state::do_complete), mutex_(locking) { } operation* epoll_reactor::descriptor_state::perform_io(uint32_t events) { mutex_.lock(); perform_io_cleanup_on_block_exit io_cleanup(reactor_); mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock); // Exception operations must be processed first to ensure that any // out-of-band data is read before normal data. static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI }; for (int j = max_ops - 1; j >= 0; --j) { if (events & (flag[j] | EPOLLERR | EPOLLHUP)) { try_speculative_[j] = true; while (reactor_op* op = op_queue_[j].front()) { if (reactor_op::status status = op->perform()) { op_queue_[j].pop(); io_cleanup.ops_.push(op); if (status == reactor_op::done_and_exhausted) { try_speculative_[j] = false; break; } } else break; } } } // The first operation will be returned for completion now. The others will // be posted for later by the io_cleanup object's destructor. io_cleanup.first_op_ = io_cleanup.ops_.front(); io_cleanup.ops_.pop(); return io_cleanup.first_op_; } void epoll_reactor::descriptor_state::do_complete( void* owner, operation* base, const asio::error_code& ec, std::size_t bytes_transferred) { if (owner) { descriptor_state* descriptor_data = static_cast(base); uint32_t events = static_cast(bytes_transferred); if (operation* op = descriptor_data->perform_io(events)) { op->complete(owner, ec, 0); } } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_EPOLL) #endif // ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP asio-1.12.2/include/asio/detail/impl/eventfd_select_interrupter.ipp000066400000000000000000000106011340672067200254650ustar00rootroot00000000000000// // detail/impl/eventfd_select_interrupter.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Roelof Naude (roelof.naude at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_EVENTFD_SELECT_INTERRUPTER_IPP #define ASIO_DETAIL_IMPL_EVENTFD_SELECT_INTERRUPTER_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_EVENTFD) #include #include #include #if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 # include #else // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 # include #endif // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 #include "asio/detail/cstdint.hpp" #include "asio/detail/eventfd_select_interrupter.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { eventfd_select_interrupter::eventfd_select_interrupter() { open_descriptors(); } void eventfd_select_interrupter::open_descriptors() { #if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 write_descriptor_ = read_descriptor_ = syscall(__NR_eventfd, 0); if (read_descriptor_ != -1) { ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); } #else // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 # if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) write_descriptor_ = read_descriptor_ = ::eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); # else // defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) errno = EINVAL; write_descriptor_ = read_descriptor_ = -1; # endif // defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) if (read_descriptor_ == -1 && errno == EINVAL) { write_descriptor_ = read_descriptor_ = ::eventfd(0, 0); if (read_descriptor_ != -1) { ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); } } #endif // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 if (read_descriptor_ == -1) { int pipe_fds[2]; if (pipe(pipe_fds) == 0) { read_descriptor_ = pipe_fds[0]; ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); write_descriptor_ = pipe_fds[1]; ::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK); ::fcntl(write_descriptor_, F_SETFD, FD_CLOEXEC); } else { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "eventfd_select_interrupter"); } } } eventfd_select_interrupter::~eventfd_select_interrupter() { close_descriptors(); } void eventfd_select_interrupter::close_descriptors() { if (write_descriptor_ != -1 && write_descriptor_ != read_descriptor_) ::close(write_descriptor_); if (read_descriptor_ != -1) ::close(read_descriptor_); } void eventfd_select_interrupter::recreate() { close_descriptors(); write_descriptor_ = -1; read_descriptor_ = -1; open_descriptors(); } void eventfd_select_interrupter::interrupt() { uint64_t counter(1UL); int result = ::write(write_descriptor_, &counter, sizeof(uint64_t)); (void)result; } bool eventfd_select_interrupter::reset() { if (write_descriptor_ == read_descriptor_) { for (;;) { // Only perform one read. The kernel maintains an atomic counter. uint64_t counter(0); errno = 0; int bytes_read = ::read(read_descriptor_, &counter, sizeof(uint64_t)); if (bytes_read < 0 && errno == EINTR) continue; bool was_interrupted = (bytes_read > 0); return was_interrupted; } } else { for (;;) { // Clear all data from the pipe. char data[1024]; int bytes_read = ::read(read_descriptor_, data, sizeof(data)); if (bytes_read < 0 && errno == EINTR) continue; bool was_interrupted = (bytes_read > 0); while (bytes_read == sizeof(data)) bytes_read = ::read(read_descriptor_, data, sizeof(data)); return was_interrupted; } } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_EVENTFD) #endif // ASIO_DETAIL_IMPL_EVENTFD_SELECT_INTERRUPTER_IPP asio-1.12.2/include/asio/detail/impl/handler_tracking.ipp000066400000000000000000000235061340672067200233370ustar00rootroot00000000000000// // detail/impl/handler_tracking.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_HANDLER_TRACKING_IPP #define ASIO_DETAIL_IMPL_HANDLER_TRACKING_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_CUSTOM_HANDLER_TRACKING) // The handler tracking implementation is provided by the user-specified header. #elif defined(ASIO_ENABLE_HANDLER_TRACKING) #include #include #include "asio/detail/handler_tracking.hpp" #if defined(ASIO_HAS_BOOST_DATE_TIME) # include "asio/time_traits.hpp" #elif defined(ASIO_HAS_CHRONO) # include "asio/detail/chrono.hpp" # include "asio/detail/chrono_time_traits.hpp" # include "asio/wait_traits.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/socket_types.hpp" #elif !defined(ASIO_WINDOWS) # include #endif // !defined(ASIO_WINDOWS) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct handler_tracking_timestamp { uint64_t seconds; uint64_t microseconds; handler_tracking_timestamp() { #if defined(ASIO_HAS_BOOST_DATE_TIME) boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1)); boost::posix_time::time_duration now = boost::posix_time::microsec_clock::universal_time() - epoch; #elif defined(ASIO_HAS_CHRONO) typedef chrono_time_traits > traits_helper; traits_helper::posix_time_duration now( chrono::system_clock::now().time_since_epoch()); #endif seconds = static_cast(now.total_seconds()); microseconds = static_cast(now.total_microseconds() % 1000000); } }; struct handler_tracking::tracking_state { static_mutex mutex_; uint64_t next_id_; tss_ptr* current_completion_; }; handler_tracking::tracking_state* handler_tracking::get_state() { static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0 }; return &state; } void handler_tracking::init() { static tracking_state* state = get_state(); state->mutex_.init(); static_mutex::scoped_lock lock(state->mutex_); if (state->current_completion_ == 0) state->current_completion_ = new tss_ptr; } void handler_tracking::creation(execution_context&, handler_tracking::tracked_handler& h, const char* object_type, void* object, uintmax_t /*native_handle*/, const char* op_name) { static tracking_state* state = get_state(); static_mutex::scoped_lock lock(state->mutex_); h.id_ = state->next_id_++; lock.unlock(); handler_tracking_timestamp timestamp; uint64_t current_id = 0; if (completion* current_completion = *state->current_completion_) current_id = current_completion->id_; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|%I64u*%I64u|%.20s@%p.%.50s\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|%llu*%llu|%.20s@%p.%.50s\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, current_id, h.id_, object_type, object, op_name); } handler_tracking::completion::completion( const handler_tracking::tracked_handler& h) : id_(h.id_), invoked_(false), next_(*get_state()->current_completion_) { *get_state()->current_completion_ = this; } handler_tracking::completion::~completion() { if (id_) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|%c%I64u|\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|%c%llu|\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, invoked_ ? '!' : '~', id_); } *get_state()->current_completion_ = next_; } void handler_tracking::completion::invocation_begin() { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|>%I64u|\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|>%llu|\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, id_); invoked_ = true; } void handler_tracking::completion::invocation_begin( const asio::error_code& ec) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|>%llu|ec=%.20s:%d\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, id_, ec.category().name(), ec.value()); invoked_ = true; } void handler_tracking::completion::invocation_begin( const asio::error_code& ec, std::size_t bytes_transferred) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d,bytes_transferred=%I64u\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|>%llu|ec=%.20s:%d,bytes_transferred=%llu\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, id_, ec.category().name(), ec.value(), static_cast(bytes_transferred)); invoked_ = true; } void handler_tracking::completion::invocation_begin( const asio::error_code& ec, int signal_number) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d,signal_number=%d\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|>%llu|ec=%.20s:%d,signal_number=%d\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, id_, ec.category().name(), ec.value(), signal_number); invoked_ = true; } void handler_tracking::completion::invocation_begin( const asio::error_code& ec, const char* arg) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d,%.50s\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|>%llu|ec=%.20s:%d,%.50s\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, id_, ec.category().name(), ec.value(), arg); invoked_ = true; } void handler_tracking::completion::invocation_end() { if (id_) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|<%I64u|\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|<%llu|\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, id_); id_ = 0; } } void handler_tracking::operation(execution_context&, const char* object_type, void* object, uintmax_t /*native_handle*/, const char* op_name) { static tracking_state* state = get_state(); handler_tracking_timestamp timestamp; unsigned long long current_id = 0; if (completion* current_completion = *state->current_completion_) current_id = current_completion->id_; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|%I64u|%.20s@%p.%.50s\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|%llu|%.20s@%p.%.50s\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, current_id, object_type, object, op_name); } void handler_tracking::reactor_registration(execution_context& /*context*/, uintmax_t /*native_handle*/, uintmax_t /*registration*/) { } void handler_tracking::reactor_deregistration(execution_context& /*context*/, uintmax_t /*native_handle*/, uintmax_t /*registration*/) { } void handler_tracking::reactor_events(execution_context& /*context*/, uintmax_t /*native_handle*/, unsigned /*events*/) { } void handler_tracking::reactor_operation( const tracked_handler& h, const char* op_name, const asio::error_code& ec) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|.%I64u|%s,ec=%.20s:%d\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|.%llu|%s,ec=%.20s:%d\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, h.id_, op_name, ec.category().name(), ec.value()); } void handler_tracking::reactor_operation( const tracked_handler& h, const char* op_name, const asio::error_code& ec, std::size_t bytes_transferred) { handler_tracking_timestamp timestamp; write_line( #if defined(ASIO_WINDOWS) "@asio|%I64u.%06I64u|.%I64u|%s,ec=%.20s:%d,bytes_transferred=%I64u\n", #else // defined(ASIO_WINDOWS) "@asio|%llu.%06llu|.%llu|%s,ec=%.20s:%d,bytes_transferred=%llu\n", #endif // defined(ASIO_WINDOWS) timestamp.seconds, timestamp.microseconds, h.id_, op_name, ec.category().name(), ec.value(), static_cast(bytes_transferred)); } void handler_tracking::write_line(const char* format, ...) { using namespace std; // For sprintf (or equivalent). va_list args; va_start(args, format); char line[256] = ""; #if defined(ASIO_HAS_SECURE_RTL) int length = vsprintf_s(line, sizeof(line), format, args); #else // defined(ASIO_HAS_SECURE_RTL) int length = vsprintf(line, format, args); #endif // defined(ASIO_HAS_SECURE_RTL) va_end(args); #if defined(ASIO_WINDOWS_RUNTIME) wchar_t wline[256] = L""; mbstowcs_s(0, wline, sizeof(wline) / sizeof(wchar_t), line, length); ::OutputDebugStringW(wline); #elif defined(ASIO_WINDOWS) HANDLE stderr_handle = ::GetStdHandle(STD_ERROR_HANDLE); DWORD bytes_written = 0; ::WriteFile(stderr_handle, line, length, &bytes_written, 0); #else // defined(ASIO_WINDOWS) ::write(STDERR_FILENO, line, length); #endif // defined(ASIO_WINDOWS) } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_HANDLER_TRACKING) #endif // ASIO_DETAIL_IMPL_HANDLER_TRACKING_IPP asio-1.12.2/include/asio/detail/impl/kqueue_reactor.hpp000066400000000000000000000047071340672067200230570ustar00rootroot00000000000000// // detail/impl/kqueue_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_KQUEUE_REACTOR_HPP #define ASIO_DETAIL_IMPL_KQUEUE_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_KQUEUE) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template void kqueue_reactor::add_timer_queue(timer_queue& queue) { do_add_timer_queue(queue); } // Remove a timer queue from the reactor. template void kqueue_reactor::remove_timer_queue(timer_queue& queue) { do_remove_timer_queue(queue); } template void kqueue_reactor::schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op) { mutex::scoped_lock lock(mutex_); if (shutdown_) { scheduler_.post_immediate_completion(op, false); return; } bool earliest = queue.enqueue_timer(time, timer, op); scheduler_.work_started(); if (earliest) interrupt(); } template std::size_t kqueue_reactor::cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled) { mutex::scoped_lock lock(mutex_); op_queue ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); lock.unlock(); scheduler_.post_deferred_completions(ops); return n; } template void kqueue_reactor::move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source) { mutex::scoped_lock lock(mutex_); op_queue ops; queue.cancel_timer(target, ops); queue.move_timer(target, source); lock.unlock(); scheduler_.post_deferred_completions(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_KQUEUE) #endif // ASIO_DETAIL_IMPL_KQUEUE_REACTOR_HPP asio-1.12.2/include/asio/detail/impl/kqueue_reactor.ipp000066400000000000000000000401701340672067200230520ustar00rootroot00000000000000// // detail/impl/kqueue_reactor.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_KQUEUE_REACTOR_IPP #define ASIO_DETAIL_IMPL_KQUEUE_REACTOR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_KQUEUE) #include "asio/detail/kqueue_reactor.hpp" #include "asio/detail/scheduler.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" #if defined(__NetBSD__) # define ASIO_KQUEUE_EV_SET(ev, ident, filt, flags, fflags, data, udata) \ EV_SET(ev, ident, filt, flags, fflags, data, \ reinterpret_cast(static_cast(udata))) #else # define ASIO_KQUEUE_EV_SET(ev, ident, filt, flags, fflags, data, udata) \ EV_SET(ev, ident, filt, flags, fflags, data, udata) #endif namespace asio { namespace detail { kqueue_reactor::kqueue_reactor(asio::execution_context& ctx) : execution_context_service_base(ctx), scheduler_(use_service(ctx)), mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING( REACTOR_REGISTRATION, scheduler_.concurrency_hint())), kqueue_fd_(do_kqueue_create()), interrupter_(), shutdown_(false), registered_descriptors_mutex_(mutex_.enabled()) { struct kevent events[1]; ASIO_KQUEUE_EV_SET(&events[0], interrupter_.read_descriptor(), EVFILT_READ, EV_ADD, 0, 0, &interrupter_); if (::kevent(kqueue_fd_, events, 1, 0, 0, 0) == -1) { asio::error_code error(errno, asio::error::get_system_category()); asio::detail::throw_error(error); } } kqueue_reactor::~kqueue_reactor() { close(kqueue_fd_); } void kqueue_reactor::shutdown() { mutex::scoped_lock lock(mutex_); shutdown_ = true; lock.unlock(); op_queue ops; while (descriptor_state* state = registered_descriptors_.first()) { for (int i = 0; i < max_ops; ++i) ops.push(state->op_queue_[i]); state->shutdown_ = true; registered_descriptors_.free(state); } timer_queues_.get_all_timers(ops); scheduler_.abandon_operations(ops); } void kqueue_reactor::notify_fork( asio::execution_context::fork_event fork_ev) { if (fork_ev == asio::execution_context::fork_child) { // The kqueue descriptor is automatically closed in the child. kqueue_fd_ = -1; kqueue_fd_ = do_kqueue_create(); interrupter_.recreate(); struct kevent events[2]; ASIO_KQUEUE_EV_SET(&events[0], interrupter_.read_descriptor(), EVFILT_READ, EV_ADD, 0, 0, &interrupter_); if (::kevent(kqueue_fd_, events, 1, 0, 0, 0) == -1) { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "kqueue interrupter registration"); } // Re-register all descriptors with kqueue. mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); for (descriptor_state* state = registered_descriptors_.first(); state != 0; state = state->next_) { if (state->num_kevents_ > 0) { ASIO_KQUEUE_EV_SET(&events[0], state->descriptor_, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, state); ASIO_KQUEUE_EV_SET(&events[1], state->descriptor_, EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, state); if (::kevent(kqueue_fd_, events, state->num_kevents_, 0, 0, 0) == -1) { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "kqueue re-registration"); } } } } } void kqueue_reactor::init_task() { scheduler_.init_task(); } int kqueue_reactor::register_descriptor(socket_type descriptor, kqueue_reactor::per_descriptor_data& descriptor_data) { descriptor_data = allocate_descriptor_state(); ASIO_HANDLER_REACTOR_REGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); mutex::scoped_lock lock(descriptor_data->mutex_); descriptor_data->descriptor_ = descriptor; descriptor_data->num_kevents_ = 0; descriptor_data->shutdown_ = false; return 0; } int kqueue_reactor::register_internal_descriptor( int op_type, socket_type descriptor, kqueue_reactor::per_descriptor_data& descriptor_data, reactor_op* op) { descriptor_data = allocate_descriptor_state(); ASIO_HANDLER_REACTOR_REGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); mutex::scoped_lock lock(descriptor_data->mutex_); descriptor_data->descriptor_ = descriptor; descriptor_data->num_kevents_ = 1; descriptor_data->shutdown_ = false; descriptor_data->op_queue_[op_type].push(op); struct kevent events[1]; ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, descriptor_data); if (::kevent(kqueue_fd_, events, 1, 0, 0, 0) == -1) return errno; return 0; } void kqueue_reactor::move_descriptor(socket_type, kqueue_reactor::per_descriptor_data& target_descriptor_data, kqueue_reactor::per_descriptor_data& source_descriptor_data) { target_descriptor_data = source_descriptor_data; source_descriptor_data = 0; } void kqueue_reactor::start_op(int op_type, socket_type descriptor, kqueue_reactor::per_descriptor_data& descriptor_data, reactor_op* op, bool is_continuation, bool allow_speculative) { if (!descriptor_data) { op->ec_ = asio::error::bad_descriptor; post_immediate_completion(op, is_continuation); return; } mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (descriptor_data->shutdown_) { post_immediate_completion(op, is_continuation); return; } if (descriptor_data->op_queue_[op_type].empty()) { static const int num_kevents[max_ops] = { 1, 2, 1 }; if (allow_speculative && (op_type != read_op || descriptor_data->op_queue_[except_op].empty())) { if (op->perform()) { descriptor_lock.unlock(); scheduler_.post_immediate_completion(op, is_continuation); return; } if (descriptor_data->num_kevents_ < num_kevents[op_type]) { struct kevent events[2]; ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, descriptor_data); ASIO_KQUEUE_EV_SET(&events[1], descriptor, EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, descriptor_data); if (::kevent(kqueue_fd_, events, num_kevents[op_type], 0, 0, 0) != -1) { descriptor_data->num_kevents_ = num_kevents[op_type]; } else { op->ec_ = asio::error_code(errno, asio::error::get_system_category()); scheduler_.post_immediate_completion(op, is_continuation); return; } } } else { if (descriptor_data->num_kevents_ < num_kevents[op_type]) descriptor_data->num_kevents_ = num_kevents[op_type]; struct kevent events[2]; ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, descriptor_data); ASIO_KQUEUE_EV_SET(&events[1], descriptor, EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, descriptor_data); ::kevent(kqueue_fd_, events, descriptor_data->num_kevents_, 0, 0, 0); } } descriptor_data->op_queue_[op_type].push(op); scheduler_.work_started(); } void kqueue_reactor::cancel_ops(socket_type, kqueue_reactor::per_descriptor_data& descriptor_data) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); op_queue ops; for (int i = 0; i < max_ops; ++i) { while (reactor_op* op = descriptor_data->op_queue_[i].front()) { op->ec_ = asio::error::operation_aborted; descriptor_data->op_queue_[i].pop(); ops.push(op); } } descriptor_lock.unlock(); scheduler_.post_deferred_completions(ops); } void kqueue_reactor::deregister_descriptor(socket_type descriptor, kqueue_reactor::per_descriptor_data& descriptor_data, bool closing) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (!descriptor_data->shutdown_) { if (closing) { // The descriptor will be automatically removed from the kqueue when it // is closed. } else { struct kevent events[2]; ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); ASIO_KQUEUE_EV_SET(&events[1], descriptor, EVFILT_WRITE, EV_DELETE, 0, 0, 0); ::kevent(kqueue_fd_, events, descriptor_data->num_kevents_, 0, 0, 0); } op_queue ops; for (int i = 0; i < max_ops; ++i) { while (reactor_op* op = descriptor_data->op_queue_[i].front()) { op->ec_ = asio::error::operation_aborted; descriptor_data->op_queue_[i].pop(); ops.push(op); } } descriptor_data->descriptor_ = -1; descriptor_data->shutdown_ = true; descriptor_lock.unlock(); ASIO_HANDLER_REACTOR_DEREGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); scheduler_.post_deferred_completions(ops); // Leave descriptor_data set so that it will be freed by the subsequent // call to cleanup_descriptor_data. } else { // We are shutting down, so prevent cleanup_descriptor_data from freeing // the descriptor_data object and let the destructor free it instead. descriptor_data = 0; } } void kqueue_reactor::deregister_internal_descriptor(socket_type descriptor, kqueue_reactor::per_descriptor_data& descriptor_data) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (!descriptor_data->shutdown_) { struct kevent events[2]; ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); ASIO_KQUEUE_EV_SET(&events[1], descriptor, EVFILT_WRITE, EV_DELETE, 0, 0, 0); ::kevent(kqueue_fd_, events, descriptor_data->num_kevents_, 0, 0, 0); op_queue ops; for (int i = 0; i < max_ops; ++i) ops.push(descriptor_data->op_queue_[i]); descriptor_data->descriptor_ = -1; descriptor_data->shutdown_ = true; descriptor_lock.unlock(); ASIO_HANDLER_REACTOR_DEREGISTRATION(( context(), static_cast(descriptor), reinterpret_cast(descriptor_data))); // Leave descriptor_data set so that it will be freed by the subsequent // call to cleanup_descriptor_data. } else { // We are shutting down, so prevent cleanup_descriptor_data from freeing // the descriptor_data object and let the destructor free it instead. descriptor_data = 0; } } void kqueue_reactor::cleanup_descriptor_data( per_descriptor_data& descriptor_data) { if (descriptor_data) { free_descriptor_state(descriptor_data); descriptor_data = 0; } } void kqueue_reactor::run(long usec, op_queue& ops) { mutex::scoped_lock lock(mutex_); // Determine how long to block while waiting for events. timespec timeout_buf = { 0, 0 }; timespec* timeout = usec ? get_timeout(usec, timeout_buf) : &timeout_buf; lock.unlock(); // Block on the kqueue descriptor. struct kevent events[128]; int num_events = kevent(kqueue_fd_, 0, 0, events, 128, timeout); #if defined(ASIO_ENABLE_HANDLER_TRACKING) // Trace the waiting events. for (int i = 0; i < num_events; ++i) { void* ptr = reinterpret_cast(events[i].udata); if (ptr != &interrupter_) { unsigned event_mask = 0; switch (events[i].filter) { case EVFILT_READ: event_mask |= ASIO_HANDLER_REACTOR_READ_EVENT; break; case EVFILT_WRITE: event_mask |= ASIO_HANDLER_REACTOR_WRITE_EVENT; break; } if ((events[i].flags & (EV_ERROR | EV_OOBAND)) != 0) event_mask |= ASIO_HANDLER_REACTOR_ERROR_EVENT; ASIO_HANDLER_REACTOR_EVENTS((context(), reinterpret_cast(ptr), event_mask)); } } #endif // defined(ASIO_ENABLE_HANDLER_TRACKING) // Dispatch the waiting events. for (int i = 0; i < num_events; ++i) { void* ptr = reinterpret_cast(events[i].udata); if (ptr == &interrupter_) { interrupter_.reset(); } else { descriptor_state* descriptor_data = static_cast(ptr); mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (events[i].filter == EVFILT_WRITE && descriptor_data->num_kevents_ == 2 && descriptor_data->op_queue_[write_op].empty()) { // Some descriptor types, like serial ports, don't seem to support // EV_CLEAR with EVFILT_WRITE. Since we have no pending write // operations we'll remove the EVFILT_WRITE registration here so that // we don't end up in a tight spin. struct kevent delete_events[1]; ASIO_KQUEUE_EV_SET(&delete_events[0], descriptor_data->descriptor_, EVFILT_WRITE, EV_DELETE, 0, 0, 0); ::kevent(kqueue_fd_, delete_events, 1, 0, 0, 0); descriptor_data->num_kevents_ = 1; } // Exception operations must be processed first to ensure that any // out-of-band data is read before normal data. #if defined(__NetBSD__) static const unsigned int filter[max_ops] = #else static const int filter[max_ops] = #endif { EVFILT_READ, EVFILT_WRITE, EVFILT_READ }; for (int j = max_ops - 1; j >= 0; --j) { if (events[i].filter == filter[j]) { if (j != except_op || events[i].flags & EV_OOBAND) { while (reactor_op* op = descriptor_data->op_queue_[j].front()) { if (events[i].flags & EV_ERROR) { op->ec_ = asio::error_code( static_cast(events[i].data), asio::error::get_system_category()); descriptor_data->op_queue_[j].pop(); ops.push(op); } if (op->perform()) { descriptor_data->op_queue_[j].pop(); ops.push(op); } else break; } } } } } } lock.lock(); timer_queues_.get_ready_timers(ops); } void kqueue_reactor::interrupt() { interrupter_.interrupt(); } int kqueue_reactor::do_kqueue_create() { int fd = ::kqueue(); if (fd == -1) { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "kqueue"); } return fd; } kqueue_reactor::descriptor_state* kqueue_reactor::allocate_descriptor_state() { mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); return registered_descriptors_.alloc(ASIO_CONCURRENCY_HINT_IS_LOCKING( REACTOR_IO, scheduler_.concurrency_hint())); } void kqueue_reactor::free_descriptor_state(kqueue_reactor::descriptor_state* s) { mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); registered_descriptors_.free(s); } void kqueue_reactor::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.insert(&queue); } void kqueue_reactor::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.erase(&queue); } timespec* kqueue_reactor::get_timeout(long usec, timespec& ts) { // By default we will wait no longer than 5 minutes. This will ensure that // any changes to the system clock are detected after no longer than this. const long max_usec = 5 * 60 * 1000 * 1000; usec = timer_queues_.wait_duration_usec( (usec < 0 || max_usec < usec) ? max_usec : usec); ts.tv_sec = usec / 1000000; ts.tv_nsec = (usec % 1000000) * 1000; return &ts; } } // namespace detail } // namespace asio #undef ASIO_KQUEUE_EV_SET #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_KQUEUE) #endif // ASIO_DETAIL_IMPL_KQUEUE_REACTOR_IPP asio-1.12.2/include/asio/detail/impl/null_event.ipp000066400000000000000000000033751340672067200222150ustar00rootroot00000000000000// // detail/impl/null_event.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_NULL_EVENT_IPP #define ASIO_DETAIL_IMPL_NULL_EVENT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) # include "asio/detail/socket_types.hpp" #else # include # if defined(__hpux) # include # endif # if !defined(__hpux) || defined(__SELECT) # include # endif #endif #include "asio/detail/push_options.hpp" namespace asio { namespace detail { void null_event::do_wait() { #if defined(ASIO_WINDOWS_RUNTIME) std::this_thread::sleep_until((std::chrono::steady_clock::time_point::max)()); #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) ::Sleep(INFINITE); #else ::pause(); #endif } void null_event::do_wait_for_usec(long usec) { #if defined(ASIO_WINDOWS_RUNTIME) std::this_thread::sleep_for(std::chrono::microseconds(usec)); #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) ::Sleep(usec / 1000); #elif defined(__hpux) && defined(__SELECT) timespec ts; ts.tv_sec = usec / 1000000; ts.tv_nsec = (usec % 1000000) * 1000; ::pselect(0, 0, 0, 0, &ts, 0); #else timeval tv; tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; ::select(0, 0, 0, 0, &tv); #endif } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_NULL_EVENT_IPP asio-1.12.2/include/asio/detail/impl/pipe_select_interrupter.ipp000066400000000000000000000056531340672067200250020ustar00rootroot00000000000000// // detail/impl/pipe_select_interrupter.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP #define ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS_RUNTIME) #if !defined(ASIO_WINDOWS) #if !defined(__CYGWIN__) #if !defined(__SYMBIAN32__) #if !defined(ASIO_HAS_EVENTFD) #include #include #include #include #include "asio/detail/pipe_select_interrupter.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { pipe_select_interrupter::pipe_select_interrupter() { open_descriptors(); } void pipe_select_interrupter::open_descriptors() { int pipe_fds[2]; if (pipe(pipe_fds) == 0) { read_descriptor_ = pipe_fds[0]; ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); write_descriptor_ = pipe_fds[1]; ::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK); #if defined(FD_CLOEXEC) ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); ::fcntl(write_descriptor_, F_SETFD, FD_CLOEXEC); #endif // defined(FD_CLOEXEC) } else { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "pipe_select_interrupter"); } } pipe_select_interrupter::~pipe_select_interrupter() { close_descriptors(); } void pipe_select_interrupter::close_descriptors() { if (read_descriptor_ != -1) ::close(read_descriptor_); if (write_descriptor_ != -1) ::close(write_descriptor_); } void pipe_select_interrupter::recreate() { close_descriptors(); write_descriptor_ = -1; read_descriptor_ = -1; open_descriptors(); } void pipe_select_interrupter::interrupt() { char byte = 0; signed_size_type result = ::write(write_descriptor_, &byte, 1); (void)result; } bool pipe_select_interrupter::reset() { for (;;) { char data[1024]; signed_size_type bytes_read = ::read(read_descriptor_, data, sizeof(data)); if (bytes_read < 0 && errno == EINTR) continue; bool was_interrupted = (bytes_read > 0); while (bytes_read == sizeof(data)) bytes_read = ::read(read_descriptor_, data, sizeof(data)); return was_interrupted; } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_EVENTFD) #endif // !defined(__SYMBIAN32__) #endif // !defined(__CYGWIN__) #endif // !defined(ASIO_WINDOWS) #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP asio-1.12.2/include/asio/detail/impl/posix_event.ipp000066400000000000000000000031601340672067200223750ustar00rootroot00000000000000// // detail/impl/posix_event.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_POSIX_EVENT_IPP #define ASIO_DETAIL_IMPL_POSIX_EVENT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include "asio/detail/posix_event.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { posix_event::posix_event() : state_(0) { #if (defined(__MACH__) && defined(__APPLE__)) \ || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) int error = ::pthread_cond_init(&cond_, 0); #else // (defined(__MACH__) && defined(__APPLE__)) // || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) ::pthread_condattr_t attr; ::pthread_condattr_init(&attr); int error = ::pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); if (error == 0) error = ::pthread_cond_init(&cond_, &attr); #endif // (defined(__MACH__) && defined(__APPLE__)) // || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) asio::error_code ec(error, asio::error::get_system_category()); asio::detail::throw_error(ec, "event"); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_IMPL_POSIX_EVENT_IPP asio-1.12.2/include/asio/detail/impl/posix_mutex.ipp000066400000000000000000000021231340672067200224140ustar00rootroot00000000000000// // detail/impl/posix_mutex.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_POSIX_MUTEX_IPP #define ASIO_DETAIL_IMPL_POSIX_MUTEX_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include "asio/detail/posix_mutex.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { posix_mutex::posix_mutex() { int error = ::pthread_mutex_init(&mutex_, 0); asio::error_code ec(error, asio::error::get_system_category()); asio::detail::throw_error(ec, "mutex"); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_IMPL_POSIX_MUTEX_IPP asio-1.12.2/include/asio/detail/impl/posix_thread.ipp000066400000000000000000000034401340672067200225240ustar00rootroot00000000000000// // detail/impl/posix_thread.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_POSIX_THREAD_IPP #define ASIO_DETAIL_IMPL_POSIX_THREAD_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include "asio/detail/posix_thread.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { posix_thread::~posix_thread() { if (!joined_) ::pthread_detach(thread_); } void posix_thread::join() { if (!joined_) { ::pthread_join(thread_, 0); joined_ = true; } } std::size_t posix_thread::hardware_concurrency() { #if defined(_SC_NPROCESSORS_ONLN) long result = sysconf(_SC_NPROCESSORS_ONLN); if (result > 0) return result; #endif // defined(_SC_NPROCESSORS_ONLN) return 0; } void posix_thread::start_thread(func_base* arg) { int error = ::pthread_create(&thread_, 0, asio_detail_posix_thread_function, arg); if (error != 0) { delete arg; asio::error_code ec(error, asio::error::get_system_category()); asio::detail::throw_error(ec, "thread"); } } void* asio_detail_posix_thread_function(void* arg) { posix_thread::auto_func_base_ptr func = { static_cast(arg) }; func.ptr->run(); return 0; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_IMPL_POSIX_THREAD_IPP asio-1.12.2/include/asio/detail/impl/posix_tss_ptr.ipp000066400000000000000000000021551340672067200227550ustar00rootroot00000000000000// // detail/impl/posix_tss_ptr.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_POSIX_TSS_PTR_IPP #define ASIO_DETAIL_IMPL_POSIX_TSS_PTR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include "asio/detail/posix_tss_ptr.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { void posix_tss_ptr_create(pthread_key_t& key) { int error = ::pthread_key_create(&key, 0); asio::error_code ec(error, asio::error::get_system_category()); asio::detail::throw_error(ec, "tss"); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_IMPL_POSIX_TSS_PTR_IPP asio-1.12.2/include/asio/detail/impl/reactive_descriptor_service.ipp000066400000000000000000000137161340672067200256220ustar00rootroot00000000000000// // detail/impl/reactive_descriptor_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP #define ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) #include "asio/error.hpp" #include "asio/detail/reactive_descriptor_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { reactive_descriptor_service::reactive_descriptor_service( asio::io_context& io_context) : service_base(io_context), reactor_(asio::use_service(io_context)) { reactor_.init_task(); } void reactive_descriptor_service::shutdown() { } void reactive_descriptor_service::construct( reactive_descriptor_service::implementation_type& impl) { impl.descriptor_ = -1; impl.state_ = 0; } void reactive_descriptor_service::move_construct( reactive_descriptor_service::implementation_type& impl, reactive_descriptor_service::implementation_type& other_impl) { impl.descriptor_ = other_impl.descriptor_; other_impl.descriptor_ = -1; impl.state_ = other_impl.state_; other_impl.state_ = 0; reactor_.move_descriptor(impl.descriptor_, impl.reactor_data_, other_impl.reactor_data_); } void reactive_descriptor_service::move_assign( reactive_descriptor_service::implementation_type& impl, reactive_descriptor_service& other_service, reactive_descriptor_service::implementation_type& other_impl) { destroy(impl); impl.descriptor_ = other_impl.descriptor_; other_impl.descriptor_ = -1; impl.state_ = other_impl.state_; other_impl.state_ = 0; other_service.reactor_.move_descriptor(impl.descriptor_, impl.reactor_data_, other_impl.reactor_data_); } void reactive_descriptor_service::destroy( reactive_descriptor_service::implementation_type& impl) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((reactor_.context(), "descriptor", &impl, impl.descriptor_, "close")); reactor_.deregister_descriptor(impl.descriptor_, impl.reactor_data_, (impl.state_ & descriptor_ops::possible_dup) == 0); asio::error_code ignored_ec; descriptor_ops::close(impl.descriptor_, impl.state_, ignored_ec); reactor_.cleanup_descriptor_data(impl.reactor_data_); } } asio::error_code reactive_descriptor_service::assign( reactive_descriptor_service::implementation_type& impl, const native_handle_type& native_descriptor, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } if (int err = reactor_.register_descriptor( native_descriptor, impl.reactor_data_)) { ec = asio::error_code(err, asio::error::get_system_category()); return ec; } impl.descriptor_ = native_descriptor; impl.state_ = descriptor_ops::possible_dup; ec = asio::error_code(); return ec; } asio::error_code reactive_descriptor_service::close( reactive_descriptor_service::implementation_type& impl, asio::error_code& ec) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((reactor_.context(), "descriptor", &impl, impl.descriptor_, "close")); reactor_.deregister_descriptor(impl.descriptor_, impl.reactor_data_, (impl.state_ & descriptor_ops::possible_dup) == 0); descriptor_ops::close(impl.descriptor_, impl.state_, ec); reactor_.cleanup_descriptor_data(impl.reactor_data_); } else { ec = asio::error_code(); } // The descriptor is closed by the OS even if close() returns an error. // // (Actually, POSIX says the state of the descriptor is unspecified. On // Linux the descriptor is apparently closed anyway; e.g. see // http://lkml.org/lkml/2005/9/10/129 // We'll just have to assume that other OSes follow the same behaviour.) construct(impl); return ec; } reactive_descriptor_service::native_handle_type reactive_descriptor_service::release( reactive_descriptor_service::implementation_type& impl) { native_handle_type descriptor = impl.descriptor_; if (is_open(impl)) { ASIO_HANDLER_OPERATION((reactor_.context(), "descriptor", &impl, impl.descriptor_, "release")); reactor_.deregister_descriptor(impl.descriptor_, impl.reactor_data_, false); reactor_.cleanup_descriptor_data(impl.reactor_data_); construct(impl); } return descriptor; } asio::error_code reactive_descriptor_service::cancel( reactive_descriptor_service::implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return ec; } ASIO_HANDLER_OPERATION((reactor_.context(), "descriptor", &impl, impl.descriptor_, "cancel")); reactor_.cancel_ops(impl.descriptor_, impl.reactor_data_); ec = asio::error_code(); return ec; } void reactive_descriptor_service::start_op( reactive_descriptor_service::implementation_type& impl, int op_type, reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop) { if (!noop) { if ((impl.state_ & descriptor_ops::non_blocking) || descriptor_ops::set_internal_non_blocking( impl.descriptor_, impl.state_, true, op->ec_)) { reactor_.start_op(op_type, impl.descriptor_, impl.reactor_data_, op, is_continuation, is_non_blocking); return; } } reactor_.post_immediate_completion(op, is_continuation); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) #endif // ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/reactive_serial_port_service.ipp000066400000000000000000000077731340672067200257750ustar00rootroot00000000000000// // detail/impl/reactive_serial_port_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP #define ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_SERIAL_PORT) #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include #include "asio/detail/reactive_serial_port_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { reactive_serial_port_service::reactive_serial_port_service( asio::io_context& io_context) : service_base(io_context), descriptor_service_(io_context) { } void reactive_serial_port_service::shutdown() { descriptor_service_.shutdown(); } asio::error_code reactive_serial_port_service::open( reactive_serial_port_service::implementation_type& impl, const std::string& device, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } descriptor_ops::state_type state = 0; int fd = descriptor_ops::open(device.c_str(), O_RDWR | O_NONBLOCK | O_NOCTTY, ec); if (fd < 0) return ec; int s = descriptor_ops::fcntl(fd, F_GETFL, ec); if (s >= 0) s = descriptor_ops::fcntl(fd, F_SETFL, s | O_NONBLOCK, ec); if (s < 0) { asio::error_code ignored_ec; descriptor_ops::close(fd, state, ignored_ec); return ec; } // Set up default serial port options. termios ios; errno = 0; s = descriptor_ops::error_wrapper(::tcgetattr(fd, &ios), ec); if (s >= 0) { #if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) ::cfmakeraw(&ios); #else ios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); ios.c_oflag &= ~OPOST; ios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); ios.c_cflag &= ~(CSIZE | PARENB); ios.c_cflag |= CS8; #endif ios.c_iflag |= IGNPAR; ios.c_cflag |= CREAD | CLOCAL; errno = 0; s = descriptor_ops::error_wrapper(::tcsetattr(fd, TCSANOW, &ios), ec); } if (s < 0) { asio::error_code ignored_ec; descriptor_ops::close(fd, state, ignored_ec); return ec; } // We're done. Take ownership of the serial port descriptor. if (descriptor_service_.assign(impl, fd, ec)) { asio::error_code ignored_ec; descriptor_ops::close(fd, state, ignored_ec); } return ec; } asio::error_code reactive_serial_port_service::do_set_option( reactive_serial_port_service::implementation_type& impl, reactive_serial_port_service::store_function_type store, const void* option, asio::error_code& ec) { termios ios; errno = 0; descriptor_ops::error_wrapper(::tcgetattr( descriptor_service_.native_handle(impl), &ios), ec); if (ec) return ec; if (store(option, ios, ec)) return ec; errno = 0; descriptor_ops::error_wrapper(::tcsetattr( descriptor_service_.native_handle(impl), TCSANOW, &ios), ec); return ec; } asio::error_code reactive_serial_port_service::do_get_option( const reactive_serial_port_service::implementation_type& impl, reactive_serial_port_service::load_function_type load, void* option, asio::error_code& ec) const { termios ios; errno = 0; descriptor_ops::error_wrapper(::tcgetattr( descriptor_service_.native_handle(impl), &ios), ec); if (ec) return ec; return load(option, ios, ec); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #endif // defined(ASIO_HAS_SERIAL_PORT) #endif // ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/reactive_socket_service_base.ipp000066400000000000000000000204141340672067200257170ustar00rootroot00000000000000// // detail/reactive_socket_service_base.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP #define ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_IOCP) \ && !defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/reactive_socket_service_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { reactive_socket_service_base::reactive_socket_service_base( asio::io_context& io_context) : io_context_(io_context), reactor_(use_service(io_context)) { reactor_.init_task(); } void reactive_socket_service_base::base_shutdown() { } void reactive_socket_service_base::construct( reactive_socket_service_base::base_implementation_type& impl) { impl.socket_ = invalid_socket; impl.state_ = 0; } void reactive_socket_service_base::base_move_construct( reactive_socket_service_base::base_implementation_type& impl, reactive_socket_service_base::base_implementation_type& other_impl) { impl.socket_ = other_impl.socket_; other_impl.socket_ = invalid_socket; impl.state_ = other_impl.state_; other_impl.state_ = 0; reactor_.move_descriptor(impl.socket_, impl.reactor_data_, other_impl.reactor_data_); } void reactive_socket_service_base::base_move_assign( reactive_socket_service_base::base_implementation_type& impl, reactive_socket_service_base& other_service, reactive_socket_service_base::base_implementation_type& other_impl) { destroy(impl); impl.socket_ = other_impl.socket_; other_impl.socket_ = invalid_socket; impl.state_ = other_impl.state_; other_impl.state_ = 0; other_service.reactor_.move_descriptor(impl.socket_, impl.reactor_data_, other_impl.reactor_data_); } void reactive_socket_service_base::destroy( reactive_socket_service_base::base_implementation_type& impl) { if (impl.socket_ != invalid_socket) { ASIO_HANDLER_OPERATION((reactor_.context(), "socket", &impl, impl.socket_, "close")); reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, (impl.state_ & socket_ops::possible_dup) == 0); asio::error_code ignored_ec; socket_ops::close(impl.socket_, impl.state_, true, ignored_ec); reactor_.cleanup_descriptor_data(impl.reactor_data_); } } asio::error_code reactive_socket_service_base::close( reactive_socket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((reactor_.context(), "socket", &impl, impl.socket_, "close")); reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, (impl.state_ & socket_ops::possible_dup) == 0); socket_ops::close(impl.socket_, impl.state_, false, ec); reactor_.cleanup_descriptor_data(impl.reactor_data_); } else { ec = asio::error_code(); } // The descriptor is closed by the OS even if close() returns an error. // // (Actually, POSIX says the state of the descriptor is unspecified. On // Linux the descriptor is apparently closed anyway; e.g. see // http://lkml.org/lkml/2005/9/10/129 // We'll just have to assume that other OSes follow the same behaviour. The // known exception is when Windows's closesocket() function fails with // WSAEWOULDBLOCK, but this case is handled inside socket_ops::close(). construct(impl); return ec; } socket_type reactive_socket_service_base::release( reactive_socket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return invalid_socket; } ASIO_HANDLER_OPERATION((reactor_.context(), "socket", &impl, impl.socket_, "release")); reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, false); reactor_.cleanup_descriptor_data(impl.reactor_data_); socket_type sock = impl.socket_; construct(impl); ec = asio::error_code(); return sock; } asio::error_code reactive_socket_service_base::cancel( reactive_socket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return ec; } ASIO_HANDLER_OPERATION((reactor_.context(), "socket", &impl, impl.socket_, "cancel")); reactor_.cancel_ops(impl.socket_, impl.reactor_data_); ec = asio::error_code(); return ec; } asio::error_code reactive_socket_service_base::do_open( reactive_socket_service_base::base_implementation_type& impl, int af, int type, int protocol, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } socket_holder sock(socket_ops::socket(af, type, protocol, ec)); if (sock.get() == invalid_socket) return ec; if (int err = reactor_.register_descriptor(sock.get(), impl.reactor_data_)) { ec = asio::error_code(err, asio::error::get_system_category()); return ec; } impl.socket_ = sock.release(); switch (type) { case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; default: impl.state_ = 0; break; } ec = asio::error_code(); return ec; } asio::error_code reactive_socket_service_base::do_assign( reactive_socket_service_base::base_implementation_type& impl, int type, const reactive_socket_service_base::native_handle_type& native_socket, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } if (int err = reactor_.register_descriptor( native_socket, impl.reactor_data_)) { ec = asio::error_code(err, asio::error::get_system_category()); return ec; } impl.socket_ = native_socket; switch (type) { case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; default: impl.state_ = 0; break; } impl.state_ |= socket_ops::possible_dup; ec = asio::error_code(); return ec; } void reactive_socket_service_base::start_op( reactive_socket_service_base::base_implementation_type& impl, int op_type, reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop) { if (!noop) { if ((impl.state_ & socket_ops::non_blocking) || socket_ops::set_internal_non_blocking( impl.socket_, impl.state_, true, op->ec_)) { reactor_.start_op(op_type, impl.socket_, impl.reactor_data_, op, is_continuation, is_non_blocking); return; } } reactor_.post_immediate_completion(op, is_continuation); } void reactive_socket_service_base::start_accept_op( reactive_socket_service_base::base_implementation_type& impl, reactor_op* op, bool is_continuation, bool peer_is_open) { if (!peer_is_open) start_op(impl, reactor::read_op, op, is_continuation, true, false); else { op->ec_ = asio::error::already_open; reactor_.post_immediate_completion(op, is_continuation); } } void reactive_socket_service_base::start_connect_op( reactive_socket_service_base::base_implementation_type& impl, reactor_op* op, bool is_continuation, const socket_addr_type* addr, size_t addrlen) { if ((impl.state_ & socket_ops::non_blocking) || socket_ops::set_internal_non_blocking( impl.socket_, impl.state_, true, op->ec_)) { if (socket_ops::connect(impl.socket_, addr, addrlen, op->ec_) != 0) { if (op->ec_ == asio::error::in_progress || op->ec_ == asio::error::would_block) { op->ec_ = asio::error_code(); reactor_.start_op(reactor::connect_op, impl.socket_, impl.reactor_data_, op, is_continuation, false); return; } } } reactor_.post_immediate_completion(op, is_continuation); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_IOCP) // && !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP asio-1.12.2/include/asio/detail/impl/resolver_service_base.ipp000066400000000000000000000074231340672067200244130ustar00rootroot00000000000000// // detail/impl/resolver_service_base.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP #define ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/resolver_service_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class resolver_service_base::work_io_context_runner { public: work_io_context_runner(asio::io_context& io_context) : io_context_(io_context) {} void operator()() { io_context_.run(); } private: asio::io_context& io_context_; }; resolver_service_base::resolver_service_base( asio::io_context& io_context) : io_context_impl_(asio::use_service(io_context)), work_io_context_(new asio::io_context(-1)), work_io_context_impl_(asio::use_service< io_context_impl>(*work_io_context_)), work_(asio::make_work_guard(*work_io_context_)), work_thread_(0) { } resolver_service_base::~resolver_service_base() { base_shutdown(); } void resolver_service_base::base_shutdown() { work_.reset(); if (work_io_context_.get()) { work_io_context_->stop(); if (work_thread_.get()) { work_thread_->join(); work_thread_.reset(); } work_io_context_.reset(); } } void resolver_service_base::base_notify_fork( asio::io_context::fork_event fork_ev) { if (work_thread_.get()) { if (fork_ev == asio::io_context::fork_prepare) { work_io_context_->stop(); work_thread_->join(); } else { work_io_context_->restart(); work_thread_.reset(new asio::detail::thread( work_io_context_runner(*work_io_context_))); } } } void resolver_service_base::construct( resolver_service_base::implementation_type& impl) { impl.reset(static_cast(0), socket_ops::noop_deleter()); } void resolver_service_base::destroy( resolver_service_base::implementation_type& impl) { ASIO_HANDLER_OPERATION((io_context_impl_.context(), "resolver", &impl, 0, "cancel")); impl.reset(); } void resolver_service_base::move_construct(implementation_type& impl, implementation_type& other_impl) { impl = ASIO_MOVE_CAST(implementation_type)(other_impl); } void resolver_service_base::move_assign(implementation_type& impl, resolver_service_base&, implementation_type& other_impl) { destroy(impl); impl = ASIO_MOVE_CAST(implementation_type)(other_impl); } void resolver_service_base::cancel( resolver_service_base::implementation_type& impl) { ASIO_HANDLER_OPERATION((io_context_impl_.context(), "resolver", &impl, 0, "cancel")); impl.reset(static_cast(0), socket_ops::noop_deleter()); } void resolver_service_base::start_resolve_op(resolve_op* op) { if (ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER, io_context_impl_.concurrency_hint())) { start_work_thread(); io_context_impl_.work_started(); work_io_context_impl_.post_immediate_completion(op, false); } else { op->ec_ = asio::error::operation_not_supported; io_context_impl_.post_immediate_completion(op, false); } } void resolver_service_base::start_work_thread() { asio::detail::mutex::scoped_lock lock(mutex_); if (!work_thread_.get()) { work_thread_.reset(new asio::detail::thread( work_io_context_runner(*work_io_context_))); } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP asio-1.12.2/include/asio/detail/impl/scheduler.ipp000066400000000000000000000324751340672067200220230ustar00rootroot00000000000000// // detail/impl/scheduler.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SCHEDULER_IPP #define ASIO_DETAIL_IMPL_SCHEDULER_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/concurrency_hint.hpp" #include "asio/detail/event.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/reactor.hpp" #include "asio/detail/scheduler.hpp" #include "asio/detail/scheduler_thread_info.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct scheduler::task_cleanup { ~task_cleanup() { if (this_thread_->private_outstanding_work > 0) { asio::detail::increment( scheduler_->outstanding_work_, this_thread_->private_outstanding_work); } this_thread_->private_outstanding_work = 0; // Enqueue the completed operations and reinsert the task at the end of // the operation queue. lock_->lock(); scheduler_->task_interrupted_ = true; scheduler_->op_queue_.push(this_thread_->private_op_queue); scheduler_->op_queue_.push(&scheduler_->task_operation_); } scheduler* scheduler_; mutex::scoped_lock* lock_; thread_info* this_thread_; }; struct scheduler::work_cleanup { ~work_cleanup() { if (this_thread_->private_outstanding_work > 1) { asio::detail::increment( scheduler_->outstanding_work_, this_thread_->private_outstanding_work - 1); } else if (this_thread_->private_outstanding_work < 1) { scheduler_->work_finished(); } this_thread_->private_outstanding_work = 0; #if defined(ASIO_HAS_THREADS) if (!this_thread_->private_op_queue.empty()) { lock_->lock(); scheduler_->op_queue_.push(this_thread_->private_op_queue); } #endif // defined(ASIO_HAS_THREADS) } scheduler* scheduler_; mutex::scoped_lock* lock_; thread_info* this_thread_; }; scheduler::scheduler( asio::execution_context& ctx, int concurrency_hint) : asio::detail::execution_context_service_base(ctx), one_thread_(concurrency_hint == 1 || !ASIO_CONCURRENCY_HINT_IS_LOCKING( SCHEDULER, concurrency_hint) || !ASIO_CONCURRENCY_HINT_IS_LOCKING( REACTOR_IO, concurrency_hint)), mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING( SCHEDULER, concurrency_hint)), task_(0), task_interrupted_(true), outstanding_work_(0), stopped_(false), shutdown_(false), concurrency_hint_(concurrency_hint) { ASIO_HANDLER_TRACKING_INIT; } void scheduler::shutdown() { mutex::scoped_lock lock(mutex_); shutdown_ = true; lock.unlock(); // Destroy handler objects. while (!op_queue_.empty()) { operation* o = op_queue_.front(); op_queue_.pop(); if (o != &task_operation_) o->destroy(); } // Reset to initial state. task_ = 0; } void scheduler::init_task() { mutex::scoped_lock lock(mutex_); if (!shutdown_ && !task_) { task_ = &use_service(this->context()); op_queue_.push(&task_operation_); wake_one_thread_and_unlock(lock); } } std::size_t scheduler::run(asio::error_code& ec) { ec = asio::error_code(); if (outstanding_work_ == 0) { stop(); return 0; } thread_info this_thread; this_thread.private_outstanding_work = 0; thread_call_stack::context ctx(this, this_thread); mutex::scoped_lock lock(mutex_); std::size_t n = 0; for (; do_run_one(lock, this_thread, ec); lock.lock()) if (n != (std::numeric_limits::max)()) ++n; return n; } std::size_t scheduler::run_one(asio::error_code& ec) { ec = asio::error_code(); if (outstanding_work_ == 0) { stop(); return 0; } thread_info this_thread; this_thread.private_outstanding_work = 0; thread_call_stack::context ctx(this, this_thread); mutex::scoped_lock lock(mutex_); return do_run_one(lock, this_thread, ec); } std::size_t scheduler::wait_one(long usec, asio::error_code& ec) { ec = asio::error_code(); if (outstanding_work_ == 0) { stop(); return 0; } thread_info this_thread; this_thread.private_outstanding_work = 0; thread_call_stack::context ctx(this, this_thread); mutex::scoped_lock lock(mutex_); return do_wait_one(lock, this_thread, usec, ec); } std::size_t scheduler::poll(asio::error_code& ec) { ec = asio::error_code(); if (outstanding_work_ == 0) { stop(); return 0; } thread_info this_thread; this_thread.private_outstanding_work = 0; thread_call_stack::context ctx(this, this_thread); mutex::scoped_lock lock(mutex_); #if defined(ASIO_HAS_THREADS) // We want to support nested calls to poll() and poll_one(), so any handlers // that are already on a thread-private queue need to be put on to the main // queue now. if (one_thread_) if (thread_info* outer_info = static_cast(ctx.next_by_key())) op_queue_.push(outer_info->private_op_queue); #endif // defined(ASIO_HAS_THREADS) std::size_t n = 0; for (; do_poll_one(lock, this_thread, ec); lock.lock()) if (n != (std::numeric_limits::max)()) ++n; return n; } std::size_t scheduler::poll_one(asio::error_code& ec) { ec = asio::error_code(); if (outstanding_work_ == 0) { stop(); return 0; } thread_info this_thread; this_thread.private_outstanding_work = 0; thread_call_stack::context ctx(this, this_thread); mutex::scoped_lock lock(mutex_); #if defined(ASIO_HAS_THREADS) // We want to support nested calls to poll() and poll_one(), so any handlers // that are already on a thread-private queue need to be put on to the main // queue now. if (one_thread_) if (thread_info* outer_info = static_cast(ctx.next_by_key())) op_queue_.push(outer_info->private_op_queue); #endif // defined(ASIO_HAS_THREADS) return do_poll_one(lock, this_thread, ec); } void scheduler::stop() { mutex::scoped_lock lock(mutex_); stop_all_threads(lock); } bool scheduler::stopped() const { mutex::scoped_lock lock(mutex_); return stopped_; } void scheduler::restart() { mutex::scoped_lock lock(mutex_); stopped_ = false; } void scheduler::compensating_work_started() { thread_info_base* this_thread = thread_call_stack::contains(this); ++static_cast(this_thread)->private_outstanding_work; } void scheduler::post_immediate_completion( scheduler::operation* op, bool is_continuation) { #if defined(ASIO_HAS_THREADS) if (one_thread_ || is_continuation) { if (thread_info_base* this_thread = thread_call_stack::contains(this)) { ++static_cast(this_thread)->private_outstanding_work; static_cast(this_thread)->private_op_queue.push(op); return; } } #else // defined(ASIO_HAS_THREADS) (void)is_continuation; #endif // defined(ASIO_HAS_THREADS) work_started(); mutex::scoped_lock lock(mutex_); op_queue_.push(op); wake_one_thread_and_unlock(lock); } void scheduler::post_deferred_completion(scheduler::operation* op) { #if defined(ASIO_HAS_THREADS) if (one_thread_) { if (thread_info_base* this_thread = thread_call_stack::contains(this)) { static_cast(this_thread)->private_op_queue.push(op); return; } } #endif // defined(ASIO_HAS_THREADS) mutex::scoped_lock lock(mutex_); op_queue_.push(op); wake_one_thread_and_unlock(lock); } void scheduler::post_deferred_completions( op_queue& ops) { if (!ops.empty()) { #if defined(ASIO_HAS_THREADS) if (one_thread_) { if (thread_info_base* this_thread = thread_call_stack::contains(this)) { static_cast(this_thread)->private_op_queue.push(ops); return; } } #endif // defined(ASIO_HAS_THREADS) mutex::scoped_lock lock(mutex_); op_queue_.push(ops); wake_one_thread_and_unlock(lock); } } void scheduler::do_dispatch( scheduler::operation* op) { work_started(); mutex::scoped_lock lock(mutex_); op_queue_.push(op); wake_one_thread_and_unlock(lock); } void scheduler::abandon_operations( op_queue& ops) { op_queue ops2; ops2.push(ops); } std::size_t scheduler::do_run_one(mutex::scoped_lock& lock, scheduler::thread_info& this_thread, const asio::error_code& ec) { while (!stopped_) { if (!op_queue_.empty()) { // Prepare to execute first handler from queue. operation* o = op_queue_.front(); op_queue_.pop(); bool more_handlers = (!op_queue_.empty()); if (o == &task_operation_) { task_interrupted_ = more_handlers; if (more_handlers && !one_thread_) wakeup_event_.unlock_and_signal_one(lock); else lock.unlock(); task_cleanup on_exit = { this, &lock, &this_thread }; (void)on_exit; // Run the task. May throw an exception. Only block if the operation // queue is empty and we're not polling, otherwise we want to return // as soon as possible. task_->run(more_handlers ? 0 : -1, this_thread.private_op_queue); } else { std::size_t task_result = o->task_result_; if (more_handlers && !one_thread_) wake_one_thread_and_unlock(lock); else lock.unlock(); // Ensure the count of outstanding work is decremented on block exit. work_cleanup on_exit = { this, &lock, &this_thread }; (void)on_exit; // Complete the operation. May throw an exception. Deletes the object. o->complete(this, ec, task_result); return 1; } } else { wakeup_event_.clear(lock); wakeup_event_.wait(lock); } } return 0; } std::size_t scheduler::do_wait_one(mutex::scoped_lock& lock, scheduler::thread_info& this_thread, long usec, const asio::error_code& ec) { if (stopped_) return 0; operation* o = op_queue_.front(); if (o == 0) { wakeup_event_.clear(lock); wakeup_event_.wait_for_usec(lock, usec); usec = 0; // Wait at most once. o = op_queue_.front(); } if (o == &task_operation_) { op_queue_.pop(); bool more_handlers = (!op_queue_.empty()); task_interrupted_ = more_handlers; if (more_handlers && !one_thread_) wakeup_event_.unlock_and_signal_one(lock); else lock.unlock(); { task_cleanup on_exit = { this, &lock, &this_thread }; (void)on_exit; // Run the task. May throw an exception. Only block if the operation // queue is empty and we're not polling, otherwise we want to return // as soon as possible. task_->run(more_handlers ? 0 : usec, this_thread.private_op_queue); } o = op_queue_.front(); if (o == &task_operation_) { if (!one_thread_) wakeup_event_.maybe_unlock_and_signal_one(lock); return 0; } } if (o == 0) return 0; op_queue_.pop(); bool more_handlers = (!op_queue_.empty()); std::size_t task_result = o->task_result_; if (more_handlers && !one_thread_) wake_one_thread_and_unlock(lock); else lock.unlock(); // Ensure the count of outstanding work is decremented on block exit. work_cleanup on_exit = { this, &lock, &this_thread }; (void)on_exit; // Complete the operation. May throw an exception. Deletes the object. o->complete(this, ec, task_result); return 1; } std::size_t scheduler::do_poll_one(mutex::scoped_lock& lock, scheduler::thread_info& this_thread, const asio::error_code& ec) { if (stopped_) return 0; operation* o = op_queue_.front(); if (o == &task_operation_) { op_queue_.pop(); lock.unlock(); { task_cleanup c = { this, &lock, &this_thread }; (void)c; // Run the task. May throw an exception. Only block if the operation // queue is empty and we're not polling, otherwise we want to return // as soon as possible. task_->run(0, this_thread.private_op_queue); } o = op_queue_.front(); if (o == &task_operation_) { wakeup_event_.maybe_unlock_and_signal_one(lock); return 0; } } if (o == 0) return 0; op_queue_.pop(); bool more_handlers = (!op_queue_.empty()); std::size_t task_result = o->task_result_; if (more_handlers && !one_thread_) wake_one_thread_and_unlock(lock); else lock.unlock(); // Ensure the count of outstanding work is decremented on block exit. work_cleanup on_exit = { this, &lock, &this_thread }; (void)on_exit; // Complete the operation. May throw an exception. Deletes the object. o->complete(this, ec, task_result); return 1; } void scheduler::stop_all_threads( mutex::scoped_lock& lock) { stopped_ = true; wakeup_event_.signal_all(lock); if (!task_interrupted_ && task_) { task_interrupted_ = true; task_->interrupt(); } } void scheduler::wake_one_thread_and_unlock( mutex::scoped_lock& lock) { if (!wakeup_event_.maybe_unlock_and_signal_one(lock)) { if (!task_interrupted_ && task_) { task_interrupted_ = true; task_->interrupt(); } lock.unlock(); } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_SCHEDULER_IPP asio-1.12.2/include/asio/detail/impl/select_reactor.hpp000066400000000000000000000054151340672067200230340ustar00rootroot00000000000000// // detail/impl/select_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP #define ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) \ || (!defined(ASIO_HAS_DEV_POLL) \ && !defined(ASIO_HAS_EPOLL) \ && !defined(ASIO_HAS_KQUEUE) \ && !defined(ASIO_WINDOWS_RUNTIME)) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template void select_reactor::add_timer_queue(timer_queue& queue) { do_add_timer_queue(queue); } // Remove a timer queue from the reactor. template void select_reactor::remove_timer_queue(timer_queue& queue) { do_remove_timer_queue(queue); } template void select_reactor::schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op) { asio::detail::mutex::scoped_lock lock(mutex_); if (shutdown_) { scheduler_.post_immediate_completion(op, false); return; } bool earliest = queue.enqueue_timer(time, timer, op); scheduler_.work_started(); if (earliest) interrupter_.interrupt(); } template std::size_t select_reactor::cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); lock.unlock(); scheduler_.post_deferred_completions(ops); return n; } template void select_reactor::move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; queue.cancel_timer(target, ops); queue.move_timer(target, source); lock.unlock(); scheduler_.post_deferred_completions(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) // || (!defined(ASIO_HAS_DEV_POLL) // && !defined(ASIO_HAS_EPOLL) // && !defined(ASIO_HAS_KQUEUE) // && !defined(ASIO_WINDOWS_RUNTIME)) #endif // ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP asio-1.12.2/include/asio/detail/impl/select_reactor.ipp000066400000000000000000000212601340672067200230310ustar00rootroot00000000000000// // detail/impl/select_reactor.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP #define ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) \ || (!defined(ASIO_HAS_DEV_POLL) \ && !defined(ASIO_HAS_EPOLL) \ && !defined(ASIO_HAS_KQUEUE) \ && !defined(ASIO_WINDOWS_RUNTIME)) #include "asio/detail/fd_set_adapter.hpp" #include "asio/detail/select_reactor.hpp" #include "asio/detail/signal_blocker.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { #if defined(ASIO_HAS_IOCP) class select_reactor::thread_function { public: explicit thread_function(select_reactor* r) : this_(r) { } void operator()() { this_->run_thread(); } private: select_reactor* this_; }; #endif // defined(ASIO_HAS_IOCP) select_reactor::select_reactor(asio::execution_context& ctx) : execution_context_service_base(ctx), scheduler_(use_service(ctx)), mutex_(), interrupter_(), #if defined(ASIO_HAS_IOCP) stop_thread_(false), thread_(0), #endif // defined(ASIO_HAS_IOCP) shutdown_(false) { #if defined(ASIO_HAS_IOCP) asio::detail::signal_blocker sb; thread_ = new asio::detail::thread(thread_function(this)); #endif // defined(ASIO_HAS_IOCP) } select_reactor::~select_reactor() { shutdown(); } void select_reactor::shutdown() { asio::detail::mutex::scoped_lock lock(mutex_); shutdown_ = true; #if defined(ASIO_HAS_IOCP) stop_thread_ = true; #endif // defined(ASIO_HAS_IOCP) lock.unlock(); #if defined(ASIO_HAS_IOCP) if (thread_) { interrupter_.interrupt(); thread_->join(); delete thread_; thread_ = 0; } #endif // defined(ASIO_HAS_IOCP) op_queue ops; for (int i = 0; i < max_ops; ++i) op_queue_[i].get_all_operations(ops); timer_queues_.get_all_timers(ops); scheduler_.abandon_operations(ops); } void select_reactor::notify_fork( asio::execution_context::fork_event fork_ev) { if (fork_ev == asio::execution_context::fork_child) interrupter_.recreate(); } void select_reactor::init_task() { scheduler_.init_task(); } int select_reactor::register_descriptor(socket_type, select_reactor::per_descriptor_data&) { return 0; } int select_reactor::register_internal_descriptor( int op_type, socket_type descriptor, select_reactor::per_descriptor_data&, reactor_op* op) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue_[op_type].enqueue_operation(descriptor, op); interrupter_.interrupt(); return 0; } void select_reactor::move_descriptor(socket_type, select_reactor::per_descriptor_data&, select_reactor::per_descriptor_data&) { } void select_reactor::start_op(int op_type, socket_type descriptor, select_reactor::per_descriptor_data&, reactor_op* op, bool is_continuation, bool) { asio::detail::mutex::scoped_lock lock(mutex_); if (shutdown_) { post_immediate_completion(op, is_continuation); return; } bool first = op_queue_[op_type].enqueue_operation(descriptor, op); scheduler_.work_started(); if (first) interrupter_.interrupt(); } void select_reactor::cancel_ops(socket_type descriptor, select_reactor::per_descriptor_data&) { asio::detail::mutex::scoped_lock lock(mutex_); cancel_ops_unlocked(descriptor, asio::error::operation_aborted); } void select_reactor::deregister_descriptor(socket_type descriptor, select_reactor::per_descriptor_data&, bool) { asio::detail::mutex::scoped_lock lock(mutex_); cancel_ops_unlocked(descriptor, asio::error::operation_aborted); } void select_reactor::deregister_internal_descriptor( socket_type descriptor, select_reactor::per_descriptor_data&) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; for (int i = 0; i < max_ops; ++i) op_queue_[i].cancel_operations(descriptor, ops); } void select_reactor::cleanup_descriptor_data( select_reactor::per_descriptor_data&) { } void select_reactor::run(long usec, op_queue& ops) { asio::detail::mutex::scoped_lock lock(mutex_); #if defined(ASIO_HAS_IOCP) // Check if the thread is supposed to stop. if (stop_thread_) return; #endif // defined(ASIO_HAS_IOCP) // Set up the descriptor sets. for (int i = 0; i < max_select_ops; ++i) fd_sets_[i].reset(); fd_sets_[read_op].set(interrupter_.read_descriptor()); socket_type max_fd = 0; bool have_work_to_do = !timer_queues_.all_empty(); for (int i = 0; i < max_select_ops; ++i) { have_work_to_do = have_work_to_do || !op_queue_[i].empty(); fd_sets_[i].set(op_queue_[i], ops); if (fd_sets_[i].max_descriptor() > max_fd) max_fd = fd_sets_[i].max_descriptor(); } #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Connection operations on Windows use both except and write fd_sets. have_work_to_do = have_work_to_do || !op_queue_[connect_op].empty(); fd_sets_[write_op].set(op_queue_[connect_op], ops); if (fd_sets_[write_op].max_descriptor() > max_fd) max_fd = fd_sets_[write_op].max_descriptor(); fd_sets_[except_op].set(op_queue_[connect_op], ops); if (fd_sets_[except_op].max_descriptor() > max_fd) max_fd = fd_sets_[except_op].max_descriptor(); #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // We can return immediately if there's no work to do and the reactor is // not supposed to block. if (!usec && !have_work_to_do) return; // Determine how long to block while waiting for events. timeval tv_buf = { 0, 0 }; timeval* tv = usec ? get_timeout(usec, tv_buf) : &tv_buf; lock.unlock(); // Block on the select call until descriptors become ready. asio::error_code ec; int retval = socket_ops::select(static_cast(max_fd + 1), fd_sets_[read_op], fd_sets_[write_op], fd_sets_[except_op], tv, ec); // Reset the interrupter. if (retval > 0 && fd_sets_[read_op].is_set(interrupter_.read_descriptor())) { interrupter_.reset(); --retval; } lock.lock(); // Dispatch all ready operations. if (retval > 0) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Connection operations on Windows use both except and write fd_sets. fd_sets_[except_op].perform(op_queue_[connect_op], ops); fd_sets_[write_op].perform(op_queue_[connect_op], ops); #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Exception operations must be processed first to ensure that any // out-of-band data is read before normal data. for (int i = max_select_ops - 1; i >= 0; --i) fd_sets_[i].perform(op_queue_[i], ops); } timer_queues_.get_ready_timers(ops); } void select_reactor::interrupt() { interrupter_.interrupt(); } #if defined(ASIO_HAS_IOCP) void select_reactor::run_thread() { asio::detail::mutex::scoped_lock lock(mutex_); while (!stop_thread_) { lock.unlock(); op_queue ops; run(true, ops); scheduler_.post_deferred_completions(ops); lock.lock(); } } #endif // defined(ASIO_HAS_IOCP) void select_reactor::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.insert(&queue); } void select_reactor::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.erase(&queue); } timeval* select_reactor::get_timeout(long usec, timeval& tv) { // By default we will wait no longer than 5 minutes. This will ensure that // any changes to the system clock are detected after no longer than this. const long max_usec = 5 * 60 * 1000 * 1000; usec = timer_queues_.wait_duration_usec( (usec < 0 || max_usec < usec) ? max_usec : usec); tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; return &tv; } void select_reactor::cancel_ops_unlocked(socket_type descriptor, const asio::error_code& ec) { bool need_interrupt = false; op_queue ops; for (int i = 0; i < max_ops; ++i) need_interrupt = op_queue_[i].cancel_operations( descriptor, ops, ec) || need_interrupt; scheduler_.post_deferred_completions(ops); if (need_interrupt) interrupter_.interrupt(); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) // || (!defined(ASIO_HAS_DEV_POLL) // && !defined(ASIO_HAS_EPOLL) // && !defined(ASIO_HAS_KQUEUE)) // && !defined(ASIO_WINDOWS_RUNTIME)) #endif // ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP asio-1.12.2/include/asio/detail/impl/service_registry.hpp000066400000000000000000000050131340672067200234200ustar00rootroot00000000000000// // detail/impl/service_registry.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP #define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template Service& service_registry::use_service() { execution_context::service::key key; init_key(key, 0); factory_type factory = &service_registry::create; return *static_cast(do_use_service(key, factory, &owner_)); } template Service& service_registry::use_service(io_context& owner) { execution_context::service::key key; init_key(key, 0); factory_type factory = &service_registry::create; return *static_cast(do_use_service(key, factory, &owner)); } template void service_registry::add_service(Service* new_service) { execution_context::service::key key; init_key(key, 0); return do_add_service(key, new_service); } template bool service_registry::has_service() const { execution_context::service::key key; init_key(key, 0); return do_has_service(key); } template inline void service_registry::init_key( execution_context::service::key& key, ...) { init_key_from_id(key, Service::id); } #if !defined(ASIO_NO_TYPEID) template void service_registry::init_key(execution_context::service::key& key, typename enable_if< is_base_of::value>::type*) { key.type_info_ = &typeid(typeid_wrapper); key.id_ = 0; } template void service_registry::init_key_from_id(execution_context::service::key& key, const service_id& /*id*/) { key.type_info_ = &typeid(typeid_wrapper); key.id_ = 0; } #endif // !defined(ASIO_NO_TYPEID) template execution_context::service* service_registry::create(void* owner) { return new Service(*static_cast(owner)); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP asio-1.12.2/include/asio/detail/impl/service_registry.ipp000066400000000000000000000123251340672067200234250ustar00rootroot00000000000000// // detail/impl/service_registry.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP #define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/service_registry.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { service_registry::service_registry(execution_context& owner) : owner_(owner), first_service_(0) { } service_registry::~service_registry() { } void service_registry::shutdown_services() { execution_context::service* service = first_service_; while (service) { service->shutdown(); service = service->next_; } } void service_registry::destroy_services() { while (first_service_) { execution_context::service* next_service = first_service_->next_; destroy(first_service_); first_service_ = next_service; } } void service_registry::notify_fork(execution_context::fork_event fork_ev) { // Make a copy of all of the services while holding the lock. We don't want // to hold the lock while calling into each service, as it may try to call // back into this class. std::vector services; { asio::detail::mutex::scoped_lock lock(mutex_); execution_context::service* service = first_service_; while (service) { services.push_back(service); service = service->next_; } } // If processing the fork_prepare event, we want to go in reverse order of // service registration, which happens to be the existing order of the // services in the vector. For the other events we want to go in the other // direction. std::size_t num_services = services.size(); if (fork_ev == execution_context::fork_prepare) for (std::size_t i = 0; i < num_services; ++i) services[i]->notify_fork(fork_ev); else for (std::size_t i = num_services; i > 0; --i) services[i - 1]->notify_fork(fork_ev); } void service_registry::init_key_from_id(execution_context::service::key& key, const execution_context::id& id) { key.type_info_ = 0; key.id_ = &id; } bool service_registry::keys_match( const execution_context::service::key& key1, const execution_context::service::key& key2) { if (key1.id_ && key2.id_) if (key1.id_ == key2.id_) return true; if (key1.type_info_ && key2.type_info_) if (*key1.type_info_ == *key2.type_info_) return true; return false; } void service_registry::destroy(execution_context::service* service) { delete service; } execution_context::service* service_registry::do_use_service( const execution_context::service::key& key, factory_type factory, void* owner) { asio::detail::mutex::scoped_lock lock(mutex_); // First see if there is an existing service object with the given key. execution_context::service* service = first_service_; while (service) { if (keys_match(service->key_, key)) return service; service = service->next_; } // Create a new service object. The service registry's mutex is not locked // at this time to allow for nested calls into this function from the new // service's constructor. lock.unlock(); auto_service_ptr new_service = { factory(owner) }; new_service.ptr_->key_ = key; lock.lock(); // Check that nobody else created another service object of the same type // while the lock was released. service = first_service_; while (service) { if (keys_match(service->key_, key)) return service; service = service->next_; } // Service was successfully initialised, pass ownership to registry. new_service.ptr_->next_ = first_service_; first_service_ = new_service.ptr_; new_service.ptr_ = 0; return first_service_; } void service_registry::do_add_service( const execution_context::service::key& key, execution_context::service* new_service) { if (&owner_ != &new_service->context()) asio::detail::throw_exception(invalid_service_owner()); asio::detail::mutex::scoped_lock lock(mutex_); // Check if there is an existing service object with the given key. execution_context::service* service = first_service_; while (service) { if (keys_match(service->key_, key)) asio::detail::throw_exception(service_already_exists()); service = service->next_; } // Take ownership of the service object. new_service->key_ = key; new_service->next_ = first_service_; first_service_ = new_service; } bool service_registry::do_has_service( const execution_context::service::key& key) const { asio::detail::mutex::scoped_lock lock(mutex_); execution_context::service* service = first_service_; while (service) { if (keys_match(service->key_, key)) return true; service = service->next_; } return false; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP asio-1.12.2/include/asio/detail/impl/signal_set_service.ipp000066400000000000000000000457771340672067200237260ustar00rootroot00000000000000// // detail/impl/signal_set_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP #define ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/detail/reactor.hpp" #include "asio/detail/signal_blocker.hpp" #include "asio/detail/signal_set_service.hpp" #include "asio/detail/static_mutex.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct signal_state { // Mutex used for protecting global state. static_mutex mutex_; // The read end of the pipe used for signal notifications. int read_descriptor_; // The write end of the pipe used for signal notifications. int write_descriptor_; // Whether the signal state has been prepared for a fork. bool fork_prepared_; // The head of a linked list of all signal_set_service instances. class signal_set_service* service_list_; // A count of the number of objects that are registered for each signal. std::size_t registration_count_[max_signal_number]; }; signal_state* get_signal_state() { static signal_state state = { ASIO_STATIC_MUTEX_INIT, -1, -1, false, 0, { 0 } }; return &state; } void asio_signal_handler(int signal_number) { #if defined(ASIO_WINDOWS) \ || defined(ASIO_WINDOWS_RUNTIME) \ || defined(__CYGWIN__) signal_set_service::deliver_signal(signal_number); #else // defined(ASIO_WINDOWS) // || defined(ASIO_WINDOWS_RUNTIME) // || defined(__CYGWIN__) int saved_errno = errno; signal_state* state = get_signal_state(); signed_size_type result = ::write(state->write_descriptor_, &signal_number, sizeof(signal_number)); (void)result; errno = saved_errno; #endif // defined(ASIO_WINDOWS) // || defined(ASIO_WINDOWS_RUNTIME) // || defined(__CYGWIN__) #if defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION) ::signal(signal_number, asio_signal_handler); #endif // defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION) } #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) class signal_set_service::pipe_read_op : public reactor_op { public: pipe_read_op() : reactor_op(&pipe_read_op::do_perform, pipe_read_op::do_complete) { } static status do_perform(reactor_op*) { signal_state* state = get_signal_state(); int fd = state->read_descriptor_; int signal_number = 0; while (::read(fd, &signal_number, sizeof(int)) == sizeof(int)) if (signal_number >= 0 && signal_number < max_signal_number) signal_set_service::deliver_signal(signal_number); return not_done; } static void do_complete(void* /*owner*/, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { pipe_read_op* o(static_cast(base)); delete o; } }; #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) signal_set_service::signal_set_service( asio::io_context& io_context) : service_base(io_context), io_context_(asio::use_service(io_context)), #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) reactor_(asio::use_service(io_context)), #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) next_(0), prev_(0) { get_signal_state()->mutex_.init(); #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) reactor_.init_task(); #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) for (int i = 0; i < max_signal_number; ++i) registrations_[i] = 0; add_service(this); } signal_set_service::~signal_set_service() { remove_service(this); } void signal_set_service::shutdown() { remove_service(this); op_queue ops; for (int i = 0; i < max_signal_number; ++i) { registration* reg = registrations_[i]; while (reg) { ops.push(*reg->queue_); reg = reg->next_in_table_; } } io_context_.abandon_operations(ops); } void signal_set_service::notify_fork( asio::io_context::fork_event fork_ev) { #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); switch (fork_ev) { case asio::io_context::fork_prepare: { int read_descriptor = state->read_descriptor_; state->fork_prepared_ = true; lock.unlock(); reactor_.deregister_internal_descriptor(read_descriptor, reactor_data_); reactor_.cleanup_descriptor_data(reactor_data_); } break; case asio::io_context::fork_parent: if (state->fork_prepared_) { int read_descriptor = state->read_descriptor_; state->fork_prepared_ = false; lock.unlock(); reactor_.register_internal_descriptor(reactor::read_op, read_descriptor, reactor_data_, new pipe_read_op); } break; case asio::io_context::fork_child: if (state->fork_prepared_) { asio::detail::signal_blocker blocker; close_descriptors(); open_descriptors(); int read_descriptor = state->read_descriptor_; state->fork_prepared_ = false; lock.unlock(); reactor_.register_internal_descriptor(reactor::read_op, read_descriptor, reactor_data_, new pipe_read_op); } break; default: break; } #else // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) (void)fork_ev; #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) } void signal_set_service::construct( signal_set_service::implementation_type& impl) { impl.signals_ = 0; } void signal_set_service::destroy( signal_set_service::implementation_type& impl) { asio::error_code ignored_ec; clear(impl, ignored_ec); cancel(impl, ignored_ec); } asio::error_code signal_set_service::add( signal_set_service::implementation_type& impl, int signal_number, asio::error_code& ec) { // Check that the signal number is valid. if (signal_number < 0 || signal_number >= max_signal_number) { ec = asio::error::invalid_argument; return ec; } signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); // Find the appropriate place to insert the registration. registration** insertion_point = &impl.signals_; registration* next = impl.signals_; while (next && next->signal_number_ < signal_number) { insertion_point = &next->next_in_set_; next = next->next_in_set_; } // Only do something if the signal is not already registered. if (next == 0 || next->signal_number_ != signal_number) { registration* new_registration = new registration; #if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) // Register for the signal if we're the first. if (state->registration_count_[signal_number] == 0) { # if defined(ASIO_HAS_SIGACTION) using namespace std; // For memset. struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = asio_signal_handler; sigfillset(&sa.sa_mask); if (::sigaction(signal_number, &sa, 0) == -1) # else // defined(ASIO_HAS_SIGACTION) if (::signal(signal_number, asio_signal_handler) == SIG_ERR) # endif // defined(ASIO_HAS_SIGACTION) { # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error::invalid_argument; # else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error_code(errno, asio::error::get_system_category()); # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) delete new_registration; return ec; } } #endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) // Record the new registration in the set. new_registration->signal_number_ = signal_number; new_registration->queue_ = &impl.queue_; new_registration->next_in_set_ = next; *insertion_point = new_registration; // Insert registration into the registration table. new_registration->next_in_table_ = registrations_[signal_number]; if (registrations_[signal_number]) registrations_[signal_number]->prev_in_table_ = new_registration; registrations_[signal_number] = new_registration; ++state->registration_count_[signal_number]; } ec = asio::error_code(); return ec; } asio::error_code signal_set_service::remove( signal_set_service::implementation_type& impl, int signal_number, asio::error_code& ec) { // Check that the signal number is valid. if (signal_number < 0 || signal_number >= max_signal_number) { ec = asio::error::invalid_argument; return ec; } signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); // Find the signal number in the list of registrations. registration** deletion_point = &impl.signals_; registration* reg = impl.signals_; while (reg && reg->signal_number_ < signal_number) { deletion_point = ®->next_in_set_; reg = reg->next_in_set_; } if (reg != 0 && reg->signal_number_ == signal_number) { #if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) // Set signal handler back to the default if we're the last. if (state->registration_count_[signal_number] == 1) { # if defined(ASIO_HAS_SIGACTION) using namespace std; // For memset. struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; if (::sigaction(signal_number, &sa, 0) == -1) # else // defined(ASIO_HAS_SIGACTION) if (::signal(signal_number, SIG_DFL) == SIG_ERR) # endif // defined(ASIO_HAS_SIGACTION) { # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error::invalid_argument; # else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error_code(errno, asio::error::get_system_category()); # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) return ec; } } #endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) // Remove the registration from the set. *deletion_point = reg->next_in_set_; // Remove the registration from the registration table. if (registrations_[signal_number] == reg) registrations_[signal_number] = reg->next_in_table_; if (reg->prev_in_table_) reg->prev_in_table_->next_in_table_ = reg->next_in_table_; if (reg->next_in_table_) reg->next_in_table_->prev_in_table_ = reg->prev_in_table_; --state->registration_count_[signal_number]; delete reg; } ec = asio::error_code(); return ec; } asio::error_code signal_set_service::clear( signal_set_service::implementation_type& impl, asio::error_code& ec) { signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); while (registration* reg = impl.signals_) { #if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) // Set signal handler back to the default if we're the last. if (state->registration_count_[reg->signal_number_] == 1) { # if defined(ASIO_HAS_SIGACTION) using namespace std; // For memset. struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; if (::sigaction(reg->signal_number_, &sa, 0) == -1) # else // defined(ASIO_HAS_SIGACTION) if (::signal(reg->signal_number_, SIG_DFL) == SIG_ERR) # endif // defined(ASIO_HAS_SIGACTION) { # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error::invalid_argument; # else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error_code(errno, asio::error::get_system_category()); # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) return ec; } } #endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) // Remove the registration from the registration table. if (registrations_[reg->signal_number_] == reg) registrations_[reg->signal_number_] = reg->next_in_table_; if (reg->prev_in_table_) reg->prev_in_table_->next_in_table_ = reg->next_in_table_; if (reg->next_in_table_) reg->next_in_table_->prev_in_table_ = reg->prev_in_table_; --state->registration_count_[reg->signal_number_]; impl.signals_ = reg->next_in_set_; delete reg; } ec = asio::error_code(); return ec; } asio::error_code signal_set_service::cancel( signal_set_service::implementation_type& impl, asio::error_code& ec) { ASIO_HANDLER_OPERATION((io_context_.context(), "signal_set", &impl, 0, "cancel")); op_queue ops; { signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); while (signal_op* op = impl.queue_.front()) { op->ec_ = asio::error::operation_aborted; impl.queue_.pop(); ops.push(op); } } io_context_.post_deferred_completions(ops); ec = asio::error_code(); return ec; } void signal_set_service::deliver_signal(int signal_number) { signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); signal_set_service* service = state->service_list_; while (service) { op_queue ops; registration* reg = service->registrations_[signal_number]; while (reg) { if (reg->queue_->empty()) { ++reg->undelivered_; } else { while (signal_op* op = reg->queue_->front()) { op->signal_number_ = signal_number; reg->queue_->pop(); ops.push(op); } } reg = reg->next_in_table_; } service->io_context_.post_deferred_completions(ops); service = service->next_; } } void signal_set_service::add_service(signal_set_service* service) { signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) // If this is the first service to be created, open a new pipe. if (state->service_list_ == 0) open_descriptors(); #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) // If an io_context object is thread-unsafe then it must be the only // io_context used to create signal_set objects. if (state->service_list_ != 0) { if (!ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER, service->io_context_.concurrency_hint()) || !ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER, state->service_list_->io_context_.concurrency_hint())) { std::logic_error ex( "Thread-unsafe io_context objects require " "exclusive access to signal handling."); asio::detail::throw_exception(ex); } } // Insert service into linked list of all services. service->next_ = state->service_list_; service->prev_ = 0; if (state->service_list_) state->service_list_->prev_ = service; state->service_list_ = service; #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) // Register for pipe readiness notifications. int read_descriptor = state->read_descriptor_; lock.unlock(); service->reactor_.register_internal_descriptor(reactor::read_op, read_descriptor, service->reactor_data_, new pipe_read_op); #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) } void signal_set_service::remove_service(signal_set_service* service) { signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); if (service->next_ || service->prev_ || state->service_list_ == service) { #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) // Disable the pipe readiness notifications. int read_descriptor = state->read_descriptor_; lock.unlock(); service->reactor_.deregister_internal_descriptor( read_descriptor, service->reactor_data_); service->reactor_.cleanup_descriptor_data(service->reactor_data_); lock.lock(); #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) // Remove service from linked list of all services. if (state->service_list_ == service) state->service_list_ = service->next_; if (service->prev_) service->prev_->next_ = service->next_; if (service->next_) service->next_->prev_= service->prev_; service->next_ = 0; service->prev_ = 0; #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) // If this is the last service to be removed, close the pipe. if (state->service_list_ == 0) close_descriptors(); #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) } } void signal_set_service::open_descriptors() { #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) signal_state* state = get_signal_state(); int pipe_fds[2]; if (::pipe(pipe_fds) == 0) { state->read_descriptor_ = pipe_fds[0]; ::fcntl(state->read_descriptor_, F_SETFL, O_NONBLOCK); state->write_descriptor_ = pipe_fds[1]; ::fcntl(state->write_descriptor_, F_SETFL, O_NONBLOCK); #if defined(FD_CLOEXEC) ::fcntl(state->read_descriptor_, F_SETFD, FD_CLOEXEC); ::fcntl(state->write_descriptor_, F_SETFD, FD_CLOEXEC); #endif // defined(FD_CLOEXEC) } else { asio::error_code ec(errno, asio::error::get_system_category()); asio::detail::throw_error(ec, "signal_set_service pipe"); } #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) } void signal_set_service::close_descriptors() { #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) signal_state* state = get_signal_state(); if (state->read_descriptor_ != -1) ::close(state->read_descriptor_); state->read_descriptor_ = -1; if (state->write_descriptor_ != -1) ::close(state->write_descriptor_); state->write_descriptor_ = -1; #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) } void signal_set_service::start_wait_op( signal_set_service::implementation_type& impl, signal_op* op) { io_context_.work_started(); signal_state* state = get_signal_state(); static_mutex::scoped_lock lock(state->mutex_); registration* reg = impl.signals_; while (reg) { if (reg->undelivered_ > 0) { --reg->undelivered_; op->signal_number_ = reg->signal_number_; io_context_.post_deferred_completion(op); return; } reg = reg->next_in_set_; } impl.queue_.push(op); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/socket_ops.ipp000066400000000000000000003022701340672067200222070ustar00rootroot00000000000000// // detail/impl/socket_ops.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOCKET_OPS_IPP #define ASIO_DETAIL_SOCKET_OPS_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include #include #include #include "asio/detail/assert.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include # include # include #endif // defined(ASIO_WINDOWS_RUNTIME) #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) \ || defined(__MACH__) && defined(__APPLE__) # if defined(ASIO_HAS_PTHREADS) # include # endif // defined(ASIO_HAS_PTHREADS) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // || defined(__MACH__) && defined(__APPLE__) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace socket_ops { #if !defined(ASIO_WINDOWS_RUNTIME) #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) struct msghdr { int msg_namelen; }; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #if defined(__hpux) // HP-UX doesn't declare these functions extern "C", so they are declared again // here to avoid linker errors about undefined symbols. extern "C" char* if_indextoname(unsigned int, char*); extern "C" unsigned int if_nametoindex(const char*); #endif // defined(__hpux) #endif // !defined(ASIO_WINDOWS_RUNTIME) inline void clear_last_error() { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) WSASetLastError(0); #else errno = 0; #endif } #if !defined(ASIO_WINDOWS_RUNTIME) template inline ReturnType error_wrapper(ReturnType return_value, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ec = asio::error_code(WSAGetLastError(), asio::error::get_system_category()); #else ec = asio::error_code(errno, asio::error::get_system_category()); #endif return return_value; } template inline socket_type call_accept(SockLenType msghdr::*, socket_type s, socket_addr_type* addr, std::size_t* addrlen) { SockLenType tmp_addrlen = addrlen ? (SockLenType)*addrlen : 0; socket_type result = ::accept(s, addr, addrlen ? &tmp_addrlen : 0); if (addrlen) *addrlen = (std::size_t)tmp_addrlen; return result; } socket_type accept(socket_type s, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return invalid_socket; } clear_last_error(); socket_type new_s = error_wrapper(call_accept( &msghdr::msg_namelen, s, addr, addrlen), ec); if (new_s == invalid_socket) return new_s; #if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__) int optval = 1; int result = error_wrapper(::setsockopt(new_s, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec); if (result != 0) { ::close(new_s); return invalid_socket; } #endif ec = asio::error_code(); return new_s; } socket_type sync_accept(socket_type s, state_type state, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec) { // Accept a socket. for (;;) { // Try to complete the operation without blocking. socket_type new_socket = socket_ops::accept(s, addr, addrlen, ec); // Check if operation succeeded. if (new_socket != invalid_socket) return new_socket; // Operation failed. if (ec == asio::error::would_block || ec == asio::error::try_again) { if (state & user_set_non_blocking) return invalid_socket; // Fall through to retry operation. } else if (ec == asio::error::connection_aborted) { if (state & enable_connection_aborted) return invalid_socket; // Fall through to retry operation. } #if defined(EPROTO) else if (ec.value() == EPROTO) { if (state & enable_connection_aborted) return invalid_socket; // Fall through to retry operation. } #endif // defined(EPROTO) else return invalid_socket; // Wait for socket to become ready. if (socket_ops::poll_read(s, 0, -1, ec) < 0) return invalid_socket; } } #if defined(ASIO_HAS_IOCP) void complete_iocp_accept(socket_type s, void* output_buffer, DWORD address_length, socket_addr_type* addr, std::size_t* addrlen, socket_type new_socket, asio::error_code& ec) { // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) ec = asio::error::connection_aborted; if (!ec) { // Get the address of the peer. if (addr && addrlen) { LPSOCKADDR local_addr = 0; int local_addr_length = 0; LPSOCKADDR remote_addr = 0; int remote_addr_length = 0; GetAcceptExSockaddrs(output_buffer, 0, address_length, address_length, &local_addr, &local_addr_length, &remote_addr, &remote_addr_length); if (static_cast(remote_addr_length) > *addrlen) { ec = asio::error::invalid_argument; } else { using namespace std; // For memcpy. memcpy(addr, remote_addr, remote_addr_length); *addrlen = static_cast(remote_addr_length); } } // Need to set the SO_UPDATE_ACCEPT_CONTEXT option so that getsockname // and getpeername will work on the accepted socket. SOCKET update_ctx_param = s; socket_ops::state_type state = 0; socket_ops::setsockopt(new_socket, state, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, &update_ctx_param, sizeof(SOCKET), ec); } } #else // defined(ASIO_HAS_IOCP) bool non_blocking_accept(socket_type s, state_type state, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec, socket_type& new_socket) { for (;;) { // Accept the waiting connection. new_socket = socket_ops::accept(s, addr, addrlen, ec); // Check if operation succeeded. if (new_socket != invalid_socket) return true; // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Operation failed. if (ec == asio::error::would_block || ec == asio::error::try_again) { // Fall through to retry operation. } else if (ec == asio::error::connection_aborted) { if (state & enable_connection_aborted) return true; // Fall through to retry operation. } #if defined(EPROTO) else if (ec.value() == EPROTO) { if (state & enable_connection_aborted) return true; // Fall through to retry operation. } #endif // defined(EPROTO) else return true; return false; } } #endif // defined(ASIO_HAS_IOCP) template inline int call_bind(SockLenType msghdr::*, socket_type s, const socket_addr_type* addr, std::size_t addrlen) { return ::bind(s, addr, (SockLenType)addrlen); } int bind(socket_type s, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } clear_last_error(); int result = error_wrapper(call_bind( &msghdr::msg_namelen, s, addr, addrlen), ec); if (result == 0) ec = asio::error_code(); return result; } int close(socket_type s, state_type& state, bool destruction, asio::error_code& ec) { int result = 0; if (s != invalid_socket) { // We don't want the destructor to block, so set the socket to linger in // the background. If the user doesn't like this behaviour then they need // to explicitly close the socket. if (destruction && (state & user_set_linger)) { ::linger opt; opt.l_onoff = 0; opt.l_linger = 0; asio::error_code ignored_ec; socket_ops::setsockopt(s, state, SOL_SOCKET, SO_LINGER, &opt, sizeof(opt), ignored_ec); } clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) result = error_wrapper(::closesocket(s), ec); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) result = error_wrapper(::close(s), ec); #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (result != 0 && (ec == asio::error::would_block || ec == asio::error::try_again)) { // According to UNIX Network Programming Vol. 1, it is possible for // close() to fail with EWOULDBLOCK under certain circumstances. What // isn't clear is the state of the descriptor after this error. The one // current OS where this behaviour is seen, Windows, says that the socket // remains open. Therefore we'll put the descriptor back into blocking // mode and have another attempt at closing it. #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ioctl_arg_type arg = 0; ::ioctlsocket(s, FIONBIO, &arg); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(__SYMBIAN32__) int flags = ::fcntl(s, F_GETFL, 0); if (flags >= 0) ::fcntl(s, F_SETFL, flags & ~O_NONBLOCK); # else // defined(__SYMBIAN32__) ioctl_arg_type arg = 0; ::ioctl(s, FIONBIO, &arg); # endif // defined(__SYMBIAN32__) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) state &= ~non_blocking; clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) result = error_wrapper(::closesocket(s), ec); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) result = error_wrapper(::close(s), ec); #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } } if (result == 0) ec = asio::error_code(); return result; } bool set_user_non_blocking(socket_type s, state_type& state, bool value, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return false; } clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ioctl_arg_type arg = (value ? 1 : 0); int result = error_wrapper(::ioctlsocket(s, FIONBIO, &arg), ec); #elif defined(__SYMBIAN32__) int result = error_wrapper(::fcntl(s, F_GETFL, 0), ec); if (result >= 0) { clear_last_error(); int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); result = error_wrapper(::fcntl(s, F_SETFL, flag), ec); } #else ioctl_arg_type arg = (value ? 1 : 0); int result = error_wrapper(::ioctl(s, FIONBIO, &arg), ec); #endif if (result >= 0) { ec = asio::error_code(); if (value) state |= user_set_non_blocking; else { // Clearing the user-set non-blocking mode always overrides any // internally-set non-blocking flag. Any subsequent asynchronous // operations will need to re-enable non-blocking I/O. state &= ~(user_set_non_blocking | internal_non_blocking); } return true; } return false; } bool set_internal_non_blocking(socket_type s, state_type& state, bool value, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return false; } if (!value && (state & user_set_non_blocking)) { // It does not make sense to clear the internal non-blocking flag if the // user still wants non-blocking behaviour. Return an error and let the // caller figure out whether to update the user-set non-blocking flag. ec = asio::error::invalid_argument; return false; } clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) ioctl_arg_type arg = (value ? 1 : 0); int result = error_wrapper(::ioctlsocket(s, FIONBIO, &arg), ec); #elif defined(__SYMBIAN32__) int result = error_wrapper(::fcntl(s, F_GETFL, 0), ec); if (result >= 0) { clear_last_error(); int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); result = error_wrapper(::fcntl(s, F_SETFL, flag), ec); } #else ioctl_arg_type arg = (value ? 1 : 0); int result = error_wrapper(::ioctl(s, FIONBIO, &arg), ec); #endif if (result >= 0) { ec = asio::error_code(); if (value) state |= internal_non_blocking; else state &= ~internal_non_blocking; return true; } return false; } int shutdown(socket_type s, int what, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } clear_last_error(); int result = error_wrapper(::shutdown(s, what), ec); if (result == 0) ec = asio::error_code(); return result; } template inline int call_connect(SockLenType msghdr::*, socket_type s, const socket_addr_type* addr, std::size_t addrlen) { return ::connect(s, addr, (SockLenType)addrlen); } int connect(socket_type s, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } clear_last_error(); int result = error_wrapper(call_connect( &msghdr::msg_namelen, s, addr, addrlen), ec); if (result == 0) ec = asio::error_code(); #if defined(__linux__) else if (ec == asio::error::try_again) ec = asio::error::no_buffer_space; #endif // defined(__linux__) return result; } void sync_connect(socket_type s, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec) { // Perform the connect operation. socket_ops::connect(s, addr, addrlen, ec); if (ec != asio::error::in_progress && ec != asio::error::would_block) { // The connect operation finished immediately. return; } // Wait for socket to become ready. if (socket_ops::poll_connect(s, -1, ec) < 0) return; // Get the error code from the connect operation. int connect_error = 0; size_t connect_error_len = sizeof(connect_error); if (socket_ops::getsockopt(s, 0, SOL_SOCKET, SO_ERROR, &connect_error, &connect_error_len, ec) == socket_error_retval) return; // Return the result of the connect operation. ec = asio::error_code(connect_error, asio::error::get_system_category()); } #if defined(ASIO_HAS_IOCP) void complete_iocp_connect(socket_type s, asio::error_code& ec) { // Map non-portable errors to their portable counterparts. switch (ec.value()) { case ERROR_CONNECTION_REFUSED: ec = asio::error::connection_refused; break; case ERROR_NETWORK_UNREACHABLE: ec = asio::error::network_unreachable; break; case ERROR_HOST_UNREACHABLE: ec = asio::error::host_unreachable; break; case ERROR_SEM_TIMEOUT: ec = asio::error::timed_out; break; default: break; } if (!ec) { // Need to set the SO_UPDATE_CONNECT_CONTEXT option so that getsockname // and getpeername will work on the connected socket. socket_ops::state_type state = 0; const int so_update_connect_context = 0x7010; socket_ops::setsockopt(s, state, SOL_SOCKET, so_update_connect_context, 0, 0, ec); } } #endif // defined(ASIO_HAS_IOCP) bool non_blocking_connect(socket_type s, asio::error_code& ec) { // Check if the connect operation has finished. This is required since we may // get spurious readiness notifications from the reactor. #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) fd_set write_fds; FD_ZERO(&write_fds); FD_SET(s, &write_fds); fd_set except_fds; FD_ZERO(&except_fds); FD_SET(s, &except_fds); timeval zero_timeout; zero_timeout.tv_sec = 0; zero_timeout.tv_usec = 0; int ready = ::select(s + 1, 0, &write_fds, &except_fds, &zero_timeout); #else // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) pollfd fds; fds.fd = s; fds.events = POLLOUT; fds.revents = 0; int ready = ::poll(&fds, 1, 0); #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) if (ready == 0) { // The asynchronous connect operation is still in progress. return false; } // Get the error code from the connect operation. int connect_error = 0; size_t connect_error_len = sizeof(connect_error); if (socket_ops::getsockopt(s, 0, SOL_SOCKET, SO_ERROR, &connect_error, &connect_error_len, ec) == 0) { if (connect_error) { ec = asio::error_code(connect_error, asio::error::get_system_category()); } else ec = asio::error_code(); } return true; } int socketpair(int af, int type, int protocol, socket_type sv[2], asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) (void)(af); (void)(type); (void)(protocol); (void)(sv); ec = asio::error::operation_not_supported; return socket_error_retval; #else clear_last_error(); int result = error_wrapper(::socketpair(af, type, protocol, sv), ec); if (result == 0) ec = asio::error_code(); return result; #endif } bool sockatmark(socket_type s, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return false; } #if defined(SIOCATMARK) ioctl_arg_type value = 0; # if defined(ASIO_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::ioctlsocket(s, SIOCATMARK, &value), ec); # else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::ioctl(s, SIOCATMARK, &value), ec); # endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (result == 0) ec = asio::error_code(); # if defined(ENOTTY) if (ec.value() == ENOTTY) ec = asio::error::not_socket; # endif // defined(ENOTTY) #else // defined(SIOCATMARK) int value = error_wrapper(::sockatmark(s), ec); if (value != -1) ec = asio::error_code(); #endif // defined(SIOCATMARK) return ec ? false : value != 0; } size_t available(socket_type s, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return 0; } ioctl_arg_type value = 0; #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::ioctlsocket(s, FIONREAD, &value), ec); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::ioctl(s, FIONREAD, &value), ec); #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (result == 0) ec = asio::error_code(); #if defined(ENOTTY) if (ec.value() == ENOTTY) ec = asio::error::not_socket; #endif // defined(ENOTTY) return ec ? static_cast(0) : static_cast(value); } int listen(socket_type s, int backlog, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } clear_last_error(); int result = error_wrapper(::listen(s, backlog), ec); if (result == 0) ec = asio::error_code(); return result; } inline void init_buf_iov_base(void*& base, void* addr) { base = addr; } template inline void init_buf_iov_base(T& base, void* addr) { base = static_cast(addr); } #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) typedef WSABUF buf; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) typedef iovec buf; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) void init_buf(buf& b, void* data, size_t size) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) b.buf = static_cast(data); b.len = static_cast(size); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) init_buf_iov_base(b.iov_base, data); b.iov_len = size; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } void init_buf(buf& b, const void* data, size_t size) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) b.buf = static_cast(const_cast(data)); b.len = static_cast(size); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) init_buf_iov_base(b.iov_base, const_cast(data)); b.iov_len = size; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } inline void init_msghdr_msg_name(void*& name, socket_addr_type* addr) { name = addr; } inline void init_msghdr_msg_name(void*& name, const socket_addr_type* addr) { name = const_cast(addr); } template inline void init_msghdr_msg_name(T& name, socket_addr_type* addr) { name = reinterpret_cast(addr); } template inline void init_msghdr_msg_name(T& name, const socket_addr_type* addr) { name = reinterpret_cast(const_cast(addr)); } signed_size_type recv(socket_type s, buf* bufs, size_t count, int flags, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Receive some data. DWORD recv_buf_count = static_cast(count); DWORD bytes_transferred = 0; DWORD recv_flags = flags; int result = error_wrapper(::WSARecv(s, bufs, recv_buf_count, &bytes_transferred, &recv_flags, 0, 0), ec); if (ec.value() == ERROR_NETNAME_DELETED) ec = asio::error::connection_reset; else if (ec.value() == ERROR_PORT_UNREACHABLE) ec = asio::error::connection_refused; else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) ec.assign(0, ec.category()); if (result != 0) return socket_error_retval; ec = asio::error_code(); return bytes_transferred; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); msg.msg_iov = bufs; msg.msg_iovlen = static_cast(count); signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec); if (result >= 0) ec = asio::error_code(); return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } size_t sync_recv(socket_type s, state_type state, buf* bufs, size_t count, int flags, bool all_empty, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return 0; } // A request to read 0 bytes on a stream is a no-op. if (all_empty && (state & stream_oriented)) { ec = asio::error_code(); return 0; } // Read some data. for (;;) { // Try to complete the operation without blocking. signed_size_type bytes = socket_ops::recv(s, bufs, count, flags, ec); // Check if operation succeeded. if (bytes > 0) return bytes; // Check for EOF. if ((state & stream_oriented) && bytes == 0) { ec = asio::error::eof; return 0; } // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for socket to become ready. if (socket_ops::poll_read(s, 0, -1, ec) < 0) return 0; } } #if defined(ASIO_HAS_IOCP) void complete_iocp_recv(state_type state, const weak_cancel_token_type& cancel_token, bool all_empty, asio::error_code& ec, size_t bytes_transferred) { // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) { if (cancel_token.expired()) ec = asio::error::operation_aborted; else ec = asio::error::connection_reset; } else if (ec.value() == ERROR_PORT_UNREACHABLE) { ec = asio::error::connection_refused; } else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) { ec.assign(0, ec.category()); } // Check for connection closed. else if (!ec && bytes_transferred == 0 && (state & stream_oriented) != 0 && !all_empty) { ec = asio::error::eof; } } #else // defined(ASIO_HAS_IOCP) bool non_blocking_recv(socket_type s, buf* bufs, size_t count, int flags, bool is_stream, asio::error_code& ec, size_t& bytes_transferred) { for (;;) { // Read some data. signed_size_type bytes = socket_ops::recv(s, bufs, count, flags, ec); // Check for end of stream. if (is_stream && bytes == 0) { ec = asio::error::eof; return true; } // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes >= 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } #endif // defined(ASIO_HAS_IOCP) signed_size_type recvfrom(socket_type s, buf* bufs, size_t count, int flags, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Receive some data. DWORD recv_buf_count = static_cast(count); DWORD bytes_transferred = 0; DWORD recv_flags = flags; int tmp_addrlen = (int)*addrlen; int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count, &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0), ec); *addrlen = (std::size_t)tmp_addrlen; if (ec.value() == ERROR_NETNAME_DELETED) ec = asio::error::connection_reset; else if (ec.value() == ERROR_PORT_UNREACHABLE) ec = asio::error::connection_refused; else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) ec.assign(0, ec.category()); if (result != 0) return socket_error_retval; ec = asio::error_code(); return bytes_transferred; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); init_msghdr_msg_name(msg.msg_name, addr); msg.msg_namelen = static_cast(*addrlen); msg.msg_iov = bufs; msg.msg_iovlen = static_cast(count); signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec); *addrlen = msg.msg_namelen; if (result >= 0) ec = asio::error_code(); return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } size_t sync_recvfrom(socket_type s, state_type state, buf* bufs, size_t count, int flags, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return 0; } // Read some data. for (;;) { // Try to complete the operation without blocking. signed_size_type bytes = socket_ops::recvfrom( s, bufs, count, flags, addr, addrlen, ec); // Check if operation succeeded. if (bytes >= 0) return bytes; // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for socket to become ready. if (socket_ops::poll_read(s, 0, -1, ec) < 0) return 0; } } #if defined(ASIO_HAS_IOCP) void complete_iocp_recvfrom( const weak_cancel_token_type& cancel_token, asio::error_code& ec) { // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) { if (cancel_token.expired()) ec = asio::error::operation_aborted; else ec = asio::error::connection_reset; } else if (ec.value() == ERROR_PORT_UNREACHABLE) { ec = asio::error::connection_refused; } else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) { ec.assign(0, ec.category()); } } #else // defined(ASIO_HAS_IOCP) bool non_blocking_recvfrom(socket_type s, buf* bufs, size_t count, int flags, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec, size_t& bytes_transferred) { for (;;) { // Read some data. signed_size_type bytes = socket_ops::recvfrom( s, bufs, count, flags, addr, addrlen, ec); // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes >= 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } #endif // defined(ASIO_HAS_IOCP) signed_size_type recvmsg(socket_type s, buf* bufs, size_t count, int in_flags, int& out_flags, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) out_flags = 0; return socket_ops::recv(s, bufs, count, in_flags, ec); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); msg.msg_iov = bufs; msg.msg_iovlen = static_cast(count); signed_size_type result = error_wrapper(::recvmsg(s, &msg, in_flags), ec); if (result >= 0) { ec = asio::error_code(); out_flags = msg.msg_flags; } else out_flags = 0; return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } size_t sync_recvmsg(socket_type s, state_type state, buf* bufs, size_t count, int in_flags, int& out_flags, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return 0; } // Read some data. for (;;) { // Try to complete the operation without blocking. signed_size_type bytes = socket_ops::recvmsg( s, bufs, count, in_flags, out_flags, ec); // Check if operation succeeded. if (bytes >= 0) return bytes; // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for socket to become ready. if (socket_ops::poll_read(s, 0, -1, ec) < 0) return 0; } } #if defined(ASIO_HAS_IOCP) void complete_iocp_recvmsg( const weak_cancel_token_type& cancel_token, asio::error_code& ec) { // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) { if (cancel_token.expired()) ec = asio::error::operation_aborted; else ec = asio::error::connection_reset; } else if (ec.value() == ERROR_PORT_UNREACHABLE) { ec = asio::error::connection_refused; } else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) { ec.assign(0, ec.category()); } } #else // defined(ASIO_HAS_IOCP) bool non_blocking_recvmsg(socket_type s, buf* bufs, size_t count, int in_flags, int& out_flags, asio::error_code& ec, size_t& bytes_transferred) { for (;;) { // Read some data. signed_size_type bytes = socket_ops::recvmsg( s, bufs, count, in_flags, out_flags, ec); // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes >= 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } #endif // defined(ASIO_HAS_IOCP) signed_size_type send(socket_type s, const buf* bufs, size_t count, int flags, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Send the data. DWORD send_buf_count = static_cast(count); DWORD bytes_transferred = 0; DWORD send_flags = flags; int result = error_wrapper(::WSASend(s, const_cast(bufs), send_buf_count, &bytes_transferred, send_flags, 0, 0), ec); if (ec.value() == ERROR_NETNAME_DELETED) ec = asio::error::connection_reset; else if (ec.value() == ERROR_PORT_UNREACHABLE) ec = asio::error::connection_refused; if (result != 0) return socket_error_retval; ec = asio::error_code(); return bytes_transferred; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); msg.msg_iov = const_cast(bufs); msg.msg_iovlen = static_cast(count); #if defined(__linux__) flags |= MSG_NOSIGNAL; #endif // defined(__linux__) signed_size_type result = error_wrapper(::sendmsg(s, &msg, flags), ec); if (result >= 0) ec = asio::error_code(); return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } size_t sync_send(socket_type s, state_type state, const buf* bufs, size_t count, int flags, bool all_empty, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return 0; } // A request to write 0 bytes to a stream is a no-op. if (all_empty && (state & stream_oriented)) { ec = asio::error_code(); return 0; } // Read some data. for (;;) { // Try to complete the operation without blocking. signed_size_type bytes = socket_ops::send(s, bufs, count, flags, ec); // Check if operation succeeded. if (bytes >= 0) return bytes; // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for socket to become ready. if (socket_ops::poll_write(s, 0, -1, ec) < 0) return 0; } } #if defined(ASIO_HAS_IOCP) void complete_iocp_send( const weak_cancel_token_type& cancel_token, asio::error_code& ec) { // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) { if (cancel_token.expired()) ec = asio::error::operation_aborted; else ec = asio::error::connection_reset; } else if (ec.value() == ERROR_PORT_UNREACHABLE) { ec = asio::error::connection_refused; } } #else // defined(ASIO_HAS_IOCP) bool non_blocking_send(socket_type s, const buf* bufs, size_t count, int flags, asio::error_code& ec, size_t& bytes_transferred) { for (;;) { // Write some data. signed_size_type bytes = socket_ops::send(s, bufs, count, flags, ec); // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes >= 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } #endif // defined(ASIO_HAS_IOCP) signed_size_type sendto(socket_type s, const buf* bufs, size_t count, int flags, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Send the data. DWORD send_buf_count = static_cast(count); DWORD bytes_transferred = 0; int result = error_wrapper(::WSASendTo(s, const_cast(bufs), send_buf_count, &bytes_transferred, flags, addr, static_cast(addrlen), 0, 0), ec); if (ec.value() == ERROR_NETNAME_DELETED) ec = asio::error::connection_reset; else if (ec.value() == ERROR_PORT_UNREACHABLE) ec = asio::error::connection_refused; if (result != 0) return socket_error_retval; ec = asio::error_code(); return bytes_transferred; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) msghdr msg = msghdr(); init_msghdr_msg_name(msg.msg_name, addr); msg.msg_namelen = static_cast(addrlen); msg.msg_iov = const_cast(bufs); msg.msg_iovlen = static_cast(count); #if defined(__linux__) flags |= MSG_NOSIGNAL; #endif // defined(__linux__) signed_size_type result = error_wrapper(::sendmsg(s, &msg, flags), ec); if (result >= 0) ec = asio::error_code(); return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } size_t sync_sendto(socket_type s, state_type state, const buf* bufs, size_t count, int flags, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return 0; } // Write some data. for (;;) { // Try to complete the operation without blocking. signed_size_type bytes = socket_ops::sendto( s, bufs, count, flags, addr, addrlen, ec); // Check if operation succeeded. if (bytes >= 0) return bytes; // Operation failed. if ((state & user_set_non_blocking) || (ec != asio::error::would_block && ec != asio::error::try_again)) return 0; // Wait for socket to become ready. if (socket_ops::poll_write(s, 0, -1, ec) < 0) return 0; } } #if !defined(ASIO_HAS_IOCP) bool non_blocking_sendto(socket_type s, const buf* bufs, size_t count, int flags, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec, size_t& bytes_transferred) { for (;;) { // Write some data. signed_size_type bytes = socket_ops::sendto( s, bufs, count, flags, addr, addrlen, ec); // Retry operation if interrupted by signal. if (ec == asio::error::interrupted) continue; // Check if we need to run the operation again. if (ec == asio::error::would_block || ec == asio::error::try_again) return false; // Operation is complete. if (bytes >= 0) { ec = asio::error_code(); bytes_transferred = bytes; } else bytes_transferred = 0; return true; } } #endif // !defined(ASIO_HAS_IOCP) socket_type socket(int af, int type, int protocol, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) socket_type s = error_wrapper(::WSASocketW(af, type, protocol, 0, 0, WSA_FLAG_OVERLAPPED), ec); if (s == invalid_socket) return s; if (af == ASIO_OS_DEF(AF_INET6)) { // Try to enable the POSIX default behaviour of having IPV6_V6ONLY set to // false. This will only succeed on Windows Vista and later versions of // Windows, where a dual-stack IPv4/v6 implementation is available. DWORD optval = 0; ::setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&optval), sizeof(optval)); } ec = asio::error_code(); return s; #elif defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__) socket_type s = error_wrapper(::socket(af, type, protocol), ec); if (s == invalid_socket) return s; int optval = 1; int result = error_wrapper(::setsockopt(s, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec); if (result != 0) { ::close(s); return invalid_socket; } return s; #else int s = error_wrapper(::socket(af, type, protocol), ec); if (s >= 0) ec = asio::error_code(); return s; #endif } template inline int call_setsockopt(SockLenType msghdr::*, socket_type s, int level, int optname, const void* optval, std::size_t optlen) { return ::setsockopt(s, level, optname, (const char*)optval, (SockLenType)optlen); } int setsockopt(socket_type s, state_type& state, int level, int optname, const void* optval, std::size_t optlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } if (level == custom_socket_option_level && optname == always_fail_option) { ec = asio::error::invalid_argument; return socket_error_retval; } if (level == custom_socket_option_level && optname == enable_connection_aborted_option) { if (optlen != sizeof(int)) { ec = asio::error::invalid_argument; return socket_error_retval; } if (*static_cast(optval)) state |= enable_connection_aborted; else state &= ~enable_connection_aborted; ec = asio::error_code(); return 0; } if (level == SOL_SOCKET && optname == SO_LINGER) state |= user_set_linger; #if defined(__BORLANDC__) // Mysteriously, using the getsockopt and setsockopt functions directly with // Borland C++ results in incorrect values being set and read. The bug can be // worked around by using function addresses resolved with GetProcAddress. if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) { typedef int (WSAAPI *sso_t)(SOCKET, int, int, const char*, int); if (sso_t sso = (sso_t)::GetProcAddress(winsock_module, "setsockopt")) { clear_last_error(); return error_wrapper(sso(s, level, optname, reinterpret_cast(optval), static_cast(optlen)), ec); } } ec = asio::error::fault; return socket_error_retval; #else // defined(__BORLANDC__) clear_last_error(); int result = error_wrapper(call_setsockopt(&msghdr::msg_namelen, s, level, optname, optval, optlen), ec); if (result == 0) { ec = asio::error_code(); #if defined(__MACH__) && defined(__APPLE__) \ || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) // To implement portable behaviour for SO_REUSEADDR with UDP sockets we // need to also set SO_REUSEPORT on BSD-based platforms. if ((state & datagram_oriented) && level == SOL_SOCKET && optname == SO_REUSEADDR) { call_setsockopt(&msghdr::msg_namelen, s, SOL_SOCKET, SO_REUSEPORT, optval, optlen); } #endif } return result; #endif // defined(__BORLANDC__) } template inline int call_getsockopt(SockLenType msghdr::*, socket_type s, int level, int optname, void* optval, std::size_t* optlen) { SockLenType tmp_optlen = (SockLenType)*optlen; int result = ::getsockopt(s, level, optname, (char*)optval, &tmp_optlen); *optlen = (std::size_t)tmp_optlen; return result; } int getsockopt(socket_type s, state_type state, int level, int optname, void* optval, size_t* optlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } if (level == custom_socket_option_level && optname == always_fail_option) { ec = asio::error::invalid_argument; return socket_error_retval; } if (level == custom_socket_option_level && optname == enable_connection_aborted_option) { if (*optlen != sizeof(int)) { ec = asio::error::invalid_argument; return socket_error_retval; } *static_cast(optval) = (state & enable_connection_aborted) ? 1 : 0; ec = asio::error_code(); return 0; } #if defined(__BORLANDC__) // Mysteriously, using the getsockopt and setsockopt functions directly with // Borland C++ results in incorrect values being set and read. The bug can be // worked around by using function addresses resolved with GetProcAddress. if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) { typedef int (WSAAPI *gso_t)(SOCKET, int, int, char*, int*); if (gso_t gso = (gso_t)::GetProcAddress(winsock_module, "getsockopt")) { clear_last_error(); int tmp_optlen = static_cast(*optlen); int result = error_wrapper(gso(s, level, optname, reinterpret_cast(optval), &tmp_optlen), ec); *optlen = static_cast(tmp_optlen); if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD)) { // Dual-stack IPv4/v6 sockets, and the IPV6_V6ONLY socket option, are // only supported on Windows Vista and later. To simplify program logic // we will fake success of getting this option and specify that the // value is non-zero (i.e. true). This corresponds to the behavior of // IPv6 sockets on Windows platforms pre-Vista. *static_cast(optval) = 1; ec = asio::error_code(); } return result; } } ec = asio::error::fault; return socket_error_retval; #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) clear_last_error(); int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen, s, level, optname, optval, optlen), ec); if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD)) { // Dual-stack IPv4/v6 sockets, and the IPV6_V6ONLY socket option, are only // supported on Windows Vista and later. To simplify program logic we will // fake success of getting this option and specify that the value is // non-zero (i.e. true). This corresponds to the behavior of IPv6 sockets // on Windows platforms pre-Vista. *static_cast(optval) = 1; ec = asio::error_code(); } if (result == 0) ec = asio::error_code(); return result; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) clear_last_error(); int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen, s, level, optname, optval, optlen), ec); #if defined(__linux__) if (result == 0 && level == SOL_SOCKET && *optlen == sizeof(int) && (optname == SO_SNDBUF || optname == SO_RCVBUF)) { // On Linux, setting SO_SNDBUF or SO_RCVBUF to N actually causes the kernel // to set the buffer size to N*2. Linux puts additional stuff into the // buffers so that only about half is actually available to the application. // The retrieved value is divided by 2 here to make it appear as though the // correct value has been set. *static_cast(optval) /= 2; } #endif // defined(__linux__) if (result == 0) ec = asio::error_code(); return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } template inline int call_getpeername(SockLenType msghdr::*, socket_type s, socket_addr_type* addr, std::size_t* addrlen) { SockLenType tmp_addrlen = (SockLenType)*addrlen; int result = ::getpeername(s, addr, &tmp_addrlen); *addrlen = (std::size_t)tmp_addrlen; return result; } int getpeername(socket_type s, socket_addr_type* addr, std::size_t* addrlen, bool cached, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } #if defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) \ || defined(__CYGWIN__) if (cached) { // Check if socket is still connected. DWORD connect_time = 0; size_t connect_time_len = sizeof(connect_time); if (socket_ops::getsockopt(s, 0, SOL_SOCKET, SO_CONNECT_TIME, &connect_time, &connect_time_len, ec) == socket_error_retval) { return socket_error_retval; } if (connect_time == 0xFFFFFFFF) { ec = asio::error::not_connected; return socket_error_retval; } // The cached value is still valid. ec = asio::error_code(); return 0; } #else // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) // || defined(__CYGWIN__) (void)cached; #endif // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) // || defined(__CYGWIN__) clear_last_error(); int result = error_wrapper(call_getpeername( &msghdr::msg_namelen, s, addr, addrlen), ec); if (result == 0) ec = asio::error_code(); return result; } template inline int call_getsockname(SockLenType msghdr::*, socket_type s, socket_addr_type* addr, std::size_t* addrlen) { SockLenType tmp_addrlen = (SockLenType)*addrlen; int result = ::getsockname(s, addr, &tmp_addrlen); *addrlen = (std::size_t)tmp_addrlen; return result; } int getsockname(socket_type s, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } clear_last_error(); int result = error_wrapper(call_getsockname( &msghdr::msg_namelen, s, addr, addrlen), ec); if (result == 0) ec = asio::error_code(); return result; } int ioctl(socket_type s, state_type& state, int cmd, ioctl_arg_type* arg, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) int result = error_wrapper(::ioctlsocket(s, cmd, arg), ec); #elif defined(__MACH__) && defined(__APPLE__) \ || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) int result = error_wrapper(::ioctl(s, static_cast(cmd), arg), ec); #else int result = error_wrapper(::ioctl(s, cmd, arg), ec); #endif if (result >= 0) { ec = asio::error_code(); // When updating the non-blocking mode we always perform the ioctl syscall, // even if the flags would otherwise indicate that the socket is already in // the correct state. This ensures that the underlying socket is put into // the state that has been requested by the user. If the ioctl syscall was // successful then we need to update the flags to match. if (cmd == static_cast(FIONBIO)) { if (*arg) { state |= user_set_non_blocking; } else { // Clearing the non-blocking mode always overrides any internally-set // non-blocking flag. Any subsequent asynchronous operations will need // to re-enable non-blocking I/O. state &= ~(user_set_non_blocking | internal_non_blocking); } } } return result; } int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (!readfds && !writefds && !exceptfds && timeout) { DWORD milliseconds = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; if (milliseconds == 0) milliseconds = 1; // Force context switch. ::Sleep(milliseconds); ec = asio::error_code(); return 0; } // The select() call allows timeout values measured in microseconds, but the // system clock (as wrapped by boost::posix_time::microsec_clock) typically // has a resolution of 10 milliseconds. This can lead to a spinning select // reactor, meaning increased CPU usage, when waiting for the earliest // scheduled timeout if it's less than 10 milliseconds away. To avoid a tight // spin we'll use a minimum timeout of 1 millisecond. if (timeout && timeout->tv_sec == 0 && timeout->tv_usec > 0 && timeout->tv_usec < 1000) timeout->tv_usec = 1000; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #if defined(__hpux) && defined(__SELECT) timespec ts; ts.tv_sec = timeout ? timeout->tv_sec : 0; ts.tv_nsec = timeout ? timeout->tv_usec * 1000 : 0; return error_wrapper(::pselect(nfds, readfds, writefds, exceptfds, timeout ? &ts : 0, 0), ec); #else int result = error_wrapper(::select(nfds, readfds, writefds, exceptfds, timeout), ec); if (result >= 0) ec = asio::error_code(); return result; #endif } int poll_read(socket_type s, state_type state, int msec, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); timeval timeout_obj; timeval* timeout; if (state & user_set_non_blocking) { timeout_obj.tv_sec = 0; timeout_obj.tv_usec = 0; timeout = &timeout_obj; } else if (msec >= 0) { timeout_obj.tv_sec = msec / 1000; timeout_obj.tv_usec = (msec % 1000) * 1000; timeout = &timeout_obj; } else timeout = 0; clear_last_error(); int result = error_wrapper(::select(s + 1, &fds, 0, 0, timeout), ec); #else // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) pollfd fds; fds.fd = s; fds.events = POLLIN; fds.revents = 0; int timeout = (state & user_set_non_blocking) ? 0 : msec; clear_last_error(); int result = error_wrapper(::poll(&fds, 1, timeout), ec); #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) if (result == 0) ec = (state & user_set_non_blocking) ? asio::error::would_block : asio::error_code(); else if (result > 0) ec = asio::error_code(); return result; } int poll_write(socket_type s, state_type state, int msec, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); timeval timeout_obj; timeval* timeout; if (state & user_set_non_blocking) { timeout_obj.tv_sec = 0; timeout_obj.tv_usec = 0; timeout = &timeout_obj; } else if (msec >= 0) { timeout_obj.tv_sec = msec / 1000; timeout_obj.tv_usec = (msec % 1000) * 1000; timeout = &timeout_obj; } else timeout = 0; clear_last_error(); int result = error_wrapper(::select(s + 1, 0, &fds, 0, timeout), ec); #else // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) pollfd fds; fds.fd = s; fds.events = POLLOUT; fds.revents = 0; int timeout = (state & user_set_non_blocking) ? 0 : msec; clear_last_error(); int result = error_wrapper(::poll(&fds, 1, timeout), ec); #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) if (result == 0) ec = (state & user_set_non_blocking) ? asio::error::would_block : asio::error_code(); else if (result > 0) ec = asio::error_code(); return result; } int poll_error(socket_type s, state_type state, int msec, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); timeval timeout_obj; timeval* timeout; if (state & user_set_non_blocking) { timeout_obj.tv_sec = 0; timeout_obj.tv_usec = 0; timeout = &timeout_obj; } else if (msec >= 0) { timeout_obj.tv_sec = msec / 1000; timeout_obj.tv_usec = (msec % 1000) * 1000; timeout = &timeout_obj; } else timeout = 0; clear_last_error(); int result = error_wrapper(::select(s + 1, 0, 0, &fds, timeout), ec); #else // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) pollfd fds; fds.fd = s; fds.events = POLLPRI | POLLERR | POLLHUP; fds.revents = 0; int timeout = (state & user_set_non_blocking) ? 0 : msec; clear_last_error(); int result = error_wrapper(::poll(&fds, 1, timeout), ec); #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) if (result == 0) ec = (state & user_set_non_blocking) ? asio::error::would_block : asio::error_code(); else if (result > 0) ec = asio::error_code(); return result; } int poll_connect(socket_type s, int msec, asio::error_code& ec) { if (s == invalid_socket) { ec = asio::error::bad_descriptor; return socket_error_retval; } #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) fd_set write_fds; FD_ZERO(&write_fds); FD_SET(s, &write_fds); fd_set except_fds; FD_ZERO(&except_fds); FD_SET(s, &except_fds); timeval timeout_obj; timeval* timeout; if (msec >= 0) { timeout_obj.tv_sec = msec / 1000; timeout_obj.tv_usec = (msec % 1000) * 1000; timeout = &timeout_obj; } else timeout = 0; clear_last_error(); int result = error_wrapper(::select( s + 1, 0, &write_fds, &except_fds, timeout), ec); if (result >= 0) ec = asio::error_code(); return result; #else // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) pollfd fds; fds.fd = s; fds.events = POLLOUT; fds.revents = 0; clear_last_error(); int result = error_wrapper(::poll(&fds, 1, msec), ec); if (result >= 0) ec = asio::error_code(); return result; #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) } #endif // !defined(ASIO_WINDOWS_RUNTIME) const char* inet_ntop(int af, const void* src, char* dest, size_t length, unsigned long scope_id, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS_RUNTIME) using namespace std; // For sprintf. const unsigned char* bytes = static_cast(src); if (af == ASIO_OS_DEF(AF_INET)) { sprintf_s(dest, length, "%u.%u.%u.%u", bytes[0], bytes[1], bytes[2], bytes[3]); return dest; } else if (af == ASIO_OS_DEF(AF_INET6)) { size_t n = 0, b = 0, z = 0; while (n < length && b < 16) { if (bytes[b] == 0 && bytes[b + 1] == 0 && z == 0) { do b += 2; while (b < 16 && bytes[b] == 0 && bytes[b + 1] == 0); n += sprintf_s(dest + n, length - n, ":%s", b < 16 ? "" : ":"), ++z; } else { n += sprintf_s(dest + n, length - n, "%s%x", b ? ":" : "", (static_cast(bytes[b]) << 8) | bytes[b + 1]); b += 2; } } if (scope_id) n += sprintf_s(dest + n, length - n, "%%%lu", scope_id); return dest; } else { ec = asio::error::address_family_not_supported; return 0; } #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) using namespace std; // For memcpy. if (af != ASIO_OS_DEF(AF_INET) && af != ASIO_OS_DEF(AF_INET6)) { ec = asio::error::address_family_not_supported; return 0; } union { socket_addr_type base; sockaddr_storage_type storage; sockaddr_in4_type v4; sockaddr_in6_type v6; } address; DWORD address_length; if (af == ASIO_OS_DEF(AF_INET)) { address_length = sizeof(sockaddr_in4_type); address.v4.sin_family = ASIO_OS_DEF(AF_INET); address.v4.sin_port = 0; memcpy(&address.v4.sin_addr, src, sizeof(in4_addr_type)); } else // AF_INET6 { address_length = sizeof(sockaddr_in6_type); address.v6.sin6_family = ASIO_OS_DEF(AF_INET6); address.v6.sin6_port = 0; address.v6.sin6_flowinfo = 0; address.v6.sin6_scope_id = scope_id; memcpy(&address.v6.sin6_addr, src, sizeof(in6_addr_type)); } DWORD string_length = static_cast(length); #if defined(BOOST_NO_ANSI_APIS) || (defined(_MSC_VER) && (_MSC_VER >= 1800)) LPWSTR string_buffer = (LPWSTR)_alloca(length * sizeof(WCHAR)); int result = error_wrapper(::WSAAddressToStringW(&address.base, address_length, 0, string_buffer, &string_length), ec); ::WideCharToMultiByte(CP_ACP, 0, string_buffer, -1, dest, static_cast(length), 0, 0); #else int result = error_wrapper(::WSAAddressToStringA( &address.base, address_length, 0, dest, &string_length), ec); #endif // Windows may set error code on success. if (result != socket_error_retval) ec = asio::error_code(); // Windows may not set an error code on failure. else if (result == socket_error_retval && !ec) ec = asio::error::invalid_argument; return result == socket_error_retval ? 0 : dest; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) const char* result = error_wrapper(::inet_ntop( af, src, dest, static_cast(length)), ec); if (result == 0 && !ec) ec = asio::error::invalid_argument; if (result != 0 && af == ASIO_OS_DEF(AF_INET6) && scope_id != 0) { using namespace std; // For strcat and sprintf. char if_name[(IF_NAMESIZE > 21 ? IF_NAMESIZE : 21) + 1] = "%"; const in6_addr_type* ipv6_address = static_cast(src); bool is_link_local = ((ipv6_address->s6_addr[0] == 0xfe) && ((ipv6_address->s6_addr[1] & 0xc0) == 0x80)); bool is_multicast_link_local = ((ipv6_address->s6_addr[0] == 0xff) && ((ipv6_address->s6_addr[1] & 0x0f) == 0x02)); if ((!is_link_local && !is_multicast_link_local) || if_indextoname(static_cast(scope_id), if_name + 1) == 0) sprintf(if_name + 1, "%lu", scope_id); strcat(dest, if_name); } return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } int inet_pton(int af, const char* src, void* dest, unsigned long* scope_id, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS_RUNTIME) using namespace std; // For sscanf. unsigned char* bytes = static_cast(dest); if (af == ASIO_OS_DEF(AF_INET)) { unsigned int b0, b1, b2, b3; if (sscanf_s(src, "%u.%u.%u.%u", &b0, &b1, &b2, &b3) != 4) { ec = asio::error::invalid_argument; return -1; } if (b0 > 255 || b1 > 255 || b2 > 255 || b3 > 255) { ec = asio::error::invalid_argument; return -1; } bytes[0] = static_cast(b0); bytes[1] = static_cast(b1); bytes[2] = static_cast(b2); bytes[3] = static_cast(b3); ec = asio::error_code(); return 1; } else if (af == ASIO_OS_DEF(AF_INET6)) { unsigned char* bytes = static_cast(dest); std::memset(bytes, 0, 16); unsigned char back_bytes[16] = { 0 }; int num_front_bytes = 0, num_back_bytes = 0; const char* p = src; enum { fword, fcolon, bword, scope, done } state = fword; unsigned long current_word = 0; while (state != done) { if (current_word > 0xFFFF) { ec = asio::error::invalid_argument; return -1; } switch (state) { case fword: if (*p >= '0' && *p <= '9') current_word = current_word * 16 + *p++ - '0'; else if (*p >= 'a' && *p <= 'f') current_word = current_word * 16 + *p++ - 'a' + 10; else if (*p >= 'A' && *p <= 'F') current_word = current_word * 16 + *p++ - 'A' + 10; else { if (num_front_bytes == 16) { ec = asio::error::invalid_argument; return -1; } bytes[num_front_bytes++] = (current_word >> 8) & 0xFF; bytes[num_front_bytes++] = current_word & 0xFF; current_word = 0; if (*p == ':') state = fcolon, ++p; else if (*p == '%') state = scope, ++p; else if (*p == 0) state = done; else { ec = asio::error::invalid_argument; return -1; } } break; case fcolon: if (*p == ':') state = bword, ++p; else state = fword; break; case bword: if (*p >= '0' && *p <= '9') current_word = current_word * 16 + *p++ - '0'; else if (*p >= 'a' && *p <= 'f') current_word = current_word * 16 + *p++ - 'a' + 10; else if (*p >= 'A' && *p <= 'F') current_word = current_word * 16 + *p++ - 'A' + 10; else { if (num_front_bytes + num_back_bytes == 16) { ec = asio::error::invalid_argument; return -1; } back_bytes[num_back_bytes++] = (current_word >> 8) & 0xFF; back_bytes[num_back_bytes++] = current_word & 0xFF; current_word = 0; if (*p == ':') state = bword, ++p; else if (*p == '%') state = scope, ++p; else if (*p == 0) state = done; else { ec = asio::error::invalid_argument; return -1; } } break; case scope: if (*p >= '0' && *p <= '9') current_word = current_word * 10 + *p++ - '0'; else if (*p == 0) *scope_id = current_word, state = done; else { ec = asio::error::invalid_argument; return -1; } break; default: break; } } for (int i = 0; i < num_back_bytes; ++i) bytes[16 - num_back_bytes + i] = back_bytes[i]; ec = asio::error_code(); return 1; } else { ec = asio::error::address_family_not_supported; return -1; } #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) using namespace std; // For memcpy and strcmp. if (af != ASIO_OS_DEF(AF_INET) && af != ASIO_OS_DEF(AF_INET6)) { ec = asio::error::address_family_not_supported; return -1; } union { socket_addr_type base; sockaddr_storage_type storage; sockaddr_in4_type v4; sockaddr_in6_type v6; } address; int address_length = sizeof(sockaddr_storage_type); #if defined(BOOST_NO_ANSI_APIS) || (defined(_MSC_VER) && (_MSC_VER >= 1800)) int num_wide_chars = static_cast(strlen(src)) + 1; LPWSTR wide_buffer = (LPWSTR)_alloca(num_wide_chars * sizeof(WCHAR)); ::MultiByteToWideChar(CP_ACP, 0, src, -1, wide_buffer, num_wide_chars); int result = error_wrapper(::WSAStringToAddressW( wide_buffer, af, 0, &address.base, &address_length), ec); #else int result = error_wrapper(::WSAStringToAddressA( const_cast(src), af, 0, &address.base, &address_length), ec); #endif if (af == ASIO_OS_DEF(AF_INET)) { if (result != socket_error_retval) { memcpy(dest, &address.v4.sin_addr, sizeof(in4_addr_type)); ec = asio::error_code(); } else if (strcmp(src, "255.255.255.255") == 0) { static_cast(dest)->s_addr = INADDR_NONE; ec = asio::error_code(); } } else // AF_INET6 { if (result != socket_error_retval) { memcpy(dest, &address.v6.sin6_addr, sizeof(in6_addr_type)); if (scope_id) *scope_id = address.v6.sin6_scope_id; ec = asio::error_code(); } } // Windows may not set an error code on failure. if (result == socket_error_retval && !ec) ec = asio::error::invalid_argument; if (result != socket_error_retval) ec = asio::error_code(); return result == socket_error_retval ? -1 : 1; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) using namespace std; // For strchr, memcpy and atoi. // On some platforms, inet_pton fails if an address string contains a scope // id. Detect and remove the scope id before passing the string to inet_pton. const bool is_v6 = (af == ASIO_OS_DEF(AF_INET6)); const char* if_name = is_v6 ? strchr(src, '%') : 0; char src_buf[max_addr_v6_str_len + 1]; const char* src_ptr = src; if (if_name != 0) { if (if_name - src > max_addr_v6_str_len) { ec = asio::error::invalid_argument; return 0; } memcpy(src_buf, src, if_name - src); src_buf[if_name - src] = 0; src_ptr = src_buf; } int result = error_wrapper(::inet_pton(af, src_ptr, dest), ec); if (result <= 0 && !ec) ec = asio::error::invalid_argument; if (result > 0 && is_v6 && scope_id) { using namespace std; // For strchr and atoi. *scope_id = 0; if (if_name != 0) { in6_addr_type* ipv6_address = static_cast(dest); bool is_link_local = ((ipv6_address->s6_addr[0] == 0xfe) && ((ipv6_address->s6_addr[1] & 0xc0) == 0x80)); bool is_multicast_link_local = ((ipv6_address->s6_addr[0] == 0xff) && ((ipv6_address->s6_addr[1] & 0x0f) == 0x02)); if (is_link_local || is_multicast_link_local) *scope_id = if_nametoindex(if_name + 1); if (*scope_id == 0) *scope_id = atoi(if_name + 1); } } return result; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } int gethostname(char* name, int namelen, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS_RUNTIME) try { using namespace Windows::Foundation::Collections; using namespace Windows::Networking; using namespace Windows::Networking::Connectivity; IVectorView^ hostnames = NetworkInformation::GetHostNames(); for (unsigned i = 0; i < hostnames->Size; ++i) { HostName^ hostname = hostnames->GetAt(i); if (hostname->Type == HostNameType::DomainName) { std::wstring_convert> converter; std::string raw_name = converter.to_bytes(hostname->RawName->Data()); if (namelen > 0 && raw_name.size() < static_cast(namelen)) { strcpy_s(name, namelen, raw_name.c_str()); return 0; } } } return -1; } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); return -1; } #else // defined(ASIO_WINDOWS_RUNTIME) int result = error_wrapper(::gethostname(name, namelen), ec); # if defined(ASIO_WINDOWS) if (result == 0) ec = asio::error_code(); # endif // defined(ASIO_WINDOWS) return result; #endif // defined(ASIO_WINDOWS_RUNTIME) } #if !defined(ASIO_WINDOWS_RUNTIME) #if !defined(ASIO_HAS_GETADDRINFO) // The following functions are only needed for emulation of getaddrinfo and // getnameinfo. inline asio::error_code translate_netdb_error(int error) { switch (error) { case 0: return asio::error_code(); case HOST_NOT_FOUND: return asio::error::host_not_found; case TRY_AGAIN: return asio::error::host_not_found_try_again; case NO_RECOVERY: return asio::error::no_recovery; case NO_DATA: return asio::error::no_data; default: ASIO_ASSERT(false); return asio::error::invalid_argument; } } inline hostent* gethostbyaddr(const char* addr, int length, int af, hostent* result, char* buffer, int buflength, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) (void)(buffer); (void)(buflength); hostent* retval = error_wrapper(::gethostbyaddr(addr, length, af), ec); if (!retval) return 0; ec = asio::error_code(); *result = *retval; return retval; #elif defined(__sun) || defined(__QNX__) int error = 0; hostent* retval = error_wrapper(::gethostbyaddr_r(addr, length, af, result, buffer, buflength, &error), ec); if (error) ec = translate_netdb_error(error); return retval; #elif defined(__MACH__) && defined(__APPLE__) (void)(buffer); (void)(buflength); int error = 0; hostent* retval = error_wrapper(::getipnodebyaddr( addr, length, af, &error), ec); if (error) ec = translate_netdb_error(error); if (!retval) return 0; *result = *retval; return retval; #else hostent* retval = 0; int error = 0; error_wrapper(::gethostbyaddr_r(addr, length, af, result, buffer, buflength, &retval, &error), ec); if (error) ec = translate_netdb_error(error); return retval; #endif } inline hostent* gethostbyname(const char* name, int af, struct hostent* result, char* buffer, int buflength, int ai_flags, asio::error_code& ec) { clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) (void)(buffer); (void)(buflength); (void)(ai_flags); if (af != ASIO_OS_DEF(AF_INET)) { ec = asio::error::address_family_not_supported; return 0; } hostent* retval = error_wrapper(::gethostbyname(name), ec); if (!retval) return 0; ec = asio::error_code(); *result = *retval; return result; #elif defined(__sun) || defined(__QNX__) (void)(ai_flags); if (af != ASIO_OS_DEF(AF_INET)) { ec = asio::error::address_family_not_supported; return 0; } int error = 0; hostent* retval = error_wrapper(::gethostbyname_r(name, result, buffer, buflength, &error), ec); if (error) ec = translate_netdb_error(error); return retval; #elif defined(__MACH__) && defined(__APPLE__) (void)(buffer); (void)(buflength); int error = 0; hostent* retval = error_wrapper(::getipnodebyname( name, af, ai_flags, &error), ec); if (error) ec = translate_netdb_error(error); if (!retval) return 0; *result = *retval; return retval; #else (void)(ai_flags); if (af != ASIO_OS_DEF(AF_INET)) { ec = asio::error::address_family_not_supported; return 0; } hostent* retval = 0; int error = 0; error_wrapper(::gethostbyname_r(name, result, buffer, buflength, &retval, &error), ec); if (error) ec = translate_netdb_error(error); return retval; #endif } inline void freehostent(hostent* h) { #if defined(__MACH__) && defined(__APPLE__) if (h) ::freehostent(h); #else (void)(h); #endif } // Emulation of getaddrinfo based on implementation in: // Stevens, W. R., UNIX Network Programming Vol. 1, 2nd Ed., Prentice-Hall 1998. struct gai_search { const char* host; int family; }; inline int gai_nsearch(const char* host, const addrinfo_type* hints, gai_search (&search)[2]) { int search_count = 0; if (host == 0 || host[0] == '\0') { if (hints->ai_flags & AI_PASSIVE) { // No host and AI_PASSIVE implies wildcard bind. switch (hints->ai_family) { case ASIO_OS_DEF(AF_INET): search[search_count].host = "0.0.0.0"; search[search_count].family = ASIO_OS_DEF(AF_INET); ++search_count; break; case ASIO_OS_DEF(AF_INET6): search[search_count].host = "0::0"; search[search_count].family = ASIO_OS_DEF(AF_INET6); ++search_count; break; case ASIO_OS_DEF(AF_UNSPEC): search[search_count].host = "0::0"; search[search_count].family = ASIO_OS_DEF(AF_INET6); ++search_count; search[search_count].host = "0.0.0.0"; search[search_count].family = ASIO_OS_DEF(AF_INET); ++search_count; break; default: break; } } else { // No host and not AI_PASSIVE means connect to local host. switch (hints->ai_family) { case ASIO_OS_DEF(AF_INET): search[search_count].host = "localhost"; search[search_count].family = ASIO_OS_DEF(AF_INET); ++search_count; break; case ASIO_OS_DEF(AF_INET6): search[search_count].host = "localhost"; search[search_count].family = ASIO_OS_DEF(AF_INET6); ++search_count; break; case ASIO_OS_DEF(AF_UNSPEC): search[search_count].host = "localhost"; search[search_count].family = ASIO_OS_DEF(AF_INET6); ++search_count; search[search_count].host = "localhost"; search[search_count].family = ASIO_OS_DEF(AF_INET); ++search_count; break; default: break; } } } else { // Host is specified. switch (hints->ai_family) { case ASIO_OS_DEF(AF_INET): search[search_count].host = host; search[search_count].family = ASIO_OS_DEF(AF_INET); ++search_count; break; case ASIO_OS_DEF(AF_INET6): search[search_count].host = host; search[search_count].family = ASIO_OS_DEF(AF_INET6); ++search_count; break; case ASIO_OS_DEF(AF_UNSPEC): search[search_count].host = host; search[search_count].family = ASIO_OS_DEF(AF_INET6); ++search_count; search[search_count].host = host; search[search_count].family = ASIO_OS_DEF(AF_INET); ++search_count; break; default: break; } } return search_count; } template inline T* gai_alloc(std::size_t size = sizeof(T)) { using namespace std; T* p = static_cast(::operator new(size, std::nothrow)); if (p) memset(p, 0, size); return p; } inline void gai_free(void* p) { ::operator delete(p); } inline void gai_strcpy(char* target, const char* source, std::size_t max_size) { using namespace std; #if defined(ASIO_HAS_SECURE_RTL) strcpy_s(target, max_size, source); #else // defined(ASIO_HAS_SECURE_RTL) *target = 0; if (max_size > 0) strncat(target, source, max_size - 1); #endif // defined(ASIO_HAS_SECURE_RTL) } enum { gai_clone_flag = 1 << 30 }; inline int gai_aistruct(addrinfo_type*** next, const addrinfo_type* hints, const void* addr, int family) { using namespace std; addrinfo_type* ai = gai_alloc(); if (ai == 0) return EAI_MEMORY; ai->ai_next = 0; **next = ai; *next = &ai->ai_next; ai->ai_canonname = 0; ai->ai_socktype = hints->ai_socktype; if (ai->ai_socktype == 0) ai->ai_flags |= gai_clone_flag; ai->ai_protocol = hints->ai_protocol; ai->ai_family = family; switch (ai->ai_family) { case ASIO_OS_DEF(AF_INET): { sockaddr_in4_type* sinptr = gai_alloc(); if (sinptr == 0) return EAI_MEMORY; sinptr->sin_family = ASIO_OS_DEF(AF_INET); memcpy(&sinptr->sin_addr, addr, sizeof(in4_addr_type)); ai->ai_addr = reinterpret_cast(sinptr); ai->ai_addrlen = sizeof(sockaddr_in4_type); break; } case ASIO_OS_DEF(AF_INET6): { sockaddr_in6_type* sin6ptr = gai_alloc(); if (sin6ptr == 0) return EAI_MEMORY; sin6ptr->sin6_family = ASIO_OS_DEF(AF_INET6); memcpy(&sin6ptr->sin6_addr, addr, sizeof(in6_addr_type)); ai->ai_addr = reinterpret_cast(sin6ptr); ai->ai_addrlen = sizeof(sockaddr_in6_type); break; } default: break; } return 0; } inline addrinfo_type* gai_clone(addrinfo_type* ai) { using namespace std; addrinfo_type* new_ai = gai_alloc(); if (new_ai == 0) return new_ai; new_ai->ai_next = ai->ai_next; ai->ai_next = new_ai; new_ai->ai_flags = 0; new_ai->ai_family = ai->ai_family; new_ai->ai_socktype = ai->ai_socktype; new_ai->ai_protocol = ai->ai_protocol; new_ai->ai_canonname = 0; new_ai->ai_addrlen = ai->ai_addrlen; new_ai->ai_addr = gai_alloc(ai->ai_addrlen); memcpy(new_ai->ai_addr, ai->ai_addr, ai->ai_addrlen); return new_ai; } inline int gai_port(addrinfo_type* aihead, int port, int socktype) { int num_found = 0; for (addrinfo_type* ai = aihead; ai; ai = ai->ai_next) { if (ai->ai_flags & gai_clone_flag) { if (ai->ai_socktype != 0) { ai = gai_clone(ai); if (ai == 0) return -1; // ai now points to newly cloned entry. } } else if (ai->ai_socktype != socktype) { // Ignore if mismatch on socket type. continue; } ai->ai_socktype = socktype; switch (ai->ai_family) { case ASIO_OS_DEF(AF_INET): { sockaddr_in4_type* sinptr = reinterpret_cast(ai->ai_addr); sinptr->sin_port = port; ++num_found; break; } case ASIO_OS_DEF(AF_INET6): { sockaddr_in6_type* sin6ptr = reinterpret_cast(ai->ai_addr); sin6ptr->sin6_port = port; ++num_found; break; } default: break; } } return num_found; } inline int gai_serv(addrinfo_type* aihead, const addrinfo_type* hints, const char* serv) { using namespace std; int num_found = 0; if ( #if defined(AI_NUMERICSERV) (hints->ai_flags & AI_NUMERICSERV) || #endif isdigit(static_cast(serv[0]))) { int port = htons(atoi(serv)); if (hints->ai_socktype) { // Caller specifies socket type. int rc = gai_port(aihead, port, hints->ai_socktype); if (rc < 0) return EAI_MEMORY; num_found += rc; } else { // Caller does not specify socket type. int rc = gai_port(aihead, port, SOCK_STREAM); if (rc < 0) return EAI_MEMORY; num_found += rc; rc = gai_port(aihead, port, SOCK_DGRAM); if (rc < 0) return EAI_MEMORY; num_found += rc; } } else { // Try service name with TCP first, then UDP. if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_STREAM) { servent* sptr = getservbyname(serv, "tcp"); if (sptr != 0) { int rc = gai_port(aihead, sptr->s_port, SOCK_STREAM); if (rc < 0) return EAI_MEMORY; num_found += rc; } } if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_DGRAM) { servent* sptr = getservbyname(serv, "udp"); if (sptr != 0) { int rc = gai_port(aihead, sptr->s_port, SOCK_DGRAM); if (rc < 0) return EAI_MEMORY; num_found += rc; } } } if (num_found == 0) { if (hints->ai_socktype == 0) { // All calls to getservbyname() failed. return EAI_NONAME; } else { // Service not supported for socket type. return EAI_SERVICE; } } return 0; } inline int gai_echeck(const char* host, const char* service, int flags, int family, int socktype, int protocol) { (void)(flags); (void)(protocol); // Host or service must be specified. if (host == 0 || host[0] == '\0') if (service == 0 || service[0] == '\0') return EAI_NONAME; // Check combination of family and socket type. switch (family) { case ASIO_OS_DEF(AF_UNSPEC): break; case ASIO_OS_DEF(AF_INET): case ASIO_OS_DEF(AF_INET6): if (service != 0 && service[0] != '\0') if (socktype != 0 && socktype != SOCK_STREAM && socktype != SOCK_DGRAM) return EAI_SOCKTYPE; break; default: return EAI_FAMILY; } return 0; } inline void freeaddrinfo_emulation(addrinfo_type* aihead) { addrinfo_type* ai = aihead; while (ai) { gai_free(ai->ai_addr); gai_free(ai->ai_canonname); addrinfo_type* ainext = ai->ai_next; gai_free(ai); ai = ainext; } } inline int getaddrinfo_emulation(const char* host, const char* service, const addrinfo_type* hintsp, addrinfo_type** result) { // Set up linked list of addrinfo structures. addrinfo_type* aihead = 0; addrinfo_type** ainext = &aihead; char* canon = 0; // Supply default hints if not specified by caller. addrinfo_type hints = addrinfo_type(); hints.ai_family = ASIO_OS_DEF(AF_UNSPEC); if (hintsp) hints = *hintsp; // If the resolution is not specifically for AF_INET6, remove the AI_V4MAPPED // and AI_ALL flags. #if defined(AI_V4MAPPED) if (hints.ai_family != ASIO_OS_DEF(AF_INET6)) hints.ai_flags &= ~AI_V4MAPPED; #endif #if defined(AI_ALL) if (hints.ai_family != ASIO_OS_DEF(AF_INET6)) hints.ai_flags &= ~AI_ALL; #endif // Basic error checking. int rc = gai_echeck(host, service, hints.ai_flags, hints.ai_family, hints.ai_socktype, hints.ai_protocol); if (rc != 0) { freeaddrinfo_emulation(aihead); return rc; } gai_search search[2]; int search_count = gai_nsearch(host, &hints, search); for (gai_search* sptr = search; sptr < search + search_count; ++sptr) { // Check for IPv4 dotted decimal string. in4_addr_type inaddr; asio::error_code ec; if (socket_ops::inet_pton(ASIO_OS_DEF(AF_INET), sptr->host, &inaddr, 0, ec) == 1) { if (hints.ai_family != ASIO_OS_DEF(AF_UNSPEC) && hints.ai_family != ASIO_OS_DEF(AF_INET)) { freeaddrinfo_emulation(aihead); gai_free(canon); return EAI_FAMILY; } if (sptr->family == ASIO_OS_DEF(AF_INET)) { rc = gai_aistruct(&ainext, &hints, &inaddr, ASIO_OS_DEF(AF_INET)); if (rc != 0) { freeaddrinfo_emulation(aihead); gai_free(canon); return rc; } } continue; } // Check for IPv6 hex string. in6_addr_type in6addr; if (socket_ops::inet_pton(ASIO_OS_DEF(AF_INET6), sptr->host, &in6addr, 0, ec) == 1) { if (hints.ai_family != ASIO_OS_DEF(AF_UNSPEC) && hints.ai_family != ASIO_OS_DEF(AF_INET6)) { freeaddrinfo_emulation(aihead); gai_free(canon); return EAI_FAMILY; } if (sptr->family == ASIO_OS_DEF(AF_INET6)) { rc = gai_aistruct(&ainext, &hints, &in6addr, ASIO_OS_DEF(AF_INET6)); if (rc != 0) { freeaddrinfo_emulation(aihead); gai_free(canon); return rc; } } continue; } // Look up hostname. hostent hent; char hbuf[8192] = ""; hostent* hptr = socket_ops::gethostbyname(sptr->host, sptr->family, &hent, hbuf, sizeof(hbuf), hints.ai_flags, ec); if (hptr == 0) { if (search_count == 2) { // Failure is OK if there are multiple searches. continue; } freeaddrinfo_emulation(aihead); gai_free(canon); if (ec == asio::error::host_not_found) return EAI_NONAME; if (ec == asio::error::host_not_found_try_again) return EAI_AGAIN; if (ec == asio::error::no_recovery) return EAI_FAIL; if (ec == asio::error::no_data) return EAI_NONAME; return EAI_NONAME; } // Check for address family mismatch if one was specified. if (hints.ai_family != ASIO_OS_DEF(AF_UNSPEC) && hints.ai_family != hptr->h_addrtype) { freeaddrinfo_emulation(aihead); gai_free(canon); socket_ops::freehostent(hptr); return EAI_FAMILY; } // Save canonical name first time. if (host != 0 && host[0] != '\0' && hptr->h_name && hptr->h_name[0] && (hints.ai_flags & AI_CANONNAME) && canon == 0) { std::size_t canon_len = strlen(hptr->h_name) + 1; canon = gai_alloc(canon_len); if (canon == 0) { freeaddrinfo_emulation(aihead); socket_ops::freehostent(hptr); return EAI_MEMORY; } gai_strcpy(canon, hptr->h_name, canon_len); } // Create an addrinfo structure for each returned address. for (char** ap = hptr->h_addr_list; *ap; ++ap) { rc = gai_aistruct(&ainext, &hints, *ap, hptr->h_addrtype); if (rc != 0) { freeaddrinfo_emulation(aihead); gai_free(canon); socket_ops::freehostent(hptr); return EAI_FAMILY; } } socket_ops::freehostent(hptr); } // Check if we found anything. if (aihead == 0) { gai_free(canon); return EAI_NONAME; } // Return canonical name in first entry. if (host != 0 && host[0] != '\0' && (hints.ai_flags & AI_CANONNAME)) { if (canon) { aihead->ai_canonname = canon; canon = 0; } else { std::size_t canonname_len = strlen(search[0].host) + 1; aihead->ai_canonname = gai_alloc(canonname_len); if (aihead->ai_canonname == 0) { freeaddrinfo_emulation(aihead); return EAI_MEMORY; } gai_strcpy(aihead->ai_canonname, search[0].host, canonname_len); } } gai_free(canon); // Process the service name. if (service != 0 && service[0] != '\0') { rc = gai_serv(aihead, &hints, service); if (rc != 0) { freeaddrinfo_emulation(aihead); return rc; } } // Return result to caller. *result = aihead; return 0; } inline asio::error_code getnameinfo_emulation( const socket_addr_type* sa, std::size_t salen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int flags, asio::error_code& ec) { using namespace std; const char* addr; size_t addr_len; unsigned short port; switch (sa->sa_family) { case ASIO_OS_DEF(AF_INET): if (salen != sizeof(sockaddr_in4_type)) { return ec = asio::error::invalid_argument; } addr = reinterpret_cast( &reinterpret_cast(sa)->sin_addr); addr_len = sizeof(in4_addr_type); port = reinterpret_cast(sa)->sin_port; break; case ASIO_OS_DEF(AF_INET6): if (salen != sizeof(sockaddr_in6_type)) { return ec = asio::error::invalid_argument; } addr = reinterpret_cast( &reinterpret_cast(sa)->sin6_addr); addr_len = sizeof(in6_addr_type); port = reinterpret_cast(sa)->sin6_port; break; default: return ec = asio::error::address_family_not_supported; } if (host && hostlen > 0) { if (flags & NI_NUMERICHOST) { if (socket_ops::inet_ntop(sa->sa_family, addr, host, hostlen, 0, ec) == 0) { return ec; } } else { hostent hent; char hbuf[8192] = ""; hostent* hptr = socket_ops::gethostbyaddr(addr, static_cast(addr_len), sa->sa_family, &hent, hbuf, sizeof(hbuf), ec); if (hptr && hptr->h_name && hptr->h_name[0] != '\0') { if (flags & NI_NOFQDN) { char* dot = strchr(hptr->h_name, '.'); if (dot) { *dot = 0; } } gai_strcpy(host, hptr->h_name, hostlen); socket_ops::freehostent(hptr); } else { socket_ops::freehostent(hptr); if (flags & NI_NAMEREQD) { return ec = asio::error::host_not_found; } if (socket_ops::inet_ntop(sa->sa_family, addr, host, hostlen, 0, ec) == 0) { return ec; } } } } if (serv && servlen > 0) { if (flags & NI_NUMERICSERV) { if (servlen < 6) { return ec = asio::error::no_buffer_space; } #if defined(ASIO_HAS_SECURE_RTL) sprintf_s(serv, servlen, "%u", ntohs(port)); #else // defined(ASIO_HAS_SECURE_RTL) sprintf(serv, "%u", ntohs(port)); #endif // defined(ASIO_HAS_SECURE_RTL) } else { #if defined(ASIO_HAS_PTHREADS) static ::pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; ::pthread_mutex_lock(&mutex); #endif // defined(ASIO_HAS_PTHREADS) servent* sptr = ::getservbyport(port, (flags & NI_DGRAM) ? "udp" : 0); if (sptr && sptr->s_name && sptr->s_name[0] != '\0') { gai_strcpy(serv, sptr->s_name, servlen); } else { if (servlen < 6) { return ec = asio::error::no_buffer_space; } #if defined(ASIO_HAS_SECURE_RTL) sprintf_s(serv, servlen, "%u", ntohs(port)); #else // defined(ASIO_HAS_SECURE_RTL) sprintf(serv, "%u", ntohs(port)); #endif // defined(ASIO_HAS_SECURE_RTL) } #if defined(ASIO_HAS_PTHREADS) ::pthread_mutex_unlock(&mutex); #endif // defined(ASIO_HAS_PTHREADS) } } ec = asio::error_code(); return ec; } #endif // !defined(ASIO_HAS_GETADDRINFO) inline asio::error_code translate_addrinfo_error(int error) { switch (error) { case 0: return asio::error_code(); case EAI_AGAIN: return asio::error::host_not_found_try_again; case EAI_BADFLAGS: return asio::error::invalid_argument; case EAI_FAIL: return asio::error::no_recovery; case EAI_FAMILY: return asio::error::address_family_not_supported; case EAI_MEMORY: return asio::error::no_memory; case EAI_NONAME: #if defined(EAI_ADDRFAMILY) case EAI_ADDRFAMILY: #endif #if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME) case EAI_NODATA: #endif return asio::error::host_not_found; case EAI_SERVICE: return asio::error::service_not_found; case EAI_SOCKTYPE: return asio::error::socket_type_not_supported; default: // Possibly the non-portable EAI_SYSTEM. #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) return asio::error_code( WSAGetLastError(), asio::error::get_system_category()); #else return asio::error_code( errno, asio::error::get_system_category()); #endif } } asio::error_code getaddrinfo(const char* host, const char* service, const addrinfo_type& hints, addrinfo_type** result, asio::error_code& ec) { host = (host && *host) ? host : 0; service = (service && *service) ? service : 0; clear_last_error(); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(ASIO_HAS_GETADDRINFO) // Building for Windows XP, Windows Server 2003, or later. int error = ::getaddrinfo(host, service, &hints, result); return ec = translate_addrinfo_error(error); # else // Building for Windows 2000 or earlier. typedef int (WSAAPI *gai_t)(const char*, const char*, const addrinfo_type*, addrinfo_type**); if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) { if (gai_t gai = (gai_t)::GetProcAddress(winsock_module, "getaddrinfo")) { int error = gai(host, service, &hints, result); return ec = translate_addrinfo_error(error); } } int error = getaddrinfo_emulation(host, service, &hints, result); return ec = translate_addrinfo_error(error); # endif #elif !defined(ASIO_HAS_GETADDRINFO) int error = getaddrinfo_emulation(host, service, &hints, result); return ec = translate_addrinfo_error(error); #else int error = ::getaddrinfo(host, service, &hints, result); #if defined(__MACH__) && defined(__APPLE__) using namespace std; // For isdigit and atoi. if (error == 0 && service && isdigit(static_cast(service[0]))) { u_short_type port = host_to_network_short(atoi(service)); for (addrinfo_type* ai = *result; ai; ai = ai->ai_next) { switch (ai->ai_family) { case ASIO_OS_DEF(AF_INET): { sockaddr_in4_type* sinptr = reinterpret_cast(ai->ai_addr); if (sinptr->sin_port == 0) sinptr->sin_port = port; break; } case ASIO_OS_DEF(AF_INET6): { sockaddr_in6_type* sin6ptr = reinterpret_cast(ai->ai_addr); if (sin6ptr->sin6_port == 0) sin6ptr->sin6_port = port; break; } default: break; } } } #endif return ec = translate_addrinfo_error(error); #endif } asio::error_code background_getaddrinfo( const weak_cancel_token_type& cancel_token, const char* host, const char* service, const addrinfo_type& hints, addrinfo_type** result, asio::error_code& ec) { if (cancel_token.expired()) ec = asio::error::operation_aborted; else socket_ops::getaddrinfo(host, service, hints, result, ec); return ec; } void freeaddrinfo(addrinfo_type* ai) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(ASIO_HAS_GETADDRINFO) // Building for Windows XP, Windows Server 2003, or later. ::freeaddrinfo(ai); # else // Building for Windows 2000 or earlier. typedef int (WSAAPI *fai_t)(addrinfo_type*); if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) { if (fai_t fai = (fai_t)::GetProcAddress(winsock_module, "freeaddrinfo")) { fai(ai); return; } } freeaddrinfo_emulation(ai); # endif #elif !defined(ASIO_HAS_GETADDRINFO) freeaddrinfo_emulation(ai); #else ::freeaddrinfo(ai); #endif } asio::error_code getnameinfo(const socket_addr_type* addr, std::size_t addrlen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int flags, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(ASIO_HAS_GETADDRINFO) // Building for Windows XP, Windows Server 2003, or later. clear_last_error(); int error = ::getnameinfo(addr, static_cast(addrlen), host, static_cast(hostlen), serv, static_cast(servlen), flags); return ec = translate_addrinfo_error(error); # else // Building for Windows 2000 or earlier. typedef int (WSAAPI *gni_t)(const socket_addr_type*, int, char*, DWORD, char*, DWORD, int); if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) { if (gni_t gni = (gni_t)::GetProcAddress(winsock_module, "getnameinfo")) { clear_last_error(); int error = gni(addr, static_cast(addrlen), host, static_cast(hostlen), serv, static_cast(servlen), flags); return ec = translate_addrinfo_error(error); } } clear_last_error(); return getnameinfo_emulation(addr, addrlen, host, hostlen, serv, servlen, flags, ec); # endif #elif !defined(ASIO_HAS_GETADDRINFO) using namespace std; // For memcpy. sockaddr_storage_type tmp_addr; memcpy(&tmp_addr, addr, addrlen); addr = reinterpret_cast(&tmp_addr); clear_last_error(); return getnameinfo_emulation(addr, addrlen, host, hostlen, serv, servlen, flags, ec); #else clear_last_error(); int error = ::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags); return ec = translate_addrinfo_error(error); #endif } asio::error_code sync_getnameinfo( const socket_addr_type* addr, std::size_t addrlen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int sock_type, asio::error_code& ec) { // First try resolving with the service name. If that fails try resolving // but allow the service to be returned as a number. int flags = (sock_type == SOCK_DGRAM) ? NI_DGRAM : 0; socket_ops::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags, ec); if (ec) { socket_ops::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags | NI_NUMERICSERV, ec); } return ec; } asio::error_code background_getnameinfo( const weak_cancel_token_type& cancel_token, const socket_addr_type* addr, std::size_t addrlen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int sock_type, asio::error_code& ec) { if (cancel_token.expired()) { ec = asio::error::operation_aborted; } else { // First try resolving with the service name. If that fails try resolving // but allow the service to be returned as a number. int flags = (sock_type == SOCK_DGRAM) ? NI_DGRAM : 0; socket_ops::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags, ec); if (ec) { socket_ops::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags | NI_NUMERICSERV, ec); } } return ec; } #endif // !defined(ASIO_WINDOWS_RUNTIME) u_long_type network_to_host_long(u_long_type value) { #if defined(ASIO_WINDOWS_RUNTIME) unsigned char* value_p = reinterpret_cast(&value); u_long_type result = (static_cast(value_p[0]) << 24) | (static_cast(value_p[1]) << 16) | (static_cast(value_p[2]) << 8) | static_cast(value_p[3]); return result; #else // defined(ASIO_WINDOWS_RUNTIME) return ntohl(value); #endif // defined(ASIO_WINDOWS_RUNTIME) } u_long_type host_to_network_long(u_long_type value) { #if defined(ASIO_WINDOWS_RUNTIME) u_long_type result; unsigned char* result_p = reinterpret_cast(&result); result_p[0] = static_cast((value >> 24) & 0xFF); result_p[1] = static_cast((value >> 16) & 0xFF); result_p[2] = static_cast((value >> 8) & 0xFF); result_p[3] = static_cast(value & 0xFF); return result; #else // defined(ASIO_WINDOWS_RUNTIME) return htonl(value); #endif // defined(ASIO_WINDOWS_RUNTIME) } u_short_type network_to_host_short(u_short_type value) { #if defined(ASIO_WINDOWS_RUNTIME) unsigned char* value_p = reinterpret_cast(&value); u_short_type result = (static_cast(value_p[0]) << 8) | static_cast(value_p[1]); return result; #else // defined(ASIO_WINDOWS_RUNTIME) return ntohs(value); #endif // defined(ASIO_WINDOWS_RUNTIME) } u_short_type host_to_network_short(u_short_type value) { #if defined(ASIO_WINDOWS_RUNTIME) u_short_type result; unsigned char* result_p = reinterpret_cast(&result); result_p[0] = static_cast((value >> 8) & 0xFF); result_p[1] = static_cast(value & 0xFF); return result; #else // defined(ASIO_WINDOWS_RUNTIME) return htons(value); #endif // defined(ASIO_WINDOWS_RUNTIME) } } // namespace socket_ops } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SOCKET_OPS_IPP asio-1.12.2/include/asio/detail/impl/socket_select_interrupter.ipp000066400000000000000000000126071340672067200253320ustar00rootroot00000000000000// // detail/impl/socket_select_interrupter.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_SOCKET_SELECT_INTERRUPTER_IPP #define ASIO_DETAIL_IMPL_SOCKET_SELECT_INTERRUPTER_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS_RUNTIME) #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) #include #include "asio/detail/socket_holder.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_select_interrupter.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { socket_select_interrupter::socket_select_interrupter() { open_descriptors(); } void socket_select_interrupter::open_descriptors() { asio::error_code ec; socket_holder acceptor(socket_ops::socket( AF_INET, SOCK_STREAM, IPPROTO_TCP, ec)); if (acceptor.get() == invalid_socket) asio::detail::throw_error(ec, "socket_select_interrupter"); int opt = 1; socket_ops::state_type acceptor_state = 0; socket_ops::setsockopt(acceptor.get(), acceptor_state, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt), ec); using namespace std; // For memset. sockaddr_in4_type addr; std::size_t addr_len = sizeof(addr); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = socket_ops::host_to_network_long(INADDR_LOOPBACK); addr.sin_port = 0; if (socket_ops::bind(acceptor.get(), (const socket_addr_type*)&addr, addr_len, ec) == socket_error_retval) asio::detail::throw_error(ec, "socket_select_interrupter"); if (socket_ops::getsockname(acceptor.get(), (socket_addr_type*)&addr, &addr_len, ec) == socket_error_retval) asio::detail::throw_error(ec, "socket_select_interrupter"); // Some broken firewalls on Windows will intermittently cause getsockname to // return 0.0.0.0 when the socket is actually bound to 127.0.0.1. We // explicitly specify the target address here to work around this problem. if (addr.sin_addr.s_addr == socket_ops::host_to_network_long(INADDR_ANY)) addr.sin_addr.s_addr = socket_ops::host_to_network_long(INADDR_LOOPBACK); if (socket_ops::listen(acceptor.get(), SOMAXCONN, ec) == socket_error_retval) asio::detail::throw_error(ec, "socket_select_interrupter"); socket_holder client(socket_ops::socket( AF_INET, SOCK_STREAM, IPPROTO_TCP, ec)); if (client.get() == invalid_socket) asio::detail::throw_error(ec, "socket_select_interrupter"); if (socket_ops::connect(client.get(), (const socket_addr_type*)&addr, addr_len, ec) == socket_error_retval) asio::detail::throw_error(ec, "socket_select_interrupter"); socket_holder server(socket_ops::accept(acceptor.get(), 0, 0, ec)); if (server.get() == invalid_socket) asio::detail::throw_error(ec, "socket_select_interrupter"); ioctl_arg_type non_blocking = 1; socket_ops::state_type client_state = 0; if (socket_ops::ioctl(client.get(), client_state, FIONBIO, &non_blocking, ec)) asio::detail::throw_error(ec, "socket_select_interrupter"); opt = 1; socket_ops::setsockopt(client.get(), client_state, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt), ec); non_blocking = 1; socket_ops::state_type server_state = 0; if (socket_ops::ioctl(server.get(), server_state, FIONBIO, &non_blocking, ec)) asio::detail::throw_error(ec, "socket_select_interrupter"); opt = 1; socket_ops::setsockopt(server.get(), server_state, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt), ec); read_descriptor_ = server.release(); write_descriptor_ = client.release(); } socket_select_interrupter::~socket_select_interrupter() { close_descriptors(); } void socket_select_interrupter::close_descriptors() { asio::error_code ec; socket_ops::state_type state = socket_ops::internal_non_blocking; if (read_descriptor_ != invalid_socket) socket_ops::close(read_descriptor_, state, true, ec); if (write_descriptor_ != invalid_socket) socket_ops::close(write_descriptor_, state, true, ec); } void socket_select_interrupter::recreate() { close_descriptors(); write_descriptor_ = invalid_socket; read_descriptor_ = invalid_socket; open_descriptors(); } void socket_select_interrupter::interrupt() { char byte = 0; socket_ops::buf b; socket_ops::init_buf(b, &byte, 1); asio::error_code ec; socket_ops::send(write_descriptor_, &b, 1, 0, ec); } bool socket_select_interrupter::reset() { char data[1024]; socket_ops::buf b; socket_ops::init_buf(b, data, sizeof(data)); asio::error_code ec; int bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0, ec); bool was_interrupted = (bytes_read > 0); while (bytes_read == sizeof(data)) bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0, ec); return was_interrupted; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_SOCKET_SELECT_INTERRUPTER_IPP asio-1.12.2/include/asio/detail/impl/strand_executor_service.hpp000066400000000000000000000127541340672067200247730ustar00rootroot00000000000000// // detail/impl/strand_executor_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP #define ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/call_stack.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/recycling_allocator.hpp" #include "asio/executor_work_guard.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class strand_executor_service::invoker { public: invoker(const implementation_type& impl, Executor& ex) : impl_(impl), work_(ex) { } invoker(const invoker& other) : impl_(other.impl_), work_(other.work_) { } #if defined(ASIO_HAS_MOVE) invoker(invoker&& other) : impl_(ASIO_MOVE_CAST(implementation_type)(other.impl_)), work_(ASIO_MOVE_CAST(executor_work_guard)(other.work_)) { } #endif // defined(ASIO_HAS_MOVE) struct on_invoker_exit { invoker* this_; ~on_invoker_exit() { this_->impl_->mutex_->lock(); this_->impl_->ready_queue_.push(this_->impl_->waiting_queue_); bool more_handlers = this_->impl_->locked_ = !this_->impl_->ready_queue_.empty(); this_->impl_->mutex_->unlock(); if (more_handlers) { Executor ex(this_->work_.get_executor()); recycling_allocator allocator; ex.post(ASIO_MOVE_CAST(invoker)(*this_), allocator); } } }; void operator()() { // Indicate that this strand is executing on the current thread. call_stack::context ctx(impl_.get()); // Ensure the next handler, if any, is scheduled on block exit. on_invoker_exit on_exit = { this }; (void)on_exit; // Run all ready handlers. No lock is required since the ready queue is // accessed only within the strand. asio::error_code ec; while (scheduler_operation* o = impl_->ready_queue_.front()) { impl_->ready_queue_.pop(); o->complete(impl_.get(), ec, 0); } } private: implementation_type impl_; executor_work_guard work_; }; template void strand_executor_service::dispatch(const implementation_type& impl, Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a) { typedef typename decay::type function_type; // If we are already in the strand then the function can run immediately. if (call_stack::contains(impl.get())) { // Make a local, non-const copy of the function. function_type tmp(ASIO_MOVE_CAST(Function)(function)); fenced_block b(fenced_block::full); asio_handler_invoke_helpers::invoke(tmp, tmp); return; } // Allocate and construct an operation to wrap the function. typedef executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(function), a); ASIO_HANDLER_CREATION((impl->service_->context(), *p.p, "strand_executor", impl.get(), 0, "dispatch")); // Add the function to the strand and schedule the strand if required. bool first = enqueue(impl, p.p); p.v = p.p = 0; if (first) ex.dispatch(invoker(impl, ex), a); } // Request invocation of the given function and return immediately. template void strand_executor_service::post(const implementation_type& impl, Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a) { typedef typename decay::type function_type; // Allocate and construct an operation to wrap the function. typedef executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(function), a); ASIO_HANDLER_CREATION((impl->service_->context(), *p.p, "strand_executor", impl.get(), 0, "post")); // Add the function to the strand and schedule the strand if required. bool first = enqueue(impl, p.p); p.v = p.p = 0; if (first) ex.post(invoker(impl, ex), a); } // Request invocation of the given function and return immediately. template void strand_executor_service::defer(const implementation_type& impl, Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a) { typedef typename decay::type function_type; // Allocate and construct an operation to wrap the function. typedef executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(function), a); ASIO_HANDLER_CREATION((impl->service_->context(), *p.p, "strand_executor", impl.get(), 0, "defer")); // Add the function to the strand and schedule the strand if required. bool first = enqueue(impl, p.p); p.v = p.p = 0; if (first) ex.defer(invoker(impl, ex), a); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP asio-1.12.2/include/asio/detail/impl/strand_executor_service.ipp000066400000000000000000000067171340672067200247760ustar00rootroot00000000000000// // detail/impl/strand_executor_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP #define ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/strand_executor_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { strand_executor_service::strand_executor_service(execution_context& ctx) : execution_context_service_base(ctx), mutex_(), salt_(0), impl_list_(0) { } void strand_executor_service::shutdown() { op_queue ops; asio::detail::mutex::scoped_lock lock(mutex_); strand_impl* impl = impl_list_; while (impl) { impl->mutex_->lock(); impl->shutdown_ = true; ops.push(impl->waiting_queue_); ops.push(impl->ready_queue_); impl->mutex_->unlock(); impl = impl->next_; } } strand_executor_service::implementation_type strand_executor_service::create_implementation() { implementation_type new_impl(new strand_impl); new_impl->locked_ = false; new_impl->shutdown_ = false; asio::detail::mutex::scoped_lock lock(mutex_); // Select a mutex from the pool of shared mutexes. std::size_t salt = salt_++; std::size_t mutex_index = reinterpret_cast(new_impl.get()); mutex_index += (reinterpret_cast(new_impl.get()) >> 3); mutex_index ^= salt + 0x9e3779b9 + (mutex_index << 6) + (mutex_index >> 2); mutex_index = mutex_index % num_mutexes; if (!mutexes_[mutex_index].get()) mutexes_[mutex_index].reset(new mutex); new_impl->mutex_ = mutexes_[mutex_index].get(); // Insert implementation into linked list of all implementations. new_impl->next_ = impl_list_; new_impl->prev_ = 0; if (impl_list_) impl_list_->prev_ = new_impl.get(); impl_list_ = new_impl.get(); new_impl->service_ = this; return new_impl; } strand_executor_service::strand_impl::~strand_impl() { asio::detail::mutex::scoped_lock lock(service_->mutex_); // Remove implementation from linked list of all implementations. if (service_->impl_list_ == this) service_->impl_list_ = next_; if (prev_) prev_->next_ = next_; if (next_) next_->prev_= prev_; } bool strand_executor_service::enqueue(const implementation_type& impl, scheduler_operation* op) { impl->mutex_->lock(); if (impl->shutdown_) { impl->mutex_->unlock(); op->destroy(); return false; } else if (impl->locked_) { // Some other function already holds the strand lock. Enqueue for later. impl->waiting_queue_.push(op); impl->mutex_->unlock(); return false; } else { // The function is acquiring the strand lock and so is responsible for // scheduling the strand. impl->locked_ = true; impl->mutex_->unlock(); impl->ready_queue_.push(op); return true; } } bool strand_executor_service::running_in_this_thread( const implementation_type& impl) { return !!call_stack::contains(impl.get()); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/strand_service.hpp000066400000000000000000000063761340672067200230600ustar00rootroot00000000000000// // detail/impl/strand_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_STRAND_SERVICE_HPP #define ASIO_DETAIL_IMPL_STRAND_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/call_stack.hpp" #include "asio/detail/completion_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { inline strand_service::strand_impl::strand_impl() : operation(&strand_service::do_complete), locked_(false) { } struct strand_service::on_dispatch_exit { io_context_impl* io_context_; strand_impl* impl_; ~on_dispatch_exit() { impl_->mutex_.lock(); impl_->ready_queue_.push(impl_->waiting_queue_); bool more_handlers = impl_->locked_ = !impl_->ready_queue_.empty(); impl_->mutex_.unlock(); if (more_handlers) io_context_->post_immediate_completion(impl_, false); } }; template void strand_service::dispatch(strand_service::implementation_type& impl, Handler& handler) { // If we are already in the strand then the handler can run immediately. if (call_stack::contains(impl)) { fenced_block b(fenced_block::full); asio_handler_invoke_helpers::invoke(handler, handler); return; } // Allocate and construct an operation to wrap the handler. typedef completion_handler op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((this->context(), *p.p, "strand", impl, 0, "dispatch")); bool dispatch_immediately = do_dispatch(impl, p.p); operation* o = p.p; p.v = p.p = 0; if (dispatch_immediately) { // Indicate that this strand is executing on the current thread. call_stack::context ctx(impl); // Ensure the next handler, if any, is scheduled on block exit. on_dispatch_exit on_exit = { &io_context_, impl }; (void)on_exit; completion_handler::do_complete( &io_context_, o, asio::error_code(), 0); } } // Request the io_context to invoke the given handler and return immediately. template void strand_service::post(strand_service::implementation_type& impl, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef completion_handler op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((this->context(), *p.p, "strand", impl, 0, "post")); do_post(impl, p.p, is_continuation); p.v = p.p = 0; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_STRAND_SERVICE_HPP asio-1.12.2/include/asio/detail/impl/strand_service.ipp000066400000000000000000000113471340672067200230530ustar00rootroot00000000000000// // detail/impl/strand_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_STRAND_SERVICE_IPP #define ASIO_DETAIL_IMPL_STRAND_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/call_stack.hpp" #include "asio/detail/strand_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct strand_service::on_do_complete_exit { io_context_impl* owner_; strand_impl* impl_; ~on_do_complete_exit() { impl_->mutex_.lock(); impl_->ready_queue_.push(impl_->waiting_queue_); bool more_handlers = impl_->locked_ = !impl_->ready_queue_.empty(); impl_->mutex_.unlock(); if (more_handlers) owner_->post_immediate_completion(impl_, true); } }; strand_service::strand_service(asio::io_context& io_context) : asio::detail::service_base(io_context), io_context_(asio::use_service(io_context)), mutex_(), salt_(0) { } void strand_service::shutdown() { op_queue ops; asio::detail::mutex::scoped_lock lock(mutex_); for (std::size_t i = 0; i < num_implementations; ++i) { if (strand_impl* impl = implementations_[i].get()) { ops.push(impl->waiting_queue_); ops.push(impl->ready_queue_); } } } void strand_service::construct(strand_service::implementation_type& impl) { asio::detail::mutex::scoped_lock lock(mutex_); std::size_t salt = salt_++; #if defined(ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) std::size_t index = salt; #else // defined(ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) std::size_t index = reinterpret_cast(&impl); index += (reinterpret_cast(&impl) >> 3); index ^= salt + 0x9e3779b9 + (index << 6) + (index >> 2); #endif // defined(ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) index = index % num_implementations; if (!implementations_[index].get()) implementations_[index].reset(new strand_impl); impl = implementations_[index].get(); } bool strand_service::running_in_this_thread( const implementation_type& impl) const { return call_stack::contains(impl) != 0; } bool strand_service::do_dispatch(implementation_type& impl, operation* op) { // If we are running inside the io_context, and no other handler already // holds the strand lock, then the handler can run immediately. bool can_dispatch = io_context_.can_dispatch(); impl->mutex_.lock(); if (can_dispatch && !impl->locked_) { // Immediate invocation is allowed. impl->locked_ = true; impl->mutex_.unlock(); return true; } if (impl->locked_) { // Some other handler already holds the strand lock. Enqueue for later. impl->waiting_queue_.push(op); impl->mutex_.unlock(); } else { // The handler is acquiring the strand lock and so is responsible for // scheduling the strand. impl->locked_ = true; impl->mutex_.unlock(); impl->ready_queue_.push(op); io_context_.post_immediate_completion(impl, false); } return false; } void strand_service::do_post(implementation_type& impl, operation* op, bool is_continuation) { impl->mutex_.lock(); if (impl->locked_) { // Some other handler already holds the strand lock. Enqueue for later. impl->waiting_queue_.push(op); impl->mutex_.unlock(); } else { // The handler is acquiring the strand lock and so is responsible for // scheduling the strand. impl->locked_ = true; impl->mutex_.unlock(); impl->ready_queue_.push(op); io_context_.post_immediate_completion(impl, is_continuation); } } void strand_service::do_complete(void* owner, operation* base, const asio::error_code& ec, std::size_t /*bytes_transferred*/) { if (owner) { strand_impl* impl = static_cast(base); // Indicate that this strand is executing on the current thread. call_stack::context ctx(impl); // Ensure the next handler, if any, is scheduled on block exit. on_do_complete_exit on_exit; on_exit.owner_ = static_cast(owner); on_exit.impl_ = impl; // Run all ready handlers. No lock is required since the ready queue is // accessed only within the strand. while (operation* o = impl->ready_queue_.front()) { impl->ready_queue_.pop(); o->complete(owner, ec, 0); } } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_STRAND_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/throw_error.ipp000066400000000000000000000035121340672067200224070ustar00rootroot00000000000000// // detail/impl/throw_error.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_THROW_ERROR_IPP #define ASIO_DETAIL_IMPL_THROW_ERROR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/system_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { void do_throw_error(const asio::error_code& err) { asio::system_error e(err); asio::detail::throw_exception(e); } void do_throw_error(const asio::error_code& err, const char* location) { // boostify: non-boost code starts here #if defined(ASIO_MSVC) && defined(ASIO_HAS_STD_SYSTEM_ERROR) // Microsoft's implementation of std::system_error is non-conformant in that // it ignores the error code's message when a "what" string is supplied. We'll // work around this by explicitly formatting the "what" string. std::string what_msg = location; what_msg += ": "; what_msg += err.message(); asio::system_error e(err, what_msg); asio::detail::throw_exception(e); #else // defined(ASIO_MSVC) && defined(ASIO_HAS_STD_SYSTEM_ERROR) // boostify: non-boost code ends here asio::system_error e(err, location); asio::detail::throw_exception(e); // boostify: non-boost code starts here #endif // defined(ASIO_MSVC) && defined(ASIO_HAS_STD_SYSTEM_ERROR) // boostify: non-boost code ends here } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_THROW_ERROR_IPP asio-1.12.2/include/asio/detail/impl/timer_queue_ptime.ipp000066400000000000000000000044151340672067200235600ustar00rootroot00000000000000// // detail/impl/timer_queue_ptime.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_TIMER_QUEUE_PTIME_IPP #define ASIO_DETAIL_IMPL_TIMER_QUEUE_PTIME_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_DATE_TIME) #include "asio/detail/timer_queue_ptime.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { timer_queue >::timer_queue() { } timer_queue >::~timer_queue() { } bool timer_queue >::enqueue_timer( const time_type& time, per_timer_data& timer, wait_op* op) { return impl_.enqueue_timer(time, timer, op); } bool timer_queue >::empty() const { return impl_.empty(); } long timer_queue >::wait_duration_msec( long max_duration) const { return impl_.wait_duration_msec(max_duration); } long timer_queue >::wait_duration_usec( long max_duration) const { return impl_.wait_duration_usec(max_duration); } void timer_queue >::get_ready_timers( op_queue& ops) { impl_.get_ready_timers(ops); } void timer_queue >::get_all_timers( op_queue& ops) { impl_.get_all_timers(ops); } std::size_t timer_queue >::cancel_timer( per_timer_data& timer, op_queue& ops, std::size_t max_cancelled) { return impl_.cancel_timer(timer, ops, max_cancelled); } void timer_queue >::move_timer( per_timer_data& target, per_timer_data& source) { impl_.move_timer(target, source); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #endif // ASIO_DETAIL_IMPL_TIMER_QUEUE_PTIME_IPP asio-1.12.2/include/asio/detail/impl/timer_queue_set.ipp000066400000000000000000000042741340672067200232400ustar00rootroot00000000000000// // detail/impl/timer_queue_set.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_TIMER_QUEUE_SET_IPP #define ASIO_DETAIL_IMPL_TIMER_QUEUE_SET_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { timer_queue_set::timer_queue_set() : first_(0) { } void timer_queue_set::insert(timer_queue_base* q) { q->next_ = first_; first_ = q; } void timer_queue_set::erase(timer_queue_base* q) { if (first_) { if (q == first_) { first_ = q->next_; q->next_ = 0; return; } for (timer_queue_base* p = first_; p->next_; p = p->next_) { if (p->next_ == q) { p->next_ = q->next_; q->next_ = 0; return; } } } } bool timer_queue_set::all_empty() const { for (timer_queue_base* p = first_; p; p = p->next_) if (!p->empty()) return false; return true; } long timer_queue_set::wait_duration_msec(long max_duration) const { long min_duration = max_duration; for (timer_queue_base* p = first_; p; p = p->next_) min_duration = p->wait_duration_msec(min_duration); return min_duration; } long timer_queue_set::wait_duration_usec(long max_duration) const { long min_duration = max_duration; for (timer_queue_base* p = first_; p; p = p->next_) min_duration = p->wait_duration_usec(min_duration); return min_duration; } void timer_queue_set::get_ready_timers(op_queue& ops) { for (timer_queue_base* p = first_; p; p = p->next_) p->get_ready_timers(ops); } void timer_queue_set::get_all_timers(op_queue& ops) { for (timer_queue_base* p = first_; p; p = p->next_) p->get_all_timers(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IMPL_TIMER_QUEUE_SET_IPP asio-1.12.2/include/asio/detail/impl/win_event.ipp000066400000000000000000000035311340672067200220320ustar00rootroot00000000000000// // detail/win_event.ipp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_EVENT_IPP #define ASIO_DETAIL_IMPL_WIN_EVENT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/throw_error.hpp" #include "asio/detail/win_event.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { win_event::win_event() : state_(0) { #if defined(ASIO_WINDOWS_APP) events_[0] = ::CreateEventExW(0, 0, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); #else // defined(ASIO_WINDOWS_APP) events_[0] = ::CreateEventW(0, true, false, 0); #endif // defined(ASIO_WINDOWS_APP) if (!events_[0]) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "event"); } #if defined(ASIO_WINDOWS_APP) events_[1] = ::CreateEventExW(0, 0, 0, EVENT_ALL_ACCESS); #else // defined(ASIO_WINDOWS_APP) events_[1] = ::CreateEventW(0, false, false, 0); #endif // defined(ASIO_WINDOWS_APP) if (!events_[1]) { DWORD last_error = ::GetLastError(); ::CloseHandle(events_[0]); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "event"); } } win_event::~win_event() { ::CloseHandle(events_[0]); ::CloseHandle(events_[1]); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_IMPL_WIN_EVENT_IPP asio-1.12.2/include/asio/detail/impl/win_iocp_handle_service.ipp000066400000000000000000000327221340672067200247020ustar00rootroot00000000000000// // detail/impl/win_iocp_handle_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_IOCP_HANDLE_SERVICE_IPP #define ASIO_DETAIL_IMPL_WIN_IOCP_HANDLE_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/win_iocp_handle_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_iocp_handle_service::overlapped_wrapper : public OVERLAPPED { public: explicit overlapped_wrapper(asio::error_code& ec) { Internal = 0; InternalHigh = 0; Offset = 0; OffsetHigh = 0; // Create a non-signalled manual-reset event, for GetOverlappedResult. hEvent = ::CreateEventW(0, TRUE, FALSE, 0); if (hEvent) { // As documented in GetQueuedCompletionStatus, setting the low order // bit of this event prevents our synchronous writes from being treated // as completion port events. DWORD_PTR tmp = reinterpret_cast(hEvent); hEvent = reinterpret_cast(tmp | 1); } else { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); } } ~overlapped_wrapper() { if (hEvent) { ::CloseHandle(hEvent); } } }; win_iocp_handle_service::win_iocp_handle_service( asio::io_context& io_context) : service_base(io_context), iocp_service_(asio::use_service(io_context)), mutex_(), impl_list_(0) { } void win_iocp_handle_service::shutdown() { // Close all implementations, causing all operations to complete. asio::detail::mutex::scoped_lock lock(mutex_); implementation_type* impl = impl_list_; while (impl) { close_for_destruction(*impl); impl = impl->next_; } } void win_iocp_handle_service::construct( win_iocp_handle_service::implementation_type& impl) { impl.handle_ = INVALID_HANDLE_VALUE; impl.safe_cancellation_thread_id_ = 0; // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } void win_iocp_handle_service::move_construct( win_iocp_handle_service::implementation_type& impl, win_iocp_handle_service::implementation_type& other_impl) { impl.handle_ = other_impl.handle_; other_impl.handle_ = INVALID_HANDLE_VALUE; impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; other_impl.safe_cancellation_thread_id_ = 0; // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } void win_iocp_handle_service::move_assign( win_iocp_handle_service::implementation_type& impl, win_iocp_handle_service& other_service, win_iocp_handle_service::implementation_type& other_impl) { close_for_destruction(impl); if (this != &other_service) { // Remove implementation from linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } impl.handle_ = other_impl.handle_; other_impl.handle_ = INVALID_HANDLE_VALUE; impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; other_impl.safe_cancellation_thread_id_ = 0; if (this != &other_service) { // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(other_service.mutex_); impl.next_ = other_service.impl_list_; impl.prev_ = 0; if (other_service.impl_list_) other_service.impl_list_->prev_ = &impl; other_service.impl_list_ = &impl; } } void win_iocp_handle_service::destroy( win_iocp_handle_service::implementation_type& impl) { close_for_destruction(impl); // Remove implementation from linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } asio::error_code win_iocp_handle_service::assign( win_iocp_handle_service::implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } if (iocp_service_.register_handle(handle, ec)) return ec; impl.handle_ = handle; ec = asio::error_code(); return ec; } asio::error_code win_iocp_handle_service::close( win_iocp_handle_service::implementation_type& impl, asio::error_code& ec) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle", &impl, reinterpret_cast(impl.handle_), "close")); if (!::CloseHandle(impl.handle_)) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); } else { ec = asio::error_code(); } impl.handle_ = INVALID_HANDLE_VALUE; impl.safe_cancellation_thread_id_ = 0; } else { ec = asio::error_code(); } return ec; } asio::error_code win_iocp_handle_service::cancel( win_iocp_handle_service::implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return ec; } ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle", &impl, reinterpret_cast(impl.handle_), "cancel")); if (FARPROC cancel_io_ex_ptr = ::GetProcAddress( ::GetModuleHandleA("KERNEL32"), "CancelIoEx")) { // The version of Windows supports cancellation from any thread. typedef BOOL (WINAPI* cancel_io_ex_t)(HANDLE, LPOVERLAPPED); cancel_io_ex_t cancel_io_ex = (cancel_io_ex_t)cancel_io_ex_ptr; if (!cancel_io_ex(impl.handle_, 0)) { DWORD last_error = ::GetLastError(); if (last_error == ERROR_NOT_FOUND) { // ERROR_NOT_FOUND means that there were no operations to be // cancelled. We swallow this error to match the behaviour on other // platforms. ec = asio::error_code(); } else { ec = asio::error_code(last_error, asio::error::get_system_category()); } } else { ec = asio::error_code(); } } else if (impl.safe_cancellation_thread_id_ == 0) { // No operations have been started, so there's nothing to cancel. ec = asio::error_code(); } else if (impl.safe_cancellation_thread_id_ == ::GetCurrentThreadId()) { // Asynchronous operations have been started from the current thread only, // so it is safe to try to cancel them using CancelIo. if (!::CancelIo(impl.handle_)) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); } else { ec = asio::error_code(); } } else { // Asynchronous operations have been started from more than one thread, // so cancellation is not safe. ec = asio::error::operation_not_supported; } return ec; } size_t win_iocp_handle_service::do_write( win_iocp_handle_service::implementation_type& impl, uint64_t offset, const asio::const_buffer& buffer, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return 0; } // A request to write 0 bytes on a handle is a no-op. if (buffer.size() == 0) { ec = asio::error_code(); return 0; } overlapped_wrapper overlapped(ec); if (ec) { return 0; } // Write the data. overlapped.Offset = offset & 0xFFFFFFFF; overlapped.OffsetHigh = (offset >> 32) & 0xFFFFFFFF; BOOL ok = ::WriteFile(impl.handle_, buffer.data(), static_cast(buffer.size()), 0, &overlapped); if (!ok) { DWORD last_error = ::GetLastError(); if (last_error != ERROR_IO_PENDING) { ec = asio::error_code(last_error, asio::error::get_system_category()); return 0; } } // Wait for the operation to complete. DWORD bytes_transferred = 0; ok = ::GetOverlappedResult(impl.handle_, &overlapped, &bytes_transferred, TRUE); if (!ok) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); return 0; } ec = asio::error_code(); return bytes_transferred; } void win_iocp_handle_service::start_write_op( win_iocp_handle_service::implementation_type& impl, uint64_t offset, const asio::const_buffer& buffer, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (!is_open(impl)) { iocp_service_.on_completion(op, asio::error::bad_descriptor); } else if (buffer.size() == 0) { // A request to write 0 bytes on a handle is a no-op. iocp_service_.on_completion(op); } else { DWORD bytes_transferred = 0; op->Offset = offset & 0xFFFFFFFF; op->OffsetHigh = (offset >> 32) & 0xFFFFFFFF; BOOL ok = ::WriteFile(impl.handle_, buffer.data(), static_cast(buffer.size()), &bytes_transferred, op); DWORD last_error = ::GetLastError(); if (!ok && last_error != ERROR_IO_PENDING && last_error != ERROR_MORE_DATA) { iocp_service_.on_completion(op, last_error, bytes_transferred); } else { iocp_service_.on_pending(op); } } } size_t win_iocp_handle_service::do_read( win_iocp_handle_service::implementation_type& impl, uint64_t offset, const asio::mutable_buffer& buffer, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return 0; } // A request to read 0 bytes on a stream handle is a no-op. if (buffer.size() == 0) { ec = asio::error_code(); return 0; } overlapped_wrapper overlapped(ec); if (ec) { return 0; } // Read some data. overlapped.Offset = offset & 0xFFFFFFFF; overlapped.OffsetHigh = (offset >> 32) & 0xFFFFFFFF; BOOL ok = ::ReadFile(impl.handle_, buffer.data(), static_cast(buffer.size()), 0, &overlapped); if (!ok) { DWORD last_error = ::GetLastError(); if (last_error != ERROR_IO_PENDING && last_error != ERROR_MORE_DATA) { if (last_error == ERROR_HANDLE_EOF) { ec = asio::error::eof; } else { ec = asio::error_code(last_error, asio::error::get_system_category()); } return 0; } } // Wait for the operation to complete. DWORD bytes_transferred = 0; ok = ::GetOverlappedResult(impl.handle_, &overlapped, &bytes_transferred, TRUE); if (!ok) { DWORD last_error = ::GetLastError(); if (last_error == ERROR_HANDLE_EOF) { ec = asio::error::eof; } else { ec = asio::error_code(last_error, asio::error::get_system_category()); } return (last_error == ERROR_MORE_DATA) ? bytes_transferred : 0; } ec = asio::error_code(); return bytes_transferred; } void win_iocp_handle_service::start_read_op( win_iocp_handle_service::implementation_type& impl, uint64_t offset, const asio::mutable_buffer& buffer, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (!is_open(impl)) { iocp_service_.on_completion(op, asio::error::bad_descriptor); } else if (buffer.size() == 0) { // A request to read 0 bytes on a handle is a no-op. iocp_service_.on_completion(op); } else { DWORD bytes_transferred = 0; op->Offset = offset & 0xFFFFFFFF; op->OffsetHigh = (offset >> 32) & 0xFFFFFFFF; BOOL ok = ::ReadFile(impl.handle_, buffer.data(), static_cast(buffer.size()), &bytes_transferred, op); DWORD last_error = ::GetLastError(); if (!ok && last_error != ERROR_IO_PENDING && last_error != ERROR_MORE_DATA) { iocp_service_.on_completion(op, last_error, bytes_transferred); } else { iocp_service_.on_pending(op); } } } void win_iocp_handle_service::update_cancellation_thread_id( win_iocp_handle_service::implementation_type& impl) { if (impl.safe_cancellation_thread_id_ == 0) impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); else if (impl.safe_cancellation_thread_id_ != ::GetCurrentThreadId()) impl.safe_cancellation_thread_id_ = ~DWORD(0); } void win_iocp_handle_service::close_for_destruction(implementation_type& impl) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle", &impl, reinterpret_cast(impl.handle_), "close")); ::CloseHandle(impl.handle_); impl.handle_ = INVALID_HANDLE_VALUE; impl.safe_cancellation_thread_id_ = 0; } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_IMPL_WIN_IOCP_HANDLE_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/win_iocp_io_context.hpp000066400000000000000000000055261340672067200241030ustar00rootroot00000000000000// // detail/impl/win_iocp_io_context.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_HPP #define ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/completion_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template void win_iocp_io_context::add_timer_queue( timer_queue& queue) { do_add_timer_queue(queue); } template void win_iocp_io_context::remove_timer_queue( timer_queue& queue) { do_remove_timer_queue(queue); } template void win_iocp_io_context::schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op) { // If the service has been shut down we silently discard the timer. if (::InterlockedExchangeAdd(&shutdown_, 0) != 0) { post_immediate_completion(op, false); return; } mutex::scoped_lock lock(dispatch_mutex_); bool earliest = queue.enqueue_timer(time, timer, op); work_started(); if (earliest) update_timeout(); } template std::size_t win_iocp_io_context::cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled) { // If the service has been shut down we silently ignore the cancellation. if (::InterlockedExchangeAdd(&shutdown_, 0) != 0) return 0; mutex::scoped_lock lock(dispatch_mutex_); op_queue ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); post_deferred_completions(ops); return n; } template void win_iocp_io_context::move_timer(timer_queue& queue, typename timer_queue::per_timer_data& to, typename timer_queue::per_timer_data& from) { asio::detail::mutex::scoped_lock lock(dispatch_mutex_); op_queue ops; queue.cancel_timer(to, ops); queue.move_timer(to, from); lock.unlock(); post_deferred_completions(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_HPP asio-1.12.2/include/asio/detail/impl/win_iocp_io_context.ipp000066400000000000000000000354341340672067200241050ustar00rootroot00000000000000// // detail/impl/win_iocp_io_context.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_IPP #define ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/error.hpp" #include "asio/detail/cstdint.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/win_iocp_io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct win_iocp_io_context::work_finished_on_block_exit { ~work_finished_on_block_exit() { io_context_->work_finished(); } win_iocp_io_context* io_context_; }; struct win_iocp_io_context::timer_thread_function { void operator()() { while (::InterlockedExchangeAdd(&io_context_->shutdown_, 0) == 0) { if (::WaitForSingleObject(io_context_->waitable_timer_.handle, INFINITE) == WAIT_OBJECT_0) { ::InterlockedExchange(&io_context_->dispatch_required_, 1); ::PostQueuedCompletionStatus(io_context_->iocp_.handle, 0, wake_for_dispatch, 0); } } } win_iocp_io_context* io_context_; }; win_iocp_io_context::win_iocp_io_context( asio::execution_context& ctx, int concurrency_hint) : execution_context_service_base(ctx), iocp_(), outstanding_work_(0), stopped_(0), stop_event_posted_(0), shutdown_(0), gqcs_timeout_(get_gqcs_timeout()), dispatch_required_(0), concurrency_hint_(concurrency_hint) { ASIO_HANDLER_TRACKING_INIT; iocp_.handle = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, static_cast(concurrency_hint >= 0 ? concurrency_hint : DWORD(~0))); if (!iocp_.handle) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "iocp"); } } void win_iocp_io_context::shutdown() { ::InterlockedExchange(&shutdown_, 1); if (timer_thread_.get()) { LARGE_INTEGER timeout; timeout.QuadPart = 1; ::SetWaitableTimer(waitable_timer_.handle, &timeout, 1, 0, 0, FALSE); } while (::InterlockedExchangeAdd(&outstanding_work_, 0) > 0) { op_queue ops; timer_queues_.get_all_timers(ops); ops.push(completed_ops_); if (!ops.empty()) { while (win_iocp_operation* op = ops.front()) { ops.pop(); ::InterlockedDecrement(&outstanding_work_); op->destroy(); } } else { DWORD bytes_transferred = 0; dword_ptr_t completion_key = 0; LPOVERLAPPED overlapped = 0; ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred, &completion_key, &overlapped, gqcs_timeout_); if (overlapped) { ::InterlockedDecrement(&outstanding_work_); static_cast(overlapped)->destroy(); } } } if (timer_thread_.get()) timer_thread_->join(); } asio::error_code win_iocp_io_context::register_handle( HANDLE handle, asio::error_code& ec) { if (::CreateIoCompletionPort(handle, iocp_.handle, 0, 0) == 0) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); } else { ec = asio::error_code(); } return ec; } size_t win_iocp_io_context::run(asio::error_code& ec) { if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = asio::error_code(); return 0; } win_iocp_thread_info this_thread; thread_call_stack::context ctx(this, this_thread); size_t n = 0; while (do_one(INFINITE, ec)) if (n != (std::numeric_limits::max)()) ++n; return n; } size_t win_iocp_io_context::run_one(asio::error_code& ec) { if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = asio::error_code(); return 0; } win_iocp_thread_info this_thread; thread_call_stack::context ctx(this, this_thread); return do_one(INFINITE, ec); } size_t win_iocp_io_context::wait_one(long usec, asio::error_code& ec) { if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = asio::error_code(); return 0; } win_iocp_thread_info this_thread; thread_call_stack::context ctx(this, this_thread); return do_one(usec < 0 ? INFINITE : ((usec - 1) / 1000 + 1), ec); } size_t win_iocp_io_context::poll(asio::error_code& ec) { if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = asio::error_code(); return 0; } win_iocp_thread_info this_thread; thread_call_stack::context ctx(this, this_thread); size_t n = 0; while (do_one(0, ec)) if (n != (std::numeric_limits::max)()) ++n; return n; } size_t win_iocp_io_context::poll_one(asio::error_code& ec) { if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) { stop(); ec = asio::error_code(); return 0; } win_iocp_thread_info this_thread; thread_call_stack::context ctx(this, this_thread); return do_one(0, ec); } void win_iocp_io_context::stop() { if (::InterlockedExchange(&stopped_, 1) == 0) { if (::InterlockedExchange(&stop_event_posted_, 1) == 0) { if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0)) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "pqcs"); } } } } void win_iocp_io_context::post_deferred_completion(win_iocp_operation* op) { // Flag the operation as ready. op->ready_ = 1; // Enqueue the operation on the I/O completion port. if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) { // Out of resources. Put on completed queue instead. mutex::scoped_lock lock(dispatch_mutex_); completed_ops_.push(op); ::InterlockedExchange(&dispatch_required_, 1); } } void win_iocp_io_context::post_deferred_completions( op_queue& ops) { while (win_iocp_operation* op = ops.front()) { ops.pop(); // Flag the operation as ready. op->ready_ = 1; // Enqueue the operation on the I/O completion port. if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) { // Out of resources. Put on completed queue instead. mutex::scoped_lock lock(dispatch_mutex_); completed_ops_.push(op); completed_ops_.push(ops); ::InterlockedExchange(&dispatch_required_, 1); } } } void win_iocp_io_context::abandon_operations( op_queue& ops) { while (win_iocp_operation* op = ops.front()) { ops.pop(); ::InterlockedDecrement(&outstanding_work_); op->destroy(); } } void win_iocp_io_context::on_pending(win_iocp_operation* op) { if (::InterlockedCompareExchange(&op->ready_, 1, 0) == 1) { // Enqueue the operation on the I/O completion port. if (!::PostQueuedCompletionStatus(iocp_.handle, 0, overlapped_contains_result, op)) { // Out of resources. Put on completed queue instead. mutex::scoped_lock lock(dispatch_mutex_); completed_ops_.push(op); ::InterlockedExchange(&dispatch_required_, 1); } } } void win_iocp_io_context::on_completion(win_iocp_operation* op, DWORD last_error, DWORD bytes_transferred) { // Flag that the operation is ready for invocation. op->ready_ = 1; // Store results in the OVERLAPPED structure. op->Internal = reinterpret_cast( &asio::error::get_system_category()); op->Offset = last_error; op->OffsetHigh = bytes_transferred; // Enqueue the operation on the I/O completion port. if (!::PostQueuedCompletionStatus(iocp_.handle, 0, overlapped_contains_result, op)) { // Out of resources. Put on completed queue instead. mutex::scoped_lock lock(dispatch_mutex_); completed_ops_.push(op); ::InterlockedExchange(&dispatch_required_, 1); } } void win_iocp_io_context::on_completion(win_iocp_operation* op, const asio::error_code& ec, DWORD bytes_transferred) { // Flag that the operation is ready for invocation. op->ready_ = 1; // Store results in the OVERLAPPED structure. op->Internal = reinterpret_cast(&ec.category()); op->Offset = ec.value(); op->OffsetHigh = bytes_transferred; // Enqueue the operation on the I/O completion port. if (!::PostQueuedCompletionStatus(iocp_.handle, 0, overlapped_contains_result, op)) { // Out of resources. Put on completed queue instead. mutex::scoped_lock lock(dispatch_mutex_); completed_ops_.push(op); ::InterlockedExchange(&dispatch_required_, 1); } } size_t win_iocp_io_context::do_one(DWORD msec, asio::error_code& ec) { for (;;) { // Try to acquire responsibility for dispatching timers and completed ops. if (::InterlockedCompareExchange(&dispatch_required_, 0, 1) == 1) { mutex::scoped_lock lock(dispatch_mutex_); // Dispatch pending timers and operations. op_queue ops; ops.push(completed_ops_); timer_queues_.get_ready_timers(ops); post_deferred_completions(ops); update_timeout(); } // Get the next operation from the queue. DWORD bytes_transferred = 0; dword_ptr_t completion_key = 0; LPOVERLAPPED overlapped = 0; ::SetLastError(0); BOOL ok = ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred, &completion_key, &overlapped, msec < gqcs_timeout_ ? msec : gqcs_timeout_); DWORD last_error = ::GetLastError(); if (overlapped) { win_iocp_operation* op = static_cast(overlapped); asio::error_code result_ec(last_error, asio::error::get_system_category()); // We may have been passed the last_error and bytes_transferred in the // OVERLAPPED structure itself. if (completion_key == overlapped_contains_result) { result_ec = asio::error_code(static_cast(op->Offset), *reinterpret_cast(op->Internal)); bytes_transferred = op->OffsetHigh; } // Otherwise ensure any result has been saved into the OVERLAPPED // structure. else { op->Internal = reinterpret_cast(&result_ec.category()); op->Offset = result_ec.value(); op->OffsetHigh = bytes_transferred; } // Dispatch the operation only if ready. The operation may not be ready // if the initiating function (e.g. a call to WSARecv) has not yet // returned. This is because the initiating function still wants access // to the operation's OVERLAPPED structure. if (::InterlockedCompareExchange(&op->ready_, 1, 0) == 1) { // Ensure the count of outstanding work is decremented on block exit. work_finished_on_block_exit on_exit = { this }; (void)on_exit; op->complete(this, result_ec, bytes_transferred); ec = asio::error_code(); return 1; } } else if (!ok) { if (last_error != WAIT_TIMEOUT) { ec = asio::error_code(last_error, asio::error::get_system_category()); return 0; } // If we're waiting indefinitely we need to keep going until we get a // real handler. if (msec == INFINITE) continue; ec = asio::error_code(); return 0; } else if (completion_key == wake_for_dispatch) { // We have been woken up to try to acquire responsibility for dispatching // timers and completed operations. } else { // Indicate that there is no longer an in-flight stop event. ::InterlockedExchange(&stop_event_posted_, 0); // The stopped_ flag is always checked to ensure that any leftover // stop events from a previous run invocation are ignored. if (::InterlockedExchangeAdd(&stopped_, 0) != 0) { // Wake up next thread that is blocked on GetQueuedCompletionStatus. if (::InterlockedExchange(&stop_event_posted_, 1) == 0) { if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0)) { last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); return 0; } } ec = asio::error_code(); return 0; } } } } DWORD win_iocp_io_context::get_gqcs_timeout() { OSVERSIONINFOEX osvi; ZeroMemory(&osvi, sizeof(osvi)); osvi.dwOSVersionInfoSize = sizeof(osvi); osvi.dwMajorVersion = 6ul; const uint64_t condition_mask = ::VerSetConditionMask( 0, VER_MAJORVERSION, VER_GREATER_EQUAL); if (!!::VerifyVersionInfo(&osvi, VER_MAJORVERSION, condition_mask)) return INFINITE; return default_gqcs_timeout; } void win_iocp_io_context::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(dispatch_mutex_); timer_queues_.insert(&queue); if (!waitable_timer_.handle) { waitable_timer_.handle = ::CreateWaitableTimer(0, FALSE, 0); if (waitable_timer_.handle == 0) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "timer"); } LARGE_INTEGER timeout; timeout.QuadPart = -max_timeout_usec; timeout.QuadPart *= 10; ::SetWaitableTimer(waitable_timer_.handle, &timeout, max_timeout_msec, 0, 0, FALSE); } if (!timer_thread_.get()) { timer_thread_function thread_function = { this }; timer_thread_.reset(new thread(thread_function, 65536)); } } void win_iocp_io_context::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(dispatch_mutex_); timer_queues_.erase(&queue); } void win_iocp_io_context::update_timeout() { if (timer_thread_.get()) { // There's no point updating the waitable timer if the new timeout period // exceeds the maximum timeout. In that case, we might as well wait for the // existing period of the timer to expire. long timeout_usec = timer_queues_.wait_duration_usec(max_timeout_usec); if (timeout_usec < max_timeout_usec) { LARGE_INTEGER timeout; timeout.QuadPart = -timeout_usec; timeout.QuadPart *= 10; ::SetWaitableTimer(waitable_timer_.handle, &timeout, max_timeout_msec, 0, 0, FALSE); } } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_IPP asio-1.12.2/include/asio/detail/impl/win_iocp_serial_port_service.ipp000066400000000000000000000123171340672067200257700ustar00rootroot00000000000000// // detail/impl/win_iocp_serial_port_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_IOCP_SERIAL_PORT_SERVICE_IPP #define ASIO_DETAIL_IMPL_WIN_IOCP_SERIAL_PORT_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) #include #include "asio/detail/win_iocp_serial_port_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { win_iocp_serial_port_service::win_iocp_serial_port_service( asio::io_context& io_context) : service_base(io_context), handle_service_(io_context) { } void win_iocp_serial_port_service::shutdown() { } asio::error_code win_iocp_serial_port_service::open( win_iocp_serial_port_service::implementation_type& impl, const std::string& device, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } // For convenience, add a leading \\.\ sequence if not already present. std::string name = (device[0] == '\\') ? device : "\\\\.\\" + device; // Open a handle to the serial port. ::HANDLE handle = ::CreateFileA(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); if (handle == INVALID_HANDLE_VALUE) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } // Determine the initial serial port parameters. using namespace std; // For memset. ::DCB dcb; memset(&dcb, 0, sizeof(DCB)); dcb.DCBlength = sizeof(DCB); if (!::GetCommState(handle, &dcb)) { DWORD last_error = ::GetLastError(); ::CloseHandle(handle); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } // Set some default serial port parameters. This implementation does not // support changing these, so they might as well be in a known state. dcb.fBinary = TRUE; // Win32 only supports binary mode. dcb.fDsrSensitivity = FALSE; dcb.fNull = FALSE; // Do not ignore NULL characters. dcb.fAbortOnError = FALSE; // Ignore serial framing errors. if (!::SetCommState(handle, &dcb)) { DWORD last_error = ::GetLastError(); ::CloseHandle(handle); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } // Set up timeouts so that the serial port will behave similarly to a // network socket. Reads wait for at least one byte, then return with // whatever they have. Writes return once everything is out the door. ::COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 1; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.WriteTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 0; if (!::SetCommTimeouts(handle, &timeouts)) { DWORD last_error = ::GetLastError(); ::CloseHandle(handle); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } // We're done. Take ownership of the serial port handle. if (handle_service_.assign(impl, handle, ec)) ::CloseHandle(handle); return ec; } asio::error_code win_iocp_serial_port_service::do_set_option( win_iocp_serial_port_service::implementation_type& impl, win_iocp_serial_port_service::store_function_type store, const void* option, asio::error_code& ec) { using namespace std; // For memcpy. ::DCB dcb; memset(&dcb, 0, sizeof(DCB)); dcb.DCBlength = sizeof(DCB); if (!::GetCommState(handle_service_.native_handle(impl), &dcb)) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } if (store(option, dcb, ec)) return ec; if (!::SetCommState(handle_service_.native_handle(impl), &dcb)) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } ec = asio::error_code(); return ec; } asio::error_code win_iocp_serial_port_service::do_get_option( const win_iocp_serial_port_service::implementation_type& impl, win_iocp_serial_port_service::load_function_type load, void* option, asio::error_code& ec) const { using namespace std; // For memset. ::DCB dcb; memset(&dcb, 0, sizeof(DCB)); dcb.DCBlength = sizeof(DCB); if (!::GetCommState(handle_service_.native_handle(impl), &dcb)) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); return ec; } return load(option, dcb, ec); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) #endif // ASIO_DETAIL_IMPL_WIN_IOCP_SERIAL_PORT_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/win_iocp_socket_service_base.ipp000066400000000000000000000574411340672067200257360ustar00rootroot00000000000000// // detail/impl/win_iocp_socket_service_base.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_IOCP_SOCKET_SERVICE_BASE_IPP #define ASIO_DETAIL_IMPL_WIN_IOCP_SOCKET_SERVICE_BASE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/win_iocp_socket_service_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { win_iocp_socket_service_base::win_iocp_socket_service_base( asio::io_context& io_context) : io_context_(io_context), iocp_service_(use_service(io_context)), reactor_(0), connect_ex_(0), nt_set_info_(0), mutex_(), impl_list_(0) { } void win_iocp_socket_service_base::base_shutdown() { // Close all implementations, causing all operations to complete. asio::detail::mutex::scoped_lock lock(mutex_); base_implementation_type* impl = impl_list_; while (impl) { close_for_destruction(*impl); impl = impl->next_; } } void win_iocp_socket_service_base::construct( win_iocp_socket_service_base::base_implementation_type& impl) { impl.socket_ = invalid_socket; impl.state_ = 0; impl.cancel_token_.reset(); #if defined(ASIO_ENABLE_CANCELIO) impl.safe_cancellation_thread_id_ = 0; #endif // defined(ASIO_ENABLE_CANCELIO) // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } void win_iocp_socket_service_base::base_move_construct( win_iocp_socket_service_base::base_implementation_type& impl, win_iocp_socket_service_base::base_implementation_type& other_impl) { impl.socket_ = other_impl.socket_; other_impl.socket_ = invalid_socket; impl.state_ = other_impl.state_; other_impl.state_ = 0; impl.cancel_token_ = other_impl.cancel_token_; other_impl.cancel_token_.reset(); #if defined(ASIO_ENABLE_CANCELIO) impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; other_impl.safe_cancellation_thread_id_ = 0; #endif // defined(ASIO_ENABLE_CANCELIO) // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } void win_iocp_socket_service_base::base_move_assign( win_iocp_socket_service_base::base_implementation_type& impl, win_iocp_socket_service_base& other_service, win_iocp_socket_service_base::base_implementation_type& other_impl) { close_for_destruction(impl); if (this != &other_service) { // Remove implementation from linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } impl.socket_ = other_impl.socket_; other_impl.socket_ = invalid_socket; impl.state_ = other_impl.state_; other_impl.state_ = 0; impl.cancel_token_ = other_impl.cancel_token_; other_impl.cancel_token_.reset(); #if defined(ASIO_ENABLE_CANCELIO) impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; other_impl.safe_cancellation_thread_id_ = 0; #endif // defined(ASIO_ENABLE_CANCELIO) if (this != &other_service) { // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(other_service.mutex_); impl.next_ = other_service.impl_list_; impl.prev_ = 0; if (other_service.impl_list_) other_service.impl_list_->prev_ = &impl; other_service.impl_list_ = &impl; } } void win_iocp_socket_service_base::destroy( win_iocp_socket_service_base::base_implementation_type& impl) { close_for_destruction(impl); // Remove implementation from linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } asio::error_code win_iocp_socket_service_base::close( win_iocp_socket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((iocp_service_.context(), "socket", &impl, impl.socket_, "close")); // Check if the reactor was created, in which case we need to close the // socket on the reactor as well to cancel any operations that might be // running there. select_reactor* r = static_cast( interlocked_compare_exchange_pointer( reinterpret_cast(&reactor_), 0, 0)); if (r) r->deregister_descriptor(impl.socket_, impl.reactor_data_, true); socket_ops::close(impl.socket_, impl.state_, false, ec); if (r) r->cleanup_descriptor_data(impl.reactor_data_); } else { ec = asio::error_code(); } impl.socket_ = invalid_socket; impl.state_ = 0; impl.cancel_token_.reset(); #if defined(ASIO_ENABLE_CANCELIO) impl.safe_cancellation_thread_id_ = 0; #endif // defined(ASIO_ENABLE_CANCELIO) return ec; } socket_type win_iocp_socket_service_base::release( win_iocp_socket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) return invalid_socket; cancel(impl, ec); if (ec) return invalid_socket; nt_set_info_fn fn = get_nt_set_info(); if (fn == 0) { ec = asio::error::operation_not_supported; return invalid_socket; } HANDLE sock_as_handle = reinterpret_cast(impl.socket_); ULONG_PTR iosb[2] = { 0, 0 }; void* info[2] = { 0, 0 }; if (fn(sock_as_handle, iosb, &info, sizeof(info), 61 /* FileReplaceCompletionInformation */)) { ec = asio::error::operation_not_supported; return invalid_socket; } socket_type tmp = impl.socket_; impl.socket_ = invalid_socket; return tmp; } asio::error_code win_iocp_socket_service_base::cancel( win_iocp_socket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return ec; } ASIO_HANDLER_OPERATION((iocp_service_.context(), "socket", &impl, impl.socket_, "cancel")); if (FARPROC cancel_io_ex_ptr = ::GetProcAddress( ::GetModuleHandleA("KERNEL32"), "CancelIoEx")) { // The version of Windows supports cancellation from any thread. typedef BOOL (WINAPI* cancel_io_ex_t)(HANDLE, LPOVERLAPPED); cancel_io_ex_t cancel_io_ex = (cancel_io_ex_t)cancel_io_ex_ptr; socket_type sock = impl.socket_; HANDLE sock_as_handle = reinterpret_cast(sock); if (!cancel_io_ex(sock_as_handle, 0)) { DWORD last_error = ::GetLastError(); if (last_error == ERROR_NOT_FOUND) { // ERROR_NOT_FOUND means that there were no operations to be // cancelled. We swallow this error to match the behaviour on other // platforms. ec = asio::error_code(); } else { ec = asio::error_code(last_error, asio::error::get_system_category()); } } else { ec = asio::error_code(); } } #if defined(ASIO_ENABLE_CANCELIO) else if (impl.safe_cancellation_thread_id_ == 0) { // No operations have been started, so there's nothing to cancel. ec = asio::error_code(); } else if (impl.safe_cancellation_thread_id_ == ::GetCurrentThreadId()) { // Asynchronous operations have been started from the current thread only, // so it is safe to try to cancel them using CancelIo. socket_type sock = impl.socket_; HANDLE sock_as_handle = reinterpret_cast(sock); if (!::CancelIo(sock_as_handle)) { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); } else { ec = asio::error_code(); } } else { // Asynchronous operations have been started from more than one thread, // so cancellation is not safe. ec = asio::error::operation_not_supported; } #else // defined(ASIO_ENABLE_CANCELIO) else { // Cancellation is not supported as CancelIo may not be used. ec = asio::error::operation_not_supported; } #endif // defined(ASIO_ENABLE_CANCELIO) // Cancel any operations started via the reactor. if (!ec) { select_reactor* r = static_cast( interlocked_compare_exchange_pointer( reinterpret_cast(&reactor_), 0, 0)); if (r) r->cancel_ops(impl.socket_, impl.reactor_data_); } return ec; } asio::error_code win_iocp_socket_service_base::do_open( win_iocp_socket_service_base::base_implementation_type& impl, int family, int type, int protocol, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } socket_holder sock(socket_ops::socket(family, type, protocol, ec)); if (sock.get() == invalid_socket) return ec; HANDLE sock_as_handle = reinterpret_cast(sock.get()); if (iocp_service_.register_handle(sock_as_handle, ec)) return ec; impl.socket_ = sock.release(); switch (type) { case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; default: impl.state_ = 0; break; } impl.cancel_token_.reset(static_cast(0), socket_ops::noop_deleter()); ec = asio::error_code(); return ec; } asio::error_code win_iocp_socket_service_base::do_assign( win_iocp_socket_service_base::base_implementation_type& impl, int type, socket_type native_socket, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } HANDLE sock_as_handle = reinterpret_cast(native_socket); if (iocp_service_.register_handle(sock_as_handle, ec)) return ec; impl.socket_ = native_socket; switch (type) { case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; default: impl.state_ = 0; break; } impl.cancel_token_.reset(static_cast(0), socket_ops::noop_deleter()); ec = asio::error_code(); return ec; } void win_iocp_socket_service_base::start_send_op( win_iocp_socket_service_base::base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, socket_base::message_flags flags, bool noop, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (noop) iocp_service_.on_completion(op); else if (!is_open(impl)) iocp_service_.on_completion(op, asio::error::bad_descriptor); else { DWORD bytes_transferred = 0; int result = ::WSASend(impl.socket_, buffers, static_cast(buffer_count), &bytes_transferred, flags, op, 0); DWORD last_error = ::WSAGetLastError(); if (last_error == ERROR_PORT_UNREACHABLE) last_error = WSAECONNREFUSED; if (result != 0 && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error, bytes_transferred); else iocp_service_.on_pending(op); } } void win_iocp_socket_service_base::start_send_to_op( win_iocp_socket_service_base::base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, const socket_addr_type* addr, int addrlen, socket_base::message_flags flags, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (!is_open(impl)) iocp_service_.on_completion(op, asio::error::bad_descriptor); else { DWORD bytes_transferred = 0; int result = ::WSASendTo(impl.socket_, buffers, static_cast(buffer_count), &bytes_transferred, flags, addr, addrlen, op, 0); DWORD last_error = ::WSAGetLastError(); if (last_error == ERROR_PORT_UNREACHABLE) last_error = WSAECONNREFUSED; if (result != 0 && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error, bytes_transferred); else iocp_service_.on_pending(op); } } void win_iocp_socket_service_base::start_receive_op( win_iocp_socket_service_base::base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, socket_base::message_flags flags, bool noop, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (noop) iocp_service_.on_completion(op); else if (!is_open(impl)) iocp_service_.on_completion(op, asio::error::bad_descriptor); else { DWORD bytes_transferred = 0; DWORD recv_flags = flags; int result = ::WSARecv(impl.socket_, buffers, static_cast(buffer_count), &bytes_transferred, &recv_flags, op, 0); DWORD last_error = ::WSAGetLastError(); if (last_error == ERROR_NETNAME_DELETED) last_error = WSAECONNRESET; else if (last_error == ERROR_PORT_UNREACHABLE) last_error = WSAECONNREFUSED; if (result != 0 && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error, bytes_transferred); else iocp_service_.on_pending(op); } } void win_iocp_socket_service_base::start_null_buffers_receive_op( win_iocp_socket_service_base::base_implementation_type& impl, socket_base::message_flags flags, reactor_op* op) { if ((impl.state_ & socket_ops::stream_oriented) != 0) { // For stream sockets on Windows, we may issue a 0-byte overlapped // WSARecv to wait until there is data available on the socket. ::WSABUF buf = { 0, 0 }; start_receive_op(impl, &buf, 1, flags, false, op); } else { start_reactor_op(impl, (flags & socket_base::message_out_of_band) ? select_reactor::except_op : select_reactor::read_op, op); } } void win_iocp_socket_service_base::start_receive_from_op( win_iocp_socket_service_base::base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, socket_addr_type* addr, socket_base::message_flags flags, int* addrlen, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (!is_open(impl)) iocp_service_.on_completion(op, asio::error::bad_descriptor); else { DWORD bytes_transferred = 0; DWORD recv_flags = flags; int result = ::WSARecvFrom(impl.socket_, buffers, static_cast(buffer_count), &bytes_transferred, &recv_flags, addr, addrlen, op, 0); DWORD last_error = ::WSAGetLastError(); if (last_error == ERROR_PORT_UNREACHABLE) last_error = WSAECONNREFUSED; if (result != 0 && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error, bytes_transferred); else iocp_service_.on_pending(op); } } void win_iocp_socket_service_base::start_accept_op( win_iocp_socket_service_base::base_implementation_type& impl, bool peer_is_open, socket_holder& new_socket, int family, int type, int protocol, void* output_buffer, DWORD address_length, operation* op) { update_cancellation_thread_id(impl); iocp_service_.work_started(); if (!is_open(impl)) iocp_service_.on_completion(op, asio::error::bad_descriptor); else if (peer_is_open) iocp_service_.on_completion(op, asio::error::already_open); else { asio::error_code ec; new_socket.reset(socket_ops::socket(family, type, protocol, ec)); if (new_socket.get() == invalid_socket) iocp_service_.on_completion(op, ec); else { DWORD bytes_read = 0; BOOL result = ::AcceptEx(impl.socket_, new_socket.get(), output_buffer, 0, address_length, address_length, &bytes_read, op); DWORD last_error = ::WSAGetLastError(); if (!result && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error); else iocp_service_.on_pending(op); } } } void win_iocp_socket_service_base::restart_accept_op( socket_type s, socket_holder& new_socket, int family, int type, int protocol, void* output_buffer, DWORD address_length, operation* op) { new_socket.reset(); iocp_service_.work_started(); asio::error_code ec; new_socket.reset(socket_ops::socket(family, type, protocol, ec)); if (new_socket.get() == invalid_socket) iocp_service_.on_completion(op, ec); else { DWORD bytes_read = 0; BOOL result = ::AcceptEx(s, new_socket.get(), output_buffer, 0, address_length, address_length, &bytes_read, op); DWORD last_error = ::WSAGetLastError(); if (!result && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error); else iocp_service_.on_pending(op); } } void win_iocp_socket_service_base::start_reactor_op( win_iocp_socket_service_base::base_implementation_type& impl, int op_type, reactor_op* op) { select_reactor& r = get_reactor(); update_cancellation_thread_id(impl); if (is_open(impl)) { r.start_op(op_type, impl.socket_, impl.reactor_data_, op, false, false); return; } else op->ec_ = asio::error::bad_descriptor; iocp_service_.post_immediate_completion(op, false); } void win_iocp_socket_service_base::start_connect_op( win_iocp_socket_service_base::base_implementation_type& impl, int family, int type, const socket_addr_type* addr, std::size_t addrlen, win_iocp_socket_connect_op_base* op) { // If ConnectEx is available, use that. if (family == ASIO_OS_DEF(AF_INET) || family == ASIO_OS_DEF(AF_INET6)) { if (connect_ex_fn connect_ex = get_connect_ex(impl, type)) { union address_union { socket_addr_type base; sockaddr_in4_type v4; sockaddr_in6_type v6; } a; using namespace std; // For memset. memset(&a, 0, sizeof(a)); a.base.sa_family = family; socket_ops::bind(impl.socket_, &a.base, family == ASIO_OS_DEF(AF_INET) ? sizeof(a.v4) : sizeof(a.v6), op->ec_); if (op->ec_ && op->ec_ != asio::error::invalid_argument) { iocp_service_.post_immediate_completion(op, false); return; } op->connect_ex_ = true; update_cancellation_thread_id(impl); iocp_service_.work_started(); BOOL result = connect_ex(impl.socket_, addr, static_cast(addrlen), 0, 0, 0, op); DWORD last_error = ::WSAGetLastError(); if (!result && last_error != WSA_IO_PENDING) iocp_service_.on_completion(op, last_error); else iocp_service_.on_pending(op); return; } } // Otherwise, fall back to a reactor-based implementation. select_reactor& r = get_reactor(); update_cancellation_thread_id(impl); if ((impl.state_ & socket_ops::non_blocking) != 0 || socket_ops::set_internal_non_blocking( impl.socket_, impl.state_, true, op->ec_)) { if (socket_ops::connect(impl.socket_, addr, addrlen, op->ec_) != 0) { if (op->ec_ == asio::error::in_progress || op->ec_ == asio::error::would_block) { op->ec_ = asio::error_code(); r.start_op(select_reactor::connect_op, impl.socket_, impl.reactor_data_, op, false, false); return; } } } r.post_immediate_completion(op, false); } void win_iocp_socket_service_base::close_for_destruction( win_iocp_socket_service_base::base_implementation_type& impl) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((iocp_service_.context(), "socket", &impl, impl.socket_, "close")); // Check if the reactor was created, in which case we need to close the // socket on the reactor as well to cancel any operations that might be // running there. select_reactor* r = static_cast( interlocked_compare_exchange_pointer( reinterpret_cast(&reactor_), 0, 0)); if (r) r->deregister_descriptor(impl.socket_, impl.reactor_data_, true); asio::error_code ignored_ec; socket_ops::close(impl.socket_, impl.state_, true, ignored_ec); if (r) r->cleanup_descriptor_data(impl.reactor_data_); } impl.socket_ = invalid_socket; impl.state_ = 0; impl.cancel_token_.reset(); #if defined(ASIO_ENABLE_CANCELIO) impl.safe_cancellation_thread_id_ = 0; #endif // defined(ASIO_ENABLE_CANCELIO) } void win_iocp_socket_service_base::update_cancellation_thread_id( win_iocp_socket_service_base::base_implementation_type& impl) { #if defined(ASIO_ENABLE_CANCELIO) if (impl.safe_cancellation_thread_id_ == 0) impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); else if (impl.safe_cancellation_thread_id_ != ::GetCurrentThreadId()) impl.safe_cancellation_thread_id_ = ~DWORD(0); #else // defined(ASIO_ENABLE_CANCELIO) (void)impl; #endif // defined(ASIO_ENABLE_CANCELIO) } select_reactor& win_iocp_socket_service_base::get_reactor() { select_reactor* r = static_cast( interlocked_compare_exchange_pointer( reinterpret_cast(&reactor_), 0, 0)); if (!r) { r = &(use_service(io_context_)); interlocked_exchange_pointer(reinterpret_cast(&reactor_), r); } return *r; } win_iocp_socket_service_base::connect_ex_fn win_iocp_socket_service_base::get_connect_ex( win_iocp_socket_service_base::base_implementation_type& impl, int type) { #if defined(ASIO_DISABLE_CONNECTEX) (void)impl; (void)type; return 0; #else // defined(ASIO_DISABLE_CONNECTEX) if (type != ASIO_OS_DEF(SOCK_STREAM) && type != ASIO_OS_DEF(SOCK_SEQPACKET)) return 0; void* ptr = interlocked_compare_exchange_pointer(&connect_ex_, 0, 0); if (!ptr) { GUID guid = { 0x25a207b9, 0xddf3, 0x4660, { 0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e } }; DWORD bytes = 0; if (::WSAIoctl(impl.socket_, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), &ptr, sizeof(ptr), &bytes, 0, 0) != 0) { // Set connect_ex_ to a special value to indicate that ConnectEx is // unavailable. That way we won't bother trying to look it up again. ptr = this; } interlocked_exchange_pointer(&connect_ex_, ptr); } return reinterpret_cast(ptr == this ? 0 : ptr); #endif // defined(ASIO_DISABLE_CONNECTEX) } win_iocp_socket_service_base::nt_set_info_fn win_iocp_socket_service_base::get_nt_set_info() { void* ptr = interlocked_compare_exchange_pointer(&nt_set_info_, 0, 0); if (!ptr) { if (HMODULE h = ::GetModuleHandleA("NTDLL.DLL")) ptr = reinterpret_cast(GetProcAddress(h, "NtSetInformationFile")); // On failure, set nt_set_info_ to a special value to indicate that the // NtSetInformationFile function is unavailable. That way we won't bother // trying to look it up again. interlocked_exchange_pointer(&nt_set_info_, ptr ? ptr : this); } return reinterpret_cast(ptr == this ? 0 : ptr); } void* win_iocp_socket_service_base::interlocked_compare_exchange_pointer( void** dest, void* exch, void* cmp) { #if defined(_M_IX86) return reinterpret_cast(InterlockedCompareExchange( reinterpret_cast(dest), reinterpret_cast(exch), reinterpret_cast(cmp))); #else return InterlockedCompareExchangePointer(dest, exch, cmp); #endif } void* win_iocp_socket_service_base::interlocked_exchange_pointer( void** dest, void* val) { #if defined(_M_IX86) return reinterpret_cast(InterlockedExchange( reinterpret_cast(dest), reinterpret_cast(val))); #else return InterlockedExchangePointer(dest, val); #endif } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_IMPL_WIN_IOCP_SOCKET_SERVICE_BASE_IPP asio-1.12.2/include/asio/detail/impl/win_mutex.ipp000066400000000000000000000040311340672067200220470ustar00rootroot00000000000000// // detail/impl/win_mutex.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_MUTEX_IPP #define ASIO_DETAIL_IMPL_WIN_MUTEX_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/throw_error.hpp" #include "asio/detail/win_mutex.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { win_mutex::win_mutex() { int error = do_init(); asio::error_code ec(error, asio::error::get_system_category()); asio::detail::throw_error(ec, "mutex"); } int win_mutex::do_init() { #if defined(__MINGW32__) // Not sure if MinGW supports structured exception handling, so for now // we'll just call the Windows API and hope. # if defined(UNDER_CE) ::InitializeCriticalSection(&crit_section_); # elif defined(ASIO_WINDOWS_APP) if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0)) return ::GetLastError(); # else if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) return ::GetLastError(); # endif return 0; #else __try { # if defined(UNDER_CE) ::InitializeCriticalSection(&crit_section_); # elif defined(ASIO_WINDOWS_APP) if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0)) return ::GetLastError(); # else if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) return ::GetLastError(); # endif } __except(GetExceptionCode() == STATUS_NO_MEMORY ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { return ERROR_OUTOFMEMORY; } return 0; #endif } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_IMPL_WIN_MUTEX_IPP asio-1.12.2/include/asio/detail/impl/win_object_handle_service.ipp000066400000000000000000000275671340672067200252310ustar00rootroot00000000000000// // detail/impl/win_object_handle_service.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2011 Boris Schaeling (boris@highscore.de) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_OBJECT_HANDLE_SERVICE_IPP #define ASIO_DETAIL_IMPL_WIN_OBJECT_HANDLE_SERVICE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) #include "asio/detail/win_object_handle_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { win_object_handle_service::win_object_handle_service( asio::io_context& io_context) : service_base(io_context), io_context_(asio::use_service(io_context)), mutex_(), impl_list_(0), shutdown_(false) { } void win_object_handle_service::shutdown() { mutex::scoped_lock lock(mutex_); // Setting this flag to true prevents new objects from being registered, and // new asynchronous wait operations from being started. We only need to worry // about cleaning up the operations that are currently in progress. shutdown_ = true; op_queue ops; for (implementation_type* impl = impl_list_; impl; impl = impl->next_) ops.push(impl->op_queue_); lock.unlock(); io_context_.abandon_operations(ops); } void win_object_handle_service::construct( win_object_handle_service::implementation_type& impl) { impl.handle_ = INVALID_HANDLE_VALUE; impl.wait_handle_ = INVALID_HANDLE_VALUE; impl.owner_ = this; // Insert implementation into linked list of all implementations. mutex::scoped_lock lock(mutex_); if (!shutdown_) { impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } } void win_object_handle_service::move_construct( win_object_handle_service::implementation_type& impl, win_object_handle_service::implementation_type& other_impl) { mutex::scoped_lock lock(mutex_); // Insert implementation into linked list of all implementations. if (!shutdown_) { impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } impl.handle_ = other_impl.handle_; other_impl.handle_ = INVALID_HANDLE_VALUE; impl.wait_handle_ = other_impl.wait_handle_; other_impl.wait_handle_ = INVALID_HANDLE_VALUE; impl.op_queue_.push(other_impl.op_queue_); impl.owner_ = this; // We must not hold the lock while calling UnregisterWaitEx. This is because // the registered callback function might be invoked while we are waiting for // UnregisterWaitEx to complete. lock.unlock(); if (impl.wait_handle_ != INVALID_HANDLE_VALUE) ::UnregisterWaitEx(impl.wait_handle_, INVALID_HANDLE_VALUE); if (!impl.op_queue_.empty()) register_wait_callback(impl, lock); } void win_object_handle_service::move_assign( win_object_handle_service::implementation_type& impl, win_object_handle_service& other_service, win_object_handle_service::implementation_type& other_impl) { asio::error_code ignored_ec; close(impl, ignored_ec); mutex::scoped_lock lock(mutex_); if (this != &other_service) { // Remove implementation from linked list of all implementations. if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } impl.handle_ = other_impl.handle_; other_impl.handle_ = INVALID_HANDLE_VALUE; impl.wait_handle_ = other_impl.wait_handle_; other_impl.wait_handle_ = INVALID_HANDLE_VALUE; impl.op_queue_.push(other_impl.op_queue_); impl.owner_ = this; if (this != &other_service) { // Insert implementation into linked list of all implementations. impl.next_ = other_service.impl_list_; impl.prev_ = 0; if (other_service.impl_list_) other_service.impl_list_->prev_ = &impl; other_service.impl_list_ = &impl; } // We must not hold the lock while calling UnregisterWaitEx. This is because // the registered callback function might be invoked while we are waiting for // UnregisterWaitEx to complete. lock.unlock(); if (impl.wait_handle_ != INVALID_HANDLE_VALUE) ::UnregisterWaitEx(impl.wait_handle_, INVALID_HANDLE_VALUE); if (!impl.op_queue_.empty()) register_wait_callback(impl, lock); } void win_object_handle_service::destroy( win_object_handle_service::implementation_type& impl) { mutex::scoped_lock lock(mutex_); // Remove implementation from linked list of all implementations. if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; if (is_open(impl)) { ASIO_HANDLER_OPERATION((io_context_.context(), "object_handle", &impl, reinterpret_cast(impl.wait_handle_), "close")); HANDLE wait_handle = impl.wait_handle_; impl.wait_handle_ = INVALID_HANDLE_VALUE; op_queue ops; while (wait_op* op = impl.op_queue_.front()) { op->ec_ = asio::error::operation_aborted; impl.op_queue_.pop(); ops.push(op); } // We must not hold the lock while calling UnregisterWaitEx. This is // because the registered callback function might be invoked while we are // waiting for UnregisterWaitEx to complete. lock.unlock(); if (wait_handle != INVALID_HANDLE_VALUE) ::UnregisterWaitEx(wait_handle, INVALID_HANDLE_VALUE); ::CloseHandle(impl.handle_); impl.handle_ = INVALID_HANDLE_VALUE; io_context_.post_deferred_completions(ops); } } asio::error_code win_object_handle_service::assign( win_object_handle_service::implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } impl.handle_ = handle; ec = asio::error_code(); return ec; } asio::error_code win_object_handle_service::close( win_object_handle_service::implementation_type& impl, asio::error_code& ec) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((io_context_.context(), "object_handle", &impl, reinterpret_cast(impl.wait_handle_), "close")); mutex::scoped_lock lock(mutex_); HANDLE wait_handle = impl.wait_handle_; impl.wait_handle_ = INVALID_HANDLE_VALUE; op_queue completed_ops; while (wait_op* op = impl.op_queue_.front()) { impl.op_queue_.pop(); op->ec_ = asio::error::operation_aborted; completed_ops.push(op); } // We must not hold the lock while calling UnregisterWaitEx. This is // because the registered callback function might be invoked while we are // waiting for UnregisterWaitEx to complete. lock.unlock(); if (wait_handle != INVALID_HANDLE_VALUE) ::UnregisterWaitEx(wait_handle, INVALID_HANDLE_VALUE); if (::CloseHandle(impl.handle_)) { impl.handle_ = INVALID_HANDLE_VALUE; ec = asio::error_code(); } else { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); } io_context_.post_deferred_completions(completed_ops); } else { ec = asio::error_code(); } return ec; } asio::error_code win_object_handle_service::cancel( win_object_handle_service::implementation_type& impl, asio::error_code& ec) { if (is_open(impl)) { ASIO_HANDLER_OPERATION((io_context_.context(), "object_handle", &impl, reinterpret_cast(impl.wait_handle_), "cancel")); mutex::scoped_lock lock(mutex_); HANDLE wait_handle = impl.wait_handle_; impl.wait_handle_ = INVALID_HANDLE_VALUE; op_queue completed_ops; while (wait_op* op = impl.op_queue_.front()) { op->ec_ = asio::error::operation_aborted; impl.op_queue_.pop(); completed_ops.push(op); } // We must not hold the lock while calling UnregisterWaitEx. This is // because the registered callback function might be invoked while we are // waiting for UnregisterWaitEx to complete. lock.unlock(); if (wait_handle != INVALID_HANDLE_VALUE) ::UnregisterWaitEx(wait_handle, INVALID_HANDLE_VALUE); ec = asio::error_code(); io_context_.post_deferred_completions(completed_ops); } else { ec = asio::error::bad_descriptor; } return ec; } void win_object_handle_service::wait( win_object_handle_service::implementation_type& impl, asio::error_code& ec) { switch (::WaitForSingleObject(impl.handle_, INFINITE)) { case WAIT_FAILED: { DWORD last_error = ::GetLastError(); ec = asio::error_code(last_error, asio::error::get_system_category()); break; } case WAIT_OBJECT_0: case WAIT_ABANDONED: default: ec = asio::error_code(); break; } } void win_object_handle_service::start_wait_op( win_object_handle_service::implementation_type& impl, wait_op* op) { io_context_.work_started(); if (is_open(impl)) { mutex::scoped_lock lock(mutex_); if (!shutdown_) { impl.op_queue_.push(op); // Only the first operation to be queued gets to register a wait callback. // Subsequent operations have to wait for the first to finish. if (impl.op_queue_.front() == op) register_wait_callback(impl, lock); } else { lock.unlock(); io_context_.post_deferred_completion(op); } } else { op->ec_ = asio::error::bad_descriptor; io_context_.post_deferred_completion(op); } } void win_object_handle_service::register_wait_callback( win_object_handle_service::implementation_type& impl, mutex::scoped_lock& lock) { lock.lock(); if (!RegisterWaitForSingleObject(&impl.wait_handle_, impl.handle_, &win_object_handle_service::wait_callback, &impl, INFINITE, WT_EXECUTEONLYONCE)) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); op_queue completed_ops; while (wait_op* op = impl.op_queue_.front()) { op->ec_ = ec; impl.op_queue_.pop(); completed_ops.push(op); } lock.unlock(); io_context_.post_deferred_completions(completed_ops); } } void win_object_handle_service::wait_callback(PVOID param, BOOLEAN) { implementation_type* impl = static_cast(param); mutex::scoped_lock lock(impl->owner_->mutex_); if (impl->wait_handle_ != INVALID_HANDLE_VALUE) { ::UnregisterWaitEx(impl->wait_handle_, NULL); impl->wait_handle_ = INVALID_HANDLE_VALUE; } if (wait_op* op = impl->op_queue_.front()) { op_queue completed_ops; op->ec_ = asio::error_code(); impl->op_queue_.pop(); completed_ops.push(op); if (!impl->op_queue_.empty()) { if (!RegisterWaitForSingleObject(&impl->wait_handle_, impl->handle_, &win_object_handle_service::wait_callback, param, INFINITE, WT_EXECUTEONLYONCE)) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); while ((op = impl->op_queue_.front()) != 0) { op->ec_ = ec; impl->op_queue_.pop(); completed_ops.push(op); } } } io_context_impl& ioc = impl->owner_->io_context_; lock.unlock(); ioc.post_deferred_completions(completed_ops); } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) #endif // ASIO_DETAIL_IMPL_WIN_OBJECT_HANDLE_SERVICE_IPP asio-1.12.2/include/asio/detail/impl/win_static_mutex.ipp000066400000000000000000000065701340672067200234300ustar00rootroot00000000000000// // detail/impl/win_static_mutex.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_STATIC_MUTEX_IPP #define ASIO_DETAIL_IMPL_WIN_STATIC_MUTEX_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include #include "asio/detail/throw_error.hpp" #include "asio/detail/win_static_mutex.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { void win_static_mutex::init() { int error = do_init(); asio::error_code ec(error, asio::error::get_system_category()); asio::detail::throw_error(ec, "static_mutex"); } int win_static_mutex::do_init() { using namespace std; // For sprintf. wchar_t mutex_name[128]; #if defined(ASIO_HAS_SECURE_RTL) swprintf_s( #else // defined(ASIO_HAS_SECURE_RTL) _snwprintf( #endif // defined(ASIO_HAS_SECURE_RTL) mutex_name, 128, L"asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p", static_cast(::GetCurrentProcessId()), this); #if defined(ASIO_WINDOWS_APP) HANDLE mutex = ::CreateMutexExW(0, mutex_name, CREATE_MUTEX_INITIAL_OWNER, 0); #else // defined(ASIO_WINDOWS_APP) HANDLE mutex = ::CreateMutexW(0, TRUE, mutex_name); #endif // defined(ASIO_WINDOWS_APP) DWORD last_error = ::GetLastError(); if (mutex == 0) return ::GetLastError(); if (last_error == ERROR_ALREADY_EXISTS) { #if defined(ASIO_WINDOWS_APP) ::WaitForSingleObjectEx(mutex, INFINITE, false); #else // defined(ASIO_WINDOWS_APP) ::WaitForSingleObject(mutex, INFINITE); #endif // defined(ASIO_WINDOWS_APP) } if (initialised_) { ::ReleaseMutex(mutex); ::CloseHandle(mutex); return 0; } #if defined(__MINGW32__) // Not sure if MinGW supports structured exception handling, so for now // we'll just call the Windows API and hope. # if defined(UNDER_CE) ::InitializeCriticalSection(&crit_section_); # else if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) { last_error = ::GetLastError(); ::ReleaseMutex(mutex); ::CloseHandle(mutex); return last_error; } # endif #else __try { # if defined(UNDER_CE) ::InitializeCriticalSection(&crit_section_); # elif defined(ASIO_WINDOWS_APP) if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0)) { last_error = ::GetLastError(); ::ReleaseMutex(mutex); ::CloseHandle(mutex); return last_error; } # else if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) { last_error = ::GetLastError(); ::ReleaseMutex(mutex); ::CloseHandle(mutex); return last_error; } # endif } __except(GetExceptionCode() == STATUS_NO_MEMORY ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { ::ReleaseMutex(mutex); ::CloseHandle(mutex); return ERROR_OUTOFMEMORY; } #endif initialised_ = true; ::ReleaseMutex(mutex); ::CloseHandle(mutex); return 0; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_IMPL_WIN_STATIC_MUTEX_IPP asio-1.12.2/include/asio/detail/impl/win_thread.ipp000066400000000000000000000075141340672067200221650ustar00rootroot00000000000000// // detail/impl/win_thread.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_THREAD_IPP #define ASIO_DETAIL_IMPL_WIN_THREAD_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_APP) \ && !defined(UNDER_CE) #include #include "asio/detail/throw_error.hpp" #include "asio/detail/win_thread.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { win_thread::~win_thread() { ::CloseHandle(thread_); // The exit_event_ handle is deliberately allowed to leak here since it // is an error for the owner of an internal thread not to join() it. } void win_thread::join() { HANDLE handles[2] = { exit_event_, thread_ }; ::WaitForMultipleObjects(2, handles, FALSE, INFINITE); ::CloseHandle(exit_event_); if (terminate_threads()) { ::TerminateThread(thread_, 0); } else { ::QueueUserAPC(apc_function, thread_, 0); ::WaitForSingleObject(thread_, INFINITE); } } std::size_t win_thread::hardware_concurrency() { SYSTEM_INFO system_info; ::GetSystemInfo(&system_info); return system_info.dwNumberOfProcessors; } void win_thread::start_thread(func_base* arg, unsigned int stack_size) { ::HANDLE entry_event = 0; arg->entry_event_ = entry_event = ::CreateEventW(0, true, false, 0); if (!entry_event) { DWORD last_error = ::GetLastError(); delete arg; asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "thread.entry_event"); } arg->exit_event_ = exit_event_ = ::CreateEventW(0, true, false, 0); if (!exit_event_) { DWORD last_error = ::GetLastError(); delete arg; asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "thread.exit_event"); } unsigned int thread_id = 0; thread_ = reinterpret_cast(::_beginthreadex(0, stack_size, win_thread_function, arg, 0, &thread_id)); if (!thread_) { DWORD last_error = ::GetLastError(); delete arg; if (entry_event) ::CloseHandle(entry_event); if (exit_event_) ::CloseHandle(exit_event_); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "thread"); } if (entry_event) { ::WaitForSingleObject(entry_event, INFINITE); ::CloseHandle(entry_event); } } unsigned int __stdcall win_thread_function(void* arg) { win_thread::auto_func_base_ptr func = { static_cast(arg) }; ::SetEvent(func.ptr->entry_event_); func.ptr->run(); // Signal that the thread has finished its work, but rather than returning go // to sleep to put the thread into a well known state. If the thread is being // joined during global object destruction then it may be killed using // TerminateThread (to avoid a deadlock in DllMain). Otherwise, the SleepEx // call will be interrupted using QueueUserAPC and the thread will shut down // cleanly. HANDLE exit_event = func.ptr->exit_event_; delete func.ptr; func.ptr = 0; ::SetEvent(exit_event); ::SleepEx(INFINITE, TRUE); return 0; } #if defined(WINVER) && (WINVER < 0x0500) void __stdcall apc_function(ULONG) {} #else void __stdcall apc_function(ULONG_PTR) {} #endif } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_APP) // && !defined(UNDER_CE) #endif // ASIO_DETAIL_IMPL_WIN_THREAD_IPP asio-1.12.2/include/asio/detail/impl/win_tss_ptr.ipp000066400000000000000000000024501340672067200224060ustar00rootroot00000000000000// // detail/impl/win_tss_ptr.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WIN_TSS_PTR_IPP #define ASIO_DETAIL_IMPL_WIN_TSS_PTR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/throw_error.hpp" #include "asio/detail/win_tss_ptr.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { DWORD win_tss_ptr_create() { #if defined(UNDER_CE) const DWORD out_of_indexes = 0xFFFFFFFF; #else const DWORD out_of_indexes = TLS_OUT_OF_INDEXES; #endif DWORD tss_key = ::TlsAlloc(); if (tss_key == out_of_indexes) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "tss"); } return tss_key; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_IMPL_WIN_TSS_PTR_IPP asio-1.12.2/include/asio/detail/impl/winrt_ssocket_service_base.ipp000066400000000000000000000403561340672067200254520ustar00rootroot00000000000000// // detail/impl/winrt_ssocket_service_base.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WINRT_SSOCKET_SERVICE_BASE_IPP #define ASIO_DETAIL_IMPL_WINRT_SSOCKET_SERVICE_BASE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include #include "asio/detail/winrt_ssocket_service_base.hpp" #include "asio/detail/winrt_async_op.hpp" #include "asio/detail/winrt_utils.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { winrt_ssocket_service_base::winrt_ssocket_service_base( asio::io_context& io_context) : io_context_(use_service(io_context)), async_manager_(use_service(io_context)), mutex_(), impl_list_(0) { } void winrt_ssocket_service_base::base_shutdown() { // Close all implementations, causing all operations to complete. asio::detail::mutex::scoped_lock lock(mutex_); base_implementation_type* impl = impl_list_; while (impl) { asio::error_code ignored_ec; close(*impl, ignored_ec); impl = impl->next_; } } void winrt_ssocket_service_base::construct( winrt_ssocket_service_base::base_implementation_type& impl) { // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } void winrt_ssocket_service_base::base_move_construct( winrt_ssocket_service_base::base_implementation_type& impl, winrt_ssocket_service_base::base_implementation_type& other_impl) { impl.socket_ = other_impl.socket_; other_impl.socket_ = nullptr; // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); impl.next_ = impl_list_; impl.prev_ = 0; if (impl_list_) impl_list_->prev_ = &impl; impl_list_ = &impl; } void winrt_ssocket_service_base::base_move_assign( winrt_ssocket_service_base::base_implementation_type& impl, winrt_ssocket_service_base& other_service, winrt_ssocket_service_base::base_implementation_type& other_impl) { asio::error_code ignored_ec; close(impl, ignored_ec); if (this != &other_service) { // Remove implementation from linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } impl.socket_ = other_impl.socket_; other_impl.socket_ = nullptr; if (this != &other_service) { // Insert implementation into linked list of all implementations. asio::detail::mutex::scoped_lock lock(other_service.mutex_); impl.next_ = other_service.impl_list_; impl.prev_ = 0; if (other_service.impl_list_) other_service.impl_list_->prev_ = &impl; other_service.impl_list_ = &impl; } } void winrt_ssocket_service_base::destroy( winrt_ssocket_service_base::base_implementation_type& impl) { asio::error_code ignored_ec; close(impl, ignored_ec); // Remove implementation from linked list of all implementations. asio::detail::mutex::scoped_lock lock(mutex_); if (impl_list_ == &impl) impl_list_ = impl.next_; if (impl.prev_) impl.prev_->next_ = impl.next_; if (impl.next_) impl.next_->prev_= impl.prev_; impl.next_ = 0; impl.prev_ = 0; } asio::error_code winrt_ssocket_service_base::close( winrt_ssocket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (impl.socket_) { delete impl.socket_; impl.socket_ = nullptr; } ec = asio::error_code(); return ec; } winrt_ssocket_service_base::native_handle_type winrt_ssocket_service_base::release( winrt_ssocket_service_base::base_implementation_type& impl, asio::error_code& ec) { if (!is_open(impl)) return nullptr; cancel(impl, ec); if (ec) return nullptr; native_handle_type tmp = impl.socket_; impl.socket_ = nullptr; return tmp; } std::size_t winrt_ssocket_service_base::do_get_endpoint( const base_implementation_type& impl, bool local, void* addr, std::size_t addr_len, asio::error_code& ec) const { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return addr_len; } try { std::string addr_string = winrt_utils::string(local ? impl.socket_->Information->LocalAddress->CanonicalName : impl.socket_->Information->RemoteAddress->CanonicalName); unsigned short port = winrt_utils::integer(local ? impl.socket_->Information->LocalPort : impl.socket_->Information->RemotePort); unsigned long scope = 0; switch (reinterpret_cast(addr)->sa_family) { case ASIO_OS_DEF(AF_INET): if (addr_len < sizeof(sockaddr_in4_type)) { ec = asio::error::invalid_argument; return addr_len; } else { socket_ops::inet_pton(ASIO_OS_DEF(AF_INET), addr_string.c_str(), &reinterpret_cast(addr)->sin_addr, &scope, ec); reinterpret_cast(addr)->sin_port = socket_ops::host_to_network_short(port); ec = asio::error_code(); return sizeof(sockaddr_in4_type); } case ASIO_OS_DEF(AF_INET6): if (addr_len < sizeof(sockaddr_in6_type)) { ec = asio::error::invalid_argument; return addr_len; } else { socket_ops::inet_pton(ASIO_OS_DEF(AF_INET6), addr_string.c_str(), &reinterpret_cast(addr)->sin6_addr, &scope, ec); reinterpret_cast(addr)->sin6_port = socket_ops::host_to_network_short(port); ec = asio::error_code(); return sizeof(sockaddr_in6_type); } default: ec = asio::error::address_family_not_supported; return addr_len; } } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); return addr_len; } } asio::error_code winrt_ssocket_service_base::do_set_option( winrt_ssocket_service_base::base_implementation_type& impl, int level, int optname, const void* optval, std::size_t optlen, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return ec; } try { if (level == ASIO_OS_DEF(SOL_SOCKET) && optname == ASIO_OS_DEF(SO_KEEPALIVE)) { if (optlen == sizeof(int)) { int value = 0; std::memcpy(&value, optval, optlen); impl.socket_->Control->KeepAlive = !!value; ec = asio::error_code(); } else { ec = asio::error::invalid_argument; } } else if (level == ASIO_OS_DEF(IPPROTO_TCP) && optname == ASIO_OS_DEF(TCP_NODELAY)) { if (optlen == sizeof(int)) { int value = 0; std::memcpy(&value, optval, optlen); impl.socket_->Control->NoDelay = !!value; ec = asio::error_code(); } else { ec = asio::error::invalid_argument; } } else { ec = asio::error::invalid_argument; } } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); } return ec; } void winrt_ssocket_service_base::do_get_option( const winrt_ssocket_service_base::base_implementation_type& impl, int level, int optname, void* optval, std::size_t* optlen, asio::error_code& ec) const { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return; } try { if (level == ASIO_OS_DEF(SOL_SOCKET) && optname == ASIO_OS_DEF(SO_KEEPALIVE)) { if (*optlen >= sizeof(int)) { int value = impl.socket_->Control->KeepAlive ? 1 : 0; std::memcpy(optval, &value, sizeof(int)); *optlen = sizeof(int); ec = asio::error_code(); } else { ec = asio::error::invalid_argument; } } else if (level == ASIO_OS_DEF(IPPROTO_TCP) && optname == ASIO_OS_DEF(TCP_NODELAY)) { if (*optlen >= sizeof(int)) { int value = impl.socket_->Control->NoDelay ? 1 : 0; std::memcpy(optval, &value, sizeof(int)); *optlen = sizeof(int); ec = asio::error_code(); } else { ec = asio::error::invalid_argument; } } else { ec = asio::error::invalid_argument; } } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); } } asio::error_code winrt_ssocket_service_base::do_connect( winrt_ssocket_service_base::base_implementation_type& impl, const void* addr, asio::error_code& ec) { if (!is_open(impl)) { ec = asio::error::bad_descriptor; return ec; } char addr_string[max_addr_v6_str_len]; unsigned short port; switch (reinterpret_cast(addr)->sa_family) { case ASIO_OS_DEF(AF_INET): socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET), &reinterpret_cast(addr)->sin_addr, addr_string, sizeof(addr_string), 0, ec); port = socket_ops::network_to_host_short( reinterpret_cast(addr)->sin_port); break; case ASIO_OS_DEF(AF_INET6): socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6), &reinterpret_cast(addr)->sin6_addr, addr_string, sizeof(addr_string), 0, ec); port = socket_ops::network_to_host_short( reinterpret_cast(addr)->sin6_port); break; default: ec = asio::error::address_family_not_supported; return ec; } if (!ec) try { async_manager_.sync(impl.socket_->ConnectAsync( ref new Windows::Networking::HostName( winrt_utils::string(addr_string)), winrt_utils::string(port)), ec); } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); } return ec; } void winrt_ssocket_service_base::start_connect_op( winrt_ssocket_service_base::base_implementation_type& impl, const void* addr, winrt_async_op* op, bool is_continuation) { if (!is_open(impl)) { op->ec_ = asio::error::bad_descriptor; io_context_.post_immediate_completion(op, is_continuation); return; } char addr_string[max_addr_v6_str_len]; unsigned short port = 0; switch (reinterpret_cast(addr)->sa_family) { case ASIO_OS_DEF(AF_INET): socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET), &reinterpret_cast(addr)->sin_addr, addr_string, sizeof(addr_string), 0, op->ec_); port = socket_ops::network_to_host_short( reinterpret_cast(addr)->sin_port); break; case ASIO_OS_DEF(AF_INET6): socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6), &reinterpret_cast(addr)->sin6_addr, addr_string, sizeof(addr_string), 0, op->ec_); port = socket_ops::network_to_host_short( reinterpret_cast(addr)->sin6_port); break; default: op->ec_ = asio::error::address_family_not_supported; break; } if (op->ec_) { io_context_.post_immediate_completion(op, is_continuation); return; } try { async_manager_.async(impl.socket_->ConnectAsync( ref new Windows::Networking::HostName( winrt_utils::string(addr_string)), winrt_utils::string(port)), op); } catch (Platform::Exception^ e) { op->ec_ = asio::error_code( e->HResult, asio::system_category()); io_context_.post_immediate_completion(op, is_continuation); } } std::size_t winrt_ssocket_service_base::do_send( winrt_ssocket_service_base::base_implementation_type& impl, const asio::const_buffer& data, socket_base::message_flags flags, asio::error_code& ec) { if (flags) { ec = asio::error::operation_not_supported; return 0; } if (!is_open(impl)) { ec = asio::error::bad_descriptor; return 0; } try { buffer_sequence_adapter bufs(asio::buffer(data)); if (bufs.all_empty()) { ec = asio::error_code(); return 0; } return async_manager_.sync( impl.socket_->OutputStream->WriteAsync(bufs.buffers()[0]), ec); } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); return 0; } } void winrt_ssocket_service_base::start_send_op( winrt_ssocket_service_base::base_implementation_type& impl, const asio::const_buffer& data, socket_base::message_flags flags, winrt_async_op* op, bool is_continuation) { if (flags) { op->ec_ = asio::error::operation_not_supported; io_context_.post_immediate_completion(op, is_continuation); return; } if (!is_open(impl)) { op->ec_ = asio::error::bad_descriptor; io_context_.post_immediate_completion(op, is_continuation); return; } try { buffer_sequence_adapter bufs(asio::buffer(data)); if (bufs.all_empty()) { io_context_.post_immediate_completion(op, is_continuation); return; } async_manager_.async( impl.socket_->OutputStream->WriteAsync(bufs.buffers()[0]), op); } catch (Platform::Exception^ e) { op->ec_ = asio::error_code(e->HResult, asio::system_category()); io_context_.post_immediate_completion(op, is_continuation); } } std::size_t winrt_ssocket_service_base::do_receive( winrt_ssocket_service_base::base_implementation_type& impl, const asio::mutable_buffer& data, socket_base::message_flags flags, asio::error_code& ec) { if (flags) { ec = asio::error::operation_not_supported; return 0; } if (!is_open(impl)) { ec = asio::error::bad_descriptor; return 0; } try { buffer_sequence_adapter bufs(asio::buffer(data)); if (bufs.all_empty()) { ec = asio::error_code(); return 0; } async_manager_.sync( impl.socket_->InputStream->ReadAsync( bufs.buffers()[0], bufs.buffers()[0]->Capacity, Windows::Storage::Streams::InputStreamOptions::Partial), ec); std::size_t bytes_transferred = bufs.buffers()[0]->Length; if (bytes_transferred == 0 && !ec) { ec = asio::error::eof; } return bytes_transferred; } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); return 0; } } void winrt_ssocket_service_base::start_receive_op( winrt_ssocket_service_base::base_implementation_type& impl, const asio::mutable_buffer& data, socket_base::message_flags flags, winrt_async_op* op, bool is_continuation) { if (flags) { op->ec_ = asio::error::operation_not_supported; io_context_.post_immediate_completion(op, is_continuation); return; } if (!is_open(impl)) { op->ec_ = asio::error::bad_descriptor; io_context_.post_immediate_completion(op, is_continuation); return; } try { buffer_sequence_adapter bufs(asio::buffer(data)); if (bufs.all_empty()) { io_context_.post_immediate_completion(op, is_continuation); return; } async_manager_.async( impl.socket_->InputStream->ReadAsync( bufs.buffers()[0], bufs.buffers()[0]->Capacity, Windows::Storage::Streams::InputStreamOptions::Partial), op); } catch (Platform::Exception^ e) { op->ec_ = asio::error_code(e->HResult, asio::system_category()); io_context_.post_immediate_completion(op, is_continuation); } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_WINRT_SSOCKET_SERVICE_BASE_IPP asio-1.12.2/include/asio/detail/impl/winrt_timer_scheduler.hpp000066400000000000000000000047771340672067200244510ustar00rootroot00000000000000// // detail/impl/winrt_timer_scheduler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_HPP #define ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template void winrt_timer_scheduler::add_timer_queue(timer_queue& queue) { do_add_timer_queue(queue); } // Remove a timer queue from the reactor. template void winrt_timer_scheduler::remove_timer_queue(timer_queue& queue) { do_remove_timer_queue(queue); } template void winrt_timer_scheduler::schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op) { asio::detail::mutex::scoped_lock lock(mutex_); if (shutdown_) { io_context_.post_immediate_completion(op, false); return; } bool earliest = queue.enqueue_timer(time, timer, op); io_context_.work_started(); if (earliest) event_.signal(lock); } template std::size_t winrt_timer_scheduler::cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); lock.unlock(); io_context_.post_deferred_completions(ops); return n; } template void winrt_timer_scheduler::move_timer(timer_queue& queue, typename timer_queue::per_timer_data& to, typename timer_queue::per_timer_data& from) { asio::detail::mutex::scoped_lock lock(mutex_); op_queue ops; queue.cancel_timer(to, ops); queue.move_timer(to, from); lock.unlock(); scheduler_.post_deferred_completions(ops); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_HPP asio-1.12.2/include/asio/detail/impl/winrt_timer_scheduler.ipp000066400000000000000000000054461340672067200244440ustar00rootroot00000000000000// // detail/impl/winrt_timer_scheduler.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP #define ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/bind_handler.hpp" #include "asio/detail/winrt_timer_scheduler.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { winrt_timer_scheduler::winrt_timer_scheduler( asio::io_context& io_context) : asio::detail::service_base(io_context), io_context_(use_service(io_context)), mutex_(), event_(), timer_queues_(), thread_(0), stop_thread_(false), shutdown_(false) { thread_ = new asio::detail::thread( bind_handler(&winrt_timer_scheduler::call_run_thread, this)); } winrt_timer_scheduler::~winrt_timer_scheduler() { shutdown(); } void winrt_timer_scheduler::shutdown() { asio::detail::mutex::scoped_lock lock(mutex_); shutdown_ = true; stop_thread_ = true; event_.signal(lock); lock.unlock(); if (thread_) { thread_->join(); delete thread_; thread_ = 0; } op_queue ops; timer_queues_.get_all_timers(ops); io_context_.abandon_operations(ops); } void winrt_timer_scheduler::notify_fork(asio::io_context::fork_event) { } void winrt_timer_scheduler::init_task() { } void winrt_timer_scheduler::run_thread() { asio::detail::mutex::scoped_lock lock(mutex_); while (!stop_thread_) { const long max_wait_duration = 5 * 60 * 1000000; long wait_duration = timer_queues_.wait_duration_usec(max_wait_duration); event_.wait_for_usec(lock, wait_duration); event_.clear(lock); op_queue ops; timer_queues_.get_ready_timers(ops); if (!ops.empty()) { lock.unlock(); io_context_.post_deferred_completions(ops); lock.lock(); } } } void winrt_timer_scheduler::call_run_thread(winrt_timer_scheduler* scheduler) { scheduler->run_thread(); } void winrt_timer_scheduler::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.insert(&queue); } void winrt_timer_scheduler::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.erase(&queue); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP asio-1.12.2/include/asio/detail/impl/winsock_init.ipp000066400000000000000000000035741340672067200225430ustar00rootroot00000000000000// // detail/impl/winsock_init.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IMPL_WINSOCK_INIT_IPP #define ASIO_DETAIL_IMPL_WINSOCK_INIT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) #include "asio/detail/socket_types.hpp" #include "asio/detail/winsock_init.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { void winsock_init_base::startup(data& d, unsigned char major, unsigned char minor) { if (::InterlockedIncrement(&d.init_count_) == 1) { WSADATA wsa_data; long result = ::WSAStartup(MAKEWORD(major, minor), &wsa_data); ::InterlockedExchange(&d.result_, result); } } void winsock_init_base::manual_startup(data& d) { if (::InterlockedIncrement(&d.init_count_) == 1) { ::InterlockedExchange(&d.result_, 0); } } void winsock_init_base::cleanup(data& d) { if (::InterlockedDecrement(&d.init_count_) == 0) { ::WSACleanup(); } } void winsock_init_base::manual_cleanup(data& d) { ::InterlockedDecrement(&d.init_count_); } void winsock_init_base::throw_on_error(data& d) { long result = ::InterlockedExchangeAdd(&d.result_, 0); if (result != 0) { asio::error_code ec(result, asio::error::get_system_category()); asio::detail::throw_error(ec, "winsock"); } } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #endif // ASIO_DETAIL_IMPL_WINSOCK_INIT_IPP asio-1.12.2/include/asio/detail/io_control.hpp000066400000000000000000000034041340672067200212400ustar00rootroot00000000000000// // detail/io_control.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IO_CONTROL_HPP #define ASIO_DETAIL_IO_CONTROL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace io_control { // I/O control command for getting number of bytes available. class bytes_readable { public: // Default constructor. bytes_readable() : value_(0) { } // Construct with a specific command value. bytes_readable(std::size_t value) : value_(static_cast(value)) { } // Get the name of the IO control command. int name() const { return static_cast(ASIO_OS_DEF(FIONREAD)); } // Set the value of the I/O control command. void set(std::size_t value) { value_ = static_cast(value); } // Get the current value of the I/O control command. std::size_t get() const { return static_cast(value_); } // Get the address of the command data. detail::ioctl_arg_type* data() { return &value_; } // Get the address of the command data. const detail::ioctl_arg_type* data() const { return &value_; } private: detail::ioctl_arg_type value_; }; } // namespace io_control } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IO_CONTROL_HPP asio-1.12.2/include/asio/detail/is_buffer_sequence.hpp000066400000000000000000000144501340672067200227300ustar00rootroot00000000000000// // detail/is_buffer_sequence.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP #define ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { class mutable_buffer; class const_buffer; namespace detail { struct buffer_sequence_memfns_base { void begin(); void end(); void size(); void max_size(); void capacity(); void data(); void prepare(); void commit(); void consume(); }; template struct buffer_sequence_memfns_derived : T, buffer_sequence_memfns_base { }; template struct buffer_sequence_memfns_check { }; template char (&buffer_sequence_begin_helper(...))[2]; #if defined(ASIO_HAS_DECLTYPE) template char buffer_sequence_begin_helper(T* t, typename enable_if::value>::type*); #else // defined(ASIO_HAS_DECLTYPE) template char buffer_sequence_begin_helper(T* t, buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::begin>*); #endif // defined(ASIO_HAS_DECLTYPE) template char (&buffer_sequence_end_helper(...))[2]; #if defined(ASIO_HAS_DECLTYPE) template char buffer_sequence_end_helper(T* t, typename enable_if::value>::type*); #else // defined(ASIO_HAS_DECLTYPE) template char buffer_sequence_end_helper(T* t, buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::end>*); #endif // defined(ASIO_HAS_DECLTYPE) template char (&size_memfn_helper(...))[2]; template char size_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::size>*); template char (&max_size_memfn_helper(...))[2]; template char max_size_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::max_size>*); template char (&capacity_memfn_helper(...))[2]; template char capacity_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::capacity>*); template char (&data_memfn_helper(...))[2]; template char data_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::data>*); template char (&prepare_memfn_helper(...))[2]; template char prepare_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::prepare>*); template char (&commit_memfn_helper(...))[2]; template char commit_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::commit>*); template char (&consume_memfn_helper(...))[2]; template char consume_memfn_helper( buffer_sequence_memfns_check< void (buffer_sequence_memfns_base::*)(), &buffer_sequence_memfns_derived::consume>*); template char (&buffer_sequence_element_type_helper(...))[2]; #if defined(ASIO_HAS_DECLTYPE) template char buffer_sequence_element_type_helper(T* t, typename enable_if::value>::type*); #else // defined(ASIO_HAS_DECLTYPE) template char buffer_sequence_element_type_helper( typename T::const_iterator*, typename enable_if::value>::type*); #endif // defined(ASIO_HAS_DECLTYPE) template char (&const_buffers_type_typedef_helper(...))[2]; template char const_buffers_type_typedef_helper( typename T::const_buffers_type*); template char (&mutable_buffers_type_typedef_helper(...))[2]; template char mutable_buffers_type_typedef_helper( typename T::mutable_buffers_type*); template struct is_buffer_sequence_class : integral_constant(0)) != 1 && sizeof(buffer_sequence_end_helper(0)) != 1 && sizeof(buffer_sequence_element_type_helper(0, 0)) == 1> { }; template struct is_buffer_sequence : conditional::value, is_buffer_sequence_class, false_type>::type { }; template <> struct is_buffer_sequence : true_type { }; template <> struct is_buffer_sequence : true_type { }; template <> struct is_buffer_sequence : true_type { }; template <> struct is_buffer_sequence : false_type { }; template struct is_dynamic_buffer_class : integral_constant(0)) != 1 && sizeof(max_size_memfn_helper(0)) != 1 && sizeof(capacity_memfn_helper(0)) != 1 && sizeof(data_memfn_helper(0)) != 1 && sizeof(consume_memfn_helper(0)) != 1 && sizeof(prepare_memfn_helper(0)) != 1 && sizeof(commit_memfn_helper(0)) != 1 && sizeof(const_buffers_type_typedef_helper(0)) == 1 && sizeof(mutable_buffers_type_typedef_helper(0)) == 1> { }; template struct is_dynamic_buffer : conditional::value, is_dynamic_buffer_class, false_type>::type { }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP asio-1.12.2/include/asio/detail/is_executor.hpp000066400000000000000000000056101340672067200214230ustar00rootroot00000000000000// // detail/is_executor.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_IS_EXECUTOR_HPP #define ASIO_DETAIL_IS_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct executor_memfns_base { void context(); void on_work_started(); void on_work_finished(); void dispatch(); void post(); void defer(); }; template struct executor_memfns_derived : T, executor_memfns_base { }; template struct executor_memfns_check { }; template char (&context_memfn_helper(...))[2]; template char context_memfn_helper( executor_memfns_check< void (executor_memfns_base::*)(), &executor_memfns_derived::context>*); template char (&on_work_started_memfn_helper(...))[2]; template char on_work_started_memfn_helper( executor_memfns_check< void (executor_memfns_base::*)(), &executor_memfns_derived::on_work_started>*); template char (&on_work_finished_memfn_helper(...))[2]; template char on_work_finished_memfn_helper( executor_memfns_check< void (executor_memfns_base::*)(), &executor_memfns_derived::on_work_finished>*); template char (&dispatch_memfn_helper(...))[2]; template char dispatch_memfn_helper( executor_memfns_check< void (executor_memfns_base::*)(), &executor_memfns_derived::dispatch>*); template char (&post_memfn_helper(...))[2]; template char post_memfn_helper( executor_memfns_check< void (executor_memfns_base::*)(), &executor_memfns_derived::post>*); template char (&defer_memfn_helper(...))[2]; template char defer_memfn_helper( executor_memfns_check< void (executor_memfns_base::*)(), &executor_memfns_derived::defer>*); template struct is_executor_class : integral_constant(0)) != 1 && sizeof(on_work_started_memfn_helper(0)) != 1 && sizeof(on_work_finished_memfn_helper(0)) != 1 && sizeof(dispatch_memfn_helper(0)) != 1 && sizeof(post_memfn_helper(0)) != 1 && sizeof(defer_memfn_helper(0)) != 1> { }; template struct is_executor : conditional::value, is_executor_class, false_type>::type { }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_IS_EXECUTOR_HPP asio-1.12.2/include/asio/detail/keyword_tss_ptr.hpp000066400000000000000000000024501340672067200223330ustar00rootroot00000000000000// // detail/keyword_tss_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_KEYWORD_TSS_PTR_HPP #define ASIO_DETAIL_KEYWORD_TSS_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class keyword_tss_ptr : private noncopyable { public: // Constructor. keyword_tss_ptr() { } // Destructor. ~keyword_tss_ptr() { } // Get the value. operator T*() const { return value_; } // Set the value. void operator=(T* value) { value_ = value; } private: static ASIO_THREAD_KEYWORD T* value_; }; template ASIO_THREAD_KEYWORD T* keyword_tss_ptr::value_; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) #endif // ASIO_DETAIL_KEYWORD_TSS_PTR_HPP asio-1.12.2/include/asio/detail/kqueue_reactor.hpp000066400000000000000000000174221340672067200221140ustar00rootroot00000000000000// // detail/kqueue_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_KQUEUE_REACTOR_HPP #define ASIO_DETAIL_KQUEUE_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_KQUEUE) #include #include #include #include #include "asio/detail/limits.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/object_pool.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/select_interrupter.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/wait_op.hpp" #include "asio/error.hpp" #include "asio/execution_context.hpp" // Older versions of Mac OS X may not define EV_OOBAND. #if !defined(EV_OOBAND) # define EV_OOBAND EV_FLAG1 #endif // !defined(EV_OOBAND) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class scheduler; class kqueue_reactor : public execution_context_service_base { private: // The mutex type used by this reactor. typedef conditionally_enabled_mutex mutex; public: enum op_types { read_op = 0, write_op = 1, connect_op = 1, except_op = 2, max_ops = 3 }; // Per-descriptor queues. struct descriptor_state { descriptor_state(bool locking) : mutex_(locking) {} friend class kqueue_reactor; friend class object_pool_access; descriptor_state* next_; descriptor_state* prev_; mutex mutex_; int descriptor_; int num_kevents_; // 1 == read only, 2 == read and write op_queue op_queue_[max_ops]; bool shutdown_; }; // Per-descriptor data. typedef descriptor_state* per_descriptor_data; // Constructor. ASIO_DECL kqueue_reactor(asio::execution_context& ctx); // Destructor. ASIO_DECL ~kqueue_reactor(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Recreate internal descriptors following a fork. ASIO_DECL void notify_fork( asio::execution_context::fork_event fork_ev); // Initialise the task. ASIO_DECL void init_task(); // Register a socket with the reactor. Returns 0 on success, system error // code on failure. ASIO_DECL int register_descriptor(socket_type descriptor, per_descriptor_data& descriptor_data); // Register a descriptor with an associated single operation. Returns 0 on // success, system error code on failure. ASIO_DECL int register_internal_descriptor( int op_type, socket_type descriptor, per_descriptor_data& descriptor_data, reactor_op* op); // Move descriptor registration from one descriptor_data object to another. ASIO_DECL void move_descriptor(socket_type descriptor, per_descriptor_data& target_descriptor_data, per_descriptor_data& source_descriptor_data); // Post a reactor operation for immediate completion. void post_immediate_completion(reactor_op* op, bool is_continuation) { scheduler_.post_immediate_completion(op, is_continuation); } // Start a new operation. The reactor operation will be performed when the // given descriptor is flagged as ready, or an error has occurred. ASIO_DECL void start_op(int op_type, socket_type descriptor, per_descriptor_data& descriptor_data, reactor_op* op, bool is_continuation, bool allow_speculative); // Cancel all operations associated with the given descriptor. The // handlers associated with the descriptor will be invoked with the // operation_aborted error. ASIO_DECL void cancel_ops(socket_type descriptor, per_descriptor_data& descriptor_data); // Cancel any operations that are running against the descriptor and remove // its registration from the reactor. The reactor resources associated with // the descriptor must be released by calling cleanup_descriptor_data. ASIO_DECL void deregister_descriptor(socket_type descriptor, per_descriptor_data& descriptor_data, bool closing); // Remove the descriptor's registration from the reactor. The reactor // resources associated with the descriptor must be released by calling // cleanup_descriptor_data. ASIO_DECL void deregister_internal_descriptor( socket_type descriptor, per_descriptor_data& descriptor_data); // Perform any post-deregistration cleanup tasks associated with the // descriptor data. ASIO_DECL void cleanup_descriptor_data( per_descriptor_data& descriptor_data); // Add a new timer queue to the reactor. template void add_timer_queue(timer_queue& queue); // Remove a timer queue from the reactor. template void remove_timer_queue(timer_queue& queue); // Schedule a new operation in the given timer queue to expire at the // specified absolute time. template void schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op); // Cancel the timer operations associated with the given token. Returns the // number of operations that have been posted or dispatched. template std::size_t cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move the timer operations associated with the given timer. template void move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source); // Run the kqueue loop. ASIO_DECL void run(long usec, op_queue& ops); // Interrupt the kqueue loop. ASIO_DECL void interrupt(); private: // Create the kqueue file descriptor. Throws an exception if the descriptor // cannot be created. ASIO_DECL static int do_kqueue_create(); // Allocate a new descriptor state object. ASIO_DECL descriptor_state* allocate_descriptor_state(); // Free an existing descriptor state object. ASIO_DECL void free_descriptor_state(descriptor_state* s); // Helper function to add a new timer queue. ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); // Helper function to remove a timer queue. ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); // Get the timeout value for the kevent call. ASIO_DECL timespec* get_timeout(long usec, timespec& ts); // The scheduler used to post completions. scheduler& scheduler_; // Mutex to protect access to internal data. mutex mutex_; // The kqueue file descriptor. int kqueue_fd_; // The interrupter is used to break a blocking kevent call. select_interrupter interrupter_; // The timer queues. timer_queue_set timer_queues_; // Whether the service has been shut down. bool shutdown_; // Mutex to protect access to the registered descriptors. mutex registered_descriptors_mutex_; // Keep track of all registered descriptors. object_pool registered_descriptors_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/kqueue_reactor.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/kqueue_reactor.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_KQUEUE) #endif // ASIO_DETAIL_KQUEUE_REACTOR_HPP asio-1.12.2/include/asio/detail/limits.hpp000066400000000000000000000012641340672067200203740ustar00rootroot00000000000000// // detail/limits.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_LIMITS_HPP #define ASIO_DETAIL_LIMITS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_LIMITS) # include #else // defined(ASIO_HAS_BOOST_LIMITS) # include #endif // defined(ASIO_HAS_BOOST_LIMITS) #endif // ASIO_DETAIL_LIMITS_HPP asio-1.12.2/include/asio/detail/local_free_on_block_exit.hpp000066400000000000000000000025171340672067200240670ustar00rootroot00000000000000// // detail/local_free_on_block_exit.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP #define ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) #if !defined(ASIO_WINDOWS_APP) #include "asio/detail/noncopyable.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class local_free_on_block_exit : private noncopyable { public: // Constructor blocks all signals for the calling thread. explicit local_free_on_block_exit(void* p) : p_(p) { } // Destructor restores the previous signal mask. ~local_free_on_block_exit() { ::LocalFree(p_); } private: void* p_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS_APP) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #endif // ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP asio-1.12.2/include/asio/detail/macos_fenced_block.hpp000066400000000000000000000024231340672067200226510ustar00rootroot00000000000000// // detail/macos_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_MACOS_FENCED_BLOCK_HPP #define ASIO_DETAIL_MACOS_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(__MACH__) && defined(__APPLE__) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class macos_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit macos_fenced_block(half_t) { } // Constructor for a full fenced block. explicit macos_fenced_block(full_t) { OSMemoryBarrier(); } // Destructor. ~macos_fenced_block() { OSMemoryBarrier(); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(__MACH__) && defined(__APPLE__) #endif // ASIO_DETAIL_MACOS_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/memory.hpp000066400000000000000000000034761340672067200204120ustar00rootroot00000000000000// // detail/memory.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_MEMORY_HPP #define ASIO_DETAIL_MEMORY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #if !defined(ASIO_HAS_STD_SHARED_PTR) # include # include #endif // !defined(ASIO_HAS_STD_SHARED_PTR) #if !defined(ASIO_HAS_STD_ADDRESSOF) # include #endif // !defined(ASIO_HAS_STD_ADDRESSOF) namespace asio { namespace detail { #if defined(ASIO_HAS_STD_SHARED_PTR) using std::shared_ptr; using std::weak_ptr; #else // defined(ASIO_HAS_STD_SHARED_PTR) using boost::shared_ptr; using boost::weak_ptr; #endif // defined(ASIO_HAS_STD_SHARED_PTR) #if defined(ASIO_HAS_STD_ADDRESSOF) using std::addressof; #else // defined(ASIO_HAS_STD_ADDRESSOF) using boost::addressof; #endif // defined(ASIO_HAS_STD_ADDRESSOF) } // namespace detail #if defined(ASIO_HAS_CXX11_ALLOCATORS) using std::allocator_arg_t; # define ASIO_USES_ALLOCATOR(t) \ namespace std { \ template \ struct uses_allocator : true_type {}; \ } \ /**/ # define ASIO_REBIND_ALLOC(alloc, t) \ typename std::allocator_traits::template rebind_alloc /**/ #else // defined(ASIO_HAS_CXX11_ALLOCATORS) struct allocator_arg_t {}; # define ASIO_USES_ALLOCATOR(t) # define ASIO_REBIND_ALLOC(alloc, t) \ typename alloc::template rebind::other /**/ #endif // defined(ASIO_HAS_CXX11_ALLOCATORS) } // namespace asio #endif // ASIO_DETAIL_MEMORY_HPP asio-1.12.2/include/asio/detail/mutex.hpp000066400000000000000000000023001340672067200202250ustar00rootroot00000000000000// // detail/mutex.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_MUTEX_HPP #define ASIO_DETAIL_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) # include "asio/detail/null_mutex.hpp" #elif defined(ASIO_WINDOWS) # include "asio/detail/win_mutex.hpp" #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_mutex.hpp" #elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) # include "asio/detail/std_mutex.hpp" #else # error Only Windows, POSIX and std::mutex are supported! #endif namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) typedef null_mutex mutex; #elif defined(ASIO_WINDOWS) typedef win_mutex mutex; #elif defined(ASIO_HAS_PTHREADS) typedef posix_mutex mutex; #elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) typedef std_mutex mutex; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_MUTEX_HPP asio-1.12.2/include/asio/detail/noncopyable.hpp000066400000000000000000000016261340672067200214060ustar00rootroot00000000000000// // detail/noncopyable.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NONCOPYABLE_HPP #define ASIO_DETAIL_NONCOPYABLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class noncopyable { protected: noncopyable() {} ~noncopyable() {} private: noncopyable(const noncopyable&); const noncopyable& operator=(const noncopyable&); }; } // namespace detail using asio::detail::noncopyable; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_NONCOPYABLE_HPP asio-1.12.2/include/asio/detail/null_event.hpp000066400000000000000000000036161340672067200212510ustar00rootroot00000000000000// // detail/null_event.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_EVENT_HPP #define ASIO_DETAIL_NULL_EVENT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class null_event : private noncopyable { public: // Constructor. null_event() { } // Destructor. ~null_event() { } // Signal the event. (Retained for backward compatibility.) template void signal(Lock&) { } // Signal all waiters. template void signal_all(Lock&) { } // Unlock the mutex and signal one waiter. template void unlock_and_signal_one(Lock&) { } // If there's a waiter, unlock the mutex and signal it. template bool maybe_unlock_and_signal_one(Lock&) { return false; } // Reset the event. template void clear(Lock&) { } // Wait for the event to become signalled. template void wait(Lock&) { do_wait(); } // Timed wait for the event to become signalled. template bool wait_for_usec(Lock&, long usec) { do_wait_for_usec(usec); return true; } private: ASIO_DECL static void do_wait(); ASIO_DECL static void do_wait_for_usec(long usec); }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/null_event.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_NULL_EVENT_HPP asio-1.12.2/include/asio/detail/null_fenced_block.hpp000066400000000000000000000017111340672067200225200ustar00rootroot00000000000000// // detail/null_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_FENCED_BLOCK_HPP #define ASIO_DETAIL_NULL_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class null_fenced_block : private noncopyable { public: enum half_or_full_t { half, full }; // Constructor. explicit null_fenced_block(half_or_full_t) { } // Destructor. ~null_fenced_block() { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_NULL_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/null_global.hpp000066400000000000000000000023041340672067200213610ustar00rootroot00000000000000// // detail/null_global.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_GLOBAL_HPP #define ASIO_DETAIL_NULL_GLOBAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct null_global_impl { null_global_impl() : ptr_(0) { } // Destructor automatically cleans up the global. ~null_global_impl() { delete ptr_; } static null_global_impl instance_; T* ptr_; }; template null_global_impl null_global_impl::instance_; template T& null_global() { if (null_global_impl::instance_.ptr_ == 0) null_global_impl::instance_.ptr_ = new T; return *null_global_impl::instance_.ptr_; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_NULL_GLOBAL_HPP asio-1.12.2/include/asio/detail/null_mutex.hpp000066400000000000000000000021751340672067200212710ustar00rootroot00000000000000// // detail/null_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_MUTEX_HPP #define ASIO_DETAIL_NULL_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class null_mutex : private noncopyable { public: typedef asio::detail::scoped_lock scoped_lock; // Constructor. null_mutex() { } // Destructor. ~null_mutex() { } // Lock the mutex. void lock() { } // Unlock the mutex. void unlock() { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_THREADS) #endif // ASIO_DETAIL_NULL_MUTEX_HPP asio-1.12.2/include/asio/detail/null_reactor.hpp000066400000000000000000000026451340672067200215700ustar00rootroot00000000000000// // detail/null_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_REACTOR_HPP #define ASIO_DETAIL_NULL_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/scheduler_operation.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class null_reactor : public execution_context_service_base { public: // Constructor. null_reactor(asio::execution_context& ctx) : execution_context_service_base(ctx) { } // Destructor. ~null_reactor() { } // Destroy all user-defined handler objects owned by the service. void shutdown() { } // No-op because should never be called. void run(long /*usec*/, op_queue& /*ops*/) { } // No-op. void interrupt() { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_NULL_REACTOR_HPP asio-1.12.2/include/asio/detail/null_signal_blocker.hpp000066400000000000000000000027461340672067200231110ustar00rootroot00000000000000// // detail/null_signal_blocker.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP #define ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) \ || defined(ASIO_WINDOWS) \ || defined(ASIO_WINDOWS_RUNTIME) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class null_signal_blocker : private noncopyable { public: // Constructor blocks all signals for the calling thread. null_signal_blocker() { } // Destructor restores the previous signal mask. ~null_signal_blocker() { } // Block all signals for the calling thread. void block() { } // Restore the previous signal mask. void unblock() { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_THREADS) // || defined(ASIO_WINDOWS) // || defined(ASIO_WINDOWS_RUNTIME) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) #endif // ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP asio-1.12.2/include/asio/detail/null_socket_service.hpp000066400000000000000000000364201340672067200231370ustar00rootroot00000000000000// // detail/null_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_SOCKET_SERVICE_HPP #define ASIO_DETAIL_NULL_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/buffer.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/socket_base.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class null_socket_service : public service_base > { public: // The protocol type. typedef Protocol protocol_type; // The endpoint type. typedef typename Protocol::endpoint endpoint_type; // The native type of a socket. typedef int native_handle_type; // The implementation type of the socket. struct implementation_type { }; // Constructor. null_socket_service(asio::io_context& io_context) : service_base >(io_context), io_context_(io_context) { } // Destroy all user-defined handler objects owned by the service. void shutdown() { } // Construct a new socket implementation. void construct(implementation_type&) { } // Move-construct a new socket implementation. void move_construct(implementation_type&, implementation_type&) { } // Move-assign from another socket implementation. void move_assign(implementation_type&, null_socket_service&, implementation_type&) { } // Move-construct a new socket implementation from another protocol type. template void converting_move_construct(implementation_type&, null_socket_service&, typename null_socket_service::implementation_type&) { } // Destroy a socket implementation. void destroy(implementation_type&) { } // Open a new socket implementation. asio::error_code open(implementation_type&, const protocol_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Assign a native socket to a socket implementation. asio::error_code assign(implementation_type&, const protocol_type&, const native_handle_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Determine whether the socket is open. bool is_open(const implementation_type&) const { return false; } // Destroy a socket implementation. asio::error_code close(implementation_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Release ownership of the socket. native_handle_type release(implementation_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Get the native socket representation. native_handle_type native_handle(implementation_type&) { return 0; } // Cancel all operations associated with the socket. asio::error_code cancel(implementation_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Determine whether the socket is at the out-of-band data mark. bool at_mark(const implementation_type&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return false; } // Determine the number of bytes available for reading. std::size_t available(const implementation_type&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return 0; } // Place the socket into the state where it will listen for new connections. asio::error_code listen(implementation_type&, int, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Perform an IO control command on the socket. template asio::error_code io_control(implementation_type&, IO_Control_Command&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Gets the non-blocking mode of the socket. bool non_blocking(const implementation_type&) const { return false; } // Sets the non-blocking mode of the socket. asio::error_code non_blocking(implementation_type&, bool, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const implementation_type&) const { return false; } // Sets the non-blocking mode of the native socket implementation. asio::error_code native_non_blocking(implementation_type&, bool, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Disable sends or receives on the socket. asio::error_code shutdown(implementation_type&, socket_base::shutdown_type, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Bind the socket to the specified local endpoint. asio::error_code bind(implementation_type&, const endpoint_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Set a socket option. template asio::error_code set_option(implementation_type&, const Option&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Set a socket option. template asio::error_code get_option(const implementation_type&, Option&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return ec; } // Get the local endpoint. endpoint_type local_endpoint(const implementation_type&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return endpoint_type(); } // Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return endpoint_type(); } // Send the given data to the peer. template std::size_t send(implementation_type&, const ConstBufferSequence&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Wait until data can be sent without blocking. std::size_t send(implementation_type&, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send(implementation_type&, const ConstBufferSequence&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Start an asynchronous wait until data can be sent without blocking. template void async_send(implementation_type&, const null_buffers&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Receive some data from the peer. Returns the number of bytes received. template std::size_t receive(implementation_type&, const MutableBufferSequence&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Wait until data can be received without blocking. std::size_t receive(implementation_type&, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive(implementation_type&, const MutableBufferSequence&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Wait until data can be received without blocking. template void async_receive(implementation_type&, const null_buffers&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Receive some data with associated flags. Returns the number of bytes // received. template std::size_t receive_with_flags(implementation_type&, const MutableBufferSequence&, socket_base::message_flags, socket_base::message_flags&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Wait until data can be received without blocking. std::size_t receive_with_flags(implementation_type&, const null_buffers&, socket_base::message_flags, socket_base::message_flags&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive_with_flags(implementation_type&, const MutableBufferSequence&, socket_base::message_flags, socket_base::message_flags&, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Wait until data can be received without blocking. template void async_receive_with_flags(implementation_type&, const null_buffers&, socket_base::message_flags, socket_base::message_flags&, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Send a datagram to the specified endpoint. Returns the number of bytes // sent. template std::size_t send_to(implementation_type&, const ConstBufferSequence&, const endpoint_type&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Wait until data can be sent without blocking. std::size_t send_to(implementation_type&, const null_buffers&, const endpoint_type&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send_to(implementation_type&, const ConstBufferSequence&, const endpoint_type&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Start an asynchronous wait until data can be sent without blocking. template void async_send_to(implementation_type&, const null_buffers&, const endpoint_type&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Receive a datagram with the endpoint of the sender. Returns the number of // bytes received. template std::size_t receive_from(implementation_type&, const MutableBufferSequence&, endpoint_type&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Wait until data can be received without blocking. std::size_t receive_from(implementation_type&, const null_buffers&, endpoint_type&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous receive. The buffer for the data being received and // the sender_endpoint object must both be valid for the lifetime of the // asynchronous operation. template void async_receive_from(implementation_type&, const MutableBufferSequence&, endpoint_type&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Wait until data can be received without blocking. template void async_receive_from(implementation_type&, const null_buffers&, endpoint_type&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); } // Accept a new connection. template asio::error_code accept(implementation_type&, Socket&, endpoint_type*, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Start an asynchronous accept. The peer and peer_endpoint objects // must be valid until the accept's handler is invoked. template void async_accept(implementation_type&, Socket&, endpoint_type*, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; io_context_.post(detail::bind_handler(handler, ec)); } // Connect the socket to the specified endpoint. asio::error_code connect(implementation_type&, const endpoint_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Start an asynchronous connect. template void async_connect(implementation_type&, const endpoint_type&, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; io_context_.post(detail::bind_handler(handler, ec)); } private: asio::io_context& io_context_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_NULL_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/detail/null_static_mutex.hpp000066400000000000000000000022011340672067200226260ustar00rootroot00000000000000// // detail/null_static_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_STATIC_MUTEX_HPP #define ASIO_DETAIL_NULL_STATIC_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct null_static_mutex { typedef asio::detail::scoped_lock scoped_lock; // Initialise the mutex. void init() { } // Lock the mutex. void lock() { } // Unlock the mutex. void unlock() { } int unused_; }; #define ASIO_NULL_STATIC_MUTEX_INIT { 0 } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_THREADS) #endif // ASIO_DETAIL_NULL_STATIC_MUTEX_HPP asio-1.12.2/include/asio/detail/null_thread.hpp000066400000000000000000000024531340672067200213750ustar00rootroot00000000000000// // detail/null_thread.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_THREAD_HPP #define ASIO_DETAIL_NULL_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) #include "asio/detail/noncopyable.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class null_thread : private noncopyable { public: // Constructor. template null_thread(Function, unsigned int = 0) { asio::detail::throw_error( asio::error::operation_not_supported, "thread"); } // Destructor. ~null_thread() { } // Wait for the thread to exit. void join() { } // Get number of CPUs. static std::size_t hardware_concurrency() { return 1; } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_THREADS) #endif // ASIO_DETAIL_NULL_THREAD_HPP asio-1.12.2/include/asio/detail/null_tss_ptr.hpp000066400000000000000000000022331340672067200216200ustar00rootroot00000000000000// // detail/null_tss_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_NULL_TSS_PTR_HPP #define ASIO_DETAIL_NULL_TSS_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class null_tss_ptr : private noncopyable { public: // Constructor. null_tss_ptr() : value_(0) { } // Destructor. ~null_tss_ptr() { } // Get the value. operator T*() const { return value_; } // Set the value. void operator=(T* value) { value_ = value; } private: T* value_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_THREADS) #endif // ASIO_DETAIL_NULL_TSS_PTR_HPP asio-1.12.2/include/asio/detail/object_pool.hpp000066400000000000000000000065411340672067200213750ustar00rootroot00000000000000// // detail/object_pool.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_OBJECT_POOL_HPP #define ASIO_DETAIL_OBJECT_POOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class object_pool; class object_pool_access { public: template static Object* create() { return new Object; } template static Object* create(Arg arg) { return new Object(arg); } template static void destroy(Object* o) { delete o; } template static Object*& next(Object* o) { return o->next_; } template static Object*& prev(Object* o) { return o->prev_; } }; template class object_pool : private noncopyable { public: // Constructor. object_pool() : live_list_(0), free_list_(0) { } // Destructor destroys all objects. ~object_pool() { destroy_list(live_list_); destroy_list(free_list_); } // Get the object at the start of the live list. Object* first() { return live_list_; } // Allocate a new object. Object* alloc() { Object* o = free_list_; if (o) free_list_ = object_pool_access::next(free_list_); else o = object_pool_access::create(); object_pool_access::next(o) = live_list_; object_pool_access::prev(o) = 0; if (live_list_) object_pool_access::prev(live_list_) = o; live_list_ = o; return o; } // Allocate a new object with an argument. template Object* alloc(Arg arg) { Object* o = free_list_; if (o) free_list_ = object_pool_access::next(free_list_); else o = object_pool_access::create(arg); object_pool_access::next(o) = live_list_; object_pool_access::prev(o) = 0; if (live_list_) object_pool_access::prev(live_list_) = o; live_list_ = o; return o; } // Free an object. Moves it to the free list. No destructors are run. void free(Object* o) { if (live_list_ == o) live_list_ = object_pool_access::next(o); if (object_pool_access::prev(o)) { object_pool_access::next(object_pool_access::prev(o)) = object_pool_access::next(o); } if (object_pool_access::next(o)) { object_pool_access::prev(object_pool_access::next(o)) = object_pool_access::prev(o); } object_pool_access::next(o) = free_list_; object_pool_access::prev(o) = 0; free_list_ = o; } private: // Helper function to destroy all elements in a list. void destroy_list(Object* list) { while (list) { Object* o = list; list = object_pool_access::next(o); object_pool_access::destroy(o); } } // The list of live objects. Object* live_list_; // The free list. Object* free_list_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_OBJECT_POOL_HPP asio-1.12.2/include/asio/detail/old_win_sdk_compat.hpp000066400000000000000000000104251340672067200227310ustar00rootroot00000000000000// // detail/old_win_sdk_compat.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP #define ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Guess whether we are building against on old Platform SDK. #if !defined(IN6ADDR_ANY_INIT) #define ASIO_HAS_OLD_WIN_SDK 1 #endif // !defined(IN6ADDR_ANY_INIT) #if defined(ASIO_HAS_OLD_WIN_SDK) // Emulation of types that are missing from old Platform SDKs. // // N.B. this emulation is also used if building for a Windows 2000 target with // a recent (i.e. Vista or later) SDK, as the SDK does not provide IPv6 support // in that case. #include "asio/detail/push_options.hpp" namespace asio { namespace detail { enum { sockaddr_storage_maxsize = 128, // Maximum size. sockaddr_storage_alignsize = (sizeof(__int64)), // Desired alignment. sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)), sockaddr_storage_pad2size = (sockaddr_storage_maxsize - (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize)) }; struct sockaddr_storage_emulation { short ss_family; char __ss_pad1[sockaddr_storage_pad1size]; __int64 __ss_align; char __ss_pad2[sockaddr_storage_pad2size]; }; struct in6_addr_emulation { union { u_char Byte[16]; u_short Word[8]; } u; }; #if !defined(s6_addr) # define _S6_un u # define _S6_u8 Byte # define s6_addr _S6_un._S6_u8 #endif // !defined(s6_addr) struct sockaddr_in6_emulation { short sin6_family; u_short sin6_port; u_long sin6_flowinfo; in6_addr_emulation sin6_addr; u_long sin6_scope_id; }; struct ipv6_mreq_emulation { in6_addr_emulation ipv6mr_multiaddr; unsigned int ipv6mr_interface; }; struct addrinfo_emulation { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; char* ai_canonname; sockaddr* ai_addr; addrinfo_emulation* ai_next; }; #if !defined(AI_PASSIVE) # define AI_PASSIVE 0x1 #endif #if !defined(AI_CANONNAME) # define AI_CANONNAME 0x2 #endif #if !defined(AI_NUMERICHOST) # define AI_NUMERICHOST 0x4 #endif #if !defined(EAI_AGAIN) # define EAI_AGAIN WSATRY_AGAIN #endif #if !defined(EAI_BADFLAGS) # define EAI_BADFLAGS WSAEINVAL #endif #if !defined(EAI_FAIL) # define EAI_FAIL WSANO_RECOVERY #endif #if !defined(EAI_FAMILY) # define EAI_FAMILY WSAEAFNOSUPPORT #endif #if !defined(EAI_MEMORY) # define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY #endif #if !defined(EAI_NODATA) # define EAI_NODATA WSANO_DATA #endif #if !defined(EAI_NONAME) # define EAI_NONAME WSAHOST_NOT_FOUND #endif #if !defined(EAI_SERVICE) # define EAI_SERVICE WSATYPE_NOT_FOUND #endif #if !defined(EAI_SOCKTYPE) # define EAI_SOCKTYPE WSAESOCKTNOSUPPORT #endif #if !defined(NI_NOFQDN) # define NI_NOFQDN 0x01 #endif #if !defined(NI_NUMERICHOST) # define NI_NUMERICHOST 0x02 #endif #if !defined(NI_NAMEREQD) # define NI_NAMEREQD 0x04 #endif #if !defined(NI_NUMERICSERV) # define NI_NUMERICSERV 0x08 #endif #if !defined(NI_DGRAM) # define NI_DGRAM 0x10 #endif #if !defined(IPPROTO_IPV6) # define IPPROTO_IPV6 41 #endif #if !defined(IPV6_UNICAST_HOPS) # define IPV6_UNICAST_HOPS 4 #endif #if !defined(IPV6_MULTICAST_IF) # define IPV6_MULTICAST_IF 9 #endif #if !defined(IPV6_MULTICAST_HOPS) # define IPV6_MULTICAST_HOPS 10 #endif #if !defined(IPV6_MULTICAST_LOOP) # define IPV6_MULTICAST_LOOP 11 #endif #if !defined(IPV6_JOIN_GROUP) # define IPV6_JOIN_GROUP 12 #endif #if !defined(IPV6_LEAVE_GROUP) # define IPV6_LEAVE_GROUP 13 #endif } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_OLD_WIN_SDK) // Even newer Platform SDKs that support IPv6 may not define IPV6_V6ONLY. #if !defined(IPV6_V6ONLY) # define IPV6_V6ONLY 27 #endif // Some SDKs (e.g. Windows CE) don't define IPPROTO_ICMPV6. #if !defined(IPPROTO_ICMPV6) # define IPPROTO_ICMPV6 58 #endif #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #endif // ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP asio-1.12.2/include/asio/detail/op_queue.hpp000066400000000000000000000062461340672067200207220ustar00rootroot00000000000000// // detail/op_queue.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_OP_QUEUE_HPP #define ASIO_DETAIL_OP_QUEUE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class op_queue; class op_queue_access { public: template static Operation* next(Operation* o) { return static_cast(o->next_); } template static void next(Operation1*& o1, Operation2* o2) { o1->next_ = o2; } template static void destroy(Operation* o) { o->destroy(); } template static Operation*& front(op_queue& q) { return q.front_; } template static Operation*& back(op_queue& q) { return q.back_; } }; template class op_queue : private noncopyable { public: // Constructor. op_queue() : front_(0), back_(0) { } // Destructor destroys all operations. ~op_queue() { while (Operation* op = front_) { pop(); op_queue_access::destroy(op); } } // Get the operation at the front of the queue. Operation* front() { return front_; } // Pop an operation from the front of the queue. void pop() { if (front_) { Operation* tmp = front_; front_ = op_queue_access::next(front_); if (front_ == 0) back_ = 0; op_queue_access::next(tmp, static_cast(0)); } } // Push an operation on to the back of the queue. void push(Operation* h) { op_queue_access::next(h, static_cast(0)); if (back_) { op_queue_access::next(back_, h); back_ = h; } else { front_ = back_ = h; } } // Push all operations from another queue on to the back of the queue. The // source queue may contain operations of a derived type. template void push(op_queue& q) { if (Operation* other_front = op_queue_access::front(q)) { if (back_) op_queue_access::next(back_, other_front); else front_ = other_front; back_ = op_queue_access::back(q); op_queue_access::front(q) = 0; op_queue_access::back(q) = 0; } } // Whether the queue is empty. bool empty() const { return front_ == 0; } // Test whether an operation is already enqueued. bool is_enqueued(Operation* o) const { return op_queue_access::next(o) != 0 || back_ == o; } private: friend class op_queue_access; // The front of the queue. Operation* front_; // The back of the queue. Operation* back_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_OP_QUEUE_HPP asio-1.12.2/include/asio/detail/operation.hpp000066400000000000000000000015541340672067200210750ustar00rootroot00000000000000// // detail/operation.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_OPERATION_HPP #define ASIO_DETAIL_OPERATION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_operation.hpp" #else # include "asio/detail/scheduler_operation.hpp" #endif namespace asio { namespace detail { #if defined(ASIO_HAS_IOCP) typedef win_iocp_operation operation; #else typedef scheduler_operation operation; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_OPERATION_HPP asio-1.12.2/include/asio/detail/pipe_select_interrupter.hpp000066400000000000000000000045761340672067200240430ustar00rootroot00000000000000// // detail/pipe_select_interrupter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP #define ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) #if !defined(ASIO_WINDOWS_RUNTIME) #if !defined(__CYGWIN__) #if !defined(__SYMBIAN32__) #if !defined(ASIO_HAS_EVENTFD) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class pipe_select_interrupter { public: // Constructor. ASIO_DECL pipe_select_interrupter(); // Destructor. ASIO_DECL ~pipe_select_interrupter(); // Recreate the interrupter's descriptors. Used after a fork. ASIO_DECL void recreate(); // Interrupt the select call. ASIO_DECL void interrupt(); // Reset the select interrupt. Returns true if the call was interrupted. ASIO_DECL bool reset(); // Get the read descriptor to be passed to select. int read_descriptor() const { return read_descriptor_; } private: // Open the descriptors. Throws on error. ASIO_DECL void open_descriptors(); // Close the descriptors. ASIO_DECL void close_descriptors(); // The read end of a connection used to interrupt the select call. This file // descriptor is passed to select such that when it is time to stop, a single // byte will be written on the other end of the connection and this // descriptor will become readable. int read_descriptor_; // The write end of a connection used to interrupt the select call. A single // byte may be written to this to wake up the select which is waiting for the // other end to become readable. int write_descriptor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/pipe_select_interrupter.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // !defined(ASIO_HAS_EVENTFD) #endif // !defined(__SYMBIAN32__) #endif // !defined(__CYGWIN__) #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // !defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP asio-1.12.2/include/asio/detail/pop_options.hpp000066400000000000000000000047551340672067200214540ustar00rootroot00000000000000// // detail/pop_options.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // No header guard #if defined(__COMO__) // Comeau C++ #elif defined(__DMC__) // Digital Mars C++ #elif defined(__INTEL_COMPILER) || defined(__ICL) \ || defined(__ICC) || defined(__ECC) // Intel C++ # if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) # pragma GCC visibility pop # endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) #elif defined(__clang__) // Clang # if defined(__OBJC__) # if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) # if defined(ASIO_OBJC_WORKAROUND) # undef Protocol # undef id # undef ASIO_OBJC_WORKAROUND # endif # endif # endif # if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) # pragma GCC visibility pop # endif // !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) #elif defined(__GNUC__) // GNU C++ # if defined(__MINGW32__) || defined(__CYGWIN__) # pragma pack (pop) # endif # if defined(__OBJC__) # if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) # if defined(ASIO_OBJC_WORKAROUND) # undef Protocol # undef id # undef ASIO_OBJC_WORKAROUND # endif # endif # endif # if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) # pragma GCC visibility pop # endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) # if (__GNUC__ >= 7) # pragma GCC diagnostic pop # endif // (__GNUC__ >= 7) #elif defined(__KCC) // Kai C++ #elif defined(__sgi) // SGI MIPSpro C++ #elif defined(__DECCXX) // Compaq Tru64 Unix cxx #elif defined(__ghs) // Greenhills C++ #elif defined(__BORLANDC__) // Borland C++ # pragma option pop # pragma nopushoptwarn # pragma nopackwarning #elif defined(__MWERKS__) // Metrowerks CodeWarrior #elif defined(__SUNPRO_CC) // Sun Workshop Compiler C++ #elif defined(__HP_aCC) // HP aCC #elif defined(__MRC__) || defined(__SC__) // MPW MrCpp or SCpp #elif defined(__IBMCPP__) // IBM Visual Age #elif defined(_MSC_VER) // Microsoft Visual C++ // // Must remain the last #elif since some other vendors (Metrowerks, for example) // also #define _MSC_VER # pragma warning (pop) # pragma pack (pop) # if defined(__cplusplus_cli) || defined(__cplusplus_winrt) # if defined(ASIO_CLR_WORKAROUND) # undef generic # undef ASIO_CLR_WORKAROUND # endif # endif #endif asio-1.12.2/include/asio/detail/posix_event.hpp000066400000000000000000000076671340672067200214530ustar00rootroot00000000000000// // detail/posix_event.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_EVENT_HPP #define ASIO_DETAIL_POSIX_EVENT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include "asio/detail/assert.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class posix_event : private noncopyable { public: // Constructor. ASIO_DECL posix_event(); // Destructor. ~posix_event() { ::pthread_cond_destroy(&cond_); } // Signal the event. (Retained for backward compatibility.) template void signal(Lock& lock) { this->signal_all(lock); } // Signal all waiters. template void signal_all(Lock& lock) { ASIO_ASSERT(lock.locked()); (void)lock; state_ |= 1; ::pthread_cond_broadcast(&cond_); // Ignore EINVAL. } // Unlock the mutex and signal one waiter. template void unlock_and_signal_one(Lock& lock) { ASIO_ASSERT(lock.locked()); state_ |= 1; bool have_waiters = (state_ > 1); lock.unlock(); if (have_waiters) ::pthread_cond_signal(&cond_); // Ignore EINVAL. } // If there's a waiter, unlock the mutex and signal it. template bool maybe_unlock_and_signal_one(Lock& lock) { ASIO_ASSERT(lock.locked()); state_ |= 1; if (state_ > 1) { lock.unlock(); ::pthread_cond_signal(&cond_); // Ignore EINVAL. return true; } return false; } // Reset the event. template void clear(Lock& lock) { ASIO_ASSERT(lock.locked()); (void)lock; state_ &= ~std::size_t(1); } // Wait for the event to become signalled. template void wait(Lock& lock) { ASIO_ASSERT(lock.locked()); while ((state_ & 1) == 0) { state_ += 2; ::pthread_cond_wait(&cond_, &lock.mutex().mutex_); // Ignore EINVAL. state_ -= 2; } } // Timed wait for the event to become signalled. template bool wait_for_usec(Lock& lock, long usec) { ASIO_ASSERT(lock.locked()); if ((state_ & 1) == 0) { state_ += 2; timespec ts; #if (defined(__MACH__) && defined(__APPLE__)) \ || (defined(__ANDROID__) && (__ANDROID_API__ < 21) \ && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)) ts.tv_sec = usec / 1000000; ts.tv_nsec = (usec % 1000000) * 1000; ::pthread_cond_timedwait_relative_np( &cond_, &lock.mutex().mutex_, &ts); // Ignore EINVAL. #else // (defined(__MACH__) && defined(__APPLE__)) // || (defined(__ANDROID__) && (__ANDROID_API__ < 21) // && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)) if (::clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { ts.tv_sec += usec / 1000000; ts.tv_nsec = (usec % 1000000) * 1000; ts.tv_sec += ts.tv_nsec / 1000000000; ts.tv_nsec = ts.tv_nsec % 1000000000; ::pthread_cond_timedwait(&cond_, &lock.mutex().mutex_, &ts); // Ignore EINVAL. } #endif // (defined(__MACH__) && defined(__APPLE__)) // || (defined(__ANDROID__) && (__ANDROID_API__ < 21) // && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)) state_ -= 2; } return (state_ & 1) != 0; } private: ::pthread_cond_t cond_; std::size_t state_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/posix_event.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_EVENT_HPP asio-1.12.2/include/asio/detail/posix_fd_set_adapter.hpp000066400000000000000000000054621340672067200232650ustar00rootroot00000000000000// // detail/posix_fd_set_adapter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP #define ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) \ && !defined(__CYGWIN__) \ && !defined(ASIO_WINDOWS_RUNTIME) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/reactor_op_queue.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. class posix_fd_set_adapter : noncopyable { public: posix_fd_set_adapter() : max_descriptor_(invalid_socket) { using namespace std; // Needed for memset on Solaris. FD_ZERO(&fd_set_); } void reset() { using namespace std; // Needed for memset on Solaris. FD_ZERO(&fd_set_); } bool set(socket_type descriptor) { if (descriptor < (socket_type)FD_SETSIZE) { if (max_descriptor_ == invalid_socket || descriptor > max_descriptor_) max_descriptor_ = descriptor; FD_SET(descriptor, &fd_set_); return true; } return false; } void set(reactor_op_queue& operations, op_queue& ops) { reactor_op_queue::iterator i = operations.begin(); while (i != operations.end()) { reactor_op_queue::iterator op_iter = i++; if (!set(op_iter->first)) { asio::error_code ec(error::fd_set_failure); operations.cancel_operations(op_iter, ops, ec); } } } bool is_set(socket_type descriptor) const { return FD_ISSET(descriptor, &fd_set_) != 0; } operator fd_set*() { return &fd_set_; } socket_type max_descriptor() const { return max_descriptor_; } void perform(reactor_op_queue& operations, op_queue& ops) const { reactor_op_queue::iterator i = operations.begin(); while (i != operations.end()) { reactor_op_queue::iterator op_iter = i++; if (is_set(op_iter->first)) operations.perform_operations(op_iter, ops); } } private: mutable fd_set fd_set_; socket_type max_descriptor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) // && !defined(__CYGWIN__) // && !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP asio-1.12.2/include/asio/detail/posix_global.hpp000066400000000000000000000032701340672067200215540ustar00rootroot00000000000000// // detail/posix_global.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_GLOBAL_HPP #define ASIO_DETAIL_POSIX_GLOBAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct posix_global_impl { // Helper function to perform initialisation. static void do_init() { instance_.static_ptr_ = instance_.ptr_ = new T; } // Destructor automatically cleans up the global. ~posix_global_impl() { delete static_ptr_; } static ::pthread_once_t init_once_; static T* static_ptr_; static posix_global_impl instance_; T* ptr_; }; template ::pthread_once_t posix_global_impl::init_once_ = PTHREAD_ONCE_INIT; template T* posix_global_impl::static_ptr_ = 0; template posix_global_impl posix_global_impl::instance_; template T& posix_global() { int result = ::pthread_once( &posix_global_impl::init_once_, &posix_global_impl::do_init); if (result != 0) std::terminate(); return *posix_global_impl::instance_.ptr_; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_GLOBAL_HPP asio-1.12.2/include/asio/detail/posix_mutex.hpp000066400000000000000000000030231340672067200214520ustar00rootroot00000000000000// // detail/posix_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_MUTEX_HPP #define ASIO_DETAIL_POSIX_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class posix_event; class posix_mutex : private noncopyable { public: typedef asio::detail::scoped_lock scoped_lock; // Constructor. ASIO_DECL posix_mutex(); // Destructor. ~posix_mutex() { ::pthread_mutex_destroy(&mutex_); // Ignore EBUSY. } // Lock the mutex. void lock() { (void)::pthread_mutex_lock(&mutex_); // Ignore EINVAL. } // Unlock the mutex. void unlock() { (void)::pthread_mutex_unlock(&mutex_); // Ignore EINVAL. } private: friend class posix_event; ::pthread_mutex_t mutex_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/posix_mutex.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_MUTEX_HPP asio-1.12.2/include/asio/detail/posix_signal_blocker.hpp000066400000000000000000000035321340672067200232730ustar00rootroot00000000000000// // detail/posix_signal_blocker.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP #define ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class posix_signal_blocker : private noncopyable { public: // Constructor blocks all signals for the calling thread. posix_signal_blocker() : blocked_(false) { sigset_t new_mask; sigfillset(&new_mask); blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0); } // Destructor restores the previous signal mask. ~posix_signal_blocker() { if (blocked_) pthread_sigmask(SIG_SETMASK, &old_mask_, 0); } // Block all signals for the calling thread. void block() { if (!blocked_) { sigset_t new_mask; sigfillset(&new_mask); blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0); } } // Restore the previous signal mask. void unblock() { if (blocked_) blocked_ = (pthread_sigmask(SIG_SETMASK, &old_mask_, 0) != 0); } private: // Have signals been blocked. bool blocked_; // The previous signal mask. sigset_t old_mask_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP asio-1.12.2/include/asio/detail/posix_static_mutex.hpp000066400000000000000000000025211340672067200230230ustar00rootroot00000000000000// // detail/posix_static_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_STATIC_MUTEX_HPP #define ASIO_DETAIL_POSIX_STATIC_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct posix_static_mutex { typedef asio::detail::scoped_lock scoped_lock; // Initialise the mutex. void init() { // Nothing to do. } // Lock the mutex. void lock() { (void)::pthread_mutex_lock(&mutex_); // Ignore EINVAL. } // Unlock the mutex. void unlock() { (void)::pthread_mutex_unlock(&mutex_); // Ignore EINVAL. } ::pthread_mutex_t mutex_; }; #define ASIO_POSIX_STATIC_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_STATIC_MUTEX_HPP asio-1.12.2/include/asio/detail/posix_thread.hpp000066400000000000000000000037621340672067200215710ustar00rootroot00000000000000// // detail/posix_thread.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_THREAD_HPP #define ASIO_DETAIL_POSIX_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { extern "C" { ASIO_DECL void* asio_detail_posix_thread_function(void* arg); } class posix_thread : private noncopyable { public: // Constructor. template posix_thread(Function f, unsigned int = 0) : joined_(false) { start_thread(new func(f)); } // Destructor. ASIO_DECL ~posix_thread(); // Wait for the thread to exit. ASIO_DECL void join(); // Get number of CPUs. ASIO_DECL static std::size_t hardware_concurrency(); private: friend void* asio_detail_posix_thread_function(void* arg); class func_base { public: virtual ~func_base() {} virtual void run() = 0; }; struct auto_func_base_ptr { func_base* ptr; ~auto_func_base_ptr() { delete ptr; } }; template class func : public func_base { public: func(Function f) : f_(f) { } virtual void run() { f_(); } private: Function f_; }; ASIO_DECL void start_thread(func_base* arg); ::pthread_t thread_; bool joined_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/posix_thread.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_THREAD_HPP asio-1.12.2/include/asio/detail/posix_tss_ptr.hpp000066400000000000000000000032231340672067200220100ustar00rootroot00000000000000// // detail/posix_tss_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_POSIX_TSS_PTR_HPP #define ASIO_DETAIL_POSIX_TSS_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_PTHREADS) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper function to create thread-specific storage. ASIO_DECL void posix_tss_ptr_create(pthread_key_t& key); template class posix_tss_ptr : private noncopyable { public: // Constructor. posix_tss_ptr() { posix_tss_ptr_create(tss_key_); } // Destructor. ~posix_tss_ptr() { ::pthread_key_delete(tss_key_); } // Get the value. operator T*() const { return static_cast(::pthread_getspecific(tss_key_)); } // Set the value. void operator=(T* value) { ::pthread_setspecific(tss_key_, value); } private: // Thread-specific storage to allow unlocked access to determine whether a // thread is a member of the pool. pthread_key_t tss_key_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/posix_tss_ptr.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_PTHREADS) #endif // ASIO_DETAIL_POSIX_TSS_PTR_HPP asio-1.12.2/include/asio/detail/push_options.hpp000066400000000000000000000101341340672067200216210ustar00rootroot00000000000000// // detail/push_options.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // No header guard #if defined(__COMO__) // Comeau C++ #elif defined(__DMC__) // Digital Mars C++ #elif defined(__INTEL_COMPILER) || defined(__ICL) \ || defined(__ICC) || defined(__ECC) // Intel C++ # if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) # pragma GCC visibility push (default) # endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) #elif defined(__clang__) // Clang # if defined(__OBJC__) # if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) # if !defined(ASIO_DISABLE_OBJC_WORKAROUND) # if !defined(Protocol) && !defined(id) # define Protocol cpp_Protocol # define id cpp_id # define ASIO_OBJC_WORKAROUND # endif # endif # endif # endif # if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) # pragma GCC visibility push (default) # endif // !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) #elif defined(__GNUC__) // GNU C++ # if defined(__MINGW32__) || defined(__CYGWIN__) # pragma pack (push, 8) # endif # if defined(__OBJC__) # if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) # if !defined(ASIO_DISABLE_OBJC_WORKAROUND) # if !defined(Protocol) && !defined(id) # define Protocol cpp_Protocol # define id cpp_id # define ASIO_OBJC_WORKAROUND # endif # endif # endif # endif # if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) # pragma GCC visibility push (default) # endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) # if (__GNUC__ >= 7) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wimplicit-fallthrough" # endif // (__GNUC__ >= 7) #elif defined(__KCC) // Kai C++ #elif defined(__sgi) // SGI MIPSpro C++ #elif defined(__DECCXX) // Compaq Tru64 Unix cxx #elif defined(__ghs) // Greenhills C++ #elif defined(__BORLANDC__) // Borland C++ # pragma option push -a8 -b -Ve- -Vx- -w-inl -vi- # pragma nopushoptwarn # pragma nopackwarning # if !defined(__MT__) # error Multithreaded RTL must be selected. # endif // !defined(__MT__) #elif defined(__MWERKS__) // Metrowerks CodeWarrior #elif defined(__SUNPRO_CC) // Sun Workshop Compiler C++ #elif defined(__HP_aCC) // HP aCC #elif defined(__MRC__) || defined(__SC__) // MPW MrCpp or SCpp #elif defined(__IBMCPP__) // IBM Visual Age #elif defined(_MSC_VER) // Microsoft Visual C++ // // Must remain the last #elif since some other vendors (Metrowerks, for example) // also #define _MSC_VER # pragma warning (disable:4103) # pragma warning (push) # pragma warning (disable:4127) # pragma warning (disable:4180) # pragma warning (disable:4244) # pragma warning (disable:4355) # pragma warning (disable:4510) # pragma warning (disable:4512) # pragma warning (disable:4610) # pragma warning (disable:4675) # if (_MSC_VER < 1600) // Visual Studio 2008 generates spurious warnings about unused parameters. # pragma warning (disable:4100) # endif // (_MSC_VER < 1600) # if defined(_M_IX86) && defined(_Wp64) // The /Wp64 option is broken. If you want to check 64 bit portability, use a // 64 bit compiler! # pragma warning (disable:4311) # pragma warning (disable:4312) # endif // defined(_M_IX86) && defined(_Wp64) # pragma pack (push, 8) // Note that if the /Og optimisation flag is enabled with MSVC6, the compiler // has a tendency to incorrectly optimise away some calls to member template // functions, even though those functions contain code that should not be // optimised away! Therefore we will always disable this optimisation option // for the MSVC6 compiler. # if (_MSC_VER < 1300) # pragma optimize ("g", off) # endif # if !defined(_MT) # error Multithreaded RTL must be selected. # endif // !defined(_MT) # if defined(__cplusplus_cli) || defined(__cplusplus_winrt) # if !defined(ASIO_DISABLE_CLR_WORKAROUND) # if !defined(generic) # define generic cpp_generic # define ASIO_CLR_WORKAROUND # endif # endif # endif #endif asio-1.12.2/include/asio/detail/reactive_descriptor_service.hpp000066400000000000000000000310261340672067200246520ustar00rootroot00000000000000// // detail/reactive_descriptor_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP #define ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/descriptor_ops.hpp" #include "asio/detail/descriptor_read_op.hpp" #include "asio/detail/descriptor_write_op.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/reactive_null_buffers_op.hpp" #include "asio/detail/reactive_wait_op.hpp" #include "asio/detail/reactor.hpp" #include "asio/posix/descriptor_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class reactive_descriptor_service : public service_base { public: // The native type of a descriptor. typedef int native_handle_type; // The implementation type of the descriptor. class implementation_type : private asio::detail::noncopyable { public: // Default constructor. implementation_type() : descriptor_(-1), state_(0) { } private: // Only this service will have access to the internal values. friend class reactive_descriptor_service; // The native descriptor representation. int descriptor_; // The current state of the descriptor. descriptor_ops::state_type state_; // Per-descriptor data used by the reactor. reactor::per_descriptor_data reactor_data_; }; // Constructor. ASIO_DECL reactive_descriptor_service( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Construct a new descriptor implementation. ASIO_DECL void construct(implementation_type& impl); // Move-construct a new descriptor implementation. ASIO_DECL void move_construct(implementation_type& impl, implementation_type& other_impl); // Move-assign from another descriptor implementation. ASIO_DECL void move_assign(implementation_type& impl, reactive_descriptor_service& other_service, implementation_type& other_impl); // Destroy a descriptor implementation. ASIO_DECL void destroy(implementation_type& impl); // Assign a native descriptor to a descriptor implementation. ASIO_DECL asio::error_code assign(implementation_type& impl, const native_handle_type& native_descriptor, asio::error_code& ec); // Determine whether the descriptor is open. bool is_open(const implementation_type& impl) const { return impl.descriptor_ != -1; } // Destroy a descriptor implementation. ASIO_DECL asio::error_code close(implementation_type& impl, asio::error_code& ec); // Get the native descriptor representation. native_handle_type native_handle(const implementation_type& impl) const { return impl.descriptor_; } // Release ownership of the native descriptor representation. ASIO_DECL native_handle_type release(implementation_type& impl); // Cancel all operations associated with the descriptor. ASIO_DECL asio::error_code cancel(implementation_type& impl, asio::error_code& ec); // Perform an IO control command on the descriptor. template asio::error_code io_control(implementation_type& impl, IO_Control_Command& command, asio::error_code& ec) { descriptor_ops::ioctl(impl.descriptor_, impl.state_, command.name(), static_cast(command.data()), ec); return ec; } // Gets the non-blocking mode of the descriptor. bool non_blocking(const implementation_type& impl) const { return (impl.state_ & descriptor_ops::user_set_non_blocking) != 0; } // Sets the non-blocking mode of the descriptor. asio::error_code non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { descriptor_ops::set_user_non_blocking( impl.descriptor_, impl.state_, mode, ec); return ec; } // Gets the non-blocking mode of the native descriptor implementation. bool native_non_blocking(const implementation_type& impl) const { return (impl.state_ & descriptor_ops::internal_non_blocking) != 0; } // Sets the non-blocking mode of the native descriptor implementation. asio::error_code native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { descriptor_ops::set_internal_non_blocking( impl.descriptor_, impl.state_, mode, ec); return ec; } // Wait for the descriptor to become ready to read, ready to write, or to have // pending error conditions. asio::error_code wait(implementation_type& impl, posix::descriptor_base::wait_type w, asio::error_code& ec) { switch (w) { case posix::descriptor_base::wait_read: descriptor_ops::poll_read(impl.descriptor_, impl.state_, ec); break; case posix::descriptor_base::wait_write: descriptor_ops::poll_write(impl.descriptor_, impl.state_, ec); break; case posix::descriptor_base::wait_error: descriptor_ops::poll_error(impl.descriptor_, impl.state_, ec); break; default: ec = asio::error::invalid_argument; break; } return ec; } // Asynchronously wait for the descriptor to become ready to read, ready to // write, or to have pending error conditions. template void async_wait(implementation_type& impl, posix::descriptor_base::wait_type w, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_wait_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_wait")); int op_type; switch (w) { case posix::descriptor_base::wait_read: op_type = reactor::read_op; break; case posix::descriptor_base::wait_write: op_type = reactor::write_op; break; case posix::descriptor_base::wait_error: op_type = reactor::except_op; break; default: p.p->ec_ = asio::error::invalid_argument; reactor_.post_immediate_completion(p.p, is_continuation); p.v = p.p = 0; return; } start_op(impl, op_type, p.p, is_continuation, false, false); p.v = p.p = 0; } // Write some data to the descriptor. template size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return descriptor_ops::sync_write(impl.descriptor_, impl.state_, bufs.buffers(), bufs.count(), bufs.all_empty(), ec); } // Wait until data can be written without blocking. size_t write_some(implementation_type& impl, const null_buffers&, asio::error_code& ec) { // Wait for descriptor to become ready. descriptor_ops::poll_write(impl.descriptor_, impl.state_, ec); return 0; } // Start an asynchronous write. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef descriptor_write_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.descriptor_, buffers, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_write_some")); start_op(impl, reactor::write_op, p.p, is_continuation, true, buffer_sequence_adapter::all_empty(buffers)); p.v = p.p = 0; } // Start an asynchronous wait until data can be written without blocking. template void async_write_some(implementation_type& impl, const null_buffers&, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_write_some(null_buffers)")); start_op(impl, reactor::write_op, p.p, is_continuation, false, false); p.v = p.p = 0; } // Read some data from the stream. Returns the number of bytes read. template size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return descriptor_ops::sync_read(impl.descriptor_, impl.state_, bufs.buffers(), bufs.count(), bufs.all_empty(), ec); } // Wait until data can be read without blocking. size_t read_some(implementation_type& impl, const null_buffers&, asio::error_code& ec) { // Wait for descriptor to become ready. descriptor_ops::poll_read(impl.descriptor_, impl.state_, ec); return 0; } // Start an asynchronous read. The buffer for the data being read must be // valid for the lifetime of the asynchronous operation. template void async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef descriptor_read_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.descriptor_, buffers, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_read_some")); start_op(impl, reactor::read_op, p.p, is_continuation, true, buffer_sequence_adapter::all_empty(buffers)); p.v = p.p = 0; } // Wait until data can be read without blocking. template void async_read_some(implementation_type& impl, const null_buffers&, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", &impl, impl.descriptor_, "async_read_some(null_buffers)")); start_op(impl, reactor::read_op, p.p, is_continuation, false, false); p.v = p.p = 0; } private: // Start the asynchronous operation. ASIO_DECL void start_op(implementation_type& impl, int op_type, reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop); // The selector that performs event demultiplexing for the service. reactor& reactor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/reactive_descriptor_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) #endif // ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP asio-1.12.2/include/asio/detail/reactive_null_buffers_op.hpp000066400000000000000000000053041340672067200241400ustar00rootroot00000000000000// // detail/reactive_null_buffers_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP #define ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_null_buffers_op : public reactor_op { public: ASIO_DEFINE_HANDLER_PTR(reactive_null_buffers_op); reactive_null_buffers_op(Handler& handler) : reactor_op(&reactive_null_buffers_op::do_perform, &reactive_null_buffers_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static status do_perform(reactor_op*) { return done; } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_null_buffers_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP asio-1.12.2/include/asio/detail/reactive_serial_port_service.hpp000066400000000000000000000170751340672067200250270ustar00rootroot00000000000000// // detail/reactive_serial_port_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SERIAL_PORT_SERVICE_HPP #define ASIO_DETAIL_REACTIVE_SERIAL_PORT_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_SERIAL_PORT) #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/serial_port_base.hpp" #include "asio/detail/descriptor_ops.hpp" #include "asio/detail/reactive_descriptor_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Extend reactive_descriptor_service to provide serial port support. class reactive_serial_port_service : public service_base { public: // The native type of a serial port. typedef reactive_descriptor_service::native_handle_type native_handle_type; // The implementation type of the serial port. typedef reactive_descriptor_service::implementation_type implementation_type; ASIO_DECL reactive_serial_port_service( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Construct a new serial port implementation. void construct(implementation_type& impl) { descriptor_service_.construct(impl); } // Move-construct a new serial port implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { descriptor_service_.move_construct(impl, other_impl); } // Move-assign from another serial port implementation. void move_assign(implementation_type& impl, reactive_serial_port_service& other_service, implementation_type& other_impl) { descriptor_service_.move_assign(impl, other_service.descriptor_service_, other_impl); } // Destroy a serial port implementation. void destroy(implementation_type& impl) { descriptor_service_.destroy(impl); } // Open the serial port using the specified device name. ASIO_DECL asio::error_code open(implementation_type& impl, const std::string& device, asio::error_code& ec); // Assign a native descriptor to a serial port implementation. asio::error_code assign(implementation_type& impl, const native_handle_type& native_descriptor, asio::error_code& ec) { return descriptor_service_.assign(impl, native_descriptor, ec); } // Determine whether the serial port is open. bool is_open(const implementation_type& impl) const { return descriptor_service_.is_open(impl); } // Destroy a serial port implementation. asio::error_code close(implementation_type& impl, asio::error_code& ec) { return descriptor_service_.close(impl, ec); } // Get the native serial port representation. native_handle_type native_handle(implementation_type& impl) { return descriptor_service_.native_handle(impl); } // Cancel all operations associated with the serial port. asio::error_code cancel(implementation_type& impl, asio::error_code& ec) { return descriptor_service_.cancel(impl, ec); } // Set an option on the serial port. template asio::error_code set_option(implementation_type& impl, const SettableSerialPortOption& option, asio::error_code& ec) { return do_set_option(impl, &reactive_serial_port_service::store_option, &option, ec); } // Get an option from the serial port. template asio::error_code get_option(const implementation_type& impl, GettableSerialPortOption& option, asio::error_code& ec) const { return do_get_option(impl, &reactive_serial_port_service::load_option, &option, ec); } // Send a break sequence to the serial port. asio::error_code send_break(implementation_type& impl, asio::error_code& ec) { errno = 0; descriptor_ops::error_wrapper(::tcsendbreak( descriptor_service_.native_handle(impl), 0), ec); return ec; } // Write the given data. Returns the number of bytes sent. template size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { return descriptor_service_.write_some(impl, buffers, ec); } // Start an asynchronous write. The data being written must be valid for the // lifetime of the asynchronous operation. template void async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, Handler& handler) { descriptor_service_.async_write_some(impl, buffers, handler); } // Read some data. Returns the number of bytes received. template size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { return descriptor_service_.read_some(impl, buffers, ec); } // Start an asynchronous read. The buffer for the data being received must be // valid for the lifetime of the asynchronous operation. template void async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, Handler& handler) { descriptor_service_.async_read_some(impl, buffers, handler); } private: // Function pointer type for storing a serial port option. typedef asio::error_code (*store_function_type)( const void*, termios&, asio::error_code&); // Helper function template to store a serial port option. template static asio::error_code store_option(const void* option, termios& storage, asio::error_code& ec) { static_cast(option)->store(storage, ec); return ec; } // Helper function to set a serial port option. ASIO_DECL asio::error_code do_set_option( implementation_type& impl, store_function_type store, const void* option, asio::error_code& ec); // Function pointer type for loading a serial port option. typedef asio::error_code (*load_function_type)( void*, const termios&, asio::error_code&); // Helper function template to load a serial port option. template static asio::error_code load_option(void* option, const termios& storage, asio::error_code& ec) { static_cast(option)->load(storage, ec); return ec; } // Helper function to get a serial port option. ASIO_DECL asio::error_code do_get_option( const implementation_type& impl, load_function_type load, void* option, asio::error_code& ec) const; // The implementation used for initiating asynchronous operations. reactive_descriptor_service descriptor_service_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/reactive_serial_port_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #endif // defined(ASIO_HAS_SERIAL_PORT) #endif // ASIO_DETAIL_REACTIVE_SERIAL_PORT_SERVICE_HPP asio-1.12.2/include/asio/detail/reactive_socket_accept_op.hpp000066400000000000000000000156121340672067200242640ustar00rootroot00000000000000// // detail/reactive_socket_accept_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_holder.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_accept_op_base : public reactor_op { public: reactive_socket_accept_op_base(socket_type socket, socket_ops::state_type state, Socket& peer, const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, func_type complete_func) : reactor_op(&reactive_socket_accept_op_base::do_perform, complete_func), socket_(socket), state_(state), peer_(peer), protocol_(protocol), peer_endpoint_(peer_endpoint), addrlen_(peer_endpoint ? peer_endpoint->capacity() : 0) { } static status do_perform(reactor_op* base) { reactive_socket_accept_op_base* o( static_cast(base)); socket_type new_socket = invalid_socket; status result = socket_ops::non_blocking_accept(o->socket_, o->state_, o->peer_endpoint_ ? o->peer_endpoint_->data() : 0, o->peer_endpoint_ ? &o->addrlen_ : 0, o->ec_, new_socket) ? done : not_done; o->new_socket_.reset(new_socket); ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_accept", o->ec_)); return result; } void do_assign() { if (new_socket_.get() != invalid_socket) { if (peer_endpoint_) peer_endpoint_->resize(addrlen_); peer_.assign(protocol_, new_socket_.get(), ec_); if (!ec_) new_socket_.release(); } } private: socket_type socket_; socket_ops::state_type state_; socket_holder new_socket_; Socket& peer_; Protocol protocol_; typename Protocol::endpoint* peer_endpoint_; std::size_t addrlen_; }; template class reactive_socket_accept_op : public reactive_socket_accept_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_accept_op); reactive_socket_accept_op(socket_type socket, socket_ops::state_type state, Socket& peer, const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, Handler& handler) : reactive_socket_accept_op_base(socket, state, peer, protocol, peer_endpoint, &reactive_socket_accept_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_accept_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); // On success, assign new connection to peer socket object. if (owner) o->do_assign(); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, o->ec_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; #if defined(ASIO_HAS_MOVE) template class reactive_socket_move_accept_op : private Protocol::socket, public reactive_socket_accept_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_move_accept_op); reactive_socket_move_accept_op(io_context& ioc, socket_type socket, socket_ops::state_type state, const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, Handler& handler) : Protocol::socket(ioc), reactive_socket_accept_op_base( socket, state, *this, protocol, peer_endpoint, &reactive_socket_move_accept_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_move_accept_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); // On success, assign new connection to peer socket object. if (owner) o->do_assign(); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::move_binder2 handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), o->ec_, ASIO_MOVE_CAST(typename Protocol::socket)(*o)); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; #endif // defined(ASIO_HAS_MOVE) } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_connect_op.hpp000066400000000000000000000064571340672067200244650ustar00rootroot00000000000000// // detail/reactive_socket_connect_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class reactive_socket_connect_op_base : public reactor_op { public: reactive_socket_connect_op_base(socket_type socket, func_type complete_func) : reactor_op(&reactive_socket_connect_op_base::do_perform, complete_func), socket_(socket) { } static status do_perform(reactor_op* base) { reactive_socket_connect_op_base* o( static_cast(base)); status result = socket_ops::non_blocking_connect( o->socket_, o->ec_) ? done : not_done; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_connect", o->ec_)); return result; } private: socket_type socket_; }; template class reactive_socket_connect_op : public reactive_socket_connect_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_connect_op); reactive_socket_connect_op(socket_type socket, Handler& handler) : reactive_socket_connect_op_base(socket, &reactive_socket_connect_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_connect_op* o (static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, o->ec_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_recv_op.hpp000066400000000000000000000103461340672067200237630ustar00rootroot00000000000000// // detail/reactive_socket_recv_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_recv_op_base : public reactor_op { public: reactive_socket_recv_op_base(socket_type socket, socket_ops::state_type state, const MutableBufferSequence& buffers, socket_base::message_flags flags, func_type complete_func) : reactor_op(&reactive_socket_recv_op_base::do_perform, complete_func), socket_(socket), state_(state), buffers_(buffers), flags_(flags) { } static status do_perform(reactor_op* base) { reactive_socket_recv_op_base* o( static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); status result = socket_ops::non_blocking_recv(o->socket_, bufs.buffers(), bufs.count(), o->flags_, (o->state_ & socket_ops::stream_oriented) != 0, o->ec_, o->bytes_transferred_) ? done : not_done; if (result == done) if ((o->state_ & socket_ops::stream_oriented) != 0) if (o->bytes_transferred_ == 0) result = done_and_exhausted; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_recv", o->ec_, o->bytes_transferred_)); return result; } private: socket_type socket_; socket_ops::state_type state_; MutableBufferSequence buffers_; socket_base::message_flags flags_; }; template class reactive_socket_recv_op : public reactive_socket_recv_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_recv_op); reactive_socket_recv_op(socket_type socket, socket_ops::state_type state, const MutableBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) : reactive_socket_recv_op_base(socket, state, buffers, flags, &reactive_socket_recv_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_recv_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_recvfrom_op.hpp000066400000000000000000000107031340672067200246440ustar00rootroot00000000000000// // detail/reactive_socket_recvfrom_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_recvfrom_op_base : public reactor_op { public: reactive_socket_recvfrom_op_base(socket_type socket, int protocol_type, const MutableBufferSequence& buffers, Endpoint& endpoint, socket_base::message_flags flags, func_type complete_func) : reactor_op(&reactive_socket_recvfrom_op_base::do_perform, complete_func), socket_(socket), protocol_type_(protocol_type), buffers_(buffers), sender_endpoint_(endpoint), flags_(flags) { } static status do_perform(reactor_op* base) { reactive_socket_recvfrom_op_base* o( static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); std::size_t addr_len = o->sender_endpoint_.capacity(); status result = socket_ops::non_blocking_recvfrom(o->socket_, bufs.buffers(), bufs.count(), o->flags_, o->sender_endpoint_.data(), &addr_len, o->ec_, o->bytes_transferred_) ? done : not_done; if (result && !o->ec_) o->sender_endpoint_.resize(addr_len); ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_recvfrom", o->ec_, o->bytes_transferred_)); return result; } private: socket_type socket_; int protocol_type_; MutableBufferSequence buffers_; Endpoint& sender_endpoint_; socket_base::message_flags flags_; }; template class reactive_socket_recvfrom_op : public reactive_socket_recvfrom_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvfrom_op); reactive_socket_recvfrom_op(socket_type socket, int protocol_type, const MutableBufferSequence& buffers, Endpoint& endpoint, socket_base::message_flags flags, Handler& handler) : reactive_socket_recvfrom_op_base( socket, protocol_type, buffers, endpoint, flags, &reactive_socket_recvfrom_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_recvfrom_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_recvmsg_op.hpp000066400000000000000000000103041340672067200244640ustar00rootroot00000000000000// // detail/reactive_socket_recvmsg_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/socket_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_recvmsg_op_base : public reactor_op { public: reactive_socket_recvmsg_op_base(socket_type socket, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, func_type complete_func) : reactor_op(&reactive_socket_recvmsg_op_base::do_perform, complete_func), socket_(socket), buffers_(buffers), in_flags_(in_flags), out_flags_(out_flags) { } static status do_perform(reactor_op* base) { reactive_socket_recvmsg_op_base* o( static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); status result = socket_ops::non_blocking_recvmsg(o->socket_, bufs.buffers(), bufs.count(), o->in_flags_, o->out_flags_, o->ec_, o->bytes_transferred_) ? done : not_done; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_recvmsg", o->ec_, o->bytes_transferred_)); return result; } private: socket_type socket_; MutableBufferSequence buffers_; socket_base::message_flags in_flags_; socket_base::message_flags& out_flags_; }; template class reactive_socket_recvmsg_op : public reactive_socket_recvmsg_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvmsg_op); reactive_socket_recvmsg_op(socket_type socket, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, Handler& handler) : reactive_socket_recvmsg_op_base(socket, buffers, in_flags, out_flags, &reactive_socket_recvmsg_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_recvmsg_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_send_op.hpp000066400000000000000000000102571340672067200237560ustar00rootroot00000000000000// // detail/reactive_socket_send_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_send_op_base : public reactor_op { public: reactive_socket_send_op_base(socket_type socket, socket_ops::state_type state, const ConstBufferSequence& buffers, socket_base::message_flags flags, func_type complete_func) : reactor_op(&reactive_socket_send_op_base::do_perform, complete_func), socket_(socket), state_(state), buffers_(buffers), flags_(flags) { } static status do_perform(reactor_op* base) { reactive_socket_send_op_base* o( static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); status result = socket_ops::non_blocking_send(o->socket_, bufs.buffers(), bufs.count(), o->flags_, o->ec_, o->bytes_transferred_) ? done : not_done; if (result == done) if ((o->state_ & socket_ops::stream_oriented) != 0) if (o->bytes_transferred_ < bufs.total_size()) result = done_and_exhausted; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_send", o->ec_, o->bytes_transferred_)); return result; } private: socket_type socket_; socket_ops::state_type state_; ConstBufferSequence buffers_; socket_base::message_flags flags_; }; template class reactive_socket_send_op : public reactive_socket_send_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_send_op); reactive_socket_send_op(socket_type socket, socket_ops::state_type state, const ConstBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) : reactive_socket_send_op_base(socket, state, buffers, flags, &reactive_socket_send_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_send_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_sendto_op.hpp000066400000000000000000000102261340672067200243150ustar00rootroot00000000000000// // detail/reactive_socket_sendto_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_sendto_op_base : public reactor_op { public: reactive_socket_sendto_op_base(socket_type socket, const ConstBufferSequence& buffers, const Endpoint& endpoint, socket_base::message_flags flags, func_type complete_func) : reactor_op(&reactive_socket_sendto_op_base::do_perform, complete_func), socket_(socket), buffers_(buffers), destination_(endpoint), flags_(flags) { } static status do_perform(reactor_op* base) { reactive_socket_sendto_op_base* o( static_cast(base)); buffer_sequence_adapter bufs(o->buffers_); status result = socket_ops::non_blocking_sendto(o->socket_, bufs.buffers(), bufs.count(), o->flags_, o->destination_.data(), o->destination_.size(), o->ec_, o->bytes_transferred_) ? done : not_done; ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_sendto", o->ec_, o->bytes_transferred_)); return result; } private: socket_type socket_; ConstBufferSequence buffers_; Endpoint destination_; socket_base::message_flags flags_; }; template class reactive_socket_sendto_op : public reactive_socket_sendto_op_base { public: ASIO_DEFINE_HANDLER_PTR(reactive_socket_sendto_op); reactive_socket_sendto_op(socket_type socket, const ConstBufferSequence& buffers, const Endpoint& endpoint, socket_base::message_flags flags, Handler& handler) : reactive_socket_sendto_op_base(socket, buffers, endpoint, flags, &reactive_socket_sendto_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_socket_sendto_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->bytes_transferred_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP asio-1.12.2/include/asio/detail/reactive_socket_service.hpp000066400000000000000000000424131340672067200237660ustar00rootroot00000000000000// // detail/reactive_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_IOCP) #include "asio/buffer.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/socket_base.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/reactive_null_buffers_op.hpp" #include "asio/detail/reactive_socket_accept_op.hpp" #include "asio/detail/reactive_socket_connect_op.hpp" #include "asio/detail/reactive_socket_recvfrom_op.hpp" #include "asio/detail/reactive_socket_sendto_op.hpp" #include "asio/detail/reactive_socket_service_base.hpp" #include "asio/detail/reactor.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_holder.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_socket_service : public service_base >, public reactive_socket_service_base { public: // The protocol type. typedef Protocol protocol_type; // The endpoint type. typedef typename Protocol::endpoint endpoint_type; // The native type of a socket. typedef socket_type native_handle_type; // The implementation type of the socket. struct implementation_type : reactive_socket_service_base::base_implementation_type { // Default constructor. implementation_type() : protocol_(endpoint_type().protocol()) { } // The protocol associated with the socket. protocol_type protocol_; }; // Constructor. reactive_socket_service(asio::io_context& io_context) : service_base >(io_context), reactive_socket_service_base(io_context) { } // Destroy all user-defined handler objects owned by the service. void shutdown() { this->base_shutdown(); } // Move-construct a new socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { this->base_move_construct(impl, other_impl); impl.protocol_ = other_impl.protocol_; other_impl.protocol_ = endpoint_type().protocol(); } // Move-assign from another socket implementation. void move_assign(implementation_type& impl, reactive_socket_service_base& other_service, implementation_type& other_impl) { this->base_move_assign(impl, other_service, other_impl); impl.protocol_ = other_impl.protocol_; other_impl.protocol_ = endpoint_type().protocol(); } // Move-construct a new socket implementation from another protocol type. template void converting_move_construct(implementation_type& impl, reactive_socket_service&, typename reactive_socket_service< Protocol1>::implementation_type& other_impl) { this->base_move_construct(impl, other_impl); impl.protocol_ = protocol_type(other_impl.protocol_); other_impl.protocol_ = typename Protocol1::endpoint().protocol(); } // Open a new socket implementation. asio::error_code open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (!do_open(impl, protocol.family(), protocol.type(), protocol.protocol(), ec)) impl.protocol_ = protocol; return ec; } // Assign a native socket to a socket implementation. asio::error_code assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { if (!do_assign(impl, protocol.type(), native_socket, ec)) impl.protocol_ = protocol; return ec; } // Get the native socket representation. native_handle_type native_handle(implementation_type& impl) { return impl.socket_; } // Bind the socket to the specified local endpoint. asio::error_code bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { socket_ops::bind(impl.socket_, endpoint.data(), endpoint.size(), ec); return ec; } // Set a socket option. template asio::error_code set_option(implementation_type& impl, const Option& option, asio::error_code& ec) { socket_ops::setsockopt(impl.socket_, impl.state_, option.level(impl.protocol_), option.name(impl.protocol_), option.data(impl.protocol_), option.size(impl.protocol_), ec); return ec; } // Set a socket option. template asio::error_code get_option(const implementation_type& impl, Option& option, asio::error_code& ec) const { std::size_t size = option.size(impl.protocol_); socket_ops::getsockopt(impl.socket_, impl.state_, option.level(impl.protocol_), option.name(impl.protocol_), option.data(impl.protocol_), &size, ec); if (!ec) option.resize(impl.protocol_, size); return ec; } // Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { endpoint_type endpoint; std::size_t addr_len = endpoint.capacity(); if (socket_ops::getsockname(impl.socket_, endpoint.data(), &addr_len, ec)) return endpoint_type(); endpoint.resize(addr_len); return endpoint; } // Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { endpoint_type endpoint; std::size_t addr_len = endpoint.capacity(); if (socket_ops::getpeername(impl.socket_, endpoint.data(), &addr_len, false, ec)) return endpoint_type(); endpoint.resize(addr_len); return endpoint; } // Disable sends or receives on the socket. asio::error_code shutdown(base_implementation_type& impl, socket_base::shutdown_type what, asio::error_code& ec) { socket_ops::shutdown(impl.socket_, what, ec); return ec; } // Send a datagram to the specified endpoint. Returns the number of bytes // sent. template size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_sendto(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, destination.data(), destination.size(), ec); } // Wait until data can be sent without blocking. size_t send_to(implementation_type& impl, const null_buffers&, const endpoint_type&, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_sendto_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, buffers, destination, flags, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send_to")); start_op(impl, reactor::write_op, p.p, is_continuation, true, false); p.v = p.p = 0; } // Start an asynchronous wait until data can be sent without blocking. template void async_send_to(implementation_type& impl, const null_buffers&, const endpoint_type&, socket_base::message_flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send_to(null_buffers)")); start_op(impl, reactor::write_op, p.p, is_continuation, false, false); p.v = p.p = 0; } // Receive a datagram with the endpoint of the sender. Returns the number of // bytes received. template size_t receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); std::size_t addr_len = sender_endpoint.capacity(); std::size_t bytes_recvd = socket_ops::sync_recvfrom( impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, sender_endpoint.data(), &addr_len, ec); if (!ec) sender_endpoint.resize(addr_len); return bytes_recvd; } // Wait until data can be received without blocking. size_t receive_from(implementation_type& impl, const null_buffers&, endpoint_type& sender_endpoint, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); // Reset endpoint since it can be given no sensible value at this time. sender_endpoint = endpoint_type(); return 0; } // Start an asynchronous receive. The buffer for the data being received and // the sender_endpoint object must both be valid for the lifetime of the // asynchronous operation. template void async_receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_recvfrom_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; int protocol = impl.protocol_.type(); p.p = new (p.v) op(impl.socket_, protocol, buffers, sender_endpoint, flags, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_from")); start_op(impl, (flags & socket_base::message_out_of_band) ? reactor::except_op : reactor::read_op, p.p, is_continuation, true, false); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive_from(implementation_type& impl, const null_buffers&, endpoint_type& sender_endpoint, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_from(null_buffers)")); // Reset endpoint since it can be given no sensible value at this time. sender_endpoint = endpoint_type(); start_op(impl, (flags & socket_base::message_out_of_band) ? reactor::except_op : reactor::read_op, p.p, is_continuation, false, false); p.v = p.p = 0; } // Accept a new connection. template asio::error_code accept(implementation_type& impl, Socket& peer, endpoint_type* peer_endpoint, asio::error_code& ec) { // We cannot accept a socket that is already open. if (peer.is_open()) { ec = asio::error::already_open; return ec; } std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; socket_holder new_socket(socket_ops::sync_accept(impl.socket_, impl.state_, peer_endpoint ? peer_endpoint->data() : 0, peer_endpoint ? &addr_len : 0, ec)); // On success, assign new connection to peer socket object. if (new_socket.get() != invalid_socket) { if (peer_endpoint) peer_endpoint->resize(addr_len); peer.assign(impl.protocol_, new_socket.get(), ec); if (!ec) new_socket.release(); } return ec; } #if defined(ASIO_HAS_MOVE) // Accept a new connection. typename Protocol::socket accept(implementation_type& impl, io_context* peer_io_context, endpoint_type* peer_endpoint, asio::error_code& ec) { typename Protocol::socket peer( peer_io_context ? *peer_io_context : io_context_); std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; socket_holder new_socket(socket_ops::sync_accept(impl.socket_, impl.state_, peer_endpoint ? peer_endpoint->data() : 0, peer_endpoint ? &addr_len : 0, ec)); // On success, assign new connection to peer socket object. if (new_socket.get() != invalid_socket) { if (peer_endpoint) peer_endpoint->resize(addr_len); peer.assign(impl.protocol_, new_socket.get(), ec); if (!ec) new_socket.release(); } return peer; } #endif // defined(ASIO_HAS_MOVE) // Start an asynchronous accept. The peer and peer_endpoint objects must be // valid until the accept's handler is invoked. template void async_accept(implementation_type& impl, Socket& peer, endpoint_type* peer_endpoint, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_accept_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, impl.state_, peer, impl.protocol_, peer_endpoint, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_accept")); start_accept_op(impl, p.p, is_continuation, peer.is_open()); p.v = p.p = 0; } #if defined(ASIO_HAS_MOVE) // Start an asynchronous accept. The peer_endpoint object must be valid until // the accept's handler is invoked. template void async_accept(implementation_type& impl, asio::io_context* peer_io_context, endpoint_type* peer_endpoint, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_move_accept_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(peer_io_context ? *peer_io_context : io_context_, impl.socket_, impl.state_, impl.protocol_, peer_endpoint, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_accept")); start_accept_op(impl, p.p, is_continuation, false); p.v = p.p = 0; } #endif // defined(ASIO_HAS_MOVE) // Connect the socket to the specified endpoint. asio::error_code connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { socket_ops::sync_connect(impl.socket_, peer_endpoint.data(), peer_endpoint.size(), ec); return ec; } // Start an asynchronous connect. template void async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_connect_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_connect")); start_connect_op(impl, p.p, is_continuation, peer_endpoint.data(), peer_endpoint.size()); p.v = p.p = 0; } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/detail/reactive_socket_service_base.hpp000066400000000000000000000425101340672067200247560ustar00rootroot00000000000000// // detail/reactive_socket_service_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP #define ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_IOCP) \ && !defined(ASIO_WINDOWS_RUNTIME) #include "asio/buffer.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/socket_base.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactive_null_buffers_op.hpp" #include "asio/detail/reactive_socket_recv_op.hpp" #include "asio/detail/reactive_socket_recvmsg_op.hpp" #include "asio/detail/reactive_socket_send_op.hpp" #include "asio/detail/reactive_wait_op.hpp" #include "asio/detail/reactor.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_holder.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class reactive_socket_service_base { public: // The native type of a socket. typedef socket_type native_handle_type; // The implementation type of the socket. struct base_implementation_type { // The native socket representation. socket_type socket_; // The current state of the socket. socket_ops::state_type state_; // Per-descriptor data used by the reactor. reactor::per_descriptor_data reactor_data_; }; // Constructor. ASIO_DECL reactive_socket_service_base( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void base_shutdown(); // Construct a new socket implementation. ASIO_DECL void construct(base_implementation_type& impl); // Move-construct a new socket implementation. ASIO_DECL void base_move_construct(base_implementation_type& impl, base_implementation_type& other_impl); // Move-assign from another socket implementation. ASIO_DECL void base_move_assign(base_implementation_type& impl, reactive_socket_service_base& other_service, base_implementation_type& other_impl); // Destroy a socket implementation. ASIO_DECL void destroy(base_implementation_type& impl); // Determine whether the socket is open. bool is_open(const base_implementation_type& impl) const { return impl.socket_ != invalid_socket; } // Destroy a socket implementation. ASIO_DECL asio::error_code close( base_implementation_type& impl, asio::error_code& ec); // Release ownership of the socket. ASIO_DECL socket_type release( base_implementation_type& impl, asio::error_code& ec); // Get the native socket representation. native_handle_type native_handle(base_implementation_type& impl) { return impl.socket_; } // Cancel all operations associated with the socket. ASIO_DECL asio::error_code cancel( base_implementation_type& impl, asio::error_code& ec); // Determine whether the socket is at the out-of-band data mark. bool at_mark(const base_implementation_type& impl, asio::error_code& ec) const { return socket_ops::sockatmark(impl.socket_, ec); } // Determine the number of bytes available for reading. std::size_t available(const base_implementation_type& impl, asio::error_code& ec) const { return socket_ops::available(impl.socket_, ec); } // Place the socket into the state where it will listen for new connections. asio::error_code listen(base_implementation_type& impl, int backlog, asio::error_code& ec) { socket_ops::listen(impl.socket_, backlog, ec); return ec; } // Perform an IO control command on the socket. template asio::error_code io_control(base_implementation_type& impl, IO_Control_Command& command, asio::error_code& ec) { socket_ops::ioctl(impl.socket_, impl.state_, command.name(), static_cast(command.data()), ec); return ec; } // Gets the non-blocking mode of the socket. bool non_blocking(const base_implementation_type& impl) const { return (impl.state_ & socket_ops::user_set_non_blocking) != 0; } // Sets the non-blocking mode of the socket. asio::error_code non_blocking(base_implementation_type& impl, bool mode, asio::error_code& ec) { socket_ops::set_user_non_blocking(impl.socket_, impl.state_, mode, ec); return ec; } // Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const base_implementation_type& impl) const { return (impl.state_ & socket_ops::internal_non_blocking) != 0; } // Sets the non-blocking mode of the native socket implementation. asio::error_code native_non_blocking(base_implementation_type& impl, bool mode, asio::error_code& ec) { socket_ops::set_internal_non_blocking(impl.socket_, impl.state_, mode, ec); return ec; } // Wait for the socket to become ready to read, ready to write, or to have // pending error conditions. asio::error_code wait(base_implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { switch (w) { case socket_base::wait_read: socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); break; case socket_base::wait_write: socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); break; case socket_base::wait_error: socket_ops::poll_error(impl.socket_, impl.state_, -1, ec); break; default: ec = asio::error::invalid_argument; break; } return ec; } // Asynchronously wait for the socket to become ready to read, ready to // write, or to have pending error conditions. template void async_wait(base_implementation_type& impl, socket_base::wait_type w, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_wait_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_wait")); int op_type; switch (w) { case socket_base::wait_read: op_type = reactor::read_op; break; case socket_base::wait_write: op_type = reactor::write_op; break; case socket_base::wait_error: op_type = reactor::except_op; break; default: p.p->ec_ = asio::error::invalid_argument; reactor_.post_immediate_completion(p.p, is_continuation); p.v = p.p = 0; return; } start_op(impl, op_type, p.p, is_continuation, false, false); p.v = p.p = 0; } // Send the given data to the peer. template size_t send(base_implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_send(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); } // Wait until data can be sent without blocking. size_t send(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send(base_implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_send_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, impl.state_, buffers, flags, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send")); start_op(impl, reactor::write_op, p.p, is_continuation, true, ((impl.state_ & socket_ops::stream_oriented) && buffer_sequence_adapter::all_empty(buffers))); p.v = p.p = 0; } // Start an asynchronous wait until data can be sent without blocking. template void async_send(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_send(null_buffers)")); start_op(impl, reactor::write_op, p.p, is_continuation, false, false); p.v = p.p = 0; } // Receive some data from the peer. Returns the number of bytes received. template size_t receive(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_recv(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); } // Wait until data can be received without blocking. size_t receive(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_recv_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, impl.state_, buffers, flags, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive")); start_op(impl, (flags & socket_base::message_out_of_band) ? reactor::except_op : reactor::read_op, p.p, is_continuation, (flags & socket_base::message_out_of_band) == 0, ((impl.state_ & socket_ops::stream_oriented) && buffer_sequence_adapter::all_empty(buffers))); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive(base_implementation_type& impl, const null_buffers&, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive(null_buffers)")); start_op(impl, (flags & socket_base::message_out_of_band) ? reactor::except_op : reactor::read_op, p.p, is_continuation, false, false); p.v = p.p = 0; } // Receive some data with associated flags. Returns the number of bytes // received. template size_t receive_with_flags(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_recvmsg(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), in_flags, out_flags, ec); } // Wait until data can be received without blocking. size_t receive_with_flags(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, socket_base::message_flags& out_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); // Clear out_flags, since we cannot give it any other sensible value when // performing a null_buffers operation. out_flags = 0; return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive_with_flags(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_socket_recvmsg_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, buffers, in_flags, out_flags, handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_with_flags")); start_op(impl, (in_flags & socket_base::message_out_of_band) ? reactor::except_op : reactor::read_op, p.p, is_continuation, (in_flags & socket_base::message_out_of_band) == 0, false); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive_with_flags(base_implementation_type& impl, const null_buffers&, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef reactive_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", &impl, impl.socket_, "async_receive_with_flags(null_buffers)")); // Clear out_flags, since we cannot give it any other sensible value when // performing a null_buffers operation. out_flags = 0; start_op(impl, (in_flags & socket_base::message_out_of_band) ? reactor::except_op : reactor::read_op, p.p, is_continuation, false, false); p.v = p.p = 0; } protected: // Open a new socket implementation. ASIO_DECL asio::error_code do_open( base_implementation_type& impl, int af, int type, int protocol, asio::error_code& ec); // Assign a native socket to a socket implementation. ASIO_DECL asio::error_code do_assign( base_implementation_type& impl, int type, const native_handle_type& native_socket, asio::error_code& ec); // Start the asynchronous read or write operation. ASIO_DECL void start_op(base_implementation_type& impl, int op_type, reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop); // Start the asynchronous accept operation. ASIO_DECL void start_accept_op(base_implementation_type& impl, reactor_op* op, bool is_continuation, bool peer_is_open); // Start the asynchronous connect operation. ASIO_DECL void start_connect_op(base_implementation_type& impl, reactor_op* op, bool is_continuation, const socket_addr_type* addr, size_t addrlen); // The io_context that owns this socket service. io_context& io_context_; // The selector that performs event demultiplexing for the service. reactor& reactor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/reactive_socket_service_base.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // !defined(ASIO_HAS_IOCP) // && !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP asio-1.12.2/include/asio/detail/reactive_wait_op.hpp000066400000000000000000000050611340672067200224160ustar00rootroot00000000000000// // detail/reactive_wait_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTIVE_WAIT_OP_HPP #define ASIO_DETAIL_REACTIVE_WAIT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactive_wait_op : public reactor_op { public: ASIO_DEFINE_HANDLER_PTR(reactive_wait_op); reactive_wait_op(Handler& handler) : reactor_op(&reactive_wait_op::do_perform, &reactive_wait_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static status do_perform(reactor_op*) { return done; } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. reactive_wait_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, o->ec_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTIVE_WAIT_OP_HPP asio-1.12.2/include/asio/detail/reactor.hpp000066400000000000000000000016271340672067200205350ustar00rootroot00000000000000// // detail/reactor.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTOR_HPP #define ASIO_DETAIL_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/reactor_fwd.hpp" #if defined(ASIO_HAS_EPOLL) # include "asio/detail/epoll_reactor.hpp" #elif defined(ASIO_HAS_KQUEUE) # include "asio/detail/kqueue_reactor.hpp" #elif defined(ASIO_HAS_DEV_POLL) # include "asio/detail/dev_poll_reactor.hpp" #elif defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/null_reactor.hpp" #else # include "asio/detail/select_reactor.hpp" #endif #endif // ASIO_DETAIL_REACTOR_HPP asio-1.12.2/include/asio/detail/reactor_fwd.hpp000066400000000000000000000020401340672067200213630ustar00rootroot00000000000000// // detail/reactor_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTOR_FWD_HPP #define ASIO_DETAIL_REACTOR_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" namespace asio { namespace detail { #if defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) typedef class null_reactor reactor; #elif defined(ASIO_HAS_IOCP) typedef class select_reactor reactor; #elif defined(ASIO_HAS_EPOLL) typedef class epoll_reactor reactor; #elif defined(ASIO_HAS_KQUEUE) typedef class kqueue_reactor reactor; #elif defined(ASIO_HAS_DEV_POLL) typedef class dev_poll_reactor reactor; #else typedef class select_reactor reactor; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_REACTOR_FWD_HPP asio-1.12.2/include/asio/detail/reactor_op.hpp000066400000000000000000000030771340672067200212340ustar00rootroot00000000000000// // detail/reactor_op.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTOR_OP_HPP #define ASIO_DETAIL_REACTOR_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class reactor_op : public operation { public: // The error code to be passed to the completion handler. asio::error_code ec_; // The number of bytes transferred, to be passed to the completion handler. std::size_t bytes_transferred_; // Status returned by perform function. May be used to decide whether it is // worth performing more operations on the descriptor immediately. enum status { not_done, done, done_and_exhausted }; // Perform the operation. Returns true if it is finished. status perform() { return perform_func_(this); } protected: typedef status (*perform_func_type)(reactor_op*); reactor_op(perform_func_type perform_func, func_type complete_func) : operation(complete_func), bytes_transferred_(0), perform_func_(perform_func) { } private: perform_func_type perform_func_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTOR_OP_HPP asio-1.12.2/include/asio/detail/reactor_op_queue.hpp000066400000000000000000000113521340672067200224330ustar00rootroot00000000000000// // detail/reactor_op_queue.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REACTOR_OP_QUEUE_HPP #define ASIO_DETAIL_REACTOR_OP_QUEUE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/hash_map.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class reactor_op_queue : private noncopyable { public: typedef Descriptor key_type; struct mapped_type : op_queue { mapped_type() {} mapped_type(const mapped_type&) {} void operator=(const mapped_type&) {} }; typedef typename hash_map::value_type value_type; typedef typename hash_map::iterator iterator; // Constructor. reactor_op_queue() : operations_() { } // Obtain iterators to all registered descriptors. iterator begin() { return operations_.begin(); } iterator end() { return operations_.end(); } // Add a new operation to the queue. Returns true if this is the only // operation for the given descriptor, in which case the reactor's event // demultiplexing function call may need to be interrupted and restarted. bool enqueue_operation(Descriptor descriptor, reactor_op* op) { std::pair entry = operations_.insert(value_type(descriptor, mapped_type())); entry.first->second.push(op); return entry.second; } // Cancel all operations associated with the descriptor identified by the // supplied iterator. Any operations pending for the descriptor will be // cancelled. Returns true if any operations were cancelled, in which case // the reactor's event demultiplexing function may need to be interrupted and // restarted. bool cancel_operations(iterator i, op_queue& ops, const asio::error_code& ec = asio::error::operation_aborted) { if (i != operations_.end()) { while (reactor_op* op = i->second.front()) { op->ec_ = ec; i->second.pop(); ops.push(op); } operations_.erase(i); return true; } return false; } // Cancel all operations associated with the descriptor. Any operations // pending for the descriptor will be cancelled. Returns true if any // operations were cancelled, in which case the reactor's event // demultiplexing function may need to be interrupted and restarted. bool cancel_operations(Descriptor descriptor, op_queue& ops, const asio::error_code& ec = asio::error::operation_aborted) { return this->cancel_operations(operations_.find(descriptor), ops, ec); } // Whether there are no operations in the queue. bool empty() const { return operations_.empty(); } // Determine whether there are any operations associated with the descriptor. bool has_operation(Descriptor descriptor) const { return operations_.find(descriptor) != operations_.end(); } // Perform the operations corresponding to the descriptor identified by the // supplied iterator. Returns true if there are still unfinished operations // queued for the descriptor. bool perform_operations(iterator i, op_queue& ops) { if (i != operations_.end()) { while (reactor_op* op = i->second.front()) { if (op->perform()) { i->second.pop(); ops.push(op); } else { return true; } } operations_.erase(i); } return false; } // Perform the operations corresponding to the descriptor. Returns true if // there are still unfinished operations queued for the descriptor. bool perform_operations(Descriptor descriptor, op_queue& ops) { return this->perform_operations(operations_.find(descriptor), ops); } // Get all operations owned by the queue. void get_all_operations(op_queue& ops) { iterator i = operations_.begin(); while (i != operations_.end()) { iterator op_iter = i++; ops.push(op_iter->second); operations_.erase(op_iter); } } private: // The operations that are currently executing asynchronously. hash_map operations_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_REACTOR_OP_QUEUE_HPP asio-1.12.2/include/asio/detail/recycling_allocator.hpp000066400000000000000000000041741340672067200231150ustar00rootroot00000000000000// // detail/recycling_allocator.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP #define ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/thread_context.hpp" #include "asio/detail/thread_info_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class recycling_allocator { public: typedef T value_type; template struct rebind { typedef recycling_allocator other; }; recycling_allocator() { } template recycling_allocator(const recycling_allocator&) { } T* allocate(std::size_t n) { typedef thread_context::thread_call_stack call_stack; void* p = thread_info_base::allocate(call_stack::top(), sizeof(T) * n); return static_cast(p); } void deallocate(T* p, std::size_t n) { typedef thread_context::thread_call_stack call_stack; thread_info_base::deallocate(call_stack::top(), p, sizeof(T) * n); } }; template <> class recycling_allocator { public: typedef void value_type; template struct rebind { typedef recycling_allocator other; }; recycling_allocator() { } template recycling_allocator(const recycling_allocator&) { } }; template struct get_recycling_allocator { typedef Allocator type; static type get(const Allocator& a) { return a; } }; template struct get_recycling_allocator > { typedef recycling_allocator type; static type get(const std::allocator&) { return type(); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP asio-1.12.2/include/asio/detail/regex_fwd.hpp000066400000000000000000000014601340672067200210430ustar00rootroot00000000000000// // detail/regex_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_REGEX_FWD_HPP #define ASIO_DETAIL_REGEX_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if defined(ASIO_HAS_BOOST_REGEX) #include #include namespace boost { template struct sub_match; template class match_results; } // namespace boost #endif // defined(ASIO_HAS_BOOST_REGEX) #endif // ASIO_DETAIL_REGEX_FWD_HPP asio-1.12.2/include/asio/detail/resolve_endpoint_op.hpp000066400000000000000000000100331340672067200231420ustar00rootroot00000000000000// // detail/resolve_endpoint_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP #define ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/ip/basic_resolver_results.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/resolve_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class resolve_endpoint_op : public resolve_op { public: ASIO_DEFINE_HANDLER_PTR(resolve_endpoint_op); typedef typename Protocol::endpoint endpoint_type; typedef asio::ip::basic_resolver_results results_type; resolve_endpoint_op(socket_ops::weak_cancel_token_type cancel_token, const endpoint_type& endpoint, io_context_impl& ioc, Handler& handler) : resolve_op(&resolve_endpoint_op::do_complete), cancel_token_(cancel_token), endpoint_(endpoint), io_context_impl_(ioc), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the operation object. resolve_endpoint_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); if (owner && owner != &o->io_context_impl_) { // The operation is being run on the worker io_context. Time to perform // the resolver operation. // Perform the blocking endpoint resolution operation. char host_name[NI_MAXHOST]; char service_name[NI_MAXSERV]; socket_ops::background_getnameinfo(o->cancel_token_, o->endpoint_.data(), o->endpoint_.size(), host_name, NI_MAXHOST, service_name, NI_MAXSERV, o->endpoint_.protocol().type(), o->ec_); o->results_ = results_type::create(o->endpoint_, host_name, service_name); // Pass operation back to main io_context for completion. o->io_context_impl_.post_deferred_completion(o); p.v = p.p = 0; } else { // The operation has been returned to the main io_context. The completion // handler is ready to be delivered. ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated // before the upcall is made. Even if we're not about to make an upcall, // a sub-object of the handler may be the true owner of the memory // associated with the handler. Consequently, a local copy of the handler // is required to ensure that any owning sub-object remains valid until // after we have deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->results_); p.h = asio::detail::addressof(handler.handler_); p.reset(); if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } } private: socket_ops::weak_cancel_token_type cancel_token_; endpoint_type endpoint_; io_context_impl& io_context_impl_; Handler handler_; results_type results_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP asio-1.12.2/include/asio/detail/resolve_op.hpp000066400000000000000000000017421340672067200212510ustar00rootroot00000000000000// // detail/resolve_op.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_RESOLVE_OP_HPP #define ASIO_DETAIL_RESOLVE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class resolve_op : public operation { public: // The error code to be passed to the completion handler. asio::error_code ec_; protected: resolve_op(func_type complete_func) : operation(complete_func) { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_RESOLVE_OP_HPP asio-1.12.2/include/asio/detail/resolve_query_op.hpp000066400000000000000000000103151340672067200224720ustar00rootroot00000000000000// // detail/resolve_query_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_RESOLVE_QUERY_OP_HPP #define ASIO_DETAIL_RESOLVE_QUERY_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_results.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/resolve_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class resolve_query_op : public resolve_op { public: ASIO_DEFINE_HANDLER_PTR(resolve_query_op); typedef asio::ip::basic_resolver_query query_type; typedef asio::ip::basic_resolver_results results_type; resolve_query_op(socket_ops::weak_cancel_token_type cancel_token, const query_type& query, io_context_impl& ioc, Handler& handler) : resolve_op(&resolve_query_op::do_complete), cancel_token_(cancel_token), query_(query), io_context_impl_(ioc), handler_(ASIO_MOVE_CAST(Handler)(handler)), addrinfo_(0) { handler_work::start(handler_); } ~resolve_query_op() { if (addrinfo_) socket_ops::freeaddrinfo(addrinfo_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the operation object. resolve_query_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; if (owner && owner != &o->io_context_impl_) { // The operation is being run on the worker io_context. Time to perform // the resolver operation. // Perform the blocking host resolution operation. socket_ops::background_getaddrinfo(o->cancel_token_, o->query_.host_name().c_str(), o->query_.service_name().c_str(), o->query_.hints(), &o->addrinfo_, o->ec_); // Pass operation back to main io_context for completion. o->io_context_impl_.post_deferred_completion(o); p.v = p.p = 0; } else { // The operation has been returned to the main io_context. The completion // handler is ready to be delivered. // Take ownership of the operation's outstanding work. handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated // before the upcall is made. Even if we're not about to make an upcall, // a sub-object of the handler may be the true owner of the memory // associated with the handler. Consequently, a local copy of the handler // is required to ensure that any owning sub-object remains valid until // after we have deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, results_type()); p.h = asio::detail::addressof(handler.handler_); if (o->addrinfo_) { handler.arg2_ = results_type::create(o->addrinfo_, o->query_.host_name(), o->query_.service_name()); } p.reset(); if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } } private: socket_ops::weak_cancel_token_type cancel_token_; query_type query_; io_context_impl& io_context_impl_; Handler handler_; asio::detail::addrinfo_type* addrinfo_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_RESOLVE_QUERY_OP_HPP asio-1.12.2/include/asio/detail/resolver_service.hpp000066400000000000000000000105751340672067200224610ustar00rootroot00000000000000// // detail/resolver_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_RESOLVER_SERVICE_HPP #define ASIO_DETAIL_RESOLVER_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS_RUNTIME) #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_results.hpp" #include "asio/detail/concurrency_hint.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/resolve_endpoint_op.hpp" #include "asio/detail/resolve_query_op.hpp" #include "asio/detail/resolver_service_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class resolver_service : public service_base >, public resolver_service_base { public: // The implementation type of the resolver. A cancellation token is used to // indicate to the background thread that the operation has been cancelled. typedef socket_ops::shared_cancel_token_type implementation_type; // The endpoint type. typedef typename Protocol::endpoint endpoint_type; // The query type. typedef asio::ip::basic_resolver_query query_type; // The results type. typedef asio::ip::basic_resolver_results results_type; // Constructor. resolver_service(asio::io_context& io_context) : service_base >(io_context), resolver_service_base(io_context) { } // Destroy all user-defined handler objects owned by the service. void shutdown() { this->base_shutdown(); } // Perform any fork-related housekeeping. void notify_fork(asio::io_context::fork_event fork_ev) { this->base_notify_fork(fork_ev); } // Resolve a query to a list of entries. results_type resolve(implementation_type&, const query_type& query, asio::error_code& ec) { asio::detail::addrinfo_type* address_info = 0; socket_ops::getaddrinfo(query.host_name().c_str(), query.service_name().c_str(), query.hints(), &address_info, ec); auto_addrinfo auto_address_info(address_info); return ec ? results_type() : results_type::create( address_info, query.host_name(), query.service_name()); } // Asynchronously resolve a query to a list of entries. template void async_resolve(implementation_type& impl, const query_type& query, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef resolve_query_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl, query, io_context_impl_, handler); ASIO_HANDLER_CREATION((io_context_impl_.context(), *p.p, "resolver", &impl, 0, "async_resolve")); start_resolve_op(p.p); p.v = p.p = 0; } // Resolve an endpoint to a list of entries. results_type resolve(implementation_type&, const endpoint_type& endpoint, asio::error_code& ec) { char host_name[NI_MAXHOST]; char service_name[NI_MAXSERV]; socket_ops::sync_getnameinfo(endpoint.data(), endpoint.size(), host_name, NI_MAXHOST, service_name, NI_MAXSERV, endpoint.protocol().type(), ec); return ec ? results_type() : results_type::create( endpoint, host_name, service_name); } // Asynchronously resolve an endpoint to a list of entries. template void async_resolve(implementation_type& impl, const endpoint_type& endpoint, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef resolve_endpoint_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl, endpoint, io_context_impl_, handler); ASIO_HANDLER_CREATION((io_context_impl_.context(), *p.p, "resolver", &impl, 0, "async_resolve")); start_resolve_op(p.p); p.v = p.p = 0; } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_RESOLVER_SERVICE_HPP asio-1.12.2/include/asio/detail/resolver_service_base.hpp000066400000000000000000000077111340672067200234510ustar00rootroot00000000000000// // detail/resolver_service_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP #define ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error.hpp" #include "asio/executor_work_guard.hpp" #include "asio/io_context.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/resolve_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/thread.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class resolver_service_base { public: // The implementation type of the resolver. A cancellation token is used to // indicate to the background thread that the operation has been cancelled. typedef socket_ops::shared_cancel_token_type implementation_type; // Constructor. ASIO_DECL resolver_service_base(asio::io_context& io_context); // Destructor. ASIO_DECL ~resolver_service_base(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void base_shutdown(); // Perform any fork-related housekeeping. ASIO_DECL void base_notify_fork( asio::io_context::fork_event fork_ev); // Construct a new resolver implementation. ASIO_DECL void construct(implementation_type& impl); // Destroy a resolver implementation. ASIO_DECL void destroy(implementation_type&); // Move-construct a new resolver implementation. ASIO_DECL void move_construct(implementation_type& impl, implementation_type& other_impl); // Move-assign from another resolver implementation. ASIO_DECL void move_assign(implementation_type& impl, resolver_service_base& other_service, implementation_type& other_impl); // Cancel pending asynchronous operations. ASIO_DECL void cancel(implementation_type& impl); protected: // Helper function to start an asynchronous resolve operation. ASIO_DECL void start_resolve_op(resolve_op* op); #if !defined(ASIO_WINDOWS_RUNTIME) // Helper class to perform exception-safe cleanup of addrinfo objects. class auto_addrinfo : private asio::detail::noncopyable { public: explicit auto_addrinfo(asio::detail::addrinfo_type* ai) : ai_(ai) { } ~auto_addrinfo() { if (ai_) socket_ops::freeaddrinfo(ai_); } operator asio::detail::addrinfo_type*() { return ai_; } private: asio::detail::addrinfo_type* ai_; }; #endif // !defined(ASIO_WINDOWS_RUNTIME) // Helper class to run the work io_context in a thread. class work_io_context_runner; // Start the work thread if it's not already running. ASIO_DECL void start_work_thread(); // The io_context implementation used to post completions. io_context_impl& io_context_impl_; private: // Mutex to protect access to internal data. asio::detail::mutex mutex_; // Private io_context used for performing asynchronous host resolution. asio::detail::scoped_ptr work_io_context_; // The work io_context implementation used to post completions. io_context_impl& work_io_context_impl_; // Work for the private io_context to perform. asio::executor_work_guard< asio::io_context::executor_type> work_; // Thread used for running the work io_context's run loop. asio::detail::scoped_ptr work_thread_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/resolver_service_base.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP asio-1.12.2/include/asio/detail/scheduler.hpp000066400000000000000000000146011340672067200210500ustar00rootroot00000000000000// // detail/scheduler.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SCHEDULER_HPP #define ASIO_DETAIL_SCHEDULER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error_code.hpp" #include "asio/execution_context.hpp" #include "asio/detail/atomic_count.hpp" #include "asio/detail/conditionally_enabled_event.hpp" #include "asio/detail/conditionally_enabled_mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/reactor_fwd.hpp" #include "asio/detail/scheduler_operation.hpp" #include "asio/detail/thread_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct scheduler_thread_info; class scheduler : public execution_context_service_base, public thread_context { public: typedef scheduler_operation operation; // Constructor. Specifies the number of concurrent threads that are likely to // run the scheduler. If set to 1 certain optimisation are performed. ASIO_DECL scheduler(asio::execution_context& ctx, int concurrency_hint = 0); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Initialise the task, if required. ASIO_DECL void init_task(); // Run the event loop until interrupted or no more work. ASIO_DECL std::size_t run(asio::error_code& ec); // Run until interrupted or one operation is performed. ASIO_DECL std::size_t run_one(asio::error_code& ec); // Run until timeout, interrupted, or one operation is performed. ASIO_DECL std::size_t wait_one( long usec, asio::error_code& ec); // Poll for operations without blocking. ASIO_DECL std::size_t poll(asio::error_code& ec); // Poll for one operation without blocking. ASIO_DECL std::size_t poll_one(asio::error_code& ec); // Interrupt the event processing loop. ASIO_DECL void stop(); // Determine whether the scheduler is stopped. ASIO_DECL bool stopped() const; // Restart in preparation for a subsequent run invocation. ASIO_DECL void restart(); // Notify that some work has started. void work_started() { ++outstanding_work_; } // Used to compensate for a forthcoming work_finished call. Must be called // from within a scheduler-owned thread. ASIO_DECL void compensating_work_started(); // Notify that some work has finished. void work_finished() { if (--outstanding_work_ == 0) stop(); } // Return whether a handler can be dispatched immediately. bool can_dispatch() { return thread_call_stack::contains(this) != 0; } // Request invocation of the given operation and return immediately. Assumes // that work_started() has not yet been called for the operation. ASIO_DECL void post_immediate_completion( operation* op, bool is_continuation); // Request invocation of the given operation and return immediately. Assumes // that work_started() was previously called for the operation. ASIO_DECL void post_deferred_completion(operation* op); // Request invocation of the given operations and return immediately. Assumes // that work_started() was previously called for each operation. ASIO_DECL void post_deferred_completions(op_queue& ops); // Enqueue the given operation following a failed attempt to dispatch the // operation for immediate invocation. ASIO_DECL void do_dispatch(operation* op); // Process unfinished operations as part of a shutdownoperation. Assumes that // work_started() was previously called for the operations. ASIO_DECL void abandon_operations(op_queue& ops); // Get the concurrency hint that was used to initialise the scheduler. int concurrency_hint() const { return concurrency_hint_; } private: // The mutex type used by this scheduler. typedef conditionally_enabled_mutex mutex; // The event type used by this scheduler. typedef conditionally_enabled_event event; // Structure containing thread-specific data. typedef scheduler_thread_info thread_info; // Run at most one operation. May block. ASIO_DECL std::size_t do_run_one(mutex::scoped_lock& lock, thread_info& this_thread, const asio::error_code& ec); // Run at most one operation with a timeout. May block. ASIO_DECL std::size_t do_wait_one(mutex::scoped_lock& lock, thread_info& this_thread, long usec, const asio::error_code& ec); // Poll for at most one operation. ASIO_DECL std::size_t do_poll_one(mutex::scoped_lock& lock, thread_info& this_thread, const asio::error_code& ec); // Stop the task and all idle threads. ASIO_DECL void stop_all_threads(mutex::scoped_lock& lock); // Wake a single idle thread, or the task, and always unlock the mutex. ASIO_DECL void wake_one_thread_and_unlock( mutex::scoped_lock& lock); // Helper class to perform task-related operations on block exit. struct task_cleanup; friend struct task_cleanup; // Helper class to call work-related operations on block exit. struct work_cleanup; friend struct work_cleanup; // Whether to optimise for single-threaded use cases. const bool one_thread_; // Mutex to protect access to internal data. mutable mutex mutex_; // Event to wake up blocked threads. event wakeup_event_; // The task to be run by this service. reactor* task_; // Operation object to represent the position of the task in the queue. struct task_operation : operation { task_operation() : operation(0) {} } task_operation_; // Whether the task has been interrupted. bool task_interrupted_; // The count of unfinished work. atomic_count outstanding_work_; // The queue of handlers that are ready to be delivered. op_queue op_queue_; // Flag to indicate that the dispatcher has been stopped. bool stopped_; // Flag to indicate that the dispatcher has been shut down. bool shutdown_; // The concurrency hint used to initialise the scheduler. const int concurrency_hint_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/scheduler.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_SCHEDULER_HPP asio-1.12.2/include/asio/detail/scheduler_operation.hpp000066400000000000000000000034101340672067200231240ustar00rootroot00000000000000// // detail/scheduler_operation.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SCHEDULER_OPERATION_HPP #define ASIO_DETAIL_SCHEDULER_OPERATION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/error_code.hpp" #include "asio/detail/handler_tracking.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class scheduler; // Base class for all operations. A function pointer is used instead of virtual // functions to avoid the associated overhead. class scheduler_operation ASIO_INHERIT_TRACKED_HANDLER { public: typedef scheduler_operation operation_type; void complete(void* owner, const asio::error_code& ec, std::size_t bytes_transferred) { func_(owner, this, ec, bytes_transferred); } void destroy() { func_(0, this, asio::error_code(), 0); } protected: typedef void (*func_type)(void*, scheduler_operation*, const asio::error_code&, std::size_t); scheduler_operation(func_type func) : next_(0), func_(func), task_result_(0) { } // Prevents deletion through this type. ~scheduler_operation() { } private: friend class op_queue_access; scheduler_operation* next_; func_type func_; protected: friend class scheduler; unsigned int task_result_; // Passed into bytes transferred. }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SCHEDULER_OPERATION_HPP asio-1.12.2/include/asio/detail/scheduler_thread_info.hpp000066400000000000000000000017461340672067200234200ustar00rootroot00000000000000// // detail/scheduler_thread_info.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SCHEDULER_THREAD_INFO_HPP #define ASIO_DETAIL_SCHEDULER_THREAD_INFO_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/op_queue.hpp" #include "asio/detail/thread_info_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class scheduler; class scheduler_operation; struct scheduler_thread_info : public thread_info_base { op_queue private_op_queue; long private_outstanding_work; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SCHEDULER_THREAD_INFO_HPP asio-1.12.2/include/asio/detail/scoped_lock.hpp000066400000000000000000000035131340672067200213570ustar00rootroot00000000000000// // detail/scoped_lock.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SCOPED_LOCK_HPP #define ASIO_DETAIL_SCOPED_LOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper class to lock and unlock a mutex automatically. template class scoped_lock : private noncopyable { public: // Tag type used to distinguish constructors. enum adopt_lock_t { adopt_lock }; // Constructor adopts a lock that is already held. scoped_lock(Mutex& m, adopt_lock_t) : mutex_(m), locked_(true) { } // Constructor acquires the lock. explicit scoped_lock(Mutex& m) : mutex_(m) { mutex_.lock(); locked_ = true; } // Destructor releases the lock. ~scoped_lock() { if (locked_) mutex_.unlock(); } // Explicitly acquire the lock. void lock() { if (!locked_) { mutex_.lock(); locked_ = true; } } // Explicitly release the lock. void unlock() { if (locked_) { mutex_.unlock(); locked_ = false; } } // Test whether the lock is held. bool locked() const { return locked_; } // Get the underlying mutex. Mutex& mutex() { return mutex_; } private: // The underlying mutex. Mutex& mutex_; // Whether the mutex is currently locked or unlocked. bool locked_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SCOPED_LOCK_HPP asio-1.12.2/include/asio/detail/scoped_ptr.hpp000066400000000000000000000025351340672067200212370ustar00rootroot00000000000000// // detail/scoped_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SCOPED_PTR_HPP #define ASIO_DETAIL_SCOPED_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class scoped_ptr { public: // Constructor. explicit scoped_ptr(T* p = 0) : p_(p) { } // Destructor. ~scoped_ptr() { delete p_; } // Access. T* get() { return p_; } // Access. T* operator->() { return p_; } // Dereference. T& operator*() { return *p_; } // Reset pointer. void reset(T* p = 0) { delete p_; p_ = p; } // Release ownership of the pointer. T* release() { T* tmp = p_; p_ = 0; return tmp; } private: // Disallow copying and assignment. scoped_ptr(const scoped_ptr&); scoped_ptr& operator=(const scoped_ptr&); T* p_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SCOPED_PTR_HPP asio-1.12.2/include/asio/detail/select_interrupter.hpp000066400000000000000000000024351340672067200230160ustar00rootroot00000000000000// // detail/select_interrupter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SELECT_INTERRUPTER_HPP #define ASIO_DETAIL_SELECT_INTERRUPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS_RUNTIME) #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) || defined(__SYMBIAN32__) # include "asio/detail/socket_select_interrupter.hpp" #elif defined(ASIO_HAS_EVENTFD) # include "asio/detail/eventfd_select_interrupter.hpp" #else # include "asio/detail/pipe_select_interrupter.hpp" #endif namespace asio { namespace detail { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) || defined(__SYMBIAN32__) typedef socket_select_interrupter select_interrupter; #elif defined(ASIO_HAS_EVENTFD) typedef eventfd_select_interrupter select_interrupter; #else typedef pipe_select_interrupter select_interrupter; #endif } // namespace detail } // namespace asio #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_SELECT_INTERRUPTER_HPP asio-1.12.2/include/asio/detail/select_reactor.hpp000066400000000000000000000202331340672067200220660ustar00rootroot00000000000000// // detail/select_reactor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SELECT_REACTOR_HPP #define ASIO_DETAIL_SELECT_REACTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) \ || (!defined(ASIO_HAS_DEV_POLL) \ && !defined(ASIO_HAS_EPOLL) \ && !defined(ASIO_HAS_KQUEUE) \ && !defined(ASIO_WINDOWS_RUNTIME)) #include #include "asio/detail/fd_set_adapter.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/reactor_op_queue.hpp" #include "asio/detail/select_interrupter.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/wait_op.hpp" #include "asio/execution_context.hpp" #if defined(ASIO_HAS_IOCP) # include "asio/detail/thread.hpp" #endif // defined(ASIO_HAS_IOCP) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class select_reactor : public execution_context_service_base { public: #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) enum op_types { read_op = 0, write_op = 1, except_op = 2, max_select_ops = 3, connect_op = 3, max_ops = 4 }; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) enum op_types { read_op = 0, write_op = 1, except_op = 2, max_select_ops = 3, connect_op = 1, max_ops = 3 }; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) // Per-descriptor data. struct per_descriptor_data { }; // Constructor. ASIO_DECL select_reactor(asio::execution_context& ctx); // Destructor. ASIO_DECL ~select_reactor(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Recreate internal descriptors following a fork. ASIO_DECL void notify_fork( asio::execution_context::fork_event fork_ev); // Initialise the task, but only if the reactor is not in its own thread. ASIO_DECL void init_task(); // Register a socket with the reactor. Returns 0 on success, system error // code on failure. ASIO_DECL int register_descriptor(socket_type, per_descriptor_data&); // Register a descriptor with an associated single operation. Returns 0 on // success, system error code on failure. ASIO_DECL int register_internal_descriptor( int op_type, socket_type descriptor, per_descriptor_data& descriptor_data, reactor_op* op); // Post a reactor operation for immediate completion. void post_immediate_completion(reactor_op* op, bool is_continuation) { scheduler_.post_immediate_completion(op, is_continuation); } // Start a new operation. The reactor operation will be performed when the // given descriptor is flagged as ready, or an error has occurred. ASIO_DECL void start_op(int op_type, socket_type descriptor, per_descriptor_data&, reactor_op* op, bool is_continuation, bool); // Cancel all operations associated with the given descriptor. The // handlers associated with the descriptor will be invoked with the // operation_aborted error. ASIO_DECL void cancel_ops(socket_type descriptor, per_descriptor_data&); // Cancel any operations that are running against the descriptor and remove // its registration from the reactor. The reactor resources associated with // the descriptor must be released by calling cleanup_descriptor_data. ASIO_DECL void deregister_descriptor(socket_type descriptor, per_descriptor_data&, bool closing); // Remove the descriptor's registration from the reactor. The reactor // resources associated with the descriptor must be released by calling // cleanup_descriptor_data. ASIO_DECL void deregister_internal_descriptor( socket_type descriptor, per_descriptor_data&); // Perform any post-deregistration cleanup tasks associated with the // descriptor data. ASIO_DECL void cleanup_descriptor_data(per_descriptor_data&); // Move descriptor registration from one descriptor_data object to another. ASIO_DECL void move_descriptor(socket_type descriptor, per_descriptor_data& target_descriptor_data, per_descriptor_data& source_descriptor_data); // Add a new timer queue to the reactor. template void add_timer_queue(timer_queue& queue); // Remove a timer queue from the reactor. template void remove_timer_queue(timer_queue& queue); // Schedule a new operation in the given timer queue to expire at the // specified absolute time. template void schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op); // Cancel the timer operations associated with the given token. Returns the // number of operations that have been posted or dispatched. template std::size_t cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move the timer operations associated with the given timer. template void move_timer(timer_queue& queue, typename timer_queue::per_timer_data& target, typename timer_queue::per_timer_data& source); // Run select once until interrupted or events are ready to be dispatched. ASIO_DECL void run(long usec, op_queue& ops); // Interrupt the select loop. ASIO_DECL void interrupt(); private: #if defined(ASIO_HAS_IOCP) // Run the select loop in the thread. ASIO_DECL void run_thread(); #endif // defined(ASIO_HAS_IOCP) // Helper function to add a new timer queue. ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); // Helper function to remove a timer queue. ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); // Get the timeout value for the select call. ASIO_DECL timeval* get_timeout(long usec, timeval& tv); // Cancel all operations associated with the given descriptor. This function // does not acquire the select_reactor's mutex. ASIO_DECL void cancel_ops_unlocked(socket_type descriptor, const asio::error_code& ec); // The scheduler implementation used to post completions. # if defined(ASIO_HAS_IOCP) typedef class win_iocp_io_context scheduler_type; # else // defined(ASIO_HAS_IOCP) typedef class scheduler scheduler_type; # endif // defined(ASIO_HAS_IOCP) scheduler_type& scheduler_; // Mutex to protect access to internal data. asio::detail::mutex mutex_; // The interrupter is used to break a blocking select call. select_interrupter interrupter_; // The queues of read, write and except operations. reactor_op_queue op_queue_[max_ops]; // The file descriptor sets to be passed to the select system call. fd_set_adapter fd_sets_[max_select_ops]; // The timer queues. timer_queue_set timer_queues_; #if defined(ASIO_HAS_IOCP) // Helper class to run the reactor loop in a thread. class thread_function; friend class thread_function; // Does the reactor loop thread need to stop. bool stop_thread_; // The thread that is running the reactor loop. asio::detail::thread* thread_; #endif // defined(ASIO_HAS_IOCP) // Whether the service has been shut down. bool shutdown_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/select_reactor.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/select_reactor.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_IOCP) // || (!defined(ASIO_HAS_DEV_POLL) // && !defined(ASIO_HAS_EPOLL) // && !defined(ASIO_HAS_KQUEUE) // && !defined(ASIO_WINDOWS_RUNTIME)) #endif // ASIO_DETAIL_SELECT_REACTOR_HPP asio-1.12.2/include/asio/detail/service_registry.hpp000066400000000000000000000124611340672067200224640ustar00rootroot00000000000000// // detail/service_registry.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SERVICE_REGISTRY_HPP #define ASIO_DETAIL_SERVICE_REGISTRY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/mutex.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/type_traits.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { class io_context; namespace detail { template class typeid_wrapper {}; class service_registry : private noncopyable { public: // Constructor. ASIO_DECL service_registry(execution_context& owner); // Destructor. ASIO_DECL ~service_registry(); // Shutdown all services. ASIO_DECL void shutdown_services(); // Destroy all services. ASIO_DECL void destroy_services(); // Notify all services of a fork event. ASIO_DECL void notify_fork(execution_context::fork_event fork_ev); // Get the service object corresponding to the specified service type. Will // create a new service object automatically if no such object already // exists. Ownership of the service object is not transferred to the caller. template Service& use_service(); // Get the service object corresponding to the specified service type. Will // create a new service object automatically if no such object already // exists. Ownership of the service object is not transferred to the caller. // This overload is used for backwards compatibility with services that // inherit from io_context::service. template Service& use_service(io_context& owner); // Add a service object. Throws on error, in which case ownership of the // object is retained by the caller. template void add_service(Service* new_service); // Check whether a service object of the specified type already exists. template bool has_service() const; private: // Initalise a service's key when the key_type typedef is not available. template static void init_key(execution_context::service::key& key, ...); #if !defined(ASIO_NO_TYPEID) // Initalise a service's key when the key_type typedef is available. template static void init_key(execution_context::service::key& key, typename enable_if< is_base_of::value>::type*); #endif // !defined(ASIO_NO_TYPEID) // Initialise a service's key based on its id. ASIO_DECL static void init_key_from_id( execution_context::service::key& key, const execution_context::id& id); #if !defined(ASIO_NO_TYPEID) // Initialise a service's key based on its id. template static void init_key_from_id(execution_context::service::key& key, const service_id& /*id*/); #endif // !defined(ASIO_NO_TYPEID) // Check if a service matches the given id. ASIO_DECL static bool keys_match( const execution_context::service::key& key1, const execution_context::service::key& key2); // The type of a factory function used for creating a service instance. typedef execution_context::service*(*factory_type)(void*); // Factory function for creating a service instance. template static execution_context::service* create(void* owner); // Destroy a service instance. ASIO_DECL static void destroy(execution_context::service* service); // Helper class to manage service pointers. struct auto_service_ptr; friend struct auto_service_ptr; struct auto_service_ptr { execution_context::service* ptr_; ~auto_service_ptr() { destroy(ptr_); } }; // Get the service object corresponding to the specified service key. Will // create a new service object automatically if no such object already // exists. Ownership of the service object is not transferred to the caller. ASIO_DECL execution_context::service* do_use_service( const execution_context::service::key& key, factory_type factory, void* owner); // Add a service object. Throws on error, in which case ownership of the // object is retained by the caller. ASIO_DECL void do_add_service( const execution_context::service::key& key, execution_context::service* new_service); // Check whether a service object with the specified key already exists. ASIO_DECL bool do_has_service( const execution_context::service::key& key) const; // Mutex to protect access to internal data. mutable asio::detail::mutex mutex_; // The owner of this service registry and the services it contains. execution_context& owner_; // The first service in the list of contained services. execution_context::service* first_service_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/service_registry.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/service_registry.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_SERVICE_REGISTRY_HPP asio-1.12.2/include/asio/detail/signal_blocker.hpp000066400000000000000000000023531340672067200220510ustar00rootroot00000000000000// // detail/signal_blocker.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SIGNAL_BLOCKER_HPP #define ASIO_DETAIL_SIGNAL_BLOCKER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) || defined(ASIO_WINDOWS) \ || defined(ASIO_WINDOWS_RUNTIME) \ || defined(__CYGWIN__) || defined(__SYMBIAN32__) # include "asio/detail/null_signal_blocker.hpp" #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_signal_blocker.hpp" #else # error Only Windows and POSIX are supported! #endif namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) || defined(ASIO_WINDOWS) \ || defined(ASIO_WINDOWS_RUNTIME) \ || defined(__CYGWIN__) || defined(__SYMBIAN32__) typedef null_signal_blocker signal_blocker; #elif defined(ASIO_HAS_PTHREADS) typedef posix_signal_blocker signal_blocker; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_SIGNAL_BLOCKER_HPP asio-1.12.2/include/asio/detail/signal_handler.hpp000066400000000000000000000050321340672067200220420ustar00rootroot00000000000000// // detail/signal_handler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SIGNAL_HANDLER_HPP #define ASIO_DETAIL_SIGNAL_HANDLER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_work.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/signal_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class signal_handler : public signal_op { public: ASIO_DEFINE_HANDLER_PTR(signal_handler); signal_handler(Handler& h) : signal_op(&signal_handler::do_complete), handler_(ASIO_MOVE_CAST(Handler)(h)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. signal_handler* h(static_cast(base)); ptr p = { asio::detail::addressof(h->handler_), h, h }; handler_work w(h->handler_); ASIO_HANDLER_COMPLETION((*h)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(h->handler_, h->ec_, h->signal_number_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SIGNAL_HANDLER_HPP asio-1.12.2/include/asio/detail/signal_init.hpp000066400000000000000000000017271340672067200213770ustar00rootroot00000000000000// // detail/signal_init.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SIGNAL_INIT_HPP #define ASIO_DETAIL_SIGNAL_INIT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class signal_init { public: // Constructor. signal_init() { std::signal(Signal, SIG_IGN); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #endif // ASIO_DETAIL_SIGNAL_INIT_HPP asio-1.12.2/include/asio/detail/signal_op.hpp000066400000000000000000000020401340672067200210370ustar00rootroot00000000000000// // detail/signal_op.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SIGNAL_OP_HPP #define ASIO_DETAIL_SIGNAL_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class signal_op : public operation { public: // The error code to be passed to the completion handler. asio::error_code ec_; // The signal number to be passed to the completion handler. int signal_number_; protected: signal_op(func_type func) : operation(func), signal_number_(0) { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SIGNAL_OP_HPP asio-1.12.2/include/asio/detail/signal_set_service.hpp000066400000000000000000000140601340672067200227410ustar00rootroot00000000000000// // detail/signal_set_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SIGNAL_SET_SERVICE_HPP #define ASIO_DETAIL_SIGNAL_SET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/signal_handler.hpp" #include "asio/detail/signal_op.hpp" #include "asio/detail/socket_types.hpp" #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) # include "asio/detail/reactor.hpp" #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { #if defined(NSIG) && (NSIG > 0) enum { max_signal_number = NSIG }; #else enum { max_signal_number = 128 }; #endif extern ASIO_DECL struct signal_state* get_signal_state(); extern "C" ASIO_DECL void asio_signal_handler(int signal_number); class signal_set_service : public service_base { public: // Type used for tracking an individual signal registration. class registration { public: // Default constructor. registration() : signal_number_(0), queue_(0), undelivered_(0), next_in_table_(0), prev_in_table_(0), next_in_set_(0) { } private: // Only this service will have access to the internal values. friend class signal_set_service; // The signal number that is registered. int signal_number_; // The waiting signal handlers. op_queue* queue_; // The number of undelivered signals. std::size_t undelivered_; // Pointers to adjacent registrations in the registrations_ table. registration* next_in_table_; registration* prev_in_table_; // Link to next registration in the signal set. registration* next_in_set_; }; // The implementation type of the signal_set. class implementation_type { public: // Default constructor. implementation_type() : signals_(0) { } private: // Only this service will have access to the internal values. friend class signal_set_service; // The pending signal handlers. op_queue queue_; // Linked list of registered signals. registration* signals_; }; // Constructor. ASIO_DECL signal_set_service(asio::io_context& io_context); // Destructor. ASIO_DECL ~signal_set_service(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Perform fork-related housekeeping. ASIO_DECL void notify_fork( asio::io_context::fork_event fork_ev); // Construct a new signal_set implementation. ASIO_DECL void construct(implementation_type& impl); // Destroy a signal_set implementation. ASIO_DECL void destroy(implementation_type& impl); // Add a signal to a signal_set. ASIO_DECL asio::error_code add(implementation_type& impl, int signal_number, asio::error_code& ec); // Remove a signal to a signal_set. ASIO_DECL asio::error_code remove(implementation_type& impl, int signal_number, asio::error_code& ec); // Remove all signals from a signal_set. ASIO_DECL asio::error_code clear(implementation_type& impl, asio::error_code& ec); // Cancel all operations associated with the signal set. ASIO_DECL asio::error_code cancel(implementation_type& impl, asio::error_code& ec); // Start an asynchronous operation to wait for a signal to be delivered. template void async_wait(implementation_type& impl, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef signal_handler op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "signal_set", &impl, 0, "async_wait")); start_wait_op(impl, p.p); p.v = p.p = 0; } // Deliver notification that a particular signal occurred. ASIO_DECL static void deliver_signal(int signal_number); private: // Helper function to add a service to the global signal state. ASIO_DECL static void add_service(signal_set_service* service); // Helper function to remove a service from the global signal state. ASIO_DECL static void remove_service(signal_set_service* service); // Helper function to create the pipe descriptors. ASIO_DECL static void open_descriptors(); // Helper function to close the pipe descriptors. ASIO_DECL static void close_descriptors(); // Helper function to start a wait operation. ASIO_DECL void start_wait_op(implementation_type& impl, signal_op* op); // The io_context instance used for dispatching handlers. io_context_impl& io_context_; #if !defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_RUNTIME) \ && !defined(__CYGWIN__) // The type used for registering for pipe reactor notifications. class pipe_read_op; // The reactor used for waiting for pipe readiness. reactor& reactor_; // The per-descriptor reactor data used for the pipe. reactor::per_descriptor_data reactor_data_; #endif // !defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_RUNTIME) // && !defined(__CYGWIN__) // A mapping from signal number to the registered signal sets. registration* registrations_[max_signal_number]; // Pointers to adjacent services in linked list. signal_set_service* next_; signal_set_service* prev_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/signal_set_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_SIGNAL_SET_SERVICE_HPP asio-1.12.2/include/asio/detail/socket_holder.hpp000066400000000000000000000037731340672067200217270ustar00rootroot00000000000000// // detail/socket_holder.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOCKET_HOLDER_HPP #define ASIO_DETAIL_SOCKET_HOLDER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Implement the resource acquisition is initialisation idiom for sockets. class socket_holder : private noncopyable { public: // Construct as an uninitialised socket. socket_holder() : socket_(invalid_socket) { } // Construct to take ownership of the specified socket. explicit socket_holder(socket_type s) : socket_(s) { } // Destructor. ~socket_holder() { if (socket_ != invalid_socket) { asio::error_code ec; socket_ops::state_type state = 0; socket_ops::close(socket_, state, true, ec); } } // Get the underlying socket. socket_type get() const { return socket_; } // Reset to an uninitialised socket. void reset() { if (socket_ != invalid_socket) { asio::error_code ec; socket_ops::state_type state = 0; socket_ops::close(socket_, state, true, ec); socket_ = invalid_socket; } } // Reset to take ownership of the specified socket. void reset(socket_type s) { reset(); socket_ = s; } // Release ownership of the socket. socket_type release() { socket_type tmp = socket_; socket_ = invalid_socket; return tmp; } private: // The underlying socket. socket_type socket_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SOCKET_HOLDER_HPP asio-1.12.2/include/asio/detail/socket_ops.hpp000066400000000000000000000246271340672067200212540ustar00rootroot00000000000000// // detail/socket_ops.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOCKET_OPS_HPP #define ASIO_DETAIL_SOCKET_OPS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error_code.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace socket_ops { // Socket state bits. enum { // The user wants a non-blocking socket. user_set_non_blocking = 1, // The socket has been set non-blocking. internal_non_blocking = 2, // Helper "state" used to determine whether the socket is non-blocking. non_blocking = user_set_non_blocking | internal_non_blocking, // User wants connection_aborted errors, which are disabled by default. enable_connection_aborted = 4, // The user set the linger option. Needs to be checked when closing. user_set_linger = 8, // The socket is stream-oriented. stream_oriented = 16, // The socket is datagram-oriented. datagram_oriented = 32, // The socket may have been dup()-ed. possible_dup = 64 }; typedef unsigned char state_type; struct noop_deleter { void operator()(void*) {} }; typedef shared_ptr shared_cancel_token_type; typedef weak_ptr weak_cancel_token_type; #if !defined(ASIO_WINDOWS_RUNTIME) ASIO_DECL socket_type accept(socket_type s, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec); ASIO_DECL socket_type sync_accept(socket_type s, state_type state, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec); #if defined(ASIO_HAS_IOCP) ASIO_DECL void complete_iocp_accept(socket_type s, void* output_buffer, DWORD address_length, socket_addr_type* addr, std::size_t* addrlen, socket_type new_socket, asio::error_code& ec); #else // defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_accept(socket_type s, state_type state, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec, socket_type& new_socket); #endif // defined(ASIO_HAS_IOCP) ASIO_DECL int bind(socket_type s, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec); ASIO_DECL int close(socket_type s, state_type& state, bool destruction, asio::error_code& ec); ASIO_DECL bool set_user_non_blocking(socket_type s, state_type& state, bool value, asio::error_code& ec); ASIO_DECL bool set_internal_non_blocking(socket_type s, state_type& state, bool value, asio::error_code& ec); ASIO_DECL int shutdown(socket_type s, int what, asio::error_code& ec); ASIO_DECL int connect(socket_type s, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec); ASIO_DECL void sync_connect(socket_type s, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec); #if defined(ASIO_HAS_IOCP) ASIO_DECL void complete_iocp_connect(socket_type s, asio::error_code& ec); #endif // defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_connect(socket_type s, asio::error_code& ec); ASIO_DECL int socketpair(int af, int type, int protocol, socket_type sv[2], asio::error_code& ec); ASIO_DECL bool sockatmark(socket_type s, asio::error_code& ec); ASIO_DECL size_t available(socket_type s, asio::error_code& ec); ASIO_DECL int listen(socket_type s, int backlog, asio::error_code& ec); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) typedef WSABUF buf; #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) typedef iovec buf; #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) ASIO_DECL void init_buf(buf& b, void* data, size_t size); ASIO_DECL void init_buf(buf& b, const void* data, size_t size); ASIO_DECL signed_size_type recv(socket_type s, buf* bufs, size_t count, int flags, asio::error_code& ec); ASIO_DECL size_t sync_recv(socket_type s, state_type state, buf* bufs, size_t count, int flags, bool all_empty, asio::error_code& ec); #if defined(ASIO_HAS_IOCP) ASIO_DECL void complete_iocp_recv(state_type state, const weak_cancel_token_type& cancel_token, bool all_empty, asio::error_code& ec, size_t bytes_transferred); #else // defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_recv(socket_type s, buf* bufs, size_t count, int flags, bool is_stream, asio::error_code& ec, size_t& bytes_transferred); #endif // defined(ASIO_HAS_IOCP) ASIO_DECL signed_size_type recvfrom(socket_type s, buf* bufs, size_t count, int flags, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec); ASIO_DECL size_t sync_recvfrom(socket_type s, state_type state, buf* bufs, size_t count, int flags, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec); #if defined(ASIO_HAS_IOCP) ASIO_DECL void complete_iocp_recvfrom( const weak_cancel_token_type& cancel_token, asio::error_code& ec); #else // defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_recvfrom(socket_type s, buf* bufs, size_t count, int flags, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec, size_t& bytes_transferred); #endif // defined(ASIO_HAS_IOCP) ASIO_DECL signed_size_type recvmsg(socket_type s, buf* bufs, size_t count, int in_flags, int& out_flags, asio::error_code& ec); ASIO_DECL size_t sync_recvmsg(socket_type s, state_type state, buf* bufs, size_t count, int in_flags, int& out_flags, asio::error_code& ec); #if defined(ASIO_HAS_IOCP) ASIO_DECL void complete_iocp_recvmsg( const weak_cancel_token_type& cancel_token, asio::error_code& ec); #else // defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_recvmsg(socket_type s, buf* bufs, size_t count, int in_flags, int& out_flags, asio::error_code& ec, size_t& bytes_transferred); #endif // defined(ASIO_HAS_IOCP) ASIO_DECL signed_size_type send(socket_type s, const buf* bufs, size_t count, int flags, asio::error_code& ec); ASIO_DECL size_t sync_send(socket_type s, state_type state, const buf* bufs, size_t count, int flags, bool all_empty, asio::error_code& ec); #if defined(ASIO_HAS_IOCP) ASIO_DECL void complete_iocp_send( const weak_cancel_token_type& cancel_token, asio::error_code& ec); #else // defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_send(socket_type s, const buf* bufs, size_t count, int flags, asio::error_code& ec, size_t& bytes_transferred); #endif // defined(ASIO_HAS_IOCP) ASIO_DECL signed_size_type sendto(socket_type s, const buf* bufs, size_t count, int flags, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec); ASIO_DECL size_t sync_sendto(socket_type s, state_type state, const buf* bufs, size_t count, int flags, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec); #if !defined(ASIO_HAS_IOCP) ASIO_DECL bool non_blocking_sendto(socket_type s, const buf* bufs, size_t count, int flags, const socket_addr_type* addr, std::size_t addrlen, asio::error_code& ec, size_t& bytes_transferred); #endif // !defined(ASIO_HAS_IOCP) ASIO_DECL socket_type socket(int af, int type, int protocol, asio::error_code& ec); ASIO_DECL int setsockopt(socket_type s, state_type& state, int level, int optname, const void* optval, std::size_t optlen, asio::error_code& ec); ASIO_DECL int getsockopt(socket_type s, state_type state, int level, int optname, void* optval, size_t* optlen, asio::error_code& ec); ASIO_DECL int getpeername(socket_type s, socket_addr_type* addr, std::size_t* addrlen, bool cached, asio::error_code& ec); ASIO_DECL int getsockname(socket_type s, socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec); ASIO_DECL int ioctl(socket_type s, state_type& state, int cmd, ioctl_arg_type* arg, asio::error_code& ec); ASIO_DECL int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout, asio::error_code& ec); ASIO_DECL int poll_read(socket_type s, state_type state, int msec, asio::error_code& ec); ASIO_DECL int poll_write(socket_type s, state_type state, int msec, asio::error_code& ec); ASIO_DECL int poll_error(socket_type s, state_type state, int msec, asio::error_code& ec); ASIO_DECL int poll_connect(socket_type s, int msec, asio::error_code& ec); #endif // !defined(ASIO_WINDOWS_RUNTIME) ASIO_DECL const char* inet_ntop(int af, const void* src, char* dest, size_t length, unsigned long scope_id, asio::error_code& ec); ASIO_DECL int inet_pton(int af, const char* src, void* dest, unsigned long* scope_id, asio::error_code& ec); ASIO_DECL int gethostname(char* name, int namelen, asio::error_code& ec); #if !defined(ASIO_WINDOWS_RUNTIME) ASIO_DECL asio::error_code getaddrinfo(const char* host, const char* service, const addrinfo_type& hints, addrinfo_type** result, asio::error_code& ec); ASIO_DECL asio::error_code background_getaddrinfo( const weak_cancel_token_type& cancel_token, const char* host, const char* service, const addrinfo_type& hints, addrinfo_type** result, asio::error_code& ec); ASIO_DECL void freeaddrinfo(addrinfo_type* ai); ASIO_DECL asio::error_code getnameinfo( const socket_addr_type* addr, std::size_t addrlen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int flags, asio::error_code& ec); ASIO_DECL asio::error_code sync_getnameinfo( const socket_addr_type* addr, std::size_t addrlen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int sock_type, asio::error_code& ec); ASIO_DECL asio::error_code background_getnameinfo( const weak_cancel_token_type& cancel_token, const socket_addr_type* addr, std::size_t addrlen, char* host, std::size_t hostlen, char* serv, std::size_t servlen, int sock_type, asio::error_code& ec); #endif // !defined(ASIO_WINDOWS_RUNTIME) ASIO_DECL u_long_type network_to_host_long(u_long_type value); ASIO_DECL u_long_type host_to_network_long(u_long_type value); ASIO_DECL u_short_type network_to_host_short(u_short_type value); ASIO_DECL u_short_type host_to_network_short(u_short_type value); } // namespace socket_ops } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/socket_ops.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_SOCKET_OPS_HPP asio-1.12.2/include/asio/detail/socket_option.hpp000066400000000000000000000142141340672067200217520ustar00rootroot00000000000000// // detail/socket_option.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOCKET_OPTION_HPP #define ASIO_DETAIL_SOCKET_OPTION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace socket_option { // Helper template for implementing boolean-based options. template class boolean { public: // Default constructor. boolean() : value_(0) { } // Construct with a specific option value. explicit boolean(bool v) : value_(v ? 1 : 0) { } // Set the current value of the boolean. boolean& operator=(bool v) { value_ = v ? 1 : 0; return *this; } // Get the current value of the boolean. bool value() const { return !!value_; } // Convert to bool. operator bool() const { return !!value_; } // Test for false. bool operator!() const { return !value_; } // Get the level of the socket option. template int level(const Protocol&) const { return Level; } // Get the name of the socket option. template int name(const Protocol&) const { return Name; } // Get the address of the boolean data. template int* data(const Protocol&) { return &value_; } // Get the address of the boolean data. template const int* data(const Protocol&) const { return &value_; } // Get the size of the boolean data. template std::size_t size(const Protocol&) const { return sizeof(value_); } // Set the size of the boolean data. template void resize(const Protocol&, std::size_t s) { // On some platforms (e.g. Windows Vista), the getsockopt function will // return the size of a boolean socket option as one byte, even though a // four byte integer was passed in. switch (s) { case sizeof(char): value_ = *reinterpret_cast(&value_) ? 1 : 0; break; case sizeof(value_): break; default: { std::length_error ex("boolean socket option resize"); asio::detail::throw_exception(ex); } } } private: int value_; }; // Helper template for implementing integer options. template class integer { public: // Default constructor. integer() : value_(0) { } // Construct with a specific option value. explicit integer(int v) : value_(v) { } // Set the value of the int option. integer& operator=(int v) { value_ = v; return *this; } // Get the current value of the int option. int value() const { return value_; } // Get the level of the socket option. template int level(const Protocol&) const { return Level; } // Get the name of the socket option. template int name(const Protocol&) const { return Name; } // Get the address of the int data. template int* data(const Protocol&) { return &value_; } // Get the address of the int data. template const int* data(const Protocol&) const { return &value_; } // Get the size of the int data. template std::size_t size(const Protocol&) const { return sizeof(value_); } // Set the size of the int data. template void resize(const Protocol&, std::size_t s) { if (s != sizeof(value_)) { std::length_error ex("integer socket option resize"); asio::detail::throw_exception(ex); } } private: int value_; }; // Helper template for implementing linger options. template class linger { public: // Default constructor. linger() { value_.l_onoff = 0; value_.l_linger = 0; } // Construct with specific option values. linger(bool e, int t) { enabled(e); timeout ASIO_PREVENT_MACRO_SUBSTITUTION(t); } // Set the value for whether linger is enabled. void enabled(bool value) { value_.l_onoff = value ? 1 : 0; } // Get the value for whether linger is enabled. bool enabled() const { return value_.l_onoff != 0; } // Set the value for the linger timeout. void timeout ASIO_PREVENT_MACRO_SUBSTITUTION(int value) { #if defined(WIN32) value_.l_linger = static_cast(value); #else value_.l_linger = value; #endif } // Get the value for the linger timeout. int timeout ASIO_PREVENT_MACRO_SUBSTITUTION() const { return static_cast(value_.l_linger); } // Get the level of the socket option. template int level(const Protocol&) const { return Level; } // Get the name of the socket option. template int name(const Protocol&) const { return Name; } // Get the address of the linger data. template detail::linger_type* data(const Protocol&) { return &value_; } // Get the address of the linger data. template const detail::linger_type* data(const Protocol&) const { return &value_; } // Get the size of the linger data. template std::size_t size(const Protocol&) const { return sizeof(value_); } // Set the size of the int data. template void resize(const Protocol&, std::size_t s) { if (s != sizeof(value_)) { std::length_error ex("linger socket option resize"); asio::detail::throw_exception(ex); } } private: detail::linger_type value_; }; } // namespace socket_option } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SOCKET_OPTION_HPP asio-1.12.2/include/asio/detail/socket_select_interrupter.hpp000066400000000000000000000046251340672067200243710ustar00rootroot00000000000000// // detail/socket_select_interrupter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP #define ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_WINDOWS_RUNTIME) #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(__SYMBIAN32__) #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class socket_select_interrupter { public: // Constructor. ASIO_DECL socket_select_interrupter(); // Destructor. ASIO_DECL ~socket_select_interrupter(); // Recreate the interrupter's descriptors. Used after a fork. ASIO_DECL void recreate(); // Interrupt the select call. ASIO_DECL void interrupt(); // Reset the select interrupt. Returns true if the call was interrupted. ASIO_DECL bool reset(); // Get the read descriptor to be passed to select. socket_type read_descriptor() const { return read_descriptor_; } private: // Open the descriptors. Throws on error. ASIO_DECL void open_descriptors(); // Close the descriptors. ASIO_DECL void close_descriptors(); // The read end of a connection used to interrupt the select call. This file // descriptor is passed to select such that when it is time to stop, a single // byte will be written on the other end of the connection and this // descriptor will become readable. socket_type read_descriptor_; // The write end of a connection used to interrupt the select call. A single // byte may be written to this to wake up the select which is waiting for the // other end to become readable. socket_type write_descriptor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/socket_select_interrupter.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) // || defined(__CYGWIN__) // || defined(__SYMBIAN32__) #endif // !defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP asio-1.12.2/include/asio/detail/socket_types.hpp000066400000000000000000000350541340672067200216130ustar00rootroot00000000000000// // detail/socket_types.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOCKET_TYPES_HPP #define ASIO_DETAIL_SOCKET_TYPES_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) // Empty. #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) # if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) # error WinSock.h has already been included # endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) # if defined(__BORLANDC__) # include // Needed for __errno # if !defined(_WSPIAPI_H_) # define _WSPIAPI_H_ # define ASIO_WSPIAPI_H_DEFINED # endif // !defined(_WSPIAPI_H_) # endif // defined(__BORLANDC__) # include # include # if defined(WINAPI_FAMILY) # if ((WINAPI_FAMILY & WINAPI_PARTITION_DESKTOP) != 0) # include # endif // ((WINAPI_FAMILY & WINAPI_PARTITION_DESKTOP) != 0) # endif // defined(WINAPI_FAMILY) # if !defined(ASIO_WINDOWS_APP) # include # endif // !defined(ASIO_WINDOWS_APP) # if defined(ASIO_WSPIAPI_H_DEFINED) # undef _WSPIAPI_H_ # undef ASIO_WSPIAPI_H_DEFINED # endif // defined(ASIO_WSPIAPI_H_DEFINED) # if !defined(ASIO_NO_DEFAULT_LINKED_LIBS) # if defined(UNDER_CE) # pragma comment(lib, "ws2.lib") # elif defined(_MSC_VER) || defined(__BORLANDC__) # pragma comment(lib, "ws2_32.lib") # if !defined(ASIO_WINDOWS_APP) # pragma comment(lib, "mswsock.lib") # endif // !defined(ASIO_WINDOWS_APP) # endif // defined(_MSC_VER) || defined(__BORLANDC__) # endif // !defined(ASIO_NO_DEFAULT_LINKED_LIBS) # include "asio/detail/old_win_sdk_compat.hpp" #else # include # if (defined(__MACH__) && defined(__APPLE__)) \ || defined(__FreeBSD__) || defined(__NetBSD__) \ || defined(__OpenBSD__) || defined(__linux__) \ || defined(__EMSCRIPTEN__) # include # elif !defined(__SYMBIAN32__) # include # endif # include # include # include # if defined(__hpux) # include # endif # if !defined(__hpux) || defined(__SELECT) # include # endif # include # include # include # include # if !defined(__SYMBIAN32__) # include # endif # include # include # include # include # if defined(__sun) # include # include # endif #endif #include "asio/detail/push_options.hpp" namespace asio { namespace detail { #if defined(ASIO_WINDOWS_RUNTIME) const int max_addr_v4_str_len = 256; const int max_addr_v6_str_len = 256; typedef unsigned __int32 u_long_type; typedef unsigned __int16 u_short_type; struct in4_addr_type { u_long_type s_addr; }; struct in4_mreq_type { in4_addr_type imr_multiaddr, imr_interface; }; struct in6_addr_type { unsigned char s6_addr[16]; }; struct in6_mreq_type { in6_addr_type ipv6mr_multiaddr; unsigned long ipv6mr_interface; }; struct socket_addr_type { int sa_family; }; struct sockaddr_in4_type { int sin_family; in4_addr_type sin_addr; u_short_type sin_port; }; struct sockaddr_in6_type { int sin6_family; in6_addr_type sin6_addr; u_short_type sin6_port; u_long_type sin6_flowinfo; u_long_type sin6_scope_id; }; struct sockaddr_storage_type { int ss_family; unsigned char ss_bytes[128 - sizeof(int)]; }; struct addrinfo_type { int ai_flags; int ai_family, ai_socktype, ai_protocol; int ai_addrlen; const void* ai_addr; const char* ai_canonname; addrinfo_type* ai_next; }; struct linger_type { u_short_type l_onoff, l_linger; }; typedef u_long_type ioctl_arg_type; typedef int signed_size_type; # define ASIO_OS_DEF(c) ASIO_OS_DEF_##c # define ASIO_OS_DEF_AF_UNSPEC 0 # define ASIO_OS_DEF_AF_INET 2 # define ASIO_OS_DEF_AF_INET6 23 # define ASIO_OS_DEF_SOCK_STREAM 1 # define ASIO_OS_DEF_SOCK_DGRAM 2 # define ASIO_OS_DEF_SOCK_RAW 3 # define ASIO_OS_DEF_SOCK_SEQPACKET 5 # define ASIO_OS_DEF_IPPROTO_IP 0 # define ASIO_OS_DEF_IPPROTO_IPV6 41 # define ASIO_OS_DEF_IPPROTO_TCP 6 # define ASIO_OS_DEF_IPPROTO_UDP 17 # define ASIO_OS_DEF_IPPROTO_ICMP 1 # define ASIO_OS_DEF_IPPROTO_ICMPV6 58 # define ASIO_OS_DEF_FIONBIO 1 # define ASIO_OS_DEF_FIONREAD 2 # define ASIO_OS_DEF_INADDR_ANY 0 # define ASIO_OS_DEF_MSG_OOB 0x1 # define ASIO_OS_DEF_MSG_PEEK 0x2 # define ASIO_OS_DEF_MSG_DONTROUTE 0x4 # define ASIO_OS_DEF_MSG_EOR 0 // Not supported. # define ASIO_OS_DEF_SHUT_RD 0x0 # define ASIO_OS_DEF_SHUT_WR 0x1 # define ASIO_OS_DEF_SHUT_RDWR 0x2 # define ASIO_OS_DEF_SOMAXCONN 0x7fffffff # define ASIO_OS_DEF_SOL_SOCKET 0xffff # define ASIO_OS_DEF_SO_BROADCAST 0x20 # define ASIO_OS_DEF_SO_DEBUG 0x1 # define ASIO_OS_DEF_SO_DONTROUTE 0x10 # define ASIO_OS_DEF_SO_KEEPALIVE 0x8 # define ASIO_OS_DEF_SO_LINGER 0x80 # define ASIO_OS_DEF_SO_OOBINLINE 0x100 # define ASIO_OS_DEF_SO_SNDBUF 0x1001 # define ASIO_OS_DEF_SO_RCVBUF 0x1002 # define ASIO_OS_DEF_SO_SNDLOWAT 0x1003 # define ASIO_OS_DEF_SO_RCVLOWAT 0x1004 # define ASIO_OS_DEF_SO_REUSEADDR 0x4 # define ASIO_OS_DEF_TCP_NODELAY 0x1 # define ASIO_OS_DEF_IP_MULTICAST_IF 2 # define ASIO_OS_DEF_IP_MULTICAST_TTL 3 # define ASIO_OS_DEF_IP_MULTICAST_LOOP 4 # define ASIO_OS_DEF_IP_ADD_MEMBERSHIP 5 # define ASIO_OS_DEF_IP_DROP_MEMBERSHIP 6 # define ASIO_OS_DEF_IP_TTL 7 # define ASIO_OS_DEF_IPV6_UNICAST_HOPS 4 # define ASIO_OS_DEF_IPV6_MULTICAST_IF 9 # define ASIO_OS_DEF_IPV6_MULTICAST_HOPS 10 # define ASIO_OS_DEF_IPV6_MULTICAST_LOOP 11 # define ASIO_OS_DEF_IPV6_JOIN_GROUP 12 # define ASIO_OS_DEF_IPV6_LEAVE_GROUP 13 # define ASIO_OS_DEF_AI_CANONNAME 0x2 # define ASIO_OS_DEF_AI_PASSIVE 0x1 # define ASIO_OS_DEF_AI_NUMERICHOST 0x4 # define ASIO_OS_DEF_AI_NUMERICSERV 0x8 # define ASIO_OS_DEF_AI_V4MAPPED 0x800 # define ASIO_OS_DEF_AI_ALL 0x100 # define ASIO_OS_DEF_AI_ADDRCONFIG 0x400 #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) typedef SOCKET socket_type; const SOCKET invalid_socket = INVALID_SOCKET; const int socket_error_retval = SOCKET_ERROR; const int max_addr_v4_str_len = 256; const int max_addr_v6_str_len = 256; typedef sockaddr socket_addr_type; typedef in_addr in4_addr_type; typedef ip_mreq in4_mreq_type; typedef sockaddr_in sockaddr_in4_type; # if defined(ASIO_HAS_OLD_WIN_SDK) typedef in6_addr_emulation in6_addr_type; typedef ipv6_mreq_emulation in6_mreq_type; typedef sockaddr_in6_emulation sockaddr_in6_type; typedef sockaddr_storage_emulation sockaddr_storage_type; typedef addrinfo_emulation addrinfo_type; # else typedef in6_addr in6_addr_type; typedef ipv6_mreq in6_mreq_type; typedef sockaddr_in6 sockaddr_in6_type; typedef sockaddr_storage sockaddr_storage_type; typedef addrinfo addrinfo_type; # endif typedef ::linger linger_type; typedef unsigned long ioctl_arg_type; typedef u_long u_long_type; typedef u_short u_short_type; typedef int signed_size_type; # define ASIO_OS_DEF(c) ASIO_OS_DEF_##c # define ASIO_OS_DEF_AF_UNSPEC AF_UNSPEC # define ASIO_OS_DEF_AF_INET AF_INET # define ASIO_OS_DEF_AF_INET6 AF_INET6 # define ASIO_OS_DEF_SOCK_STREAM SOCK_STREAM # define ASIO_OS_DEF_SOCK_DGRAM SOCK_DGRAM # define ASIO_OS_DEF_SOCK_RAW SOCK_RAW # define ASIO_OS_DEF_SOCK_SEQPACKET SOCK_SEQPACKET # define ASIO_OS_DEF_IPPROTO_IP IPPROTO_IP # define ASIO_OS_DEF_IPPROTO_IPV6 IPPROTO_IPV6 # define ASIO_OS_DEF_IPPROTO_TCP IPPROTO_TCP # define ASIO_OS_DEF_IPPROTO_UDP IPPROTO_UDP # define ASIO_OS_DEF_IPPROTO_ICMP IPPROTO_ICMP # define ASIO_OS_DEF_IPPROTO_ICMPV6 IPPROTO_ICMPV6 # define ASIO_OS_DEF_FIONBIO FIONBIO # define ASIO_OS_DEF_FIONREAD FIONREAD # define ASIO_OS_DEF_INADDR_ANY INADDR_ANY # define ASIO_OS_DEF_MSG_OOB MSG_OOB # define ASIO_OS_DEF_MSG_PEEK MSG_PEEK # define ASIO_OS_DEF_MSG_DONTROUTE MSG_DONTROUTE # define ASIO_OS_DEF_MSG_EOR 0 // Not supported on Windows. # define ASIO_OS_DEF_SHUT_RD SD_RECEIVE # define ASIO_OS_DEF_SHUT_WR SD_SEND # define ASIO_OS_DEF_SHUT_RDWR SD_BOTH # define ASIO_OS_DEF_SOMAXCONN SOMAXCONN # define ASIO_OS_DEF_SOL_SOCKET SOL_SOCKET # define ASIO_OS_DEF_SO_BROADCAST SO_BROADCAST # define ASIO_OS_DEF_SO_DEBUG SO_DEBUG # define ASIO_OS_DEF_SO_DONTROUTE SO_DONTROUTE # define ASIO_OS_DEF_SO_KEEPALIVE SO_KEEPALIVE # define ASIO_OS_DEF_SO_LINGER SO_LINGER # define ASIO_OS_DEF_SO_OOBINLINE SO_OOBINLINE # define ASIO_OS_DEF_SO_SNDBUF SO_SNDBUF # define ASIO_OS_DEF_SO_RCVBUF SO_RCVBUF # define ASIO_OS_DEF_SO_SNDLOWAT SO_SNDLOWAT # define ASIO_OS_DEF_SO_RCVLOWAT SO_RCVLOWAT # define ASIO_OS_DEF_SO_REUSEADDR SO_REUSEADDR # define ASIO_OS_DEF_TCP_NODELAY TCP_NODELAY # define ASIO_OS_DEF_IP_MULTICAST_IF IP_MULTICAST_IF # define ASIO_OS_DEF_IP_MULTICAST_TTL IP_MULTICAST_TTL # define ASIO_OS_DEF_IP_MULTICAST_LOOP IP_MULTICAST_LOOP # define ASIO_OS_DEF_IP_ADD_MEMBERSHIP IP_ADD_MEMBERSHIP # define ASIO_OS_DEF_IP_DROP_MEMBERSHIP IP_DROP_MEMBERSHIP # define ASIO_OS_DEF_IP_TTL IP_TTL # define ASIO_OS_DEF_IPV6_UNICAST_HOPS IPV6_UNICAST_HOPS # define ASIO_OS_DEF_IPV6_MULTICAST_IF IPV6_MULTICAST_IF # define ASIO_OS_DEF_IPV6_MULTICAST_HOPS IPV6_MULTICAST_HOPS # define ASIO_OS_DEF_IPV6_MULTICAST_LOOP IPV6_MULTICAST_LOOP # define ASIO_OS_DEF_IPV6_JOIN_GROUP IPV6_JOIN_GROUP # define ASIO_OS_DEF_IPV6_LEAVE_GROUP IPV6_LEAVE_GROUP # define ASIO_OS_DEF_AI_CANONNAME AI_CANONNAME # define ASIO_OS_DEF_AI_PASSIVE AI_PASSIVE # define ASIO_OS_DEF_AI_NUMERICHOST AI_NUMERICHOST # if defined(AI_NUMERICSERV) # define ASIO_OS_DEF_AI_NUMERICSERV AI_NUMERICSERV # else # define ASIO_OS_DEF_AI_NUMERICSERV 0 # endif # if defined(AI_V4MAPPED) # define ASIO_OS_DEF_AI_V4MAPPED AI_V4MAPPED # else # define ASIO_OS_DEF_AI_V4MAPPED 0 # endif # if defined(AI_ALL) # define ASIO_OS_DEF_AI_ALL AI_ALL # else # define ASIO_OS_DEF_AI_ALL 0 # endif # if defined(AI_ADDRCONFIG) # define ASIO_OS_DEF_AI_ADDRCONFIG AI_ADDRCONFIG # else # define ASIO_OS_DEF_AI_ADDRCONFIG 0 # endif # if defined (_WIN32_WINNT) const int max_iov_len = 64; # else const int max_iov_len = 16; # endif #else typedef int socket_type; const int invalid_socket = -1; const int socket_error_retval = -1; const int max_addr_v4_str_len = INET_ADDRSTRLEN; #if defined(INET6_ADDRSTRLEN) const int max_addr_v6_str_len = INET6_ADDRSTRLEN + 1 + IF_NAMESIZE; #else // defined(INET6_ADDRSTRLEN) const int max_addr_v6_str_len = 256; #endif // defined(INET6_ADDRSTRLEN) typedef sockaddr socket_addr_type; typedef in_addr in4_addr_type; # if defined(__hpux) // HP-UX doesn't provide ip_mreq when _XOPEN_SOURCE_EXTENDED is defined. struct in4_mreq_type { struct in_addr imr_multiaddr; struct in_addr imr_interface; }; # else typedef ip_mreq in4_mreq_type; # endif typedef sockaddr_in sockaddr_in4_type; typedef in6_addr in6_addr_type; typedef ipv6_mreq in6_mreq_type; typedef sockaddr_in6 sockaddr_in6_type; typedef sockaddr_storage sockaddr_storage_type; typedef sockaddr_un sockaddr_un_type; typedef addrinfo addrinfo_type; typedef ::linger linger_type; typedef int ioctl_arg_type; typedef uint32_t u_long_type; typedef uint16_t u_short_type; #if defined(ASIO_HAS_SSIZE_T) typedef ssize_t signed_size_type; #else // defined(ASIO_HAS_SSIZE_T) typedef int signed_size_type; #endif // defined(ASIO_HAS_SSIZE_T) # define ASIO_OS_DEF(c) ASIO_OS_DEF_##c # define ASIO_OS_DEF_AF_UNSPEC AF_UNSPEC # define ASIO_OS_DEF_AF_INET AF_INET # define ASIO_OS_DEF_AF_INET6 AF_INET6 # define ASIO_OS_DEF_SOCK_STREAM SOCK_STREAM # define ASIO_OS_DEF_SOCK_DGRAM SOCK_DGRAM # define ASIO_OS_DEF_SOCK_RAW SOCK_RAW # define ASIO_OS_DEF_SOCK_SEQPACKET SOCK_SEQPACKET # define ASIO_OS_DEF_IPPROTO_IP IPPROTO_IP # define ASIO_OS_DEF_IPPROTO_IPV6 IPPROTO_IPV6 # define ASIO_OS_DEF_IPPROTO_TCP IPPROTO_TCP # define ASIO_OS_DEF_IPPROTO_UDP IPPROTO_UDP # define ASIO_OS_DEF_IPPROTO_ICMP IPPROTO_ICMP # define ASIO_OS_DEF_IPPROTO_ICMPV6 IPPROTO_ICMPV6 # define ASIO_OS_DEF_FIONBIO FIONBIO # define ASIO_OS_DEF_FIONREAD FIONREAD # define ASIO_OS_DEF_INADDR_ANY INADDR_ANY # define ASIO_OS_DEF_MSG_OOB MSG_OOB # define ASIO_OS_DEF_MSG_PEEK MSG_PEEK # define ASIO_OS_DEF_MSG_DONTROUTE MSG_DONTROUTE # define ASIO_OS_DEF_MSG_EOR MSG_EOR # define ASIO_OS_DEF_SHUT_RD SHUT_RD # define ASIO_OS_DEF_SHUT_WR SHUT_WR # define ASIO_OS_DEF_SHUT_RDWR SHUT_RDWR # define ASIO_OS_DEF_SOMAXCONN SOMAXCONN # define ASIO_OS_DEF_SOL_SOCKET SOL_SOCKET # define ASIO_OS_DEF_SO_BROADCAST SO_BROADCAST # define ASIO_OS_DEF_SO_DEBUG SO_DEBUG # define ASIO_OS_DEF_SO_DONTROUTE SO_DONTROUTE # define ASIO_OS_DEF_SO_KEEPALIVE SO_KEEPALIVE # define ASIO_OS_DEF_SO_LINGER SO_LINGER # define ASIO_OS_DEF_SO_OOBINLINE SO_OOBINLINE # define ASIO_OS_DEF_SO_SNDBUF SO_SNDBUF # define ASIO_OS_DEF_SO_RCVBUF SO_RCVBUF # define ASIO_OS_DEF_SO_SNDLOWAT SO_SNDLOWAT # define ASIO_OS_DEF_SO_RCVLOWAT SO_RCVLOWAT # define ASIO_OS_DEF_SO_REUSEADDR SO_REUSEADDR # define ASIO_OS_DEF_TCP_NODELAY TCP_NODELAY # define ASIO_OS_DEF_IP_MULTICAST_IF IP_MULTICAST_IF # define ASIO_OS_DEF_IP_MULTICAST_TTL IP_MULTICAST_TTL # define ASIO_OS_DEF_IP_MULTICAST_LOOP IP_MULTICAST_LOOP # define ASIO_OS_DEF_IP_ADD_MEMBERSHIP IP_ADD_MEMBERSHIP # define ASIO_OS_DEF_IP_DROP_MEMBERSHIP IP_DROP_MEMBERSHIP # define ASIO_OS_DEF_IP_TTL IP_TTL # define ASIO_OS_DEF_IPV6_UNICAST_HOPS IPV6_UNICAST_HOPS # define ASIO_OS_DEF_IPV6_MULTICAST_IF IPV6_MULTICAST_IF # define ASIO_OS_DEF_IPV6_MULTICAST_HOPS IPV6_MULTICAST_HOPS # define ASIO_OS_DEF_IPV6_MULTICAST_LOOP IPV6_MULTICAST_LOOP # define ASIO_OS_DEF_IPV6_JOIN_GROUP IPV6_JOIN_GROUP # define ASIO_OS_DEF_IPV6_LEAVE_GROUP IPV6_LEAVE_GROUP # define ASIO_OS_DEF_AI_CANONNAME AI_CANONNAME # define ASIO_OS_DEF_AI_PASSIVE AI_PASSIVE # define ASIO_OS_DEF_AI_NUMERICHOST AI_NUMERICHOST # if defined(AI_NUMERICSERV) # define ASIO_OS_DEF_AI_NUMERICSERV AI_NUMERICSERV # else # define ASIO_OS_DEF_AI_NUMERICSERV 0 # endif // Note: QNX Neutrino 6.3 defines AI_V4MAPPED, AI_ALL and AI_ADDRCONFIG but // does not implement them. Therefore they are specifically excluded here. # if defined(AI_V4MAPPED) && !defined(__QNXNTO__) # define ASIO_OS_DEF_AI_V4MAPPED AI_V4MAPPED # else # define ASIO_OS_DEF_AI_V4MAPPED 0 # endif # if defined(AI_ALL) && !defined(__QNXNTO__) # define ASIO_OS_DEF_AI_ALL AI_ALL # else # define ASIO_OS_DEF_AI_ALL 0 # endif # if defined(AI_ADDRCONFIG) && !defined(__QNXNTO__) # define ASIO_OS_DEF_AI_ADDRCONFIG AI_ADDRCONFIG # else # define ASIO_OS_DEF_AI_ADDRCONFIG 0 # endif # if defined(IOV_MAX) const int max_iov_len = IOV_MAX; # else // POSIX platforms are not required to define IOV_MAX. const int max_iov_len = 16; # endif #endif const int custom_socket_option_level = 0xA5100000; const int enable_connection_aborted_option = 1; const int always_fail_option = 2; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_SOCKET_TYPES_HPP asio-1.12.2/include/asio/detail/solaris_fenced_block.hpp000066400000000000000000000023511340672067200232230ustar00rootroot00000000000000// // detail/solaris_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_SOLARIS_FENCED_BLOCK_HPP #define ASIO_DETAIL_SOLARIS_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(__sun) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class solaris_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit solaris_fenced_block(half_t) { } // Constructor for a full fenced block. explicit solaris_fenced_block(full_t) { membar_consumer(); } // Destructor. ~solaris_fenced_block() { membar_producer(); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(__sun) #endif // ASIO_DETAIL_SOLARIS_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/static_mutex.hpp000066400000000000000000000030321340672067200215770ustar00rootroot00000000000000// // detail/static_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STATIC_MUTEX_HPP #define ASIO_DETAIL_STATIC_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) # include "asio/detail/null_static_mutex.hpp" #elif defined(ASIO_WINDOWS) # include "asio/detail/win_static_mutex.hpp" #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_static_mutex.hpp" #elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) # include "asio/detail/std_static_mutex.hpp" #else # error Only Windows and POSIX are supported! #endif namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) typedef null_static_mutex static_mutex; # define ASIO_STATIC_MUTEX_INIT ASIO_NULL_STATIC_MUTEX_INIT #elif defined(ASIO_WINDOWS) typedef win_static_mutex static_mutex; # define ASIO_STATIC_MUTEX_INIT ASIO_WIN_STATIC_MUTEX_INIT #elif defined(ASIO_HAS_PTHREADS) typedef posix_static_mutex static_mutex; # define ASIO_STATIC_MUTEX_INIT ASIO_POSIX_STATIC_MUTEX_INIT #elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) typedef std_static_mutex static_mutex; # define ASIO_STATIC_MUTEX_INIT ASIO_STD_STATIC_MUTEX_INIT #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_STATIC_MUTEX_HPP asio-1.12.2/include/asio/detail/std_event.hpp000066400000000000000000000070111340672067200210620ustar00rootroot00000000000000// // detail/std_event.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STD_EVENT_HPP #define ASIO_DETAIL_STD_EVENT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) #include #include #include "asio/detail/assert.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class std_event : private noncopyable { public: // Constructor. std_event() : state_(0) { } // Destructor. ~std_event() { } // Signal the event. (Retained for backward compatibility.) template void signal(Lock& lock) { this->signal_all(lock); } // Signal all waiters. template void signal_all(Lock& lock) { ASIO_ASSERT(lock.locked()); (void)lock; state_ |= 1; cond_.notify_all(); } // Unlock the mutex and signal one waiter. template void unlock_and_signal_one(Lock& lock) { ASIO_ASSERT(lock.locked()); state_ |= 1; bool have_waiters = (state_ > 1); lock.unlock(); if (have_waiters) cond_.notify_one(); } // If there's a waiter, unlock the mutex and signal it. template bool maybe_unlock_and_signal_one(Lock& lock) { ASIO_ASSERT(lock.locked()); state_ |= 1; if (state_ > 1) { lock.unlock(); cond_.notify_one(); return true; } return false; } // Reset the event. template void clear(Lock& lock) { ASIO_ASSERT(lock.locked()); (void)lock; state_ &= ~std::size_t(1); } // Wait for the event to become signalled. template void wait(Lock& lock) { ASIO_ASSERT(lock.locked()); unique_lock_adapter u_lock(lock); while ((state_ & 1) == 0) { waiter w(state_); cond_.wait(u_lock.unique_lock_); } } // Timed wait for the event to become signalled. template bool wait_for_usec(Lock& lock, long usec) { ASIO_ASSERT(lock.locked()); unique_lock_adapter u_lock(lock); if ((state_ & 1) == 0) { waiter w(state_); cond_.wait_for(u_lock.unique_lock_, std::chrono::microseconds(usec)); } return (state_ & 1) != 0; } private: // Helper class to temporarily adapt a scoped_lock into a unique_lock so that // it can be passed to std::condition_variable::wait(). struct unique_lock_adapter { template explicit unique_lock_adapter(Lock& lock) : unique_lock_(lock.mutex().mutex_, std::adopt_lock) { } ~unique_lock_adapter() { unique_lock_.release(); } std::unique_lock unique_lock_; }; // Helper to increment and decrement the state to track outstanding waiters. class waiter { public: explicit waiter(std::size_t& state) : state_(state) { state_ += 2; } ~waiter() { state_ -= 2; } private: std::size_t& state_; }; std::condition_variable cond_; std::size_t state_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) #endif // ASIO_DETAIL_STD_EVENT_HPP asio-1.12.2/include/asio/detail/std_fenced_block.hpp000066400000000000000000000024431340672067200223430ustar00rootroot00000000000000// // detail/std_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STD_FENCED_BLOCK_HPP #define ASIO_DETAIL_STD_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_ATOMIC) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class std_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit std_fenced_block(half_t) { } // Constructor for a full fenced block. explicit std_fenced_block(full_t) { std::atomic_thread_fence(std::memory_order_acquire); } // Destructor. ~std_fenced_block() { std::atomic_thread_fence(std::memory_order_release); } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_ATOMIC) #endif // ASIO_DETAIL_STD_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/std_global.hpp000066400000000000000000000027111340672067200212030ustar00rootroot00000000000000// // detail/std_global.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STD_GLOBAL_HPP #define ASIO_DETAIL_STD_GLOBAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_CALL_ONCE) #include #include #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct std_global_impl { // Helper function to perform initialisation. static void do_init() { instance_.ptr_ = new T; } // Destructor automatically cleans up the global. ~std_global_impl() { delete ptr_; } static std::once_flag init_once_; static std_global_impl instance_; T* ptr_; }; template std::once_flag std_global_impl::init_once_; template std_global_impl std_global_impl::instance_; template T& std_global() { std::call_once(std_global_impl::init_once_, &std_global_impl::do_init); return *std_global_impl::instance_.ptr_; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_CALL_ONCE) #endif // ASIO_DETAIL_STD_GLOBAL_HPP asio-1.12.2/include/asio/detail/std_mutex.hpp000066400000000000000000000024221340672067200211040ustar00rootroot00000000000000// // detail/std_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STD_MUTEX_HPP #define ASIO_DETAIL_STD_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class std_event; class std_mutex : private noncopyable { public: typedef asio::detail::scoped_lock scoped_lock; // Constructor. std_mutex() { } // Destructor. ~std_mutex() { } // Lock the mutex. void lock() { mutex_.lock(); } // Unlock the mutex. void unlock() { mutex_.unlock(); } private: friend class std_event; std::mutex mutex_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) #endif // ASIO_DETAIL_STD_MUTEX_HPP asio-1.12.2/include/asio/detail/std_static_mutex.hpp000066400000000000000000000027021340672067200224540ustar00rootroot00000000000000// // detail/std_static_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STD_STATIC_MUTEX_HPP #define ASIO_DETAIL_STD_STATIC_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class std_event; class std_static_mutex : private noncopyable { public: typedef asio::detail::scoped_lock scoped_lock; // Constructor. std_static_mutex(int) { } // Destructor. ~std_static_mutex() { } // Initialise the mutex. void init() { // Nothing to do. } // Lock the mutex. void lock() { mutex_.lock(); } // Unlock the mutex. void unlock() { mutex_.unlock(); } private: friend class std_event; std::mutex mutex_; }; #define ASIO_STD_STATIC_MUTEX_INIT 0 } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) #endif // ASIO_DETAIL_STD_STATIC_MUTEX_HPP asio-1.12.2/include/asio/detail/std_thread.hpp000066400000000000000000000024641340672067200212170ustar00rootroot00000000000000// // detail/std_thread.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STD_THREAD_HPP #define ASIO_DETAIL_STD_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_THREAD) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class std_thread : private noncopyable { public: // Constructor. template std_thread(Function f, unsigned int = 0) : thread_(f) { } // Destructor. ~std_thread() { join(); } // Wait for the thread to exit. void join() { if (thread_.joinable()) thread_.join(); } // Get number of CPUs. static std::size_t hardware_concurrency() { return std::thread::hardware_concurrency(); } private: std::thread thread_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_THREAD) #endif // ASIO_DETAIL_STD_THREAD_HPP asio-1.12.2/include/asio/detail/strand_executor_service.hpp000066400000000000000000000113161340672067200240230ustar00rootroot00000000000000// // detail/strand_executor_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STRAND_EXECUTOR_SERVICE_HPP #define ASIO_DETAIL_STRAND_EXECUTOR_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/atomic_count.hpp" #include "asio/detail/executor_op.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/scheduler_operation.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Default service implementation for a strand. class strand_executor_service : public execution_context_service_base { public: // The underlying implementation of a strand. class strand_impl { public: ASIO_DECL ~strand_impl(); private: friend class strand_executor_service; // Mutex to protect access to internal data. mutex* mutex_; // Indicates whether the strand is currently "locked" by a handler. This // means that there is a handler upcall in progress, or that the strand // itself has been scheduled in order to invoke some pending handlers. bool locked_; // Indicates that the strand has been shut down and will accept no further // handlers. bool shutdown_; // The handlers that are waiting on the strand but should not be run until // after the next time the strand is scheduled. This queue must only be // modified while the mutex is locked. op_queue waiting_queue_; // The handlers that are ready to be run. Logically speaking, these are the // handlers that hold the strand's lock. The ready queue is only modified // from within the strand and so may be accessed without locking the mutex. op_queue ready_queue_; // Pointers to adjacent handle implementations in linked list. strand_impl* next_; strand_impl* prev_; // The strand service in where the implementation is held. strand_executor_service* service_; }; typedef shared_ptr implementation_type; // Construct a new strand service for the specified context. ASIO_DECL explicit strand_executor_service(execution_context& context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Create a new strand_executor implementation. ASIO_DECL implementation_type create_implementation(); // Request invocation of the given function. template static void dispatch(const implementation_type& impl, Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a); // Request invocation of the given function and return immediately. template static void post(const implementation_type& impl, Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a); // Request invocation of the given function and return immediately. template static void defer(const implementation_type& impl, Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a); // Determine whether the strand is running in the current thread. ASIO_DECL static bool running_in_this_thread( const implementation_type& impl); private: friend class strand_impl; template class invoker; // Adds a function to the strand. Returns true if it acquires the lock. ASIO_DECL static bool enqueue(const implementation_type& impl, scheduler_operation* op); // Mutex to protect access to the service-wide state. mutex mutex_; // Number of mutexes shared between all strand objects. enum { num_mutexes = 193 }; // Pool of mutexes. scoped_ptr mutexes_[num_mutexes]; // Extra value used when hashing to prevent recycled memory locations from // getting the same mutex. std::size_t salt_; // The head of a linked list of all implementations. strand_impl* impl_list_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/strand_executor_service.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/strand_executor_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_STRAND_EXECUTOR_SERVICE_HPP asio-1.12.2/include/asio/detail/strand_service.hpp000066400000000000000000000107431340672067200221100ustar00rootroot00000000000000// // detail/strand_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STRAND_SERVICE_HPP #define ASIO_DETAIL_STRAND_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/io_context.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Default service implementation for a strand. class strand_service : public asio::detail::service_base { private: // Helper class to re-post the strand on exit. struct on_do_complete_exit; // Helper class to re-post the strand on exit. struct on_dispatch_exit; public: // The underlying implementation of a strand. class strand_impl : public operation { public: strand_impl(); private: // Only this service will have access to the internal values. friend class strand_service; friend struct on_do_complete_exit; friend struct on_dispatch_exit; // Mutex to protect access to internal data. asio::detail::mutex mutex_; // Indicates whether the strand is currently "locked" by a handler. This // means that there is a handler upcall in progress, or that the strand // itself has been scheduled in order to invoke some pending handlers. bool locked_; // The handlers that are waiting on the strand but should not be run until // after the next time the strand is scheduled. This queue must only be // modified while the mutex is locked. op_queue waiting_queue_; // The handlers that are ready to be run. Logically speaking, these are the // handlers that hold the strand's lock. The ready queue is only modified // from within the strand and so may be accessed without locking the mutex. op_queue ready_queue_; }; typedef strand_impl* implementation_type; // Construct a new strand service for the specified io_context. ASIO_DECL explicit strand_service(asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Construct a new strand implementation. ASIO_DECL void construct(implementation_type& impl); // Request the io_context to invoke the given handler. template void dispatch(implementation_type& impl, Handler& handler); // Request the io_context to invoke the given handler and return immediately. template void post(implementation_type& impl, Handler& handler); // Determine whether the strand is running in the current thread. ASIO_DECL bool running_in_this_thread( const implementation_type& impl) const; private: // Helper function to dispatch a handler. Returns true if the handler should // be dispatched immediately. ASIO_DECL bool do_dispatch(implementation_type& impl, operation* op); // Helper fiunction to post a handler. ASIO_DECL void do_post(implementation_type& impl, operation* op, bool is_continuation); ASIO_DECL static void do_complete(void* owner, operation* base, const asio::error_code& ec, std::size_t bytes_transferred); // The io_context implementation used to post completions. io_context_impl& io_context_; // Mutex to protect access to the array of implementations. asio::detail::mutex mutex_; // Number of implementations shared between all strand objects. #if defined(ASIO_STRAND_IMPLEMENTATIONS) enum { num_implementations = ASIO_STRAND_IMPLEMENTATIONS }; #else // defined(ASIO_STRAND_IMPLEMENTATIONS) enum { num_implementations = 193 }; #endif // defined(ASIO_STRAND_IMPLEMENTATIONS) // Pool of implementations. scoped_ptr implementations_[num_implementations]; // Extra value used when hashing to prevent recycled memory locations from // getting the same strand implementation. std::size_t salt_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/strand_service.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/strand_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_STRAND_SERVICE_HPP asio-1.12.2/include/asio/detail/string_view.hpp000066400000000000000000000026221340672067200214320ustar00rootroot00000000000000// // detail/string_view.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_STRING_VIEW_HPP #define ASIO_DETAIL_STRING_VIEW_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STRING_VIEW) #if defined(ASIO_HAS_STD_STRING_VIEW) # include #elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) # include #else // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) # error ASIO_HAS_STRING_VIEW is set but no string_view is available #endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) namespace asio { #if defined(ASIO_HAS_STD_STRING_VIEW) using std::basic_string_view; using std::string_view; #elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) using std::experimental::basic_string_view; using std::experimental::string_view; #endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) } // namespace asio # define ASIO_STRING_VIEW_PARAM asio::string_view #else // defined(ASIO_HAS_STRING_VIEW) # define ASIO_STRING_VIEW_PARAM const std::string& #endif // defined(ASIO_HAS_STRING_VIEW) #endif // ASIO_DETAIL_STRING_VIEW_HPP asio-1.12.2/include/asio/detail/thread.hpp000066400000000000000000000027331340672067200203440ustar00rootroot00000000000000// // detail/thread.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_THREAD_HPP #define ASIO_DETAIL_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) # include "asio/detail/null_thread.hpp" #elif defined(ASIO_WINDOWS) # if defined(UNDER_CE) # include "asio/detail/wince_thread.hpp" # elif defined(ASIO_WINDOWS_APP) # include "asio/detail/winapp_thread.hpp" # else # include "asio/detail/win_thread.hpp" # endif #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_thread.hpp" #elif defined(ASIO_HAS_STD_THREAD) # include "asio/detail/std_thread.hpp" #else # error Only Windows, POSIX and std::thread are supported! #endif namespace asio { namespace detail { #if !defined(ASIO_HAS_THREADS) typedef null_thread thread; #elif defined(ASIO_WINDOWS) # if defined(UNDER_CE) typedef wince_thread thread; # elif defined(ASIO_WINDOWS_APP) typedef winapp_thread thread; # else typedef win_thread thread; # endif #elif defined(ASIO_HAS_PTHREADS) typedef posix_thread thread; #elif defined(ASIO_HAS_STD_THREAD) typedef std_thread thread; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_THREAD_HPP asio-1.12.2/include/asio/detail/thread_context.hpp000066400000000000000000000020441340672067200221030ustar00rootroot00000000000000// // detail/thread_context.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_THREAD_CONTEXT_HPP #define ASIO_DETAIL_THREAD_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include "asio/detail/call_stack.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class thread_info_base; // Base class for things that manage threads (scheduler, win_iocp_io_context). class thread_context { public: // Per-thread call stack to track the state of each thread in the context. typedef call_stack thread_call_stack; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_THREAD_CONTEXT_HPP asio-1.12.2/include/asio/detail/thread_group.hpp000066400000000000000000000034331340672067200215560ustar00rootroot00000000000000// // detail/thread_group.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_THREAD_GROUP_HPP #define ASIO_DETAIL_THREAD_GROUP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/thread.hpp" namespace asio { namespace detail { class thread_group { public: // Constructor initialises an empty thread group. thread_group() : first_(0) { } // Destructor joins any remaining threads in the group. ~thread_group() { join(); } // Create a new thread in the group. template void create_thread(Function f) { first_ = new item(f, first_); } // Create new threads in the group. template void create_threads(Function f, std::size_t num_threads) { for (std::size_t i = 0; i < num_threads; ++i) create_thread(f); } // Wait for all threads in the group to exit. void join() { while (first_) { first_->thread_.join(); item* tmp = first_; first_ = first_->next_; delete tmp; } } private: // Structure used to track a single thread in the group. struct item { template explicit item(Function f, item* next) : thread_(f), next_(next) { } asio::detail::thread thread_; item* next_; }; // The first thread in the group. item* first_; }; } // namespace detail } // namespace asio #endif // ASIO_DETAIL_THREAD_GROUP_HPP asio-1.12.2/include/asio/detail/thread_info_base.hpp000066400000000000000000000057141340672067200223530ustar00rootroot00000000000000// // detail/thread_info_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_THREAD_INFO_BASE_HPP #define ASIO_DETAIL_THREAD_INFO_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class thread_info_base : private noncopyable { public: struct default_tag { enum { mem_index = 0 }; }; struct awaitee_tag { enum { mem_index = 1 }; }; thread_info_base() { for (int i = 0; i < max_mem_index; ++i) reusable_memory_[i] = 0; } ~thread_info_base() { for (int i = 0; i < max_mem_index; ++i) if (reusable_memory_[i]) ::operator delete(reusable_memory_[i]); } static void* allocate(thread_info_base* this_thread, std::size_t size) { return allocate(default_tag(), this_thread, size); } static void deallocate(thread_info_base* this_thread, void* pointer, std::size_t size) { deallocate(default_tag(), this_thread, pointer, size); } template static void* allocate(Purpose, thread_info_base* this_thread, std::size_t size) { std::size_t chunks = (size + chunk_size - 1) / chunk_size; if (this_thread && this_thread->reusable_memory_[Purpose::mem_index]) { void* const pointer = this_thread->reusable_memory_[Purpose::mem_index]; this_thread->reusable_memory_[Purpose::mem_index] = 0; unsigned char* const mem = static_cast(pointer); if (static_cast(mem[0]) >= chunks) { mem[size] = mem[0]; return pointer; } ::operator delete(pointer); } void* const pointer = ::operator new(chunks * chunk_size + 1); unsigned char* const mem = static_cast(pointer); mem[size] = (chunks <= UCHAR_MAX) ? static_cast(chunks) : 0; return pointer; } template static void deallocate(Purpose, thread_info_base* this_thread, void* pointer, std::size_t size) { if (size <= chunk_size * UCHAR_MAX) { if (this_thread && this_thread->reusable_memory_[Purpose::mem_index] == 0) { unsigned char* const mem = static_cast(pointer); mem[0] = mem[size]; this_thread->reusable_memory_[Purpose::mem_index] = pointer; return; } } ::operator delete(pointer); } private: enum { chunk_size = 4 }; enum { max_mem_index = 2 }; void* reusable_memory_[max_mem_index]; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_THREAD_INFO_BASE_HPP asio-1.12.2/include/asio/detail/throw_error.hpp000066400000000000000000000023141340672067200214440ustar00rootroot00000000000000// // detail/throw_error.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_THROW_ERROR_HPP #define ASIO_DETAIL_THROW_ERROR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error_code.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { ASIO_DECL void do_throw_error(const asio::error_code& err); ASIO_DECL void do_throw_error(const asio::error_code& err, const char* location); inline void throw_error(const asio::error_code& err) { if (err) do_throw_error(err); } inline void throw_error(const asio::error_code& err, const char* location) { if (err) do_throw_error(err, location); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/throw_error.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_THROW_ERROR_HPP asio-1.12.2/include/asio/detail/throw_exception.hpp000066400000000000000000000025771340672067200223240ustar00rootroot00000000000000// // detail/throw_exception.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_THROW_EXCEPTION_HPP #define ASIO_DETAIL_THROW_EXCEPTION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_THROW_EXCEPTION) # include #endif // defined(ASIO_BOOST_THROW_EXCEPTION) namespace asio { namespace detail { #if defined(ASIO_HAS_BOOST_THROW_EXCEPTION) using boost::throw_exception; #else // defined(ASIO_HAS_BOOST_THROW_EXCEPTION) // Declare the throw_exception function for all targets. template void throw_exception(const Exception& e); // Only define the throw_exception function when exceptions are enabled. // Otherwise, it is up to the application to provide a definition of this // function. # if !defined(ASIO_NO_EXCEPTIONS) template void throw_exception(const Exception& e) { throw e; } # endif // !defined(ASIO_NO_EXCEPTIONS) #endif // defined(ASIO_HAS_BOOST_THROW_EXCEPTION) } // namespace detail } // namespace asio #endif // ASIO_DETAIL_THROW_EXCEPTION_HPP asio-1.12.2/include/asio/detail/timer_queue.hpp000066400000000000000000000230251340672067200214160ustar00rootroot00000000000000// // detail/timer_queue.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TIMER_QUEUE_HPP #define ASIO_DETAIL_TIMER_QUEUE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/detail/cstdint.hpp" #include "asio/detail/date_time_fwd.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/wait_op.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class timer_queue : public timer_queue_base { public: // The time type. typedef typename Time_Traits::time_type time_type; // The duration type. typedef typename Time_Traits::duration_type duration_type; // Per-timer data. class per_timer_data { public: per_timer_data() : heap_index_((std::numeric_limits::max)()), next_(0), prev_(0) { } private: friend class timer_queue; // The operations waiting on the timer. op_queue op_queue_; // The index of the timer in the heap. std::size_t heap_index_; // Pointers to adjacent timers in a linked list. per_timer_data* next_; per_timer_data* prev_; }; // Constructor. timer_queue() : timers_(), heap_() { } // Add a new timer to the queue. Returns true if this is the timer that is // earliest in the queue, in which case the reactor's event demultiplexing // function call may need to be interrupted and restarted. bool enqueue_timer(const time_type& time, per_timer_data& timer, wait_op* op) { // Enqueue the timer object. if (timer.prev_ == 0 && &timer != timers_) { if (this->is_positive_infinity(time)) { // No heap entry is required for timers that never expire. timer.heap_index_ = (std::numeric_limits::max)(); } else { // Put the new timer at the correct position in the heap. This is done // first since push_back() can throw due to allocation failure. timer.heap_index_ = heap_.size(); heap_entry entry = { time, &timer }; heap_.push_back(entry); up_heap(heap_.size() - 1); } // Insert the new timer into the linked list of active timers. timer.next_ = timers_; timer.prev_ = 0; if (timers_) timers_->prev_ = &timer; timers_ = &timer; } // Enqueue the individual timer operation. timer.op_queue_.push(op); // Interrupt reactor only if newly added timer is first to expire. return timer.heap_index_ == 0 && timer.op_queue_.front() == op; } // Whether there are no timers in the queue. virtual bool empty() const { return timers_ == 0; } // Get the time for the timer that is earliest in the queue. virtual long wait_duration_msec(long max_duration) const { if (heap_.empty()) return max_duration; return this->to_msec( Time_Traits::to_posix_duration( Time_Traits::subtract(heap_[0].time_, Time_Traits::now())), max_duration); } // Get the time for the timer that is earliest in the queue. virtual long wait_duration_usec(long max_duration) const { if (heap_.empty()) return max_duration; return this->to_usec( Time_Traits::to_posix_duration( Time_Traits::subtract(heap_[0].time_, Time_Traits::now())), max_duration); } // Dequeue all timers not later than the current time. virtual void get_ready_timers(op_queue& ops) { if (!heap_.empty()) { const time_type now = Time_Traits::now(); while (!heap_.empty() && !Time_Traits::less_than(now, heap_[0].time_)) { per_timer_data* timer = heap_[0].timer_; ops.push(timer->op_queue_); remove_timer(*timer); } } } // Dequeue all timers. virtual void get_all_timers(op_queue& ops) { while (timers_) { per_timer_data* timer = timers_; timers_ = timers_->next_; ops.push(timer->op_queue_); timer->next_ = 0; timer->prev_ = 0; } heap_.clear(); } // Cancel and dequeue operations for the given timer. std::size_t cancel_timer(per_timer_data& timer, op_queue& ops, std::size_t max_cancelled = (std::numeric_limits::max)()) { std::size_t num_cancelled = 0; if (timer.prev_ != 0 || &timer == timers_) { while (wait_op* op = (num_cancelled != max_cancelled) ? timer.op_queue_.front() : 0) { op->ec_ = asio::error::operation_aborted; timer.op_queue_.pop(); ops.push(op); ++num_cancelled; } if (timer.op_queue_.empty()) remove_timer(timer); } return num_cancelled; } // Move operations from one timer to another, empty timer. void move_timer(per_timer_data& target, per_timer_data& source) { target.op_queue_.push(source.op_queue_); target.heap_index_ = source.heap_index_; source.heap_index_ = (std::numeric_limits::max)(); if (target.heap_index_ < heap_.size()) heap_[target.heap_index_].timer_ = ⌖ if (timers_ == &source) timers_ = ⌖ if (source.prev_) source.prev_->next_ = ⌖ if (source.next_) source.next_->prev_= ⌖ target.next_ = source.next_; target.prev_ = source.prev_; source.next_ = 0; source.prev_ = 0; } private: // Move the item at the given index up the heap to its correct position. void up_heap(std::size_t index) { while (index > 0) { std::size_t parent = (index - 1) / 2; if (!Time_Traits::less_than(heap_[index].time_, heap_[parent].time_)) break; swap_heap(index, parent); index = parent; } } // Move the item at the given index down the heap to its correct position. void down_heap(std::size_t index) { std::size_t child = index * 2 + 1; while (child < heap_.size()) { std::size_t min_child = (child + 1 == heap_.size() || Time_Traits::less_than( heap_[child].time_, heap_[child + 1].time_)) ? child : child + 1; if (Time_Traits::less_than(heap_[index].time_, heap_[min_child].time_)) break; swap_heap(index, min_child); index = min_child; child = index * 2 + 1; } } // Swap two entries in the heap. void swap_heap(std::size_t index1, std::size_t index2) { heap_entry tmp = heap_[index1]; heap_[index1] = heap_[index2]; heap_[index2] = tmp; heap_[index1].timer_->heap_index_ = index1; heap_[index2].timer_->heap_index_ = index2; } // Remove a timer from the heap and list of timers. void remove_timer(per_timer_data& timer) { // Remove the timer from the heap. std::size_t index = timer.heap_index_; if (!heap_.empty() && index < heap_.size()) { if (index == heap_.size() - 1) { timer.heap_index_ = (std::numeric_limits::max)(); heap_.pop_back(); } else { swap_heap(index, heap_.size() - 1); timer.heap_index_ = (std::numeric_limits::max)(); heap_.pop_back(); if (index > 0 && Time_Traits::less_than( heap_[index].time_, heap_[(index - 1) / 2].time_)) up_heap(index); else down_heap(index); } } // Remove the timer from the linked list of active timers. if (timers_ == &timer) timers_ = timer.next_; if (timer.prev_) timer.prev_->next_ = timer.next_; if (timer.next_) timer.next_->prev_= timer.prev_; timer.next_ = 0; timer.prev_ = 0; } // Determine if the specified absolute time is positive infinity. template static bool is_positive_infinity(const Time_Type&) { return false; } // Determine if the specified absolute time is positive infinity. template static bool is_positive_infinity( const boost::date_time::base_time& time) { return time.is_pos_infinity(); } // Helper function to convert a duration into milliseconds. template long to_msec(const Duration& d, long max_duration) const { if (d.ticks() <= 0) return 0; int64_t msec = d.total_milliseconds(); if (msec == 0) return 1; if (msec > max_duration) return max_duration; return static_cast(msec); } // Helper function to convert a duration into microseconds. template long to_usec(const Duration& d, long max_duration) const { if (d.ticks() <= 0) return 0; int64_t usec = d.total_microseconds(); if (usec == 0) return 1; if (usec > max_duration) return max_duration; return static_cast(usec); } // The head of a linked list of all active timers. per_timer_data* timers_; struct heap_entry { // The time when the timer should fire. time_type time_; // The associated timer with enqueued operations. per_timer_data* timer_; }; // The heap of timers, with the earliest timer at the front. std::vector heap_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_TIMER_QUEUE_HPP asio-1.12.2/include/asio/detail/timer_queue_base.hpp000066400000000000000000000031751340672067200224140ustar00rootroot00000000000000// // detail/timer_queue_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TIMER_QUEUE_BASE_HPP #define ASIO_DETAIL_TIMER_QUEUE_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class timer_queue_base : private noncopyable { public: // Constructor. timer_queue_base() : next_(0) {} // Destructor. virtual ~timer_queue_base() {} // Whether there are no timers in the queue. virtual bool empty() const = 0; // Get the time to wait until the next timer. virtual long wait_duration_msec(long max_duration) const = 0; // Get the time to wait until the next timer. virtual long wait_duration_usec(long max_duration) const = 0; // Dequeue all ready timers. virtual void get_ready_timers(op_queue& ops) = 0; // Dequeue all timers. virtual void get_all_timers(op_queue& ops) = 0; private: friend class timer_queue_set; // Next timer queue in the set. timer_queue_base* next_; }; template class timer_queue; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_TIMER_QUEUE_BASE_HPP asio-1.12.2/include/asio/detail/timer_queue_ptime.hpp000066400000000000000000000056131340672067200226170ustar00rootroot00000000000000// // detail/timer_queue_ptime.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TIMER_QUEUE_PTIME_HPP #define ASIO_DETAIL_TIMER_QUEUE_PTIME_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_DATE_TIME) #include "asio/time_traits.hpp" #include "asio/detail/timer_queue.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct forwarding_posix_time_traits : time_traits {}; // Template specialisation for the commonly used instantation. template <> class timer_queue > : public timer_queue_base { public: // The time type. typedef boost::posix_time::ptime time_type; // The duration type. typedef boost::posix_time::time_duration duration_type; // Per-timer data. typedef timer_queue::per_timer_data per_timer_data; // Constructor. ASIO_DECL timer_queue(); // Destructor. ASIO_DECL virtual ~timer_queue(); // Add a new timer to the queue. Returns true if this is the timer that is // earliest in the queue, in which case the reactor's event demultiplexing // function call may need to be interrupted and restarted. ASIO_DECL bool enqueue_timer(const time_type& time, per_timer_data& timer, wait_op* op); // Whether there are no timers in the queue. ASIO_DECL virtual bool empty() const; // Get the time for the timer that is earliest in the queue. ASIO_DECL virtual long wait_duration_msec(long max_duration) const; // Get the time for the timer that is earliest in the queue. ASIO_DECL virtual long wait_duration_usec(long max_duration) const; // Dequeue all timers not later than the current time. ASIO_DECL virtual void get_ready_timers(op_queue& ops); // Dequeue all timers. ASIO_DECL virtual void get_all_timers(op_queue& ops); // Cancel and dequeue operations for the given timer. ASIO_DECL std::size_t cancel_timer( per_timer_data& timer, op_queue& ops, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move operations from one timer to another, empty timer. ASIO_DECL void move_timer(per_timer_data& target, per_timer_data& source); private: timer_queue impl_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/timer_queue_ptime.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #endif // ASIO_DETAIL_TIMER_QUEUE_PTIME_HPP asio-1.12.2/include/asio/detail/timer_queue_set.hpp000066400000000000000000000031721340672067200222720ustar00rootroot00000000000000// // detail/timer_queue_set.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TIMER_QUEUE_SET_HPP #define ASIO_DETAIL_TIMER_QUEUE_SET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class timer_queue_set { public: // Constructor. ASIO_DECL timer_queue_set(); // Add a timer queue to the set. ASIO_DECL void insert(timer_queue_base* q); // Remove a timer queue from the set. ASIO_DECL void erase(timer_queue_base* q); // Determine whether all queues are empty. ASIO_DECL bool all_empty() const; // Get the wait duration in milliseconds. ASIO_DECL long wait_duration_msec(long max_duration) const; // Get the wait duration in microseconds. ASIO_DECL long wait_duration_usec(long max_duration) const; // Dequeue all ready timers. ASIO_DECL void get_ready_timers(op_queue& ops); // Dequeue all timers. ASIO_DECL void get_all_timers(op_queue& ops); private: timer_queue_base* first_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/timer_queue_set.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_DETAIL_TIMER_QUEUE_SET_HPP asio-1.12.2/include/asio/detail/timer_scheduler.hpp000066400000000000000000000020451340672067200222470ustar00rootroot00000000000000// // detail/timer_scheduler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TIMER_SCHEDULER_HPP #define ASIO_DETAIL_TIMER_SCHEDULER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/timer_scheduler_fwd.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_timer_scheduler.hpp" #elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_io_context.hpp" #elif defined(ASIO_HAS_EPOLL) # include "asio/detail/epoll_reactor.hpp" #elif defined(ASIO_HAS_KQUEUE) # include "asio/detail/kqueue_reactor.hpp" #elif defined(ASIO_HAS_DEV_POLL) # include "asio/detail/dev_poll_reactor.hpp" #else # include "asio/detail/select_reactor.hpp" #endif #endif // ASIO_DETAIL_TIMER_SCHEDULER_HPP asio-1.12.2/include/asio/detail/timer_scheduler_fwd.hpp000066400000000000000000000021541340672067200231100ustar00rootroot00000000000000// // detail/timer_scheduler_fwd.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TIMER_SCHEDULER_FWD_HPP #define ASIO_DETAIL_TIMER_SCHEDULER_FWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" namespace asio { namespace detail { #if defined(ASIO_WINDOWS_RUNTIME) typedef class winrt_timer_scheduler timer_scheduler; #elif defined(ASIO_HAS_IOCP) typedef class win_iocp_io_context timer_scheduler; #elif defined(ASIO_HAS_EPOLL) typedef class epoll_reactor timer_scheduler; #elif defined(ASIO_HAS_KQUEUE) typedef class kqueue_reactor timer_scheduler; #elif defined(ASIO_HAS_DEV_POLL) typedef class dev_poll_reactor timer_scheduler; #else typedef class select_reactor timer_scheduler; #endif } // namespace detail } // namespace asio #endif // ASIO_DETAIL_TIMER_SCHEDULER_FWD_HPP asio-1.12.2/include/asio/detail/tss_ptr.hpp000066400000000000000000000032601340672067200205670ustar00rootroot00000000000000// // detail/tss_ptr.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TSS_PTR_HPP #define ASIO_DETAIL_TSS_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_THREADS) # include "asio/detail/null_tss_ptr.hpp" #elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) # include "asio/detail/keyword_tss_ptr.hpp" #elif defined(ASIO_WINDOWS) # include "asio/detail/win_tss_ptr.hpp" #elif defined(ASIO_HAS_PTHREADS) # include "asio/detail/posix_tss_ptr.hpp" #else # error Only Windows and POSIX are supported! #endif #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class tss_ptr #if !defined(ASIO_HAS_THREADS) : public null_tss_ptr #elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) : public keyword_tss_ptr #elif defined(ASIO_WINDOWS) : public win_tss_ptr #elif defined(ASIO_HAS_PTHREADS) : public posix_tss_ptr #endif { public: void operator=(T* value) { #if !defined(ASIO_HAS_THREADS) null_tss_ptr::operator=(value); #elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) keyword_tss_ptr::operator=(value); #elif defined(ASIO_WINDOWS) win_tss_ptr::operator=(value); #elif defined(ASIO_HAS_PTHREADS) posix_tss_ptr::operator=(value); #endif } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_TSS_PTR_HPP asio-1.12.2/include/asio/detail/type_traits.hpp000066400000000000000000000051051340672067200214400ustar00rootroot00000000000000// // detail/type_traits.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_TYPE_TRAITS_HPP #define ASIO_DETAIL_TYPE_TRAITS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_TYPE_TRAITS) # include #else // defined(ASIO_HAS_TYPE_TRAITS) # include # include # include # include # include # include # include # include # include # include # include # include # include # include #endif // defined(ASIO_HAS_TYPE_TRAITS) namespace asio { #if defined(ASIO_HAS_STD_TYPE_TRAITS) using std::add_const; using std::conditional; using std::decay; using std::enable_if; using std::false_type; using std::integral_constant; using std::is_base_of; using std::is_class; using std::is_const; using std::is_convertible; using std::is_function; using std::is_same; using std::remove_pointer; using std::remove_reference; #if defined(ASIO_HAS_STD_INVOKE_RESULT) template struct result_of; template struct result_of : std::invoke_result {}; #else // defined(ASIO_HAS_STD_INVOKE_RESULT) using std::result_of; #endif // defined(ASIO_HAS_STD_INVOKE_RESULT) using std::true_type; #else // defined(ASIO_HAS_STD_TYPE_TRAITS) using boost::add_const; template struct enable_if : boost::enable_if_c {}; using boost::conditional; using boost::decay; using boost::false_type; using boost::integral_constant; using boost::is_base_of; using boost::is_class; using boost::is_const; using boost::is_convertible; using boost::is_function; using boost::is_same; using boost::remove_pointer; using boost::remove_reference; using boost::result_of; using boost::true_type; #endif // defined(ASIO_HAS_STD_TYPE_TRAITS) } // namespace asio #endif // ASIO_DETAIL_TYPE_TRAITS_HPP asio-1.12.2/include/asio/detail/variadic_templates.hpp000066400000000000000000000076541340672067200227440ustar00rootroot00000000000000// // detail/variadic_templates.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_VARIADIC_TEMPLATES_HPP #define ASIO_DETAIL_VARIADIC_TEMPLATES_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_HAS_VARIADIC_TEMPLATES) # define ASIO_VARIADIC_TPARAMS(n) ASIO_VARIADIC_TPARAMS_##n # define ASIO_VARIADIC_TPARAMS_1 \ typename T1 # define ASIO_VARIADIC_TPARAMS_2 \ typename T1, typename T2 # define ASIO_VARIADIC_TPARAMS_3 \ typename T1, typename T2, typename T3 # define ASIO_VARIADIC_TPARAMS_4 \ typename T1, typename T2, typename T3, typename T4 # define ASIO_VARIADIC_TPARAMS_5 \ typename T1, typename T2, typename T3, typename T4, typename T5 # define ASIO_VARIADIC_TARGS(n) ASIO_VARIADIC_TARGS_##n # define ASIO_VARIADIC_TARGS_1 T1 # define ASIO_VARIADIC_TARGS_2 T1, T2 # define ASIO_VARIADIC_TARGS_3 T1, T2, T3 # define ASIO_VARIADIC_TARGS_4 T1, T2, T3, T4 # define ASIO_VARIADIC_TARGS_5 T1, T2, T3, T4, T5 # define ASIO_VARIADIC_BYVAL_PARAMS(n) \ ASIO_VARIADIC_BYVAL_PARAMS_##n # define ASIO_VARIADIC_BYVAL_PARAMS_1 T1 x1 # define ASIO_VARIADIC_BYVAL_PARAMS_2 T1 x1, T2 x2 # define ASIO_VARIADIC_BYVAL_PARAMS_3 T1 x1, T2 x2, T3 x3 # define ASIO_VARIADIC_BYVAL_PARAMS_4 T1 x1, T2 x2, T3 x3, T4 x4 # define ASIO_VARIADIC_BYVAL_PARAMS_5 T1 x1, T2 x2, T3 x3, T4 x4, T5 x5 # define ASIO_VARIADIC_BYVAL_ARGS(n) \ ASIO_VARIADIC_BYVAL_ARGS_##n # define ASIO_VARIADIC_BYVAL_ARGS_1 x1 # define ASIO_VARIADIC_BYVAL_ARGS_2 x1, x2 # define ASIO_VARIADIC_BYVAL_ARGS_3 x1, x2, x3 # define ASIO_VARIADIC_BYVAL_ARGS_4 x1, x2, x3, x4 # define ASIO_VARIADIC_BYVAL_ARGS_5 x1, x2, x3, x4, x5 # define ASIO_VARIADIC_MOVE_PARAMS(n) \ ASIO_VARIADIC_MOVE_PARAMS_##n # define ASIO_VARIADIC_MOVE_PARAMS_1 \ ASIO_MOVE_ARG(T1) x1 # define ASIO_VARIADIC_MOVE_PARAMS_2 \ ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2 # define ASIO_VARIADIC_MOVE_PARAMS_3 \ ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2, \ ASIO_MOVE_ARG(T3) x3 # define ASIO_VARIADIC_MOVE_PARAMS_4 \ ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2, \ ASIO_MOVE_ARG(T3) x3, ASIO_MOVE_ARG(T4) x4 # define ASIO_VARIADIC_MOVE_PARAMS_5 \ ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2, \ ASIO_MOVE_ARG(T3) x3, ASIO_MOVE_ARG(T4) x4, \ ASIO_MOVE_ARG(T5) x5 # define ASIO_VARIADIC_MOVE_ARGS(n) \ ASIO_VARIADIC_MOVE_ARGS_##n # define ASIO_VARIADIC_MOVE_ARGS_1 \ ASIO_MOVE_CAST(T1)(x1) # define ASIO_VARIADIC_MOVE_ARGS_2 \ ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2) # define ASIO_VARIADIC_MOVE_ARGS_3 \ ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2), \ ASIO_MOVE_CAST(T3)(x3) # define ASIO_VARIADIC_MOVE_ARGS_4 \ ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2), \ ASIO_MOVE_CAST(T3)(x3), ASIO_MOVE_CAST(T4)(x4) # define ASIO_VARIADIC_MOVE_ARGS_5 \ ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2), \ ASIO_MOVE_CAST(T3)(x3), ASIO_MOVE_CAST(T4)(x4), \ ASIO_MOVE_CAST(T5)(x5) # define ASIO_VARIADIC_DECAY(n) \ ASIO_VARIADIC_DECAY_##n # define ASIO_VARIADIC_DECAY_1 \ typename decay::type # define ASIO_VARIADIC_DECAY_2 \ typename decay::type, typename decay::type # define ASIO_VARIADIC_DECAY_3 \ typename decay::type, typename decay::type, \ typename decay::type # define ASIO_VARIADIC_DECAY_4 \ typename decay::type, typename decay::type, \ typename decay::type, typename decay::type # define ASIO_VARIADIC_DECAY_5 \ typename decay::type, typename decay::type, \ typename decay::type, typename decay::type, \ typename decay::type # define ASIO_VARIADIC_GENERATE(m) m(1) m(2) m(3) m(4) m(5) #endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) #endif // ASIO_DETAIL_VARIADIC_TEMPLATES_HPP asio-1.12.2/include/asio/detail/wait_handler.hpp000066400000000000000000000046461340672067200215430ustar00rootroot00000000000000// // detail/wait_handler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WAIT_HANDLER_HPP #define ASIO_DETAIL_WAIT_HANDLER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/wait_op.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class wait_handler : public wait_op { public: ASIO_DEFINE_HANDLER_PTR(wait_handler); wait_handler(Handler& h) : wait_op(&wait_handler::do_complete), handler_(ASIO_MOVE_CAST(Handler)(h)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/) { // Take ownership of the handler object. wait_handler* h(static_cast(base)); ptr p = { asio::detail::addressof(h->handler_), h, h }; handler_work w(h->handler_); ASIO_HANDLER_COMPLETION((*h)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(h->handler_, h->ec_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WAIT_HANDLER_HPP asio-1.12.2/include/asio/detail/wait_op.hpp000066400000000000000000000016431340672067200205360ustar00rootroot00000000000000// // detail/wait_op.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WAIT_OP_HPP #define ASIO_DETAIL_WAIT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class wait_op : public operation { public: // The error code to be passed to the completion handler. asio::error_code ec_; protected: wait_op(func_type func) : operation(func) { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WAIT_OP_HPP asio-1.12.2/include/asio/detail/win_event.hpp000066400000000000000000000064751340672067200211020ustar00rootroot00000000000000// // detail/win_event.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_EVENT_HPP #define ASIO_DETAIL_WIN_EVENT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/assert.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_event : private noncopyable { public: // Constructor. ASIO_DECL win_event(); // Destructor. ASIO_DECL ~win_event(); // Signal the event. (Retained for backward compatibility.) template void signal(Lock& lock) { this->signal_all(lock); } // Signal all waiters. template void signal_all(Lock& lock) { ASIO_ASSERT(lock.locked()); (void)lock; state_ |= 1; ::SetEvent(events_[0]); } // Unlock the mutex and signal one waiter. template void unlock_and_signal_one(Lock& lock) { ASIO_ASSERT(lock.locked()); state_ |= 1; bool have_waiters = (state_ > 1); lock.unlock(); if (have_waiters) ::SetEvent(events_[1]); } // If there's a waiter, unlock the mutex and signal it. template bool maybe_unlock_and_signal_one(Lock& lock) { ASIO_ASSERT(lock.locked()); state_ |= 1; if (state_ > 1) { lock.unlock(); ::SetEvent(events_[1]); return true; } return false; } // Reset the event. template void clear(Lock& lock) { ASIO_ASSERT(lock.locked()); (void)lock; ::ResetEvent(events_[0]); state_ &= ~std::size_t(1); } // Wait for the event to become signalled. template void wait(Lock& lock) { ASIO_ASSERT(lock.locked()); while ((state_ & 1) == 0) { state_ += 2; lock.unlock(); #if defined(ASIO_WINDOWS_APP) ::WaitForMultipleObjectsEx(2, events_, false, INFINITE, false); #else // defined(ASIO_WINDOWS_APP) ::WaitForMultipleObjects(2, events_, false, INFINITE); #endif // defined(ASIO_WINDOWS_APP) lock.lock(); state_ -= 2; } } // Timed wait for the event to become signalled. template bool wait_for_usec(Lock& lock, long usec) { ASIO_ASSERT(lock.locked()); if ((state_ & 1) == 0) { state_ += 2; lock.unlock(); DWORD msec = usec > 0 ? (usec < 1000 ? 1 : usec / 1000) : 0; #if defined(ASIO_WINDOWS_APP) ::WaitForMultipleObjectsEx(2, events_, false, msec, false); #else // defined(ASIO_WINDOWS_APP) ::WaitForMultipleObjects(2, events_, false, msec); #endif // defined(ASIO_WINDOWS_APP) lock.lock(); state_ -= 2; } return (state_ & 1) != 0; } private: HANDLE events_[2]; std::size_t state_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_event.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_WIN_EVENT_HPP asio-1.12.2/include/asio/detail/win_fd_set_adapter.hpp000066400000000000000000000073361340672067200227220ustar00rootroot00000000000000// // detail/win_fd_set_adapter.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP #define ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) #include "asio/detail/noncopyable.hpp" #include "asio/detail/reactor_op_queue.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. class win_fd_set_adapter : noncopyable { public: enum { default_fd_set_size = 1024 }; win_fd_set_adapter() : capacity_(default_fd_set_size), max_descriptor_(invalid_socket) { fd_set_ = static_cast(::operator new( sizeof(win_fd_set) - sizeof(SOCKET) + sizeof(SOCKET) * (capacity_))); fd_set_->fd_count = 0; } ~win_fd_set_adapter() { ::operator delete(fd_set_); } void reset() { fd_set_->fd_count = 0; max_descriptor_ = invalid_socket; } bool set(socket_type descriptor) { for (u_int i = 0; i < fd_set_->fd_count; ++i) if (fd_set_->fd_array[i] == descriptor) return true; reserve(fd_set_->fd_count + 1); fd_set_->fd_array[fd_set_->fd_count++] = descriptor; return true; } void set(reactor_op_queue& operations, op_queue&) { reactor_op_queue::iterator i = operations.begin(); while (i != operations.end()) { reactor_op_queue::iterator op_iter = i++; reserve(fd_set_->fd_count + 1); fd_set_->fd_array[fd_set_->fd_count++] = op_iter->first; } } bool is_set(socket_type descriptor) const { return !!__WSAFDIsSet(descriptor, const_cast(reinterpret_cast(fd_set_))); } operator fd_set*() { return reinterpret_cast(fd_set_); } socket_type max_descriptor() const { return max_descriptor_; } void perform(reactor_op_queue& operations, op_queue& ops) const { for (u_int i = 0; i < fd_set_->fd_count; ++i) operations.perform_operations(fd_set_->fd_array[i], ops); } private: // This structure is defined to be compatible with the Windows API fd_set // structure, but without being dependent on the value of FD_SETSIZE. We use // the "struct hack" to allow the number of descriptors to be varied at // runtime. struct win_fd_set { u_int fd_count; SOCKET fd_array[1]; }; // Increase the fd_set_ capacity to at least the specified number of elements. void reserve(u_int n) { if (n <= capacity_) return; u_int new_capacity = capacity_ + capacity_ / 2; if (new_capacity < n) new_capacity = n; win_fd_set* new_fd_set = static_cast(::operator new( sizeof(win_fd_set) - sizeof(SOCKET) + sizeof(SOCKET) * (new_capacity))); new_fd_set->fd_count = fd_set_->fd_count; for (u_int i = 0; i < fd_set_->fd_count; ++i) new_fd_set->fd_array[i] = fd_set_->fd_array[i]; ::operator delete(fd_set_); fd_set_ = new_fd_set; capacity_ = new_capacity; } win_fd_set* fd_set_; u_int capacity_; socket_type max_descriptor_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #endif // ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP asio-1.12.2/include/asio/detail/win_fenced_block.hpp000066400000000000000000000037371340672067200223550ustar00rootroot00000000000000// // detail/win_fenced_block.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_FENCED_BLOCK_HPP #define ASIO_DETAIL_WIN_FENCED_BLOCK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) && !defined(UNDER_CE) #include "asio/detail/socket_types.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_fenced_block : private noncopyable { public: enum half_t { half }; enum full_t { full }; // Constructor for a half fenced block. explicit win_fenced_block(half_t) { } // Constructor for a full fenced block. explicit win_fenced_block(full_t) { #if defined(__BORLANDC__) LONG barrier = 0; ::InterlockedExchange(&barrier, 1); #elif defined(ASIO_MSVC) \ && ((ASIO_MSVC < 1400) || !defined(MemoryBarrier)) # if defined(_M_IX86) # pragma warning(push) # pragma warning(disable:4793) LONG barrier; __asm { xchg barrier, eax } # pragma warning(pop) # endif // defined(_M_IX86) #else MemoryBarrier(); #endif } // Destructor. ~win_fenced_block() { #if defined(__BORLANDC__) LONG barrier = 0; ::InterlockedExchange(&barrier, 1); #elif defined(ASIO_MSVC) \ && ((ASIO_MSVC < 1400) || !defined(MemoryBarrier)) # if defined(_M_IX86) # pragma warning(push) # pragma warning(disable:4793) LONG barrier; __asm { xchg barrier, eax } # pragma warning(pop) # endif // defined(_M_IX86) #else MemoryBarrier(); #endif } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) && !defined(UNDER_CE) #endif // ASIO_DETAIL_WIN_FENCED_BLOCK_HPP asio-1.12.2/include/asio/detail/win_global.hpp000066400000000000000000000033021340672067200212030ustar00rootroot00000000000000// // detail/win_global.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_GLOBAL_HPP #define ASIO_DETAIL_WIN_GLOBAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/static_mutex.hpp" #include "asio/detail/tss_ptr.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template struct win_global_impl { // Destructor automatically cleans up the global. ~win_global_impl() { delete ptr_; } static win_global_impl instance_; static static_mutex mutex_; static T* ptr_; static tss_ptr tss_ptr_; }; template win_global_impl win_global_impl::instance_ = { 0 }; template static_mutex win_global_impl::mutex_ = ASIO_STATIC_MUTEX_INIT; template T* win_global_impl::ptr_ = 0; template tss_ptr win_global_impl::tss_ptr_; template T& win_global() { if (static_cast(win_global_impl::tss_ptr_) == 0) { win_global_impl::mutex_.init(); static_mutex::scoped_lock lock(win_global_impl::mutex_); if (win_global_impl::ptr_ == 0) win_global_impl::ptr_ = new T; win_global_impl::tss_ptr_ = win_global_impl::ptr_; } return *win_global_impl::tss_ptr_; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WIN_GLOBAL_HPP asio-1.12.2/include/asio/detail/win_iocp_handle_read_op.hpp000066400000000000000000000066011340672067200237060ustar00rootroot00000000000000// // detail/win_iocp_handle_read_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_HANDLE_READ_OP_HPP #define ASIO_DETAIL_WIN_IOCP_HANDLE_READ_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/error.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_handle_read_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_handle_read_op); win_iocp_handle_read_op( const MutableBufferSequence& buffers, Handler& handler) : operation(&win_iocp_handle_read_op::do_complete), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t bytes_transferred) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_handle_read_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) if (owner) { // Check whether buffers are still valid. buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_HANDLE_EOF) ec = asio::error::eof; // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: MutableBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_HANDLE_READ_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_handle_service.hpp000066400000000000000000000270401340672067200237350ustar00rootroot00000000000000// // detail/win_iocp_handle_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_HANDLE_SERVICE_HPP #define ASIO_DETAIL_WIN_IOCP_HANDLE_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/cstdint.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/win_iocp_handle_read_op.hpp" #include "asio/detail/win_iocp_handle_write_op.hpp" #include "asio/detail/win_iocp_io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_iocp_handle_service : public service_base { public: // The native type of a stream handle. typedef HANDLE native_handle_type; // The implementation type of the stream handle. class implementation_type { public: // Default constructor. implementation_type() : handle_(INVALID_HANDLE_VALUE), safe_cancellation_thread_id_(0), next_(0), prev_(0) { } private: // Only this service will have access to the internal values. friend class win_iocp_handle_service; // The native stream handle representation. native_handle_type handle_; // The ID of the thread from which it is safe to cancel asynchronous // operations. 0 means no asynchronous operations have been started yet. // ~0 means asynchronous operations have been started from more than one // thread, and cancellation is not supported for the handle. DWORD safe_cancellation_thread_id_; // Pointers to adjacent handle implementations in linked list. implementation_type* next_; implementation_type* prev_; }; ASIO_DECL win_iocp_handle_service(asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Construct a new handle implementation. ASIO_DECL void construct(implementation_type& impl); // Move-construct a new handle implementation. ASIO_DECL void move_construct(implementation_type& impl, implementation_type& other_impl); // Move-assign from another handle implementation. ASIO_DECL void move_assign(implementation_type& impl, win_iocp_handle_service& other_service, implementation_type& other_impl); // Destroy a handle implementation. ASIO_DECL void destroy(implementation_type& impl); // Assign a native handle to a handle implementation. ASIO_DECL asio::error_code assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec); // Determine whether the handle is open. bool is_open(const implementation_type& impl) const { return impl.handle_ != INVALID_HANDLE_VALUE; } // Destroy a handle implementation. ASIO_DECL asio::error_code close(implementation_type& impl, asio::error_code& ec); // Get the native handle representation. native_handle_type native_handle(const implementation_type& impl) const { return impl.handle_; } // Cancel all operations associated with the handle. ASIO_DECL asio::error_code cancel(implementation_type& impl, asio::error_code& ec); // Write the given data. Returns the number of bytes written. template size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { return write_some_at(impl, 0, buffers, ec); } // Write the given data at the specified offset. Returns the number of bytes // written. template size_t write_some_at(implementation_type& impl, uint64_t offset, const ConstBufferSequence& buffers, asio::error_code& ec) { asio::const_buffer buffer = buffer_sequence_adapter::first(buffers); return do_write(impl, offset, buffer, ec); } // Start an asynchronous write. The data being written must be valid for the // lifetime of the asynchronous operation. template void async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_handle_write_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(buffers, handler); ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, reinterpret_cast(impl.handle_), "async_write_some")); start_write_op(impl, 0, buffer_sequence_adapter::first(buffers), p.p); p.v = p.p = 0; } // Start an asynchronous write at a specified offset. The data being written // must be valid for the lifetime of the asynchronous operation. template void async_write_some_at(implementation_type& impl, uint64_t offset, const ConstBufferSequence& buffers, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_handle_write_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(buffers, handler); ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, reinterpret_cast(impl.handle_), "async_write_some_at")); start_write_op(impl, offset, buffer_sequence_adapter::first(buffers), p.p); p.v = p.p = 0; } // Read some data. Returns the number of bytes received. template size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { return read_some_at(impl, 0, buffers, ec); } // Read some data at a specified offset. Returns the number of bytes received. template size_t read_some_at(implementation_type& impl, uint64_t offset, const MutableBufferSequence& buffers, asio::error_code& ec) { asio::mutable_buffer buffer = buffer_sequence_adapter::first(buffers); return do_read(impl, offset, buffer, ec); } // Start an asynchronous read. The buffer for the data being received must be // valid for the lifetime of the asynchronous operation. template void async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_handle_read_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(buffers, handler); ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, reinterpret_cast(impl.handle_), "async_read_some")); start_read_op(impl, 0, buffer_sequence_adapter::first(buffers), p.p); p.v = p.p = 0; } // Start an asynchronous read at a specified offset. The buffer for the data // being received must be valid for the lifetime of the asynchronous // operation. template void async_read_some_at(implementation_type& impl, uint64_t offset, const MutableBufferSequence& buffers, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_handle_read_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(buffers, handler); ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, reinterpret_cast(impl.handle_), "async_read_some_at")); start_read_op(impl, offset, buffer_sequence_adapter::first(buffers), p.p); p.v = p.p = 0; } private: // Prevent the use of the null_buffers type with this service. size_t write_some(implementation_type& impl, const null_buffers& buffers, asio::error_code& ec); size_t write_some_at(implementation_type& impl, uint64_t offset, const null_buffers& buffers, asio::error_code& ec); template void async_write_some(implementation_type& impl, const null_buffers& buffers, Handler& handler); template void async_write_some_at(implementation_type& impl, uint64_t offset, const null_buffers& buffers, Handler& handler); size_t read_some(implementation_type& impl, const null_buffers& buffers, asio::error_code& ec); size_t read_some_at(implementation_type& impl, uint64_t offset, const null_buffers& buffers, asio::error_code& ec); template void async_read_some(implementation_type& impl, const null_buffers& buffers, Handler& handler); template void async_read_some_at(implementation_type& impl, uint64_t offset, const null_buffers& buffers, Handler& handler); // Helper class for waiting for synchronous operations to complete. class overlapped_wrapper; // Helper function to perform a synchronous write operation. ASIO_DECL size_t do_write(implementation_type& impl, uint64_t offset, const asio::const_buffer& buffer, asio::error_code& ec); // Helper function to start a write operation. ASIO_DECL void start_write_op(implementation_type& impl, uint64_t offset, const asio::const_buffer& buffer, operation* op); // Helper function to perform a synchronous write operation. ASIO_DECL size_t do_read(implementation_type& impl, uint64_t offset, const asio::mutable_buffer& buffer, asio::error_code& ec); // Helper function to start a read operation. ASIO_DECL void start_read_op(implementation_type& impl, uint64_t offset, const asio::mutable_buffer& buffer, operation* op); // Update the ID of the thread from which cancellation is safe. ASIO_DECL void update_cancellation_thread_id(implementation_type& impl); // Helper function to close a handle when the associated object is being // destroyed. ASIO_DECL void close_for_destruction(implementation_type& impl); // The IOCP service used for running asynchronous operations and dispatching // handlers. win_iocp_io_context& iocp_service_; // Mutex to protect access to the linked list of implementations. mutex mutex_; // The head of a linked list of all implementations. implementation_type* impl_list_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_iocp_handle_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_HANDLE_SERVICE_HPP asio-1.12.2/include/asio/detail/win_iocp_handle_write_op.hpp000066400000000000000000000063041340672067200241250ustar00rootroot00000000000000// // detail/win_iocp_handle_write_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_HANDLE_WRITE_OP_HPP #define ASIO_DETAIL_WIN_IOCP_HANDLE_WRITE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/error.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_handle_write_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_handle_write_op); win_iocp_handle_write_op(const ConstBufferSequence& buffers, Handler& handler) : operation(&win_iocp_handle_write_op::do_complete), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& ec, std::size_t bytes_transferred) { // Take ownership of the operation object. win_iocp_handle_write_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) if (owner) { // Check whether buffers are still valid. buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: ConstBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_HANDLE_WRITE_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_io_context.hpp000066400000000000000000000252201340672067200231330ustar00rootroot00000000000000// // detail/win_iocp_io_context.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_IO_CONTEXT_HPP #define ASIO_DETAIL_WIN_IOCP_IO_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/limits.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/thread.hpp" #include "asio/detail/thread_context.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/wait_op.hpp" #include "asio/detail/win_iocp_operation.hpp" #include "asio/detail/win_iocp_thread_info.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class wait_op; class win_iocp_io_context : public execution_context_service_base, public thread_context { public: // Constructor. Specifies a concurrency hint that is passed through to the // underlying I/O completion port. ASIO_DECL win_iocp_io_context(asio::execution_context& ctx, int concurrency_hint = -1); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Initialise the task. Nothing to do here. void init_task() { } // Register a handle with the IO completion port. ASIO_DECL asio::error_code register_handle( HANDLE handle, asio::error_code& ec); // Run the event loop until stopped or no more work. ASIO_DECL size_t run(asio::error_code& ec); // Run until stopped or one operation is performed. ASIO_DECL size_t run_one(asio::error_code& ec); // Run until timeout, interrupted, or one operation is performed. ASIO_DECL size_t wait_one(long usec, asio::error_code& ec); // Poll for operations without blocking. ASIO_DECL size_t poll(asio::error_code& ec); // Poll for one operation without blocking. ASIO_DECL size_t poll_one(asio::error_code& ec); // Stop the event processing loop. ASIO_DECL void stop(); // Determine whether the io_context is stopped. bool stopped() const { return ::InterlockedExchangeAdd(&stopped_, 0) != 0; } // Restart in preparation for a subsequent run invocation. void restart() { ::InterlockedExchange(&stopped_, 0); } // Notify that some work has started. void work_started() { ::InterlockedIncrement(&outstanding_work_); } // Notify that some work has finished. void work_finished() { if (::InterlockedDecrement(&outstanding_work_) == 0) stop(); } // Return whether a handler can be dispatched immediately. bool can_dispatch() { return thread_call_stack::contains(this) != 0; } // Request invocation of the given operation and return immediately. Assumes // that work_started() has not yet been called for the operation. void post_immediate_completion(win_iocp_operation* op, bool) { work_started(); post_deferred_completion(op); } // Request invocation of the given operation and return immediately. Assumes // that work_started() was previously called for the operation. ASIO_DECL void post_deferred_completion(win_iocp_operation* op); // Request invocation of the given operation and return immediately. Assumes // that work_started() was previously called for the operations. ASIO_DECL void post_deferred_completions( op_queue& ops); // Request invocation of the given operation using the thread-private queue // and return immediately. Assumes that work_started() has not yet been // called for the operation. void post_private_immediate_completion(win_iocp_operation* op) { post_immediate_completion(op, false); } // Request invocation of the given operation using the thread-private queue // and return immediately. Assumes that work_started() was previously called // for the operation. void post_private_deferred_completion(win_iocp_operation* op) { post_deferred_completion(op); } // Enqueue the given operation following a failed attempt to dispatch the // operation for immediate invocation. void do_dispatch(operation* op) { post_immediate_completion(op, false); } // Process unfinished operations as part of a shutdown operation. Assumes // that work_started() was previously called for the operations. ASIO_DECL void abandon_operations(op_queue& ops); // Called after starting an overlapped I/O operation that did not complete // immediately. The caller must have already called work_started() prior to // starting the operation. ASIO_DECL void on_pending(win_iocp_operation* op); // Called after starting an overlapped I/O operation that completed // immediately. The caller must have already called work_started() prior to // starting the operation. ASIO_DECL void on_completion(win_iocp_operation* op, DWORD last_error = 0, DWORD bytes_transferred = 0); // Called after starting an overlapped I/O operation that completed // immediately. The caller must have already called work_started() prior to // starting the operation. ASIO_DECL void on_completion(win_iocp_operation* op, const asio::error_code& ec, DWORD bytes_transferred = 0); // Add a new timer queue to the service. template void add_timer_queue(timer_queue& timer_queue); // Remove a timer queue from the service. template void remove_timer_queue(timer_queue& timer_queue); // Schedule a new operation in the given timer queue to expire at the // specified absolute time. template void schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op); // Cancel the timer associated with the given token. Returns the number of // handlers that have been posted or dispatched. template std::size_t cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move the timer operations associated with the given timer. template void move_timer(timer_queue& queue, typename timer_queue::per_timer_data& to, typename timer_queue::per_timer_data& from); // Get the concurrency hint that was used to initialise the io_context. int concurrency_hint() const { return concurrency_hint_; } private: #if defined(WINVER) && (WINVER < 0x0500) typedef DWORD dword_ptr_t; typedef ULONG ulong_ptr_t; #else // defined(WINVER) && (WINVER < 0x0500) typedef DWORD_PTR dword_ptr_t; typedef ULONG_PTR ulong_ptr_t; #endif // defined(WINVER) && (WINVER < 0x0500) // Dequeues at most one operation from the I/O completion port, and then // executes it. Returns the number of operations that were dequeued (i.e. // either 0 or 1). ASIO_DECL size_t do_one(DWORD msec, asio::error_code& ec); // Helper to calculate the GetQueuedCompletionStatus timeout. ASIO_DECL static DWORD get_gqcs_timeout(); // Helper function to add a new timer queue. ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); // Helper function to remove a timer queue. ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); // Called to recalculate and update the timeout. ASIO_DECL void update_timeout(); // Helper class to call work_finished() on block exit. struct work_finished_on_block_exit; // Helper class for managing a HANDLE. struct auto_handle { HANDLE handle; auto_handle() : handle(0) {} ~auto_handle() { if (handle) ::CloseHandle(handle); } }; // The IO completion port used for queueing operations. auto_handle iocp_; // The count of unfinished work. long outstanding_work_; // Flag to indicate whether the event loop has been stopped. mutable long stopped_; // Flag to indicate whether there is an in-flight stop event. Every event // posted using PostQueuedCompletionStatus consumes non-paged pool, so to // avoid exhausting this resouce we limit the number of outstanding events. long stop_event_posted_; // Flag to indicate whether the service has been shut down. long shutdown_; enum { // Timeout to use with GetQueuedCompletionStatus on older versions of // Windows. Some versions of windows have a "bug" where a call to // GetQueuedCompletionStatus can appear stuck even though there are events // waiting on the queue. Using a timeout helps to work around the issue. default_gqcs_timeout = 500, // Maximum waitable timer timeout, in milliseconds. max_timeout_msec = 5 * 60 * 1000, // Maximum waitable timer timeout, in microseconds. max_timeout_usec = max_timeout_msec * 1000, // Completion key value used to wake up a thread to dispatch timers or // completed operations. wake_for_dispatch = 1, // Completion key value to indicate that an operation has posted with the // original last_error and bytes_transferred values stored in the fields of // the OVERLAPPED structure. overlapped_contains_result = 2 }; // Timeout to use with GetQueuedCompletionStatus. const DWORD gqcs_timeout_; // Function object for processing timeouts in a background thread. struct timer_thread_function; friend struct timer_thread_function; // Background thread used for processing timeouts. scoped_ptr timer_thread_; // A waitable timer object used for waiting for timeouts. auto_handle waitable_timer_; // Non-zero if timers or completed operations need to be dispatched. long dispatch_required_; // Mutex for protecting access to the timer queues and completed operations. mutex dispatch_mutex_; // The timer queues. timer_queue_set timer_queues_; // The operations that are ready to dispatch. op_queue completed_ops_; // The concurrency hint used to initialise the io_context. const int concurrency_hint_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/win_iocp_io_context.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_iocp_io_context.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_IO_CONTEXT_HPP asio-1.12.2/include/asio/detail/win_iocp_null_buffers_op.hpp000066400000000000000000000070411340672067200241450ustar00rootroot00000000000000// // detail/win_iocp_null_buffers_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_NULL_BUFFERS_OP_HPP #define ASIO_DETAIL_WIN_IOCP_NULL_BUFFERS_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_null_buffers_op : public reactor_op { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_null_buffers_op); win_iocp_null_buffers_op(socket_ops::weak_cancel_token_type cancel_token, Handler& handler) : reactor_op(&win_iocp_null_buffers_op::do_perform, &win_iocp_null_buffers_op::do_complete), cancel_token_(cancel_token), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static status do_perform(reactor_op*) { return done; } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t bytes_transferred) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_null_buffers_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // The reactor may have stored a result in the operation object. if (o->ec_) ec = o->ec_; // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) { if (o->cancel_token_.expired()) ec = asio::error::operation_aborted; else ec = asio::error::connection_reset; } else if (ec.value() == ERROR_PORT_UNREACHABLE) { ec = asio::error::connection_refused; } // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: socket_ops::weak_cancel_token_type cancel_token_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_NULL_BUFFERS_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_operation.hpp000066400000000000000000000037711340672067200227670ustar00rootroot00000000000000// // detail/win_iocp_operation.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_OPERATION_HPP #define ASIO_DETAIL_WIN_IOCP_OPERATION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/handler_tracking.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/socket_types.hpp" #include "asio/error_code.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_iocp_io_context; // Base class for all operations. A function pointer is used instead of virtual // functions to avoid the associated overhead. class win_iocp_operation : public OVERLAPPED ASIO_ALSO_INHERIT_TRACKED_HANDLER { public: typedef win_iocp_operation operation_type; void complete(void* owner, const asio::error_code& ec, std::size_t bytes_transferred) { func_(owner, this, ec, bytes_transferred); } void destroy() { func_(0, this, asio::error_code(), 0); } protected: typedef void (*func_type)( void*, win_iocp_operation*, const asio::error_code&, std::size_t); win_iocp_operation(func_type func) : next_(0), func_(func) { reset(); } // Prevents deletion through this type. ~win_iocp_operation() { } void reset() { Internal = 0; InternalHigh = 0; Offset = 0; OffsetHigh = 0; hEvent = 0; ready_ = 0; } private: friend class op_queue_access; friend class win_iocp_io_context; win_iocp_operation* next_; func_type func_; long ready_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_OPERATION_HPP asio-1.12.2/include/asio/detail/win_iocp_overlapped_op.hpp000066400000000000000000000052471340672067200236260ustar00rootroot00000000000000// // detail/win_iocp_overlapped_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_OVERLAPPED_OP_HPP #define ASIO_DETAIL_WIN_IOCP_OVERLAPPED_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/error.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_overlapped_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_overlapped_op); win_iocp_overlapped_op(Handler& handler) : operation(&win_iocp_overlapped_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& ec, std::size_t bytes_transferred) { // Take ownership of the operation object. win_iocp_overlapped_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_OVERLAPPED_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_overlapped_ptr.hpp000066400000000000000000000064761340672067200240220ustar00rootroot00000000000000// // detail/win_iocp_overlapped_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_OVERLAPPED_PTR_HPP #define ASIO_DETAIL_WIN_IOCP_OVERLAPPED_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/io_context.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/win_iocp_overlapped_op.hpp" #include "asio/detail/win_iocp_io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Wraps a handler to create an OVERLAPPED object for use with overlapped I/O. class win_iocp_overlapped_ptr : private noncopyable { public: // Construct an empty win_iocp_overlapped_ptr. win_iocp_overlapped_ptr() : ptr_(0), iocp_service_(0) { } // Construct an win_iocp_overlapped_ptr to contain the specified handler. template explicit win_iocp_overlapped_ptr( asio::io_context& io_context, ASIO_MOVE_ARG(Handler) handler) : ptr_(0), iocp_service_(0) { this->reset(io_context, ASIO_MOVE_CAST(Handler)(handler)); } // Destructor automatically frees the OVERLAPPED object unless released. ~win_iocp_overlapped_ptr() { reset(); } // Reset to empty. void reset() { if (ptr_) { ptr_->destroy(); ptr_ = 0; iocp_service_->work_finished(); iocp_service_ = 0; } } // Reset to contain the specified handler, freeing any current OVERLAPPED // object. template void reset(asio::io_context& io_context, Handler handler) { typedef win_iocp_overlapped_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((io_context, *p.p, "io_context", &io_context.impl_, 0, "overlapped")); io_context.impl_.work_started(); reset(); ptr_ = p.p; p.v = p.p = 0; iocp_service_ = &io_context.impl_; } // Get the contained OVERLAPPED object. OVERLAPPED* get() { return ptr_; } // Get the contained OVERLAPPED object. const OVERLAPPED* get() const { return ptr_; } // Release ownership of the OVERLAPPED object. OVERLAPPED* release() { if (ptr_) iocp_service_->on_pending(ptr_); OVERLAPPED* tmp = ptr_; ptr_ = 0; iocp_service_ = 0; return tmp; } // Post completion notification for overlapped operation. Releases ownership. void complete(const asio::error_code& ec, std::size_t bytes_transferred) { if (ptr_) { iocp_service_->on_completion(ptr_, ec, static_cast(bytes_transferred)); ptr_ = 0; iocp_service_ = 0; } } private: win_iocp_operation* ptr_; win_iocp_io_context* iocp_service_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_OVERLAPPED_PTR_HPP asio-1.12.2/include/asio/detail/win_iocp_serial_port_service.hpp000066400000000000000000000163711340672067200250320ustar00rootroot00000000000000// // detail/win_iocp_serial_port_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SERIAL_PORT_SERVICE_HPP #define ASIO_DETAIL_WIN_IOCP_SERIAL_PORT_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) #include #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/win_iocp_handle_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Extend win_iocp_handle_service to provide serial port support. class win_iocp_serial_port_service : public service_base { public: // The native type of a serial port. typedef win_iocp_handle_service::native_handle_type native_handle_type; // The implementation type of the serial port. typedef win_iocp_handle_service::implementation_type implementation_type; // Constructor. ASIO_DECL win_iocp_serial_port_service( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Construct a new serial port implementation. void construct(implementation_type& impl) { handle_service_.construct(impl); } // Move-construct a new serial port implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { handle_service_.move_construct(impl, other_impl); } // Move-assign from another serial port implementation. void move_assign(implementation_type& impl, win_iocp_serial_port_service& other_service, implementation_type& other_impl) { handle_service_.move_assign(impl, other_service.handle_service_, other_impl); } // Destroy a serial port implementation. void destroy(implementation_type& impl) { handle_service_.destroy(impl); } // Open the serial port using the specified device name. ASIO_DECL asio::error_code open(implementation_type& impl, const std::string& device, asio::error_code& ec); // Assign a native handle to a serial port implementation. asio::error_code assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { return handle_service_.assign(impl, handle, ec); } // Determine whether the serial port is open. bool is_open(const implementation_type& impl) const { return handle_service_.is_open(impl); } // Destroy a serial port implementation. asio::error_code close(implementation_type& impl, asio::error_code& ec) { return handle_service_.close(impl, ec); } // Get the native serial port representation. native_handle_type native_handle(implementation_type& impl) { return handle_service_.native_handle(impl); } // Cancel all operations associated with the handle. asio::error_code cancel(implementation_type& impl, asio::error_code& ec) { return handle_service_.cancel(impl, ec); } // Set an option on the serial port. template asio::error_code set_option(implementation_type& impl, const SettableSerialPortOption& option, asio::error_code& ec) { return do_set_option(impl, &win_iocp_serial_port_service::store_option, &option, ec); } // Get an option from the serial port. template asio::error_code get_option(const implementation_type& impl, GettableSerialPortOption& option, asio::error_code& ec) const { return do_get_option(impl, &win_iocp_serial_port_service::load_option, &option, ec); } // Send a break sequence to the serial port. asio::error_code send_break(implementation_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Write the given data. Returns the number of bytes sent. template size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { return handle_service_.write_some(impl, buffers, ec); } // Start an asynchronous write. The data being written must be valid for the // lifetime of the asynchronous operation. template void async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, Handler& handler) { handle_service_.async_write_some(impl, buffers, handler); } // Read some data. Returns the number of bytes received. template size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { return handle_service_.read_some(impl, buffers, ec); } // Start an asynchronous read. The buffer for the data being received must be // valid for the lifetime of the asynchronous operation. template void async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, Handler& handler) { handle_service_.async_read_some(impl, buffers, handler); } private: // Function pointer type for storing a serial port option. typedef asio::error_code (*store_function_type)( const void*, ::DCB&, asio::error_code&); // Helper function template to store a serial port option. template static asio::error_code store_option(const void* option, ::DCB& storage, asio::error_code& ec) { static_cast(option)->store(storage, ec); return ec; } // Helper function to set a serial port option. ASIO_DECL asio::error_code do_set_option( implementation_type& impl, store_function_type store, const void* option, asio::error_code& ec); // Function pointer type for loading a serial port option. typedef asio::error_code (*load_function_type)( void*, const ::DCB&, asio::error_code&); // Helper function template to load a serial port option. template static asio::error_code load_option(void* option, const ::DCB& storage, asio::error_code& ec) { static_cast(option)->load(storage, ec); return ec; } // Helper function to get a serial port option. ASIO_DECL asio::error_code do_get_option( const implementation_type& impl, load_function_type load, void* option, asio::error_code& ec) const; // The implementation used for initiating asynchronous operations. win_iocp_handle_service handle_service_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_iocp_serial_port_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) #endif // ASIO_DETAIL_WIN_IOCP_SERIAL_PORT_SERVICE_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_accept_op.hpp000066400000000000000000000221761340672067200242740ustar00rootroot00000000000000// // detail/win_iocp_socket_accept_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_ACCEPT_OP_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_ACCEPT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/win_iocp_socket_service_base.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_socket_accept_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_accept_op); win_iocp_socket_accept_op(win_iocp_socket_service_base& socket_service, socket_type socket, Socket& peer, const Protocol& protocol, typename Protocol::endpoint* peer_endpoint, bool enable_connection_aborted, Handler& handler) : operation(&win_iocp_socket_accept_op::do_complete), socket_service_(socket_service), socket_(socket), peer_(peer), protocol_(protocol), peer_endpoint_(peer_endpoint), enable_connection_aborted_(enable_connection_aborted), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } socket_holder& new_socket() { return new_socket_; } void* output_buffer() { return output_buffer_; } DWORD address_length() { return sizeof(sockaddr_storage_type) + 16; } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t /*bytes_transferred*/) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_accept_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); if (owner) { typename Protocol::endpoint peer_endpoint; std::size_t addr_len = peer_endpoint.capacity(); socket_ops::complete_iocp_accept(o->socket_, o->output_buffer(), o->address_length(), peer_endpoint.data(), &addr_len, o->new_socket_.get(), ec); // Restart the accept operation if we got the connection_aborted error // and the enable_connection_aborted socket option is not set. if (ec == asio::error::connection_aborted && !o->enable_connection_aborted_) { o->reset(); o->socket_service_.restart_accept_op(o->socket_, o->new_socket_, o->protocol_.family(), o->protocol_.type(), o->protocol_.protocol(), o->output_buffer(), o->address_length(), o); p.v = p.p = 0; return; } // If the socket was successfully accepted, transfer ownership of the // socket to the peer object. if (!ec) { o->peer_.assign(o->protocol_, typename Socket::native_handle_type( o->new_socket_.get(), peer_endpoint), ec); if (!ec) o->new_socket_.release(); } // Pass endpoint back to caller. if (o->peer_endpoint_) *o->peer_endpoint_ = peer_endpoint; } ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, ec); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: win_iocp_socket_service_base& socket_service_; socket_type socket_; socket_holder new_socket_; Socket& peer_; Protocol protocol_; typename Protocol::endpoint* peer_endpoint_; unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; bool enable_connection_aborted_; Handler handler_; }; #if defined(ASIO_HAS_MOVE) template class win_iocp_socket_move_accept_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_move_accept_op); win_iocp_socket_move_accept_op( win_iocp_socket_service_base& socket_service, socket_type socket, const Protocol& protocol, asio::io_context& peer_io_context, typename Protocol::endpoint* peer_endpoint, bool enable_connection_aborted, Handler& handler) : operation(&win_iocp_socket_move_accept_op::do_complete), socket_service_(socket_service), socket_(socket), peer_(peer_io_context), protocol_(protocol), peer_endpoint_(peer_endpoint), enable_connection_aborted_(enable_connection_aborted), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } socket_holder& new_socket() { return new_socket_; } void* output_buffer() { return output_buffer_; } DWORD address_length() { return sizeof(sockaddr_storage_type) + 16; } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t /*bytes_transferred*/) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_move_accept_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); if (owner) { typename Protocol::endpoint peer_endpoint; std::size_t addr_len = peer_endpoint.capacity(); socket_ops::complete_iocp_accept(o->socket_, o->output_buffer(), o->address_length(), peer_endpoint.data(), &addr_len, o->new_socket_.get(), ec); // Restart the accept operation if we got the connection_aborted error // and the enable_connection_aborted socket option is not set. if (ec == asio::error::connection_aborted && !o->enable_connection_aborted_) { o->reset(); o->socket_service_.restart_accept_op(o->socket_, o->new_socket_, o->protocol_.family(), o->protocol_.type(), o->protocol_.protocol(), o->output_buffer(), o->address_length(), o); p.v = p.p = 0; return; } // If the socket was successfully accepted, transfer ownership of the // socket to the peer object. if (!ec) { o->peer_.assign(o->protocol_, typename Protocol::socket::native_handle_type( o->new_socket_.get(), peer_endpoint), ec); if (!ec) o->new_socket_.release(); } // Pass endpoint back to caller. if (o->peer_endpoint_) *o->peer_endpoint_ = peer_endpoint; } ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::move_binder2 handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), ec, ASIO_MOVE_CAST(typename Protocol::socket)(o->peer_)); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: win_iocp_socket_service_base& socket_service_; socket_type socket_; socket_holder new_socket_; typename Protocol::socket peer_; Protocol protocol_; typename Protocol::endpoint* peer_endpoint_; unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; bool enable_connection_aborted_; Handler handler_; }; #endif // defined(ASIO_HAS_MOVE) } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_ACCEPT_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_connect_op.hpp000066400000000000000000000070551340672067200244650ustar00rootroot00000000000000// // detail/win_iocp_socket_connect_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_iocp_socket_connect_op_base : public reactor_op { public: win_iocp_socket_connect_op_base(socket_type socket, func_type complete_func) : reactor_op(&win_iocp_socket_connect_op_base::do_perform, complete_func), socket_(socket), connect_ex_(false) { } static status do_perform(reactor_op* base) { win_iocp_socket_connect_op_base* o( static_cast(base)); return socket_ops::non_blocking_connect( o->socket_, o->ec_) ? done : not_done; } socket_type socket_; bool connect_ex_; }; template class win_iocp_socket_connect_op : public win_iocp_socket_connect_op_base { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_connect_op); win_iocp_socket_connect_op(socket_type socket, Handler& handler) : win_iocp_socket_connect_op_base(socket, &win_iocp_socket_connect_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t /*bytes_transferred*/) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_connect_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); if (owner) { if (o->connect_ex_) socket_ops::complete_iocp_connect(o->socket_, ec); else ec = o->ec_; } ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, ec); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_recv_op.hpp000066400000000000000000000072101340672067200237640ustar00rootroot00000000000000// // detail/win_iocp_socket_recv_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_socket_recv_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recv_op); win_iocp_socket_recv_op(socket_ops::state_type state, socket_ops::weak_cancel_token_type cancel_token, const MutableBufferSequence& buffers, Handler& handler) : operation(&win_iocp_socket_recv_op::do_complete), state_(state), cancel_token_(cancel_token), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t bytes_transferred) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_recv_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Check whether buffers are still valid. if (owner) { buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) socket_ops::complete_iocp_recv(o->state_, o->cancel_token_, buffer_sequence_adapter::all_empty(o->buffers_), ec, bytes_transferred); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: socket_ops::state_type state_; socket_ops::weak_cancel_token_type cancel_token_; MutableBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_recvfrom_op.hpp000066400000000000000000000074551340672067200246630ustar00rootroot00000000000000// // detail/win_iocp_socket_recvfrom_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_socket_recvfrom_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recvfrom_op); win_iocp_socket_recvfrom_op(Endpoint& endpoint, socket_ops::weak_cancel_token_type cancel_token, const MutableBufferSequence& buffers, Handler& handler) : operation(&win_iocp_socket_recvfrom_op::do_complete), endpoint_(endpoint), endpoint_size_(static_cast(endpoint.capacity())), cancel_token_(cancel_token), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } int& endpoint_size() { return endpoint_size_; } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t bytes_transferred) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_recvfrom_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Check whether buffers are still valid. if (owner) { buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) socket_ops::complete_iocp_recvfrom(o->cancel_token_, ec); // Record the size of the endpoint returned by the operation. o->endpoint_.resize(o->endpoint_size_); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Endpoint& endpoint_; int endpoint_size_; socket_ops::weak_cancel_token_type cancel_token_; MutableBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_recvmsg_op.hpp000066400000000000000000000071641340672067200245030ustar00rootroot00000000000000// // detail/win_iocp_socket_recvmsg_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_RECVMSG_OP_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_RECVMSG_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/socket_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_socket_recvmsg_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recvmsg_op); win_iocp_socket_recvmsg_op( socket_ops::weak_cancel_token_type cancel_token, const MutableBufferSequence& buffers, socket_base::message_flags& out_flags, Handler& handler) : operation(&win_iocp_socket_recvmsg_op::do_complete), cancel_token_(cancel_token), buffers_(buffers), out_flags_(out_flags), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t bytes_transferred) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_recvmsg_op* o( static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Check whether buffers are still valid. if (owner) { buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) socket_ops::complete_iocp_recvmsg(o->cancel_token_, ec); o->out_flags_ = 0; // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: socket_ops::weak_cancel_token_type cancel_token_; MutableBufferSequence buffers_; socket_base::message_flags& out_flags_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_RECVMSG_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_send_op.hpp000066400000000000000000000066161340672067200237670ustar00rootroot00000000000000// // detail/win_iocp_socket_send_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SEND_OP_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_SEND_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_socket_send_op : public operation { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_send_op); win_iocp_socket_send_op(socket_ops::weak_cancel_token_type cancel_token, const ConstBufferSequence& buffers, Handler& handler) : operation(&win_iocp_socket_send_op::do_complete), cancel_token_(cancel_token), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t bytes_transferred) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_socket_send_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Check whether buffers are still valid. if (owner) { buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) socket_ops::complete_iocp_send(o->cancel_token_, ec); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, ec, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: socket_ops::weak_cancel_token_type cancel_token_; ConstBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SEND_OP_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_service.hpp000066400000000000000000000470251340672067200237770ustar00rootroot00000000000000// // detail/win_iocp_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/socket_base.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/select_reactor.hpp" #include "asio/detail/socket_holder.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/win_iocp_io_context.hpp" #include "asio/detail/win_iocp_null_buffers_op.hpp" #include "asio/detail/win_iocp_socket_accept_op.hpp" #include "asio/detail/win_iocp_socket_connect_op.hpp" #include "asio/detail/win_iocp_socket_recvfrom_op.hpp" #include "asio/detail/win_iocp_socket_send_op.hpp" #include "asio/detail/win_iocp_socket_service_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_socket_service : public service_base >, public win_iocp_socket_service_base { public: // The protocol type. typedef Protocol protocol_type; // The endpoint type. typedef typename Protocol::endpoint endpoint_type; // The native type of a socket. class native_handle_type { public: native_handle_type(socket_type s) : socket_(s), have_remote_endpoint_(false) { } native_handle_type(socket_type s, const endpoint_type& ep) : socket_(s), have_remote_endpoint_(true), remote_endpoint_(ep) { } void operator=(socket_type s) { socket_ = s; have_remote_endpoint_ = false; remote_endpoint_ = endpoint_type(); } operator socket_type() const { return socket_; } bool have_remote_endpoint() const { return have_remote_endpoint_; } endpoint_type remote_endpoint() const { return remote_endpoint_; } private: socket_type socket_; bool have_remote_endpoint_; endpoint_type remote_endpoint_; }; // The implementation type of the socket. struct implementation_type : win_iocp_socket_service_base::base_implementation_type { // Default constructor. implementation_type() : protocol_(endpoint_type().protocol()), have_remote_endpoint_(false), remote_endpoint_() { } // The protocol associated with the socket. protocol_type protocol_; // Whether we have a cached remote endpoint. bool have_remote_endpoint_; // A cached remote endpoint. endpoint_type remote_endpoint_; }; // Constructor. win_iocp_socket_service(asio::io_context& io_context) : service_base >(io_context), win_iocp_socket_service_base(io_context) { } // Destroy all user-defined handler objects owned by the service. void shutdown() { this->base_shutdown(); } // Move-construct a new socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { this->base_move_construct(impl, other_impl); impl.protocol_ = other_impl.protocol_; other_impl.protocol_ = endpoint_type().protocol(); impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_; other_impl.have_remote_endpoint_ = false; impl.remote_endpoint_ = other_impl.remote_endpoint_; other_impl.remote_endpoint_ = endpoint_type(); } // Move-assign from another socket implementation. void move_assign(implementation_type& impl, win_iocp_socket_service_base& other_service, implementation_type& other_impl) { this->base_move_assign(impl, other_service, other_impl); impl.protocol_ = other_impl.protocol_; other_impl.protocol_ = endpoint_type().protocol(); impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_; other_impl.have_remote_endpoint_ = false; impl.remote_endpoint_ = other_impl.remote_endpoint_; other_impl.remote_endpoint_ = endpoint_type(); } // Move-construct a new socket implementation from another protocol type. template void converting_move_construct(implementation_type& impl, win_iocp_socket_service&, typename win_iocp_socket_service< Protocol1>::implementation_type& other_impl) { this->base_move_construct(impl, other_impl); impl.protocol_ = protocol_type(other_impl.protocol_); other_impl.protocol_ = typename Protocol1::endpoint().protocol(); impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_; other_impl.have_remote_endpoint_ = false; impl.remote_endpoint_ = other_impl.remote_endpoint_; other_impl.remote_endpoint_ = typename Protocol1::endpoint(); } // Open a new socket implementation. asio::error_code open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (!do_open(impl, protocol.family(), protocol.type(), protocol.protocol(), ec)) { impl.protocol_ = protocol; impl.have_remote_endpoint_ = false; impl.remote_endpoint_ = endpoint_type(); } return ec; } // Assign a native socket to a socket implementation. asio::error_code assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { if (!do_assign(impl, protocol.type(), native_socket, ec)) { impl.protocol_ = protocol; impl.have_remote_endpoint_ = native_socket.have_remote_endpoint(); impl.remote_endpoint_ = native_socket.remote_endpoint(); } return ec; } // Get the native socket representation. native_handle_type native_handle(implementation_type& impl) { if (impl.have_remote_endpoint_) return native_handle_type(impl.socket_, impl.remote_endpoint_); return native_handle_type(impl.socket_); } // Bind the socket to the specified local endpoint. asio::error_code bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { socket_ops::bind(impl.socket_, endpoint.data(), endpoint.size(), ec); return ec; } // Set a socket option. template asio::error_code set_option(implementation_type& impl, const Option& option, asio::error_code& ec) { socket_ops::setsockopt(impl.socket_, impl.state_, option.level(impl.protocol_), option.name(impl.protocol_), option.data(impl.protocol_), option.size(impl.protocol_), ec); return ec; } // Set a socket option. template asio::error_code get_option(const implementation_type& impl, Option& option, asio::error_code& ec) const { std::size_t size = option.size(impl.protocol_); socket_ops::getsockopt(impl.socket_, impl.state_, option.level(impl.protocol_), option.name(impl.protocol_), option.data(impl.protocol_), &size, ec); if (!ec) option.resize(impl.protocol_, size); return ec; } // Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { endpoint_type endpoint; std::size_t addr_len = endpoint.capacity(); if (socket_ops::getsockname(impl.socket_, endpoint.data(), &addr_len, ec)) return endpoint_type(); endpoint.resize(addr_len); return endpoint; } // Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { endpoint_type endpoint = impl.remote_endpoint_; std::size_t addr_len = endpoint.capacity(); if (socket_ops::getpeername(impl.socket_, endpoint.data(), &addr_len, impl.have_remote_endpoint_, ec)) return endpoint_type(); endpoint.resize(addr_len); return endpoint; } // Disable sends or receives on the socket. asio::error_code shutdown(base_implementation_type& impl, socket_base::shutdown_type what, asio::error_code& ec) { socket_ops::shutdown(impl.socket_, what, ec); return ec; } // Send a datagram to the specified endpoint. Returns the number of bytes // sent. template size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_sendto(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, destination.data(), destination.size(), ec); } // Wait until data can be sent without blocking. size_t send_to(implementation_type& impl, const null_buffers&, const endpoint_type&, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_send_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, buffers, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_send_to")); buffer_sequence_adapter bufs(buffers); start_send_to_op(impl, bufs.buffers(), bufs.count(), destination.data(), static_cast(destination.size()), flags, p.p); p.v = p.p = 0; } // Start an asynchronous wait until data can be sent without blocking. template void async_send_to(implementation_type& impl, const null_buffers&, const endpoint_type&, socket_base::message_flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_send_to(null_buffers)")); start_reactor_op(impl, select_reactor::write_op, p.p); p.v = p.p = 0; } // Receive a datagram with the endpoint of the sender. Returns the number of // bytes received. template size_t receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); std::size_t addr_len = sender_endpoint.capacity(); std::size_t bytes_recvd = socket_ops::sync_recvfrom( impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, sender_endpoint.data(), &addr_len, ec); if (!ec) sender_endpoint.resize(addr_len); return bytes_recvd; } // Wait until data can be received without blocking. size_t receive_from(implementation_type& impl, const null_buffers&, endpoint_type& sender_endpoint, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); // Reset endpoint since it can be given no sensible value at this time. sender_endpoint = endpoint_type(); return 0; } // Start an asynchronous receive. The buffer for the data being received and // the sender_endpoint object must both be valid for the lifetime of the // asynchronous operation. template void async_receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endp, socket_base::message_flags flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_recvfrom_op< MutableBufferSequence, endpoint_type, Handler> op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(sender_endp, impl.cancel_token_, buffers, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_receive_from")); buffer_sequence_adapter bufs(buffers); start_receive_from_op(impl, bufs.buffers(), bufs.count(), sender_endp.data(), flags, &p.p->endpoint_size(), p.p); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive_from(implementation_type& impl, const null_buffers&, endpoint_type& sender_endpoint, socket_base::message_flags flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_receive_from(null_buffers)")); // Reset endpoint since it can be given no sensible value at this time. sender_endpoint = endpoint_type(); start_null_buffers_receive_op(impl, flags, p.p); p.v = p.p = 0; } // Accept a new connection. template asio::error_code accept(implementation_type& impl, Socket& peer, endpoint_type* peer_endpoint, asio::error_code& ec) { // We cannot accept a socket that is already open. if (peer.is_open()) { ec = asio::error::already_open; return ec; } std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; socket_holder new_socket(socket_ops::sync_accept(impl.socket_, impl.state_, peer_endpoint ? peer_endpoint->data() : 0, peer_endpoint ? &addr_len : 0, ec)); // On success, assign new connection to peer socket object. if (new_socket.get() != invalid_socket) { if (peer_endpoint) peer_endpoint->resize(addr_len); peer.assign(impl.protocol_, new_socket.get(), ec); if (!ec) new_socket.release(); } return ec; } #if defined(ASIO_HAS_MOVE) // Accept a new connection. typename Protocol::socket accept(implementation_type& impl, io_context* peer_io_context, endpoint_type* peer_endpoint, asio::error_code& ec) { typename Protocol::socket peer( peer_io_context ? *peer_io_context : io_context_); std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; socket_holder new_socket(socket_ops::sync_accept(impl.socket_, impl.state_, peer_endpoint ? peer_endpoint->data() : 0, peer_endpoint ? &addr_len : 0, ec)); // On success, assign new connection to peer socket object. if (new_socket.get() != invalid_socket) { if (peer_endpoint) peer_endpoint->resize(addr_len); peer.assign(impl.protocol_, new_socket.get(), ec); if (!ec) new_socket.release(); } return peer; } #endif // defined(ASIO_HAS_MOVE) // Start an asynchronous accept. The peer and peer_endpoint objects // must be valid until the accept's handler is invoked. template void async_accept(implementation_type& impl, Socket& peer, endpoint_type* peer_endpoint, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_accept_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; bool enable_connection_aborted = (impl.state_ & socket_ops::enable_connection_aborted) != 0; p.p = new (p.v) op(*this, impl.socket_, peer, impl.protocol_, peer_endpoint, enable_connection_aborted, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_accept")); start_accept_op(impl, peer.is_open(), p.p->new_socket(), impl.protocol_.family(), impl.protocol_.type(), impl.protocol_.protocol(), p.p->output_buffer(), p.p->address_length(), p.p); p.v = p.p = 0; } #if defined(ASIO_HAS_MOVE) // Start an asynchronous accept. The peer and peer_endpoint objects // must be valid until the accept's handler is invoked. template void async_accept(implementation_type& impl, asio::io_context* peer_io_context, endpoint_type* peer_endpoint, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_move_accept_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; bool enable_connection_aborted = (impl.state_ & socket_ops::enable_connection_aborted) != 0; p.p = new (p.v) op(*this, impl.socket_, impl.protocol_, peer_io_context ? *peer_io_context : io_context_, peer_endpoint, enable_connection_aborted, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_accept")); start_accept_op(impl, false, p.p->new_socket(), impl.protocol_.family(), impl.protocol_.type(), impl.protocol_.protocol(), p.p->output_buffer(), p.p->address_length(), p.p); p.v = p.p = 0; } #endif // defined(ASIO_HAS_MOVE) // Connect the socket to the specified endpoint. asio::error_code connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { socket_ops::sync_connect(impl.socket_, peer_endpoint.data(), peer_endpoint.size(), ec); return ec; } // Start an asynchronous connect. template void async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_connect_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.socket_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_connect")); start_connect_op(impl, impl.protocol_.family(), impl.protocol_.type(), peer_endpoint.data(), static_cast(peer_endpoint.size()), p.p); p.v = p.p = 0; } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/detail/win_iocp_socket_service_base.hpp000066400000000000000000000531701340672067200247670ustar00rootroot00000000000000// // detail/win_iocp_socket_service_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_BASE_HPP #define ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/socket_base.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/select_reactor.hpp" #include "asio/detail/socket_holder.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/win_iocp_io_context.hpp" #include "asio/detail/win_iocp_null_buffers_op.hpp" #include "asio/detail/win_iocp_socket_connect_op.hpp" #include "asio/detail/win_iocp_socket_send_op.hpp" #include "asio/detail/win_iocp_socket_recv_op.hpp" #include "asio/detail/win_iocp_socket_recvmsg_op.hpp" #include "asio/detail/win_iocp_wait_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_iocp_socket_service_base { public: // The implementation type of the socket. struct base_implementation_type { // The native socket representation. socket_type socket_; // The current state of the socket. socket_ops::state_type state_; // We use a shared pointer as a cancellation token here to work around the // broken Windows support for cancellation. MSDN says that when you call // closesocket any outstanding WSARecv or WSASend operations will complete // with the error ERROR_OPERATION_ABORTED. In practice they complete with // ERROR_NETNAME_DELETED, which means you can't tell the difference between // a local cancellation and the socket being hard-closed by the peer. socket_ops::shared_cancel_token_type cancel_token_; // Per-descriptor data used by the reactor. select_reactor::per_descriptor_data reactor_data_; #if defined(ASIO_ENABLE_CANCELIO) // The ID of the thread from which it is safe to cancel asynchronous // operations. 0 means no asynchronous operations have been started yet. // ~0 means asynchronous operations have been started from more than one // thread, and cancellation is not supported for the socket. DWORD safe_cancellation_thread_id_; #endif // defined(ASIO_ENABLE_CANCELIO) // Pointers to adjacent socket implementations in linked list. base_implementation_type* next_; base_implementation_type* prev_; }; // Constructor. ASIO_DECL win_iocp_socket_service_base( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void base_shutdown(); // Construct a new socket implementation. ASIO_DECL void construct(base_implementation_type& impl); // Move-construct a new socket implementation. ASIO_DECL void base_move_construct(base_implementation_type& impl, base_implementation_type& other_impl); // Move-assign from another socket implementation. ASIO_DECL void base_move_assign(base_implementation_type& impl, win_iocp_socket_service_base& other_service, base_implementation_type& other_impl); // Destroy a socket implementation. ASIO_DECL void destroy(base_implementation_type& impl); // Determine whether the socket is open. bool is_open(const base_implementation_type& impl) const { return impl.socket_ != invalid_socket; } // Destroy a socket implementation. ASIO_DECL asio::error_code close( base_implementation_type& impl, asio::error_code& ec); // Release ownership of the socket. ASIO_DECL socket_type release( base_implementation_type& impl, asio::error_code& ec); // Cancel all operations associated with the socket. ASIO_DECL asio::error_code cancel( base_implementation_type& impl, asio::error_code& ec); // Determine whether the socket is at the out-of-band data mark. bool at_mark(const base_implementation_type& impl, asio::error_code& ec) const { return socket_ops::sockatmark(impl.socket_, ec); } // Determine the number of bytes available for reading. std::size_t available(const base_implementation_type& impl, asio::error_code& ec) const { return socket_ops::available(impl.socket_, ec); } // Place the socket into the state where it will listen for new connections. asio::error_code listen(base_implementation_type& impl, int backlog, asio::error_code& ec) { socket_ops::listen(impl.socket_, backlog, ec); return ec; } // Perform an IO control command on the socket. template asio::error_code io_control(base_implementation_type& impl, IO_Control_Command& command, asio::error_code& ec) { socket_ops::ioctl(impl.socket_, impl.state_, command.name(), static_cast(command.data()), ec); return ec; } // Gets the non-blocking mode of the socket. bool non_blocking(const base_implementation_type& impl) const { return (impl.state_ & socket_ops::user_set_non_blocking) != 0; } // Sets the non-blocking mode of the socket. asio::error_code non_blocking(base_implementation_type& impl, bool mode, asio::error_code& ec) { socket_ops::set_user_non_blocking(impl.socket_, impl.state_, mode, ec); return ec; } // Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const base_implementation_type& impl) const { return (impl.state_ & socket_ops::internal_non_blocking) != 0; } // Sets the non-blocking mode of the native socket implementation. asio::error_code native_non_blocking(base_implementation_type& impl, bool mode, asio::error_code& ec) { socket_ops::set_internal_non_blocking(impl.socket_, impl.state_, mode, ec); return ec; } // Wait for the socket to become ready to read, ready to write, or to have // pending error conditions. asio::error_code wait(base_implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { switch (w) { case socket_base::wait_read: socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); break; case socket_base::wait_write: socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); break; case socket_base::wait_error: socket_ops::poll_error(impl.socket_, impl.state_, -1, ec); break; default: ec = asio::error::invalid_argument; break; } return ec; } // Asynchronously wait for the socket to become ready to read, ready to // write, or to have pending error conditions. template void async_wait(base_implementation_type& impl, socket_base::wait_type w, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef win_iocp_wait_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_wait")); switch (w) { case socket_base::wait_read: start_null_buffers_receive_op(impl, 0, p.p); break; case socket_base::wait_write: start_reactor_op(impl, select_reactor::write_op, p.p); break; case socket_base::wait_error: start_reactor_op(impl, select_reactor::except_op, p.p); break; default: p.p->ec_ = asio::error::invalid_argument; iocp_service_.post_immediate_completion(p.p, is_continuation); break; } p.v = p.p = 0; } // Send the given data to the peer. Returns the number of bytes sent. template size_t send(base_implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_send(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); } // Wait until data can be sent without blocking. size_t send(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send(base_implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_send_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, buffers, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_send")); buffer_sequence_adapter bufs(buffers); start_send_op(impl, bufs.buffers(), bufs.count(), flags, (impl.state_ & socket_ops::stream_oriented) != 0 && bufs.all_empty(), p.p); p.v = p.p = 0; } // Start an asynchronous wait until data can be sent without blocking. template void async_send(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_send(null_buffers)")); start_reactor_op(impl, select_reactor::write_op, p.p); p.v = p.p = 0; } // Receive some data from the peer. Returns the number of bytes received. template size_t receive(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_recv(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); } // Wait until data can be received without blocking. size_t receive(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_recv_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.state_, impl.cancel_token_, buffers, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_receive")); buffer_sequence_adapter bufs(buffers); start_receive_op(impl, bufs.buffers(), bufs.count(), flags, (impl.state_ & socket_ops::stream_oriented) != 0 && bufs.all_empty(), p.p); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive(base_implementation_type& impl, const null_buffers&, socket_base::message_flags flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_receive(null_buffers)")); start_null_buffers_receive_op(impl, flags, p.p); p.v = p.p = 0; } // Receive some data with associated flags. Returns the number of bytes // received. template size_t receive_with_flags(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, asio::error_code& ec) { buffer_sequence_adapter bufs(buffers); return socket_ops::sync_recvmsg(impl.socket_, impl.state_, bufs.buffers(), bufs.count(), in_flags, out_flags, ec); } // Wait until data can be received without blocking. size_t receive_with_flags(base_implementation_type& impl, const null_buffers&, socket_base::message_flags, socket_base::message_flags& out_flags, asio::error_code& ec) { // Wait for socket to become ready. socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); // Clear out_flags, since we cannot give it any other sensible value when // performing a null_buffers operation. out_flags = 0; return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive_with_flags(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_socket_recvmsg_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, buffers, out_flags, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_receive_with_flags")); buffer_sequence_adapter bufs(buffers); start_receive_op(impl, bufs.buffers(), bufs.count(), in_flags, false, p.p); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive_with_flags(base_implementation_type& impl, const null_buffers&, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef win_iocp_null_buffers_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(impl.cancel_token_, handler); ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", &impl, impl.socket_, "async_receive_with_flags(null_buffers)")); // Reset out_flags since it can be given no sensible value at this time. out_flags = 0; start_null_buffers_receive_op(impl, in_flags, p.p); p.v = p.p = 0; } // Helper function to restart an asynchronous accept operation. ASIO_DECL void restart_accept_op(socket_type s, socket_holder& new_socket, int family, int type, int protocol, void* output_buffer, DWORD address_length, operation* op); protected: // Open a new socket implementation. ASIO_DECL asio::error_code do_open( base_implementation_type& impl, int family, int type, int protocol, asio::error_code& ec); // Assign a native socket to a socket implementation. ASIO_DECL asio::error_code do_assign( base_implementation_type& impl, int type, socket_type native_socket, asio::error_code& ec); // Helper function to start an asynchronous send operation. ASIO_DECL void start_send_op(base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, socket_base::message_flags flags, bool noop, operation* op); // Helper function to start an asynchronous send_to operation. ASIO_DECL void start_send_to_op(base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, const socket_addr_type* addr, int addrlen, socket_base::message_flags flags, operation* op); // Helper function to start an asynchronous receive operation. ASIO_DECL void start_receive_op(base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, socket_base::message_flags flags, bool noop, operation* op); // Helper function to start an asynchronous null_buffers receive operation. ASIO_DECL void start_null_buffers_receive_op( base_implementation_type& impl, socket_base::message_flags flags, reactor_op* op); // Helper function to start an asynchronous receive_from operation. ASIO_DECL void start_receive_from_op(base_implementation_type& impl, WSABUF* buffers, std::size_t buffer_count, socket_addr_type* addr, socket_base::message_flags flags, int* addrlen, operation* op); // Helper function to start an asynchronous accept operation. ASIO_DECL void start_accept_op(base_implementation_type& impl, bool peer_is_open, socket_holder& new_socket, int family, int type, int protocol, void* output_buffer, DWORD address_length, operation* op); // Start an asynchronous read or write operation using the reactor. ASIO_DECL void start_reactor_op(base_implementation_type& impl, int op_type, reactor_op* op); // Start the asynchronous connect operation using the reactor. ASIO_DECL void start_connect_op(base_implementation_type& impl, int family, int type, const socket_addr_type* remote_addr, std::size_t remote_addrlen, win_iocp_socket_connect_op_base* op); // Helper function to close a socket when the associated object is being // destroyed. ASIO_DECL void close_for_destruction(base_implementation_type& impl); // Update the ID of the thread from which cancellation is safe. ASIO_DECL void update_cancellation_thread_id( base_implementation_type& impl); // Helper function to get the reactor. If no reactor has been created yet, a // new one is obtained from the io_context and a pointer to it is cached in // this service. ASIO_DECL select_reactor& get_reactor(); // The type of a ConnectEx function pointer, as old SDKs may not provide it. typedef BOOL (PASCAL *connect_ex_fn)(SOCKET, const socket_addr_type*, int, void*, DWORD, DWORD*, OVERLAPPED*); // Helper function to get the ConnectEx pointer. If no ConnectEx pointer has // been obtained yet, one is obtained using WSAIoctl and the pointer is // cached. Returns a null pointer if ConnectEx is not available. ASIO_DECL connect_ex_fn get_connect_ex( base_implementation_type& impl, int type); // The type of a NtSetInformationFile function pointer. typedef LONG (NTAPI *nt_set_info_fn)(HANDLE, ULONG_PTR*, void*, ULONG, ULONG); // Helper function to get the NtSetInformationFile function pointer. If no // NtSetInformationFile pointer has been obtained yet, one is obtained using // GetProcAddress and the pointer is cached. Returns a null pointer if // NtSetInformationFile is not available. ASIO_DECL nt_set_info_fn get_nt_set_info(); // Helper function to emulate InterlockedCompareExchangePointer functionality // for: // - very old Platform SDKs; and // - platform SDKs where MSVC's /Wp64 option causes spurious warnings. ASIO_DECL void* interlocked_compare_exchange_pointer( void** dest, void* exch, void* cmp); // Helper function to emulate InterlockedExchangePointer functionality for: // - very old Platform SDKs; and // - platform SDKs where MSVC's /Wp64 option causes spurious warnings. ASIO_DECL void* interlocked_exchange_pointer(void** dest, void* val); // The io_context used to obtain the reactor, if required. asio::io_context& io_context_; // The IOCP service used for running asynchronous operations and dispatching // handlers. win_iocp_io_context& iocp_service_; // The reactor used for performing connect operations. This object is created // only if needed. select_reactor* reactor_; // Pointer to ConnectEx implementation. void* connect_ex_; // Pointer to NtSetInformationFile implementation. void* nt_set_info_; // Mutex to protect access to the linked list of implementations. asio::detail::mutex mutex_; // The head of a linked list of all implementations. base_implementation_type* impl_list_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_iocp_socket_service_base.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_BASE_HPP asio-1.12.2/include/asio/detail/win_iocp_thread_info.hpp000066400000000000000000000014741340672067200232470ustar00rootroot00000000000000// // detail/win_iocp_thread_info.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_THREAD_INFO_HPP #define ASIO_DETAIL_WIN_IOCP_THREAD_INFO_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/thread_info_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct win_iocp_thread_info : public thread_info_base { }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WIN_IOCP_THREAD_INFO_HPP asio-1.12.2/include/asio/detail/win_iocp_wait_op.hpp000066400000000000000000000066261340672067200224330ustar00rootroot00000000000000// // detail/win_iocp_wait_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP #define ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_IOCP) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/reactor_op.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class win_iocp_wait_op : public reactor_op { public: ASIO_DEFINE_HANDLER_PTR(win_iocp_wait_op); win_iocp_wait_op(socket_ops::weak_cancel_token_type cancel_token, Handler& handler) : reactor_op(&win_iocp_wait_op::do_perform, &win_iocp_wait_op::do_complete), cancel_token_(cancel_token), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static status do_perform(reactor_op*) { return done; } static void do_complete(void* owner, operation* base, const asio::error_code& result_ec, std::size_t /*bytes_transferred*/) { asio::error_code ec(result_ec); // Take ownership of the operation object. win_iocp_wait_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // The reactor may have stored a result in the operation object. if (o->ec_) ec = o->ec_; // Map non-portable errors to their portable counterparts. if (ec.value() == ERROR_NETNAME_DELETED) { if (o->cancel_token_.expired()) ec = asio::error::operation_aborted; else ec = asio::error::connection_reset; } else if (ec.value() == ERROR_PORT_UNREACHABLE) { ec = asio::error::connection_refused; } // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, ec); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: socket_ops::weak_cancel_token_type cancel_token_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_IOCP) #endif // ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP asio-1.12.2/include/asio/detail/win_mutex.hpp000066400000000000000000000032321340672067200211070ustar00rootroot00000000000000// // detail/win_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_MUTEX_HPP #define ASIO_DETAIL_WIN_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_lock.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_mutex : private noncopyable { public: typedef asio::detail::scoped_lock scoped_lock; // Constructor. ASIO_DECL win_mutex(); // Destructor. ~win_mutex() { ::DeleteCriticalSection(&crit_section_); } // Lock the mutex. void lock() { ::EnterCriticalSection(&crit_section_); } // Unlock the mutex. void unlock() { ::LeaveCriticalSection(&crit_section_); } private: // Initialisation must be performed in a separate function to the constructor // since the compiler does not support the use of structured exceptions and // C++ exceptions in the same function. ASIO_DECL int do_init(); ::CRITICAL_SECTION crit_section_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_mutex.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_WIN_MUTEX_HPP asio-1.12.2/include/asio/detail/win_object_handle_service.hpp000066400000000000000000000130771340672067200242560ustar00rootroot00000000000000// // detail/win_object_handle_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2011 Boris Schaeling (boris@highscore.de) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_OBJECT_HANDLE_SERVICE_HPP #define ASIO_DETAIL_WIN_OBJECT_HANDLE_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/wait_handler.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class win_object_handle_service : public service_base { public: // The native type of an object handle. typedef HANDLE native_handle_type; // The implementation type of the object handle. class implementation_type { public: // Default constructor. implementation_type() : handle_(INVALID_HANDLE_VALUE), wait_handle_(INVALID_HANDLE_VALUE), owner_(0), next_(0), prev_(0) { } private: // Only this service will have access to the internal values. friend class win_object_handle_service; // The native object handle representation. May be accessed or modified // without locking the mutex. native_handle_type handle_; // The handle used to unregister the wait operation. The mutex must be // locked when accessing or modifying this member. HANDLE wait_handle_; // The operations waiting on the object handle. If there is a registered // wait then the mutex must be locked when accessing or modifying this // member op_queue op_queue_; // The service instance that owns the object handle implementation. win_object_handle_service* owner_; // Pointers to adjacent handle implementations in linked list. The mutex // must be locked when accessing or modifying these members. implementation_type* next_; implementation_type* prev_; }; // Constructor. ASIO_DECL win_object_handle_service( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Construct a new handle implementation. ASIO_DECL void construct(implementation_type& impl); // Move-construct a new handle implementation. ASIO_DECL void move_construct(implementation_type& impl, implementation_type& other_impl); // Move-assign from another handle implementation. ASIO_DECL void move_assign(implementation_type& impl, win_object_handle_service& other_service, implementation_type& other_impl); // Destroy a handle implementation. ASIO_DECL void destroy(implementation_type& impl); // Assign a native handle to a handle implementation. ASIO_DECL asio::error_code assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec); // Determine whether the handle is open. bool is_open(const implementation_type& impl) const { return impl.handle_ != INVALID_HANDLE_VALUE && impl.handle_ != 0; } // Destroy a handle implementation. ASIO_DECL asio::error_code close(implementation_type& impl, asio::error_code& ec); // Get the native handle representation. native_handle_type native_handle(const implementation_type& impl) const { return impl.handle_; } // Cancel all operations associated with the handle. ASIO_DECL asio::error_code cancel(implementation_type& impl, asio::error_code& ec); // Perform a synchronous wait for the object to enter a signalled state. ASIO_DECL void wait(implementation_type& impl, asio::error_code& ec); /// Start an asynchronous wait. template void async_wait(implementation_type& impl, Handler& handler) { // Allocate and construct an operation to wrap the handler. typedef wait_handler op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "object_handle", &impl, reinterpret_cast(impl.wait_handle_), "async_wait")); start_wait_op(impl, p.p); p.v = p.p = 0; } private: // Helper function to start an asynchronous wait operation. ASIO_DECL void start_wait_op(implementation_type& impl, wait_op* op); // Helper function to register a wait operation. ASIO_DECL void register_wait_callback( implementation_type& impl, mutex::scoped_lock& lock); // Callback function invoked when the registered wait completes. static ASIO_DECL VOID CALLBACK wait_callback( PVOID param, BOOLEAN timeout); // The io_context implementation used to post completions. io_context_impl& io_context_; // Mutex to protect access to internal state. mutex mutex_; // The head of a linked list of all implementations. implementation_type* impl_list_; // Flag to indicate that the dispatcher has been shut down. bool shutdown_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_object_handle_service.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) #endif // ASIO_DETAIL_WIN_OBJECT_HANDLE_SERVICE_HPP asio-1.12.2/include/asio/detail/win_static_mutex.hpp000066400000000000000000000034031340672067200224560ustar00rootroot00000000000000// // detail/win_static_mutex.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_STATIC_MUTEX_HPP #define ASIO_DETAIL_WIN_STATIC_MUTEX_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/scoped_lock.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct win_static_mutex { typedef asio::detail::scoped_lock scoped_lock; // Initialise the mutex. ASIO_DECL void init(); // Initialisation must be performed in a separate function to the "public" // init() function since the compiler does not support the use of structured // exceptions and C++ exceptions in the same function. ASIO_DECL int do_init(); // Lock the mutex. void lock() { ::EnterCriticalSection(&crit_section_); } // Unlock the mutex. void unlock() { ::LeaveCriticalSection(&crit_section_); } bool initialised_; ::CRITICAL_SECTION crit_section_; }; #if defined(UNDER_CE) # define ASIO_WIN_STATIC_MUTEX_INIT { false, { 0, 0, 0, 0, 0 } } #else // defined(UNDER_CE) # define ASIO_WIN_STATIC_MUTEX_INIT { false, { 0, 0, 0, 0, 0, 0 } } #endif // defined(UNDER_CE) } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_static_mutex.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_WIN_STATIC_MUTEX_HPP asio-1.12.2/include/asio/detail/win_thread.hpp000066400000000000000000000057441340672067200212260ustar00rootroot00000000000000// // detail/win_thread.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_THREAD_HPP #define ASIO_DETAIL_WIN_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) \ && !defined(ASIO_WINDOWS_APP) \ && !defined(UNDER_CE) #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { ASIO_DECL unsigned int __stdcall win_thread_function(void* arg); #if defined(WINVER) && (WINVER < 0x0500) ASIO_DECL void __stdcall apc_function(ULONG data); #else ASIO_DECL void __stdcall apc_function(ULONG_PTR data); #endif template class win_thread_base { public: static bool terminate_threads() { return ::InterlockedExchangeAdd(&terminate_threads_, 0) != 0; } static void set_terminate_threads(bool b) { ::InterlockedExchange(&terminate_threads_, b ? 1 : 0); } private: static long terminate_threads_; }; template long win_thread_base::terminate_threads_ = 0; class win_thread : private noncopyable, public win_thread_base { public: // Constructor. template win_thread(Function f, unsigned int stack_size = 0) : thread_(0), exit_event_(0) { start_thread(new func(f), stack_size); } // Destructor. ASIO_DECL ~win_thread(); // Wait for the thread to exit. ASIO_DECL void join(); // Get number of CPUs. ASIO_DECL static std::size_t hardware_concurrency(); private: friend ASIO_DECL unsigned int __stdcall win_thread_function(void* arg); #if defined(WINVER) && (WINVER < 0x0500) friend ASIO_DECL void __stdcall apc_function(ULONG); #else friend ASIO_DECL void __stdcall apc_function(ULONG_PTR); #endif class func_base { public: virtual ~func_base() {} virtual void run() = 0; ::HANDLE entry_event_; ::HANDLE exit_event_; }; struct auto_func_base_ptr { func_base* ptr; ~auto_func_base_ptr() { delete ptr; } }; template class func : public func_base { public: func(Function f) : f_(f) { } virtual void run() { f_(); } private: Function f_; }; ASIO_DECL void start_thread(func_base* arg, unsigned int stack_size); ::HANDLE thread_; ::HANDLE exit_event_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_thread.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) // && !defined(ASIO_WINDOWS_APP) // && !defined(UNDER_CE) #endif // ASIO_DETAIL_WIN_THREAD_HPP asio-1.12.2/include/asio/detail/win_tss_ptr.hpp000066400000000000000000000031251340672067200214440ustar00rootroot00000000000000// // detail/win_tss_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WIN_TSS_PTR_HPP #define ASIO_DETAIL_WIN_TSS_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) #include "asio/detail/noncopyable.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { // Helper function to create thread-specific storage. ASIO_DECL DWORD win_tss_ptr_create(); template class win_tss_ptr : private noncopyable { public: // Constructor. win_tss_ptr() : tss_key_(win_tss_ptr_create()) { } // Destructor. ~win_tss_ptr() { ::TlsFree(tss_key_); } // Get the value. operator T*() const { return static_cast(::TlsGetValue(tss_key_)); } // Set the value. void operator=(T* value) { ::TlsSetValue(tss_key_, value); } private: // Thread-specific storage to allow unlocked access to determine whether a // thread is a member of the pool. DWORD tss_key_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/win_tss_ptr.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) #endif // ASIO_DETAIL_WIN_TSS_PTR_HPP asio-1.12.2/include/asio/detail/winapp_thread.hpp000066400000000000000000000050341340672067200217170ustar00rootroot00000000000000// // detail/winapp_thread.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINAPP_THREAD_HPP #define ASIO_DETAIL_WINAPP_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) && defined(ASIO_WINDOWS_APP) #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { DWORD WINAPI winapp_thread_function(LPVOID arg); class winapp_thread : private noncopyable { public: // Constructor. template winapp_thread(Function f, unsigned int = 0) { scoped_ptr arg(new func(f)); DWORD thread_id = 0; thread_ = ::CreateThread(0, 0, winapp_thread_function, arg.get(), 0, &thread_id); if (!thread_) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "thread"); } arg.release(); } // Destructor. ~winapp_thread() { ::CloseHandle(thread_); } // Wait for the thread to exit. void join() { ::WaitForSingleObjectEx(thread_, INFINITE, false); } // Get number of CPUs. static std::size_t hardware_concurrency() { SYSTEM_INFO system_info; ::GetNativeSystemInfo(&system_info); return system_info.dwNumberOfProcessors; } private: friend DWORD WINAPI winapp_thread_function(LPVOID arg); class func_base { public: virtual ~func_base() {} virtual void run() = 0; }; template class func : public func_base { public: func(Function f) : f_(f) { } virtual void run() { f_(); } private: Function f_; }; ::HANDLE thread_; }; inline DWORD WINAPI winapp_thread_function(LPVOID arg) { scoped_ptr func( static_cast(arg)); func->run(); return 0; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) && defined(ASIO_WINDOWS_APP) #endif // ASIO_DETAIL_WINAPP_THREAD_HPP asio-1.12.2/include/asio/detail/wince_thread.hpp000066400000000000000000000047571340672067200215410ustar00rootroot00000000000000// // detail/wince_thread.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINCE_THREAD_HPP #define ASIO_DETAIL_WINCE_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) && defined(UNDER_CE) #include "asio/detail/noncopyable.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { DWORD WINAPI wince_thread_function(LPVOID arg); class wince_thread : private noncopyable { public: // Constructor. template wince_thread(Function f, unsigned int = 0) { scoped_ptr arg(new func(f)); DWORD thread_id = 0; thread_ = ::CreateThread(0, 0, wince_thread_function, arg.get(), 0, &thread_id); if (!thread_) { DWORD last_error = ::GetLastError(); asio::error_code ec(last_error, asio::error::get_system_category()); asio::detail::throw_error(ec, "thread"); } arg.release(); } // Destructor. ~wince_thread() { ::CloseHandle(thread_); } // Wait for the thread to exit. void join() { ::WaitForSingleObject(thread_, INFINITE); } // Get number of CPUs. static std::size_t hardware_concurrency() { SYSTEM_INFO system_info; ::GetSystemInfo(&system_info); return system_info.dwNumberOfProcessors; } private: friend DWORD WINAPI wince_thread_function(LPVOID arg); class func_base { public: virtual ~func_base() {} virtual void run() = 0; }; template class func : public func_base { public: func(Function f) : f_(f) { } virtual void run() { f_(); } private: Function f_; }; ::HANDLE thread_; }; inline DWORD WINAPI wince_thread_function(LPVOID arg) { scoped_ptr func( static_cast(arg)); func->run(); return 0; } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS) && defined(UNDER_CE) #endif // ASIO_DETAIL_WINCE_THREAD_HPP asio-1.12.2/include/asio/detail/winrt_async_manager.hpp000066400000000000000000000202541340672067200231250ustar00rootroot00000000000000// // detail/winrt_async_manager.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_ASYNC_MANAGER_HPP #define ASIO_DETAIL_WINRT_ASYNC_MANAGER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include #include "asio/detail/atomic_count.hpp" #include "asio/detail/winrt_async_op.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class winrt_async_manager : public asio::detail::service_base { public: // Constructor. winrt_async_manager(asio::io_context& io_context) : asio::detail::service_base(io_context), io_context_(use_service(io_context)), outstanding_ops_(1) { } // Destructor. ~winrt_async_manager() { } // Destroy all user-defined handler objects owned by the service. void shutdown() { if (--outstanding_ops_ > 0) { // Block until last operation is complete. std::future f = promise_.get_future(); f.wait(); } } void sync(Windows::Foundation::IAsyncAction^ action, asio::error_code& ec) { using namespace Windows::Foundation; using Windows::Foundation::AsyncStatus; auto promise = std::make_shared>(); auto future = promise->get_future(); action->Completed = ref new AsyncActionCompletedHandler( [promise](IAsyncAction^ action, AsyncStatus status) { switch (status) { case AsyncStatus::Canceled: promise->set_value(asio::error::operation_aborted); break; case AsyncStatus::Error: case AsyncStatus::Completed: default: asio::error_code ec( action->ErrorCode.Value, asio::system_category()); promise->set_value(ec); break; } }); ec = future.get(); } template TResult sync(Windows::Foundation::IAsyncOperation^ operation, asio::error_code& ec) { using namespace Windows::Foundation; using Windows::Foundation::AsyncStatus; auto promise = std::make_shared>(); auto future = promise->get_future(); operation->Completed = ref new AsyncOperationCompletedHandler( [promise](IAsyncOperation^ operation, AsyncStatus status) { switch (status) { case AsyncStatus::Canceled: promise->set_value(asio::error::operation_aborted); break; case AsyncStatus::Error: case AsyncStatus::Completed: default: asio::error_code ec( operation->ErrorCode.Value, asio::system_category()); promise->set_value(ec); break; } }); ec = future.get(); return operation->GetResults(); } template TResult sync( Windows::Foundation::IAsyncOperationWithProgress< TResult, TProgress>^ operation, asio::error_code& ec) { using namespace Windows::Foundation; using Windows::Foundation::AsyncStatus; auto promise = std::make_shared>(); auto future = promise->get_future(); operation->Completed = ref new AsyncOperationWithProgressCompletedHandler( [promise](IAsyncOperationWithProgress^ operation, AsyncStatus status) { switch (status) { case AsyncStatus::Canceled: promise->set_value(asio::error::operation_aborted); break; case AsyncStatus::Started: break; case AsyncStatus::Error: case AsyncStatus::Completed: default: asio::error_code ec( operation->ErrorCode.Value, asio::system_category()); promise->set_value(ec); break; } }); ec = future.get(); return operation->GetResults(); } void async(Windows::Foundation::IAsyncAction^ action, winrt_async_op* handler) { using namespace Windows::Foundation; using Windows::Foundation::AsyncStatus; auto on_completed = ref new AsyncActionCompletedHandler( [this, handler](IAsyncAction^ action, AsyncStatus status) { switch (status) { case AsyncStatus::Canceled: handler->ec_ = asio::error::operation_aborted; break; case AsyncStatus::Started: return; case AsyncStatus::Completed: case AsyncStatus::Error: default: handler->ec_ = asio::error_code( action->ErrorCode.Value, asio::system_category()); break; } io_context_.post_deferred_completion(handler); if (--outstanding_ops_ == 0) promise_.set_value(); }); io_context_.work_started(); ++outstanding_ops_; action->Completed = on_completed; } template void async(Windows::Foundation::IAsyncOperation^ operation, winrt_async_op* handler) { using namespace Windows::Foundation; using Windows::Foundation::AsyncStatus; auto on_completed = ref new AsyncOperationCompletedHandler( [this, handler](IAsyncOperation^ operation, AsyncStatus status) { switch (status) { case AsyncStatus::Canceled: handler->ec_ = asio::error::operation_aborted; break; case AsyncStatus::Started: return; case AsyncStatus::Completed: handler->result_ = operation->GetResults(); // Fall through. case AsyncStatus::Error: default: handler->ec_ = asio::error_code( operation->ErrorCode.Value, asio::system_category()); break; } io_context_.post_deferred_completion(handler); if (--outstanding_ops_ == 0) promise_.set_value(); }); io_context_.work_started(); ++outstanding_ops_; operation->Completed = on_completed; } template void async( Windows::Foundation::IAsyncOperationWithProgress< TResult, TProgress>^ operation, winrt_async_op* handler) { using namespace Windows::Foundation; using Windows::Foundation::AsyncStatus; auto on_completed = ref new AsyncOperationWithProgressCompletedHandler( [this, handler](IAsyncOperationWithProgress< TResult, TProgress>^ operation, AsyncStatus status) { switch (status) { case AsyncStatus::Canceled: handler->ec_ = asio::error::operation_aborted; break; case AsyncStatus::Started: return; case AsyncStatus::Completed: handler->result_ = operation->GetResults(); // Fall through. case AsyncStatus::Error: default: handler->ec_ = asio::error_code( operation->ErrorCode.Value, asio::system_category()); break; } io_context_.post_deferred_completion(handler); if (--outstanding_ops_ == 0) promise_.set_value(); }); io_context_.work_started(); ++outstanding_ops_; operation->Completed = on_completed; } private: // The io_context implementation used to post completed handlers. io_context_impl& io_context_; // Count of outstanding operations. atomic_count outstanding_ops_; // Used to keep wait for outstanding operations to complete. std::promise promise_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_ASYNC_MANAGER_HPP asio-1.12.2/include/asio/detail/winrt_async_op.hpp000066400000000000000000000025541340672067200221340ustar00rootroot00000000000000// // detail/winrt_async_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_ASYNC_OP_HPP #define ASIO_DETAIL_WINRT_ASYNC_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/operation.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_async_op : public operation { public: // The error code to be passed to the completion handler. asio::error_code ec_; // The result of the operation, to be passed to the completion handler. TResult result_; protected: winrt_async_op(func_type complete_func) : operation(complete_func), result_() { } }; template <> class winrt_async_op : public operation { public: // The error code to be passed to the completion handler. asio::error_code ec_; protected: winrt_async_op(func_type complete_func) : operation(complete_func) { } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WINRT_ASYNC_OP_HPP asio-1.12.2/include/asio/detail/winrt_resolve_op.hpp000066400000000000000000000067431340672067200225020ustar00rootroot00000000000000// // detail/winrt_resolve_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_RESOLVE_OP_HPP #define ASIO_DETAIL_WINRT_RESOLVE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/bind_handler.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/winrt_async_op.hpp" #include "asio/ip/basic_resolver_results.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_resolve_op : public winrt_async_op< Windows::Foundation::Collections::IVectorView< Windows::Networking::EndpointPair^>^> { public: ASIO_DEFINE_HANDLER_PTR(winrt_resolve_op); typedef typename Protocol::endpoint endpoint_type; typedef asio::ip::basic_resolver_query query_type; typedef asio::ip::basic_resolver_results results_type; winrt_resolve_op(const query_type& query, Handler& handler) : winrt_async_op< Windows::Foundation::Collections::IVectorView< Windows::Networking::EndpointPair^>^>( &winrt_resolve_op::do_complete), query_(query), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code&, std::size_t) { // Take ownership of the operation object. winrt_resolve_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); results_type results = results_type(); if (!o->ec_) { try { results = results_type::create(o->result_, o->query_.hints(), o->query_.host_name(), o->query_.service_name()); } catch (Platform::Exception^ e) { o->ec_ = asio::error_code(e->HResult, asio::system_category()); } } // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, results); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: query_type query_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_RESOLVE_OP_HPP asio-1.12.2/include/asio/detail/winrt_resolver_service.hpp000066400000000000000000000125571340672067200237060ustar00rootroot00000000000000// // detail/winrt_resolver_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_RESOLVER_SERVICE_HPP #define ASIO_DETAIL_WINRT_RESOLVER_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_results.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/winrt_async_manager.hpp" #include "asio/detail/winrt_resolve_op.hpp" #include "asio/detail/winrt_utils.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_resolver_service : public service_base > { public: // The implementation type of the resolver. A cancellation token is used to // indicate to the asynchronous operation that the operation has been // cancelled. typedef socket_ops::shared_cancel_token_type implementation_type; // The endpoint type. typedef typename Protocol::endpoint endpoint_type; // The query type. typedef asio::ip::basic_resolver_query query_type; // The results type. typedef asio::ip::basic_resolver_results results_type; // Constructor. winrt_resolver_service(asio::io_context& io_context) : service_base >(io_context), io_context_(use_service(io_context)), async_manager_(use_service(io_context)) { } // Destructor. ~winrt_resolver_service() { } // Destroy all user-defined handler objects owned by the service. void shutdown() { } // Perform any fork-related housekeeping. void notify_fork(asio::io_context::fork_event) { } // Construct a new resolver implementation. void construct(implementation_type&) { } // Move-construct a new resolver implementation. void move_construct(implementation_type&, implementation_type&) { } // Move-assign from another resolver implementation. void move_assign(implementation_type&, winrt_resolver_service&, implementation_type&) { } // Destroy a resolver implementation. void destroy(implementation_type&) { } // Cancel pending asynchronous operations. void cancel(implementation_type&) { } // Resolve a query to a list of entries. results_type resolve(implementation_type&, const query_type& query, asio::error_code& ec) { try { using namespace Windows::Networking::Sockets; auto endpoint_pairs = async_manager_.sync( DatagramSocket::GetEndpointPairsAsync( winrt_utils::host_name(query.host_name()), winrt_utils::string(query.service_name())), ec); if (ec) return results_type(); return results_type::create( endpoint_pairs, query.hints(), query.host_name(), query.service_name()); } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); return results_type(); } } // Asynchronously resolve a query to a list of entries. template void async_resolve(implementation_type& impl, const query_type& query, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef winrt_resolve_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(query, handler); ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "resolver", &impl, 0, "async_resolve")); (void)impl; try { using namespace Windows::Networking::Sockets; async_manager_.async(DatagramSocket::GetEndpointPairsAsync( winrt_utils::host_name(query.host_name()), winrt_utils::string(query.service_name())), p.p); p.v = p.p = 0; } catch (Platform::Exception^ e) { p.p->ec_ = asio::error_code( e->HResult, asio::system_category()); io_context_.post_immediate_completion(p.p, is_continuation); p.v = p.p = 0; } } // Resolve an endpoint to a list of entries. results_type resolve(implementation_type&, const endpoint_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return results_type(); } // Asynchronously resolve an endpoint to a list of entries. template void async_resolve(implementation_type&, const endpoint_type&, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const results_type results; io_context_.get_io_context().post( detail::bind_handler(handler, ec, results)); } private: io_context_impl& io_context_; winrt_async_manager& async_manager_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_RESOLVER_SERVICE_HPP asio-1.12.2/include/asio/detail/winrt_socket_connect_op.hpp000066400000000000000000000053201340672067200240120ustar00rootroot00000000000000// // detail/winrt_socket_connect_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_SOCKET_CONNECT_OP_HPP #define ASIO_DETAIL_WINRT_SOCKET_CONNECT_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/winrt_async_op.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_socket_connect_op : public winrt_async_op { public: ASIO_DEFINE_HANDLER_PTR(winrt_socket_connect_op); winrt_socket_connect_op(Handler& handler) : winrt_async_op(&winrt_socket_connect_op::do_complete), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code&, std::size_t) { // Take ownership of the operation object. winrt_socket_connect_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder1 handler(o->handler_, o->ec_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_SOCKET_CONNECT_OP_HPP asio-1.12.2/include/asio/detail/winrt_socket_recv_op.hpp000066400000000000000000000067161340672067200233320ustar00rootroot00000000000000// // detail/winrt_socket_recv_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_SOCKET_RECV_OP_HPP #define ASIO_DETAIL_WINRT_SOCKET_RECV_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/winrt_async_op.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_socket_recv_op : public winrt_async_op { public: ASIO_DEFINE_HANDLER_PTR(winrt_socket_recv_op); winrt_socket_recv_op(const MutableBufferSequence& buffers, Handler& handler) : winrt_async_op( &winrt_socket_recv_op::do_complete), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code&, std::size_t) { // Take ownership of the operation object. winrt_socket_recv_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Check whether buffers are still valid. if (owner) { buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) std::size_t bytes_transferred = o->result_ ? o->result_->Length : 0; if (bytes_transferred == 0 && !o->ec_ && !buffer_sequence_adapter::all_empty(o->buffers_)) { o->ec_ = asio::error::eof; } // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, bytes_transferred); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: MutableBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_SOCKET_RECV_OP_HPP asio-1.12.2/include/asio/detail/winrt_socket_send_op.hpp000066400000000000000000000061571340672067200233230ustar00rootroot00000000000000// // detail/winrt_socket_send_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_SOCKET_SEND_OP_HPP #define ASIO_DETAIL_WINRT_SOCKET_SEND_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/bind_handler.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/winrt_async_op.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_socket_send_op : public winrt_async_op { public: ASIO_DEFINE_HANDLER_PTR(winrt_socket_send_op); winrt_socket_send_op(const ConstBufferSequence& buffers, Handler& handler) : winrt_async_op(&winrt_socket_send_op::do_complete), buffers_(buffers), handler_(ASIO_MOVE_CAST(Handler)(handler)) { handler_work::start(handler_); } static void do_complete(void* owner, operation* base, const asio::error_code&, std::size_t) { // Take ownership of the operation object. winrt_socket_send_op* o(static_cast(base)); ptr p = { asio::detail::addressof(o->handler_), o, o }; handler_work w(o->handler_); ASIO_HANDLER_COMPLETION((*o)); #if defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Check whether buffers are still valid. if (owner) { buffer_sequence_adapter::validate(o->buffers_); } #endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) // Make a copy of the handler so that the memory can be deallocated before // the upcall is made. Even if we're not about to make an upcall, a // sub-object of the handler may be the true owner of the memory associated // with the handler. Consequently, a local copy of the handler is required // to ensure that any owning sub-object remains valid until after we have // deallocated the memory here. detail::binder2 handler(o->handler_, o->ec_, o->result_); p.h = asio::detail::addressof(handler.handler_); p.reset(); // Make the upcall if required. if (owner) { fenced_block b(fenced_block::half); ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); w.complete(handler, handler.handler_); ASIO_HANDLER_INVOCATION_END; } } private: ConstBufferSequence buffers_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_SOCKET_SEND_OP_HPP asio-1.12.2/include/asio/detail/winrt_ssocket_service.hpp000066400000000000000000000151451340672067200235140ustar00rootroot00000000000000// // detail/winrt_ssocket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_SSOCKET_SERVICE_HPP #define ASIO_DETAIL_WINRT_SSOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/winrt_socket_connect_op.hpp" #include "asio/detail/winrt_ssocket_service_base.hpp" #include "asio/detail/winrt_utils.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class winrt_ssocket_service : public service_base >, public winrt_ssocket_service_base { public: // The protocol type. typedef Protocol protocol_type; // The endpoint type. typedef typename Protocol::endpoint endpoint_type; // The native type of a socket. typedef Windows::Networking::Sockets::StreamSocket^ native_handle_type; // The implementation type of the socket. struct implementation_type : base_implementation_type { // Default constructor. implementation_type() : base_implementation_type(), protocol_(endpoint_type().protocol()) { } // The protocol associated with the socket. protocol_type protocol_; }; // Constructor. winrt_ssocket_service(asio::io_context& io_context) : service_base >(io_context), winrt_ssocket_service_base(io_context) { } // Destroy all user-defined handler objects owned by the service. void shutdown() { this->base_shutdown(); } // Move-construct a new socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { this->base_move_construct(impl, other_impl); impl.protocol_ = other_impl.protocol_; other_impl.protocol_ = endpoint_type().protocol(); } // Move-assign from another socket implementation. void move_assign(implementation_type& impl, winrt_ssocket_service& other_service, implementation_type& other_impl) { this->base_move_assign(impl, other_service, other_impl); impl.protocol_ = other_impl.protocol_; other_impl.protocol_ = endpoint_type().protocol(); } // Move-construct a new socket implementation from another protocol type. template void converting_move_construct(implementation_type& impl, winrt_ssocket_service&, typename winrt_ssocket_service< Protocol1>::implementation_type& other_impl) { this->base_move_construct(impl, other_impl); impl.protocol_ = protocol_type(other_impl.protocol_); other_impl.protocol_ = typename Protocol1::endpoint().protocol(); } // Open a new socket implementation. asio::error_code open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } try { impl.socket_ = ref new Windows::Networking::Sockets::StreamSocket; impl.protocol_ = protocol; ec = asio::error_code(); } catch (Platform::Exception^ e) { ec = asio::error_code(e->HResult, asio::system_category()); } return ec; } // Assign a native socket to a socket implementation. asio::error_code assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { if (is_open(impl)) { ec = asio::error::already_open; return ec; } impl.socket_ = native_socket; impl.protocol_ = protocol; ec = asio::error_code(); return ec; } // Bind the socket to the specified local endpoint. asio::error_code bind(implementation_type&, const endpoint_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { endpoint_type endpoint; endpoint.resize(do_get_endpoint(impl, true, endpoint.data(), endpoint.size(), ec)); return endpoint; } // Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { endpoint_type endpoint; endpoint.resize(do_get_endpoint(impl, false, endpoint.data(), endpoint.size(), ec)); return endpoint; } // Set a socket option. template asio::error_code set_option(implementation_type& impl, const Option& option, asio::error_code& ec) { return do_set_option(impl, option.level(impl.protocol_), option.name(impl.protocol_), option.data(impl.protocol_), option.size(impl.protocol_), ec); } // Get a socket option. template asio::error_code get_option(const implementation_type& impl, Option& option, asio::error_code& ec) const { std::size_t size = option.size(impl.protocol_); do_get_option(impl, option.level(impl.protocol_), option.name(impl.protocol_), option.data(impl.protocol_), &size, ec); if (!ec) option.resize(impl.protocol_, size); return ec; } // Connect the socket to the specified endpoint. asio::error_code connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { return do_connect(impl, peer_endpoint.data(), ec); } // Start an asynchronous connect. template void async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef winrt_socket_connect_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(handler); ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "socket", &impl, 0, "async_connect")); start_connect_op(impl, peer_endpoint.data(), p.p, is_continuation); p.v = p.p = 0; } }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_SSOCKET_SERVICE_HPP asio-1.12.2/include/asio/detail/winrt_ssocket_service_base.hpp000066400000000000000000000271071340672067200245070ustar00rootroot00000000000000// // detail/winrt_ssocket_service_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_SSOCKET_SERVICE_BASE_HPP #define ASIO_DETAIL_WINRT_SSOCKET_SERVICE_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include "asio/buffer.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/socket_base.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/winrt_async_manager.hpp" #include "asio/detail/winrt_socket_recv_op.hpp" #include "asio/detail/winrt_socket_send_op.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class winrt_ssocket_service_base { public: // The native type of a socket. typedef Windows::Networking::Sockets::StreamSocket^ native_handle_type; // The implementation type of the socket. struct base_implementation_type { // Default constructor. base_implementation_type() : socket_(nullptr), next_(0), prev_(0) { } // The underlying native socket. native_handle_type socket_; // Pointers to adjacent socket implementations in linked list. base_implementation_type* next_; base_implementation_type* prev_; }; // Constructor. ASIO_DECL winrt_ssocket_service_base( asio::io_context& io_context); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void base_shutdown(); // Construct a new socket implementation. ASIO_DECL void construct(base_implementation_type&); // Move-construct a new socket implementation. ASIO_DECL void base_move_construct(base_implementation_type& impl, base_implementation_type& other_impl); // Move-assign from another socket implementation. ASIO_DECL void base_move_assign(base_implementation_type& impl, winrt_ssocket_service_base& other_service, base_implementation_type& other_impl); // Destroy a socket implementation. ASIO_DECL void destroy(base_implementation_type& impl); // Determine whether the socket is open. bool is_open(const base_implementation_type& impl) const { return impl.socket_ != nullptr; } // Destroy a socket implementation. ASIO_DECL asio::error_code close( base_implementation_type& impl, asio::error_code& ec); // Release ownership of the socket. ASIO_DECL native_handle_type release( base_implementation_type& impl, asio::error_code& ec); // Get the native socket representation. native_handle_type native_handle(base_implementation_type& impl) { return impl.socket_; } // Cancel all operations associated with the socket. asio::error_code cancel(base_implementation_type&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Determine whether the socket is at the out-of-band data mark. bool at_mark(const base_implementation_type&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return false; } // Determine the number of bytes available for reading. std::size_t available(const base_implementation_type&, asio::error_code& ec) const { ec = asio::error::operation_not_supported; return 0; } // Perform an IO control command on the socket. template asio::error_code io_control(base_implementation_type&, IO_Control_Command&, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Gets the non-blocking mode of the socket. bool non_blocking(const base_implementation_type&) const { return false; } // Sets the non-blocking mode of the socket. asio::error_code non_blocking(base_implementation_type&, bool, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const base_implementation_type&) const { return false; } // Sets the non-blocking mode of the native socket implementation. asio::error_code native_non_blocking(base_implementation_type&, bool, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Disable sends or receives on the socket. asio::error_code shutdown(base_implementation_type&, socket_base::shutdown_type, asio::error_code& ec) { ec = asio::error::operation_not_supported; return ec; } // Send the given data to the peer. template std::size_t send(base_implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return do_send(impl, buffer_sequence_adapter::first(buffers), flags, ec); } // Wait until data can be sent without blocking. std::size_t send(base_implementation_type&, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous send. The data being sent must be valid for the // lifetime of the asynchronous operation. template void async_send(base_implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef winrt_socket_send_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(buffers, handler); ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "socket", &impl, 0, "async_send")); start_send_op(impl, buffer_sequence_adapter::first(buffers), flags, p.p, is_continuation); p.v = p.p = 0; } // Start an asynchronous wait until data can be sent without blocking. template void async_send(base_implementation_type&, const null_buffers&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.get_io_context().post( detail::bind_handler(handler, ec, bytes_transferred)); } // Receive some data from the peer. Returns the number of bytes received. template std::size_t receive(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return do_receive(impl, buffer_sequence_adapter::first(buffers), flags, ec); } // Wait until data can be received without blocking. std::size_t receive(base_implementation_type&, const null_buffers&, socket_base::message_flags, asio::error_code& ec) { ec = asio::error::operation_not_supported; return 0; } // Start an asynchronous receive. The buffer for the data being received // must be valid for the lifetime of the asynchronous operation. template void async_receive(base_implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, Handler& handler) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. typedef winrt_socket_recv_op op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; p.p = new (p.v) op(buffers, handler); ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "socket", &impl, 0, "async_receive")); start_receive_op(impl, buffer_sequence_adapter::first(buffers), flags, p.p, is_continuation); p.v = p.p = 0; } // Wait until data can be received without blocking. template void async_receive(base_implementation_type&, const null_buffers&, socket_base::message_flags, Handler& handler) { asio::error_code ec = asio::error::operation_not_supported; const std::size_t bytes_transferred = 0; io_context_.get_io_context().post( detail::bind_handler(handler, ec, bytes_transferred)); } protected: // Helper function to obtain endpoints associated with the connection. ASIO_DECL std::size_t do_get_endpoint( const base_implementation_type& impl, bool local, void* addr, std::size_t addr_len, asio::error_code& ec) const; // Helper function to set a socket option. ASIO_DECL asio::error_code do_set_option( base_implementation_type& impl, int level, int optname, const void* optval, std::size_t optlen, asio::error_code& ec); // Helper function to get a socket option. ASIO_DECL void do_get_option( const base_implementation_type& impl, int level, int optname, void* optval, std::size_t* optlen, asio::error_code& ec) const; // Helper function to perform a synchronous connect. ASIO_DECL asio::error_code do_connect( base_implementation_type& impl, const void* addr, asio::error_code& ec); // Helper function to start an asynchronous connect. ASIO_DECL void start_connect_op( base_implementation_type& impl, const void* addr, winrt_async_op* op, bool is_continuation); // Helper function to perform a synchronous send. ASIO_DECL std::size_t do_send( base_implementation_type& impl, const asio::const_buffer& data, socket_base::message_flags flags, asio::error_code& ec); // Helper function to start an asynchronous send. ASIO_DECL void start_send_op(base_implementation_type& impl, const asio::const_buffer& data, socket_base::message_flags flags, winrt_async_op* op, bool is_continuation); // Helper function to perform a synchronous receive. ASIO_DECL std::size_t do_receive( base_implementation_type& impl, const asio::mutable_buffer& data, socket_base::message_flags flags, asio::error_code& ec); // Helper function to start an asynchronous receive. ASIO_DECL void start_receive_op(base_implementation_type& impl, const asio::mutable_buffer& data, socket_base::message_flags flags, winrt_async_op* op, bool is_continuation); // The io_context implementation used for delivering completions. io_context_impl& io_context_; // The manager that keeps track of outstanding operations. winrt_async_manager& async_manager_; // Mutex to protect access to the linked list of implementations. asio::detail::mutex mutex_; // The head of a linked list of all implementations. base_implementation_type* impl_list_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/winrt_ssocket_service_base.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_SSOCKET_SERVICE_BASE_HPP asio-1.12.2/include/asio/detail/winrt_timer_scheduler.hpp000066400000000000000000000102101340672067200234630ustar00rootroot00000000000000// // detail/winrt_timer_scheduler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_TIMER_SCHEDULER_HPP #define ASIO_DETAIL_WINRT_TIMER_SCHEDULER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include #include "asio/detail/event.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/op_queue.hpp" #include "asio/detail/thread.hpp" #include "asio/detail/timer_queue_base.hpp" #include "asio/detail/timer_queue_set.hpp" #include "asio/detail/wait_op.hpp" #include "asio/io_context.hpp" #if defined(ASIO_HAS_IOCP) # include "asio/detail/thread.hpp" #endif // defined(ASIO_HAS_IOCP) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class winrt_timer_scheduler : public asio::detail::service_base { public: // Constructor. ASIO_DECL winrt_timer_scheduler(asio::io_context& io_context); // Destructor. ASIO_DECL ~winrt_timer_scheduler(); // Destroy all user-defined handler objects owned by the service. ASIO_DECL void shutdown(); // Recreate internal descriptors following a fork. ASIO_DECL void notify_fork( asio::io_context::fork_event fork_ev); // Initialise the task. No effect as this class uses its own thread. ASIO_DECL void init_task(); // Add a new timer queue to the reactor. template void add_timer_queue(timer_queue& queue); // Remove a timer queue from the reactor. template void remove_timer_queue(timer_queue& queue); // Schedule a new operation in the given timer queue to expire at the // specified absolute time. template void schedule_timer(timer_queue& queue, const typename Time_Traits::time_type& time, typename timer_queue::per_timer_data& timer, wait_op* op); // Cancel the timer operations associated with the given token. Returns the // number of operations that have been posted or dispatched. template std::size_t cancel_timer(timer_queue& queue, typename timer_queue::per_timer_data& timer, std::size_t max_cancelled = (std::numeric_limits::max)()); // Move the timer operations associated with the given timer. template void move_timer(timer_queue& queue, typename timer_queue::per_timer_data& to, typename timer_queue::per_timer_data& from); private: // Run the select loop in the thread. ASIO_DECL void run_thread(); // Entry point for the select loop thread. ASIO_DECL static void call_run_thread(winrt_timer_scheduler* reactor); // Helper function to add a new timer queue. ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); // Helper function to remove a timer queue. ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); // The io_context implementation used to post completions. io_context_impl& io_context_; // Mutex used to protect internal variables. asio::detail::mutex mutex_; // Event used to wake up background thread. asio::detail::event event_; // The timer queues. timer_queue_set timer_queues_; // The background thread that is waiting for timers to expire. asio::detail::thread* thread_; // Does the background thread need to stop. bool stop_thread_; // Whether the service has been shut down. bool shutdown_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/detail/impl/winrt_timer_scheduler.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/winrt_timer_scheduler.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_TIMER_SCHEDULER_HPP asio-1.12.2/include/asio/detail/winrt_utils.hpp000066400000000000000000000051021340672067200214510ustar00rootroot00000000000000// // detail/winrt_utils.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINRT_UTILS_HPP #define ASIO_DETAIL_WINRT_UTILS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS_RUNTIME) #include #include #include #include #include #include #include #include "asio/buffer.hpp" #include "asio/error_code.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { namespace winrt_utils { inline Platform::String^ string(const char* from) { std::wstring tmp(from, from + std::strlen(from)); return ref new Platform::String(tmp.c_str()); } inline Platform::String^ string(const std::string& from) { std::wstring tmp(from.begin(), from.end()); return ref new Platform::String(tmp.c_str()); } inline std::string string(Platform::String^ from) { std::wstring_convert> converter; return converter.to_bytes(from->Data()); } inline Platform::String^ string(unsigned short from) { return string(std::to_string(from)); } template inline Platform::String^ string(const T& from) { return string(from.to_string()); } inline int integer(Platform::String^ from) { return _wtoi(from->Data()); } template inline Windows::Networking::HostName^ host_name(const T& from) { return ref new Windows::Networking::HostName((string)(from)); } template inline Windows::Storage::Streams::IBuffer^ buffer_dup( const ConstBufferSequence& buffers) { using Microsoft::WRL::ComPtr; using asio::buffer_size; std::size_t size = buffer_size(buffers); auto b = ref new Windows::Storage::Streams::Buffer(size); ComPtr insp = reinterpret_cast(b); ComPtr bacc; insp.As(&bacc); byte* bytes = nullptr; bacc->Buffer(&bytes); asio::buffer_copy(asio::buffer(bytes, size), buffers); b->Length = size; return b; } } // namespace winrt_utils } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #endif // ASIO_DETAIL_WINRT_UTILS_HPP asio-1.12.2/include/asio/detail/winsock_init.hpp000066400000000000000000000060221340672067200215700ustar00rootroot00000000000000// // detail/winsock_init.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WINSOCK_INIT_HPP #define ASIO_DETAIL_WINSOCK_INIT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class winsock_init_base { protected: // Structure to track result of initialisation and number of uses. POD is used // to ensure that the values are zero-initialised prior to any code being run. struct data { long init_count_; long result_; }; ASIO_DECL static void startup(data& d, unsigned char major, unsigned char minor); ASIO_DECL static void manual_startup(data& d); ASIO_DECL static void cleanup(data& d); ASIO_DECL static void manual_cleanup(data& d); ASIO_DECL static void throw_on_error(data& d); }; template class winsock_init : private winsock_init_base { public: winsock_init(bool allow_throw = true) { startup(data_, Major, Minor); if (allow_throw) throw_on_error(data_); } winsock_init(const winsock_init&) { startup(data_, Major, Minor); throw_on_error(data_); } ~winsock_init() { cleanup(data_); } // This class may be used to indicate that user code will manage Winsock // initialisation and cleanup. This may be required in the case of a DLL, for // example, where it is not safe to initialise Winsock from global object // constructors. // // To prevent asio from initialising Winsock, the object must be constructed // before any Asio's own global objects. With MSVC, this may be accomplished // by adding the following code to the DLL: // // #pragma warning(push) // #pragma warning(disable:4073) // #pragma init_seg(lib) // asio::detail::winsock_init<>::manual manual_winsock_init; // #pragma warning(pop) class manual { public: manual() { manual_startup(data_); } manual(const manual&) { manual_startup(data_); } ~manual() { manual_cleanup(data_); } }; private: friend class manual; static data data_; }; template winsock_init_base::data winsock_init::data_; // Static variable to ensure that winsock is initialised before main, and // therefore before any other threads can get started. static const winsock_init<>& winsock_init_instance = winsock_init<>(false); } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/detail/impl/winsock_init.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) #endif // ASIO_DETAIL_WINSOCK_INIT_HPP asio-1.12.2/include/asio/detail/work_dispatcher.hpp000066400000000000000000000034101340672067200222560ustar00rootroot00000000000000// // detail/work_dispatcher.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WORK_DISPATCHER_HPP #define ASIO_DETAIL_WORK_DISPATCHER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_executor.hpp" #include "asio/associated_allocator.hpp" #include "asio/executor_work_guard.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class work_dispatcher { public: work_dispatcher(Handler& handler) : work_((get_associated_executor)(handler)), handler_(ASIO_MOVE_CAST(Handler)(handler)) { } #if defined(ASIO_HAS_MOVE) work_dispatcher(const work_dispatcher& other) : work_(other.work_), handler_(other.handler_) { } work_dispatcher(work_dispatcher&& other) : work_(ASIO_MOVE_CAST(executor_work_guard< typename associated_executor::type>)(other.work_)), handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { typename associated_allocator::type alloc( (get_associated_allocator)(handler_)); work_.get_executor().dispatch( ASIO_MOVE_CAST(Handler)(handler_), alloc); work_.reset(); } private: executor_work_guard::type> work_; Handler handler_; }; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WORK_DISPATCHER_HPP asio-1.12.2/include/asio/detail/wrapped_handler.hpp000066400000000000000000000177051340672067200222410ustar00rootroot00000000000000// // detail/wrapped_handler.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DETAIL_WRAPPED_HANDLER_HPP #define ASIO_DETAIL_WRAPPED_HANDLER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/bind_handler.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct is_continuation_delegated { template bool operator()(Dispatcher&, Handler& handler) const { return asio_handler_cont_helpers::is_continuation(handler); } }; struct is_continuation_if_running { template bool operator()(Dispatcher& dispatcher, Handler&) const { return dispatcher.running_in_this_thread(); } }; template class wrapped_handler { public: typedef void result_type; wrapped_handler(Dispatcher dispatcher, Handler& handler) : dispatcher_(dispatcher), handler_(ASIO_MOVE_CAST(Handler)(handler)) { } #if defined(ASIO_HAS_MOVE) wrapped_handler(const wrapped_handler& other) : dispatcher_(other.dispatcher_), handler_(other.handler_) { } wrapped_handler(wrapped_handler&& other) : dispatcher_(other.dispatcher_), handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { dispatcher_.dispatch(ASIO_MOVE_CAST(Handler)(handler_)); } void operator()() const { dispatcher_.dispatch(handler_); } template void operator()(const Arg1& arg1) { dispatcher_.dispatch(detail::bind_handler(handler_, arg1)); } template void operator()(const Arg1& arg1) const { dispatcher_.dispatch(detail::bind_handler(handler_, arg1)); } template void operator()(const Arg1& arg1, const Arg2& arg2) { dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2)); } template void operator()(const Arg1& arg1, const Arg2& arg2) const { dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2)); } template void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3)); } template void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) const { dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3)); } template void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) { dispatcher_.dispatch( detail::bind_handler(handler_, arg1, arg2, arg3, arg4)); } template void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) const { dispatcher_.dispatch( detail::bind_handler(handler_, arg1, arg2, arg3, arg4)); } template void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) { dispatcher_.dispatch( detail::bind_handler(handler_, arg1, arg2, arg3, arg4, arg5)); } template void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) const { dispatcher_.dispatch( detail::bind_handler(handler_, arg1, arg2, arg3, arg4, arg5)); } //private: Dispatcher dispatcher_; Handler handler_; }; template class rewrapped_handler { public: explicit rewrapped_handler(Handler& handler, const Context& context) : context_(context), handler_(ASIO_MOVE_CAST(Handler)(handler)) { } explicit rewrapped_handler(const Handler& handler, const Context& context) : context_(context), handler_(handler) { } #if defined(ASIO_HAS_MOVE) rewrapped_handler(const rewrapped_handler& other) : context_(other.context_), handler_(other.handler_) { } rewrapped_handler(rewrapped_handler&& other) : context_(ASIO_MOVE_CAST(Context)(other.context_)), handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()() { handler_(); } void operator()() const { handler_(); } //private: Context context_; Handler handler_; }; template inline void* asio_handler_allocate(std::size_t size, wrapped_handler* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, wrapped_handler* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( wrapped_handler* this_handler) { return IsContinuation()(this_handler->dispatcher_, this_handler->handler_); } template inline void asio_handler_invoke(Function& function, wrapped_handler* this_handler) { this_handler->dispatcher_.dispatch( rewrapped_handler( function, this_handler->handler_)); } template inline void asio_handler_invoke(const Function& function, wrapped_handler* this_handler) { this_handler->dispatcher_.dispatch( rewrapped_handler( function, this_handler->handler_)); } template inline void* asio_handler_allocate(std::size_t size, rewrapped_handler* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->context_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, rewrapped_handler* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->context_); } template inline bool asio_handler_is_continuation( rewrapped_handler* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->context_); } template inline void asio_handler_invoke(Function& function, rewrapped_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->context_); } template inline void asio_handler_invoke(const Function& function, rewrapped_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->context_); } } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_DETAIL_WRAPPED_HANDLER_HPP asio-1.12.2/include/asio/dispatch.hpp000066400000000000000000000074201340672067200174300ustar00rootroot00000000000000// // dispatch.hpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_DISPATCH_HPP #define ASIO_DISPATCH_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/execution_context.hpp" #include "asio/is_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the object's associated * executor. The function object is queued for execution, and is never called * from the current thread prior to returning from dispatch(). * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with handler(forward(token)). * * @li Constructs an object @c result of type async_result, * initializing the object as result(handler). * * @li Obtains the handler's associated executor object @c ex by performing * get_associated_executor(handler). * * @li Obtains the handler's associated allocator object @c alloc by performing * get_associated_allocator(handler). * * @li Performs ex.dispatch(std::move(handler), alloc). * * @li Returns result.get(). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( ASIO_MOVE_ARG(CompletionToken) token); /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the specified executor. * The function object is queued for execution, and is never called from the * current thread prior to returning from dispatch(). * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with handler(forward(token)). * * @li Constructs an object @c result of type async_result, * initializing the object as result(handler). * * @li Obtains the handler's associated executor object @c ex1 by performing * get_associated_executor(handler). * * @li Creates a work object @c w by performing make_work(ex1). * * @li Obtains the handler's associated allocator object @c alloc by performing * get_associated_allocator(handler). * * @li Constructs a function object @c f with a function call operator that * performs ex1.dispatch(std::move(handler), alloc) followed by * w.reset(). * * @li Performs Executor(ex).dispatch(std::move(f), alloc). * * @li Returns result.get(). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type* = 0); /// Submits a completion token or function object for execution. /** * @returns dispatch(ctx.get_executor(), * forward(token)). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type* = 0); } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/dispatch.hpp" #endif // ASIO_DISPATCH_HPP asio-1.12.2/include/asio/error.hpp000066400000000000000000000223111340672067200167560ustar00rootroot00000000000000// // error.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_ERROR_HPP #define ASIO_ERROR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error_code.hpp" #include "asio/system_error.hpp" #if defined(ASIO_WINDOWS) \ || defined(__CYGWIN__) \ || defined(ASIO_WINDOWS_RUNTIME) # include #else # include # include #endif #if defined(GENERATING_DOCUMENTATION) /// INTERNAL ONLY. # define ASIO_NATIVE_ERROR(e) implementation_defined /// INTERNAL ONLY. # define ASIO_SOCKET_ERROR(e) implementation_defined /// INTERNAL ONLY. # define ASIO_NETDB_ERROR(e) implementation_defined /// INTERNAL ONLY. # define ASIO_GETADDRINFO_ERROR(e) implementation_defined /// INTERNAL ONLY. # define ASIO_WIN_OR_POSIX(e_win, e_posix) implementation_defined #elif defined(ASIO_WINDOWS_RUNTIME) # define ASIO_NATIVE_ERROR(e) __HRESULT_FROM_WIN32(e) # define ASIO_SOCKET_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e) # define ASIO_NETDB_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e) # define ASIO_GETADDRINFO_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e) # define ASIO_WIN_OR_POSIX(e_win, e_posix) e_win #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) # define ASIO_NATIVE_ERROR(e) e # define ASIO_SOCKET_ERROR(e) WSA ## e # define ASIO_NETDB_ERROR(e) WSA ## e # define ASIO_GETADDRINFO_ERROR(e) WSA ## e # define ASIO_WIN_OR_POSIX(e_win, e_posix) e_win #else # define ASIO_NATIVE_ERROR(e) e # define ASIO_SOCKET_ERROR(e) e # define ASIO_NETDB_ERROR(e) e # define ASIO_GETADDRINFO_ERROR(e) e # define ASIO_WIN_OR_POSIX(e_win, e_posix) e_posix #endif #include "asio/detail/push_options.hpp" namespace asio { namespace error { enum basic_errors { /// Permission denied. access_denied = ASIO_SOCKET_ERROR(EACCES), /// Address family not supported by protocol. address_family_not_supported = ASIO_SOCKET_ERROR(EAFNOSUPPORT), /// Address already in use. address_in_use = ASIO_SOCKET_ERROR(EADDRINUSE), /// Transport endpoint is already connected. already_connected = ASIO_SOCKET_ERROR(EISCONN), /// Operation already in progress. already_started = ASIO_SOCKET_ERROR(EALREADY), /// Broken pipe. broken_pipe = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(ERROR_BROKEN_PIPE), ASIO_NATIVE_ERROR(EPIPE)), /// A connection has been aborted. connection_aborted = ASIO_SOCKET_ERROR(ECONNABORTED), /// Connection refused. connection_refused = ASIO_SOCKET_ERROR(ECONNREFUSED), /// Connection reset by peer. connection_reset = ASIO_SOCKET_ERROR(ECONNRESET), /// Bad file descriptor. bad_descriptor = ASIO_SOCKET_ERROR(EBADF), /// Bad address. fault = ASIO_SOCKET_ERROR(EFAULT), /// No route to host. host_unreachable = ASIO_SOCKET_ERROR(EHOSTUNREACH), /// Operation now in progress. in_progress = ASIO_SOCKET_ERROR(EINPROGRESS), /// Interrupted system call. interrupted = ASIO_SOCKET_ERROR(EINTR), /// Invalid argument. invalid_argument = ASIO_SOCKET_ERROR(EINVAL), /// Message too long. message_size = ASIO_SOCKET_ERROR(EMSGSIZE), /// The name was too long. name_too_long = ASIO_SOCKET_ERROR(ENAMETOOLONG), /// Network is down. network_down = ASIO_SOCKET_ERROR(ENETDOWN), /// Network dropped connection on reset. network_reset = ASIO_SOCKET_ERROR(ENETRESET), /// Network is unreachable. network_unreachable = ASIO_SOCKET_ERROR(ENETUNREACH), /// Too many open files. no_descriptors = ASIO_SOCKET_ERROR(EMFILE), /// No buffer space available. no_buffer_space = ASIO_SOCKET_ERROR(ENOBUFS), /// Cannot allocate memory. no_memory = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(ERROR_OUTOFMEMORY), ASIO_NATIVE_ERROR(ENOMEM)), /// Operation not permitted. no_permission = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(ERROR_ACCESS_DENIED), ASIO_NATIVE_ERROR(EPERM)), /// Protocol not available. no_protocol_option = ASIO_SOCKET_ERROR(ENOPROTOOPT), /// No such device. no_such_device = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(ERROR_BAD_UNIT), ASIO_NATIVE_ERROR(ENODEV)), /// Transport endpoint is not connected. not_connected = ASIO_SOCKET_ERROR(ENOTCONN), /// Socket operation on non-socket. not_socket = ASIO_SOCKET_ERROR(ENOTSOCK), /// Operation cancelled. operation_aborted = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(ERROR_OPERATION_ABORTED), ASIO_NATIVE_ERROR(ECANCELED)), /// Operation not supported. operation_not_supported = ASIO_SOCKET_ERROR(EOPNOTSUPP), /// Cannot send after transport endpoint shutdown. shut_down = ASIO_SOCKET_ERROR(ESHUTDOWN), /// Connection timed out. timed_out = ASIO_SOCKET_ERROR(ETIMEDOUT), /// Resource temporarily unavailable. try_again = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(ERROR_RETRY), ASIO_NATIVE_ERROR(EAGAIN)), /// The socket is marked non-blocking and the requested operation would block. would_block = ASIO_SOCKET_ERROR(EWOULDBLOCK) }; enum netdb_errors { /// Host not found (authoritative). host_not_found = ASIO_NETDB_ERROR(HOST_NOT_FOUND), /// Host not found (non-authoritative). host_not_found_try_again = ASIO_NETDB_ERROR(TRY_AGAIN), /// The query is valid but does not have associated address data. no_data = ASIO_NETDB_ERROR(NO_DATA), /// A non-recoverable error occurred. no_recovery = ASIO_NETDB_ERROR(NO_RECOVERY) }; enum addrinfo_errors { /// The service is not supported for the given socket type. service_not_found = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(WSATYPE_NOT_FOUND), ASIO_GETADDRINFO_ERROR(EAI_SERVICE)), /// The socket type is not supported. socket_type_not_supported = ASIO_WIN_OR_POSIX( ASIO_NATIVE_ERROR(WSAESOCKTNOSUPPORT), ASIO_GETADDRINFO_ERROR(EAI_SOCKTYPE)) }; enum misc_errors { /// Already open. already_open = 1, /// End of file or stream. eof, /// Element not found. not_found, /// The descriptor cannot fit into the select system call's fd_set. fd_set_failure }; inline const asio::error_category& get_system_category() { return asio::system_category(); } #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) extern ASIO_DECL const asio::error_category& get_netdb_category(); extern ASIO_DECL const asio::error_category& get_addrinfo_category(); #else // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) inline const asio::error_category& get_netdb_category() { return get_system_category(); } inline const asio::error_category& get_addrinfo_category() { return get_system_category(); } #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) extern ASIO_DECL const asio::error_category& get_misc_category(); static const asio::error_category& system_category ASIO_UNUSED_VARIABLE = asio::error::get_system_category(); static const asio::error_category& netdb_category ASIO_UNUSED_VARIABLE = asio::error::get_netdb_category(); static const asio::error_category& addrinfo_category ASIO_UNUSED_VARIABLE = asio::error::get_addrinfo_category(); static const asio::error_category& misc_category ASIO_UNUSED_VARIABLE = asio::error::get_misc_category(); } // namespace error } // namespace asio #if defined(ASIO_HAS_STD_SYSTEM_ERROR) namespace std { template<> struct is_error_code_enum { static const bool value = true; }; template<> struct is_error_code_enum { static const bool value = true; }; template<> struct is_error_code_enum { static const bool value = true; }; template<> struct is_error_code_enum { static const bool value = true; }; } // namespace std #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) namespace asio { namespace error { inline asio::error_code make_error_code(basic_errors e) { return asio::error_code( static_cast(e), get_system_category()); } inline asio::error_code make_error_code(netdb_errors e) { return asio::error_code( static_cast(e), get_netdb_category()); } inline asio::error_code make_error_code(addrinfo_errors e) { return asio::error_code( static_cast(e), get_addrinfo_category()); } inline asio::error_code make_error_code(misc_errors e) { return asio::error_code( static_cast(e), get_misc_category()); } } // namespace error namespace stream_errc { // Simulates the proposed stream_errc scoped enum. using error::eof; using error::not_found; } // namespace stream_errc namespace socket_errc { // Simulates the proposed socket_errc scoped enum. using error::already_open; using error::not_found; } // namespace socket_errc namespace resolver_errc { // Simulates the proposed resolver_errc scoped enum. using error::host_not_found; const error::netdb_errors try_again = error::host_not_found_try_again; using error::service_not_found; } // namespace resolver_errc } // namespace asio #include "asio/detail/pop_options.hpp" #undef ASIO_NATIVE_ERROR #undef ASIO_SOCKET_ERROR #undef ASIO_NETDB_ERROR #undef ASIO_GETADDRINFO_ERROR #undef ASIO_WIN_OR_POSIX #if defined(ASIO_HEADER_ONLY) # include "asio/impl/error.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_ERROR_HPP asio-1.12.2/include/asio/error_code.hpp000066400000000000000000000107201340672067200177510ustar00rootroot00000000000000// // error_code.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_ERROR_CODE_HPP #define ASIO_ERROR_CODE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_SYSTEM_ERROR) # include #else // defined(ASIO_HAS_STD_SYSTEM_ERROR) # include # include "asio/detail/noncopyable.hpp" # if !defined(ASIO_NO_IOSTREAM) # include # endif // !defined(ASIO_NO_IOSTREAM) #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) #include "asio/detail/push_options.hpp" namespace asio { #if defined(ASIO_HAS_STD_SYSTEM_ERROR) typedef std::error_category error_category; #else // defined(ASIO_HAS_STD_SYSTEM_ERROR) /// Base class for all error categories. class error_category : private noncopyable { public: /// Destructor. virtual ~error_category() { } /// Returns a string naming the error gategory. virtual const char* name() const = 0; /// Returns a string describing the error denoted by @c value. virtual std::string message(int value) const = 0; /// Equality operator to compare two error categories. bool operator==(const error_category& rhs) const { return this == &rhs; } /// Inequality operator to compare two error categories. bool operator!=(const error_category& rhs) const { return !(*this == rhs); } }; #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) /// Returns the error category used for the system errors produced by asio. extern ASIO_DECL const error_category& system_category(); #if defined(ASIO_HAS_STD_SYSTEM_ERROR) typedef std::error_code error_code; #else // defined(ASIO_HAS_STD_SYSTEM_ERROR) /// Class to represent an error code value. class error_code { public: /// Default constructor. error_code() : value_(0), category_(&system_category()) { } /// Construct with specific error code and category. error_code(int v, const error_category& c) : value_(v), category_(&c) { } /// Construct from an error code enum. template error_code(ErrorEnum e) { *this = make_error_code(e); } /// Clear the error value to the default. void clear() { value_ = 0; category_ = &system_category(); } /// Assign a new error value. void assign(int v, const error_category& c) { value_ = v; category_ = &c; } /// Get the error value. int value() const { return value_; } /// Get the error category. const error_category& category() const { return *category_; } /// Get the message associated with the error. std::string message() const { return category_->message(value_); } struct unspecified_bool_type_t { }; typedef void (*unspecified_bool_type)(unspecified_bool_type_t); static void unspecified_bool_true(unspecified_bool_type_t) {} /// Operator returns non-null if there is a non-success error code. operator unspecified_bool_type() const { if (value_ == 0) return 0; else return &error_code::unspecified_bool_true; } /// Operator to test if the error represents success. bool operator!() const { return value_ == 0; } /// Equality operator to compare two error objects. friend bool operator==(const error_code& e1, const error_code& e2) { return e1.value_ == e2.value_ && e1.category_ == e2.category_; } /// Inequality operator to compare two error objects. friend bool operator!=(const error_code& e1, const error_code& e2) { return e1.value_ != e2.value_ || e1.category_ != e2.category_; } private: // The value associated with the error code. int value_; // The category associated with the error code. const error_category* category_; }; # if !defined(ASIO_NO_IOSTREAM) /// Output an error code. template std::basic_ostream& operator<<( std::basic_ostream& os, const error_code& ec) { os << ec.category().name() << ':' << ec.value(); return os; } # endif // !defined(ASIO_NO_IOSTREAM) #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/error_code.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_ERROR_CODE_HPP asio-1.12.2/include/asio/execution_context.hpp000066400000000000000000000333521340672067200214030ustar00rootroot00000000000000// // execution_context.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXECUTION_CONTEXT_HPP #define ASIO_EXECUTION_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include "asio/detail/noncopyable.hpp" #include "asio/detail/variadic_templates.hpp" #include "asio/detail/push_options.hpp" namespace asio { class execution_context; class io_context; #if !defined(GENERATING_DOCUMENTATION) template Service& use_service(execution_context&); template Service& use_service(io_context&); template void add_service(execution_context&, Service*); template bool has_service(execution_context&); #endif // !defined(GENERATING_DOCUMENTATION) namespace detail { class service_registry; } /// A context for function object execution. /** * An execution context represents a place where function objects will be * executed. An @c io_context is an example of an execution context. * * @par The execution_context class and services * * Class execution_context implements an extensible, type-safe, polymorphic set * of services, indexed by service type. * * Services exist to manage the resources that are shared across an execution * context. For example, timers may be implemented in terms of a single timer * queue, and this queue would be stored in a service. * * Access to the services of an execution_context is via three function * templates, use_service(), add_service() and has_service(). * * In a call to @c use_service(), the type argument chooses a service, * making available all members of the named type. If @c Service is not present * in an execution_context, an object of type @c Service is created and added * to the execution_context. A C++ program can check if an execution_context * implements a particular service with the function template @c * has_service(). * * Service objects may be explicitly added to an execution_context using the * function template @c add_service(). If the @c Service is already * present, the service_already_exists exception is thrown. If the owner of the * service is not the same object as the execution_context parameter, the * invalid_service_owner exception is thrown. * * Once a service reference is obtained from an execution_context object by * calling use_service(), that reference remains usable as long as the owning * execution_context object exists. * * All service implementations have execution_context::service as a public base * class. Custom services may be implemented by deriving from this class and * then added to an execution_context using the facilities described above. * * @par The execution_context as a base class * * Class execution_context may be used only as a base class for concrete * execution context types. The @c io_context is an example of such a derived * type. * * On destruction, a class that is derived from execution_context must perform * execution_context::shutdown() followed by * execution_context::destroy(). * * This destruction sequence permits programs to simplify their resource * management by using @c shared_ptr<>. Where an object's lifetime is tied to * the lifetime of a connection (or some other sequence of asynchronous * operations), a @c shared_ptr to the object would be bound into the handlers * for all asynchronous operations associated with it. This works as follows: * * @li When a single connection ends, all associated asynchronous operations * complete. The corresponding handler objects are destroyed, and all @c * shared_ptr references to the objects are destroyed. * * @li To shut down the whole program, the io_context function stop() is called * to terminate any run() calls as soon as possible. The io_context destructor * calls @c shutdown() and @c destroy() to destroy all pending handlers, * causing all @c shared_ptr references to all connection objects to be * destroyed. */ class execution_context : private noncopyable { public: class id; class service; protected: /// Constructor. ASIO_DECL execution_context(); /// Destructor. ASIO_DECL ~execution_context(); /// Shuts down all services in the context. /** * This function is implemented as follows: * * @li For each service object @c svc in the execution_context set, in * reverse order of the beginning of service object lifetime, performs @c * svc->shutdown(). */ ASIO_DECL void shutdown(); /// Destroys all services in the context. /** * This function is implemented as follows: * * @li For each service object @c svc in the execution_context set, in * reverse order * of the beginning of service object lifetime, performs * delete static_cast(svc). */ ASIO_DECL void destroy(); public: /// Fork-related event notifications. enum fork_event { /// Notify the context that the process is about to fork. fork_prepare, /// Notify the context that the process has forked and is the parent. fork_parent, /// Notify the context that the process has forked and is the child. fork_child }; /// Notify the execution_context of a fork-related event. /** * This function is used to inform the execution_context that the process is * about to fork, or has just forked. This allows the execution_context, and * the services it contains, to perform any necessary housekeeping to ensure * correct operation following a fork. * * This function must not be called while any other execution_context * function, or any function associated with the execution_context's derived * class, is being called in another thread. It is, however, safe to call * this function from within a completion handler, provided no other thread * is accessing the execution_context or its derived class. * * @param event A fork-related event. * * @throws asio::system_error Thrown on failure. If the notification * fails the execution_context object should no longer be used and should be * destroyed. * * @par Example * The following code illustrates how to incorporate the notify_fork() * function: * @code my_execution_context.notify_fork(execution_context::fork_prepare); * if (fork() == 0) * { * // This is the child process. * my_execution_context.notify_fork(execution_context::fork_child); * } * else * { * // This is the parent process. * my_execution_context.notify_fork(execution_context::fork_parent); * } @endcode * * @note For each service object @c svc in the execution_context set, * performs svc->notify_fork();. When processing the fork_prepare * event, services are visited in reverse order of the beginning of service * object lifetime. Otherwise, services are visited in order of the beginning * of service object lifetime. */ ASIO_DECL void notify_fork(fork_event event); /// Obtain the service object corresponding to the given type. /** * This function is used to locate a service object that corresponds to the * given service type. If there is no existing implementation of the service, * then the execution_context will create a new instance of the service. * * @param e The execution_context object that owns the service. * * @return The service interface implementing the specified service type. * Ownership of the service interface is not transferred to the caller. */ template friend Service& use_service(execution_context& e); /// Obtain the service object corresponding to the given type. /** * This function is used to locate a service object that corresponds to the * given service type. If there is no existing implementation of the service, * then the io_context will create a new instance of the service. * * @param ioc The io_context object that owns the service. * * @return The service interface implementing the specified service type. * Ownership of the service interface is not transferred to the caller. * * @note This overload is preserved for backwards compatibility with services * that inherit from io_context::service. */ template friend Service& use_service(io_context& ioc); #if defined(GENERATING_DOCUMENTATION) /// Creates a service object and adds it to the execution_context. /** * This function is used to add a service to the execution_context. * * @param e The execution_context object that owns the service. * * @param args Zero or more arguments to be passed to the service * constructor. * * @throws asio::service_already_exists Thrown if a service of the * given type is already present in the execution_context. */ template friend Service& make_service(execution_context& e, Args&&... args); #elif defined(ASIO_HAS_VARIADIC_TEMPLATES) template friend Service& make_service(execution_context& e, ASIO_MOVE_ARG(Args)... args); #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) template friend Service& make_service(execution_context& e); #define ASIO_PRIVATE_MAKE_SERVICE_DEF(n) \ template \ friend Service& make_service(execution_context& e, \ ASIO_VARIADIC_MOVE_PARAMS(n)); \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_MAKE_SERVICE_DEF) #undef ASIO_PRIVATE_MAKE_SERVICE_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) /// (Deprecated: Use make_service().) Add a service object to the /// execution_context. /** * This function is used to add a service to the execution_context. * * @param e The execution_context object that owns the service. * * @param svc The service object. On success, ownership of the service object * is transferred to the execution_context. When the execution_context object * is destroyed, it will destroy the service object by performing: @code * delete static_cast(svc) @endcode * * @throws asio::service_already_exists Thrown if a service of the * given type is already present in the execution_context. * * @throws asio::invalid_service_owner Thrown if the service's owning * execution_context is not the execution_context object specified by the * @c e parameter. */ template friend void add_service(execution_context& e, Service* svc); /// Determine if an execution_context contains a specified service type. /** * This function is used to determine whether the execution_context contains a * service object corresponding to the given service type. * * @param e The execution_context object that owns the service. * * @return A boolean indicating whether the execution_context contains the * service. */ template friend bool has_service(execution_context& e); private: // The service registry. asio::detail::service_registry* service_registry_; }; /// Class used to uniquely identify a service. class execution_context::id : private noncopyable { public: /// Constructor. id() {} }; /// Base class for all io_context services. class execution_context::service : private noncopyable { public: /// Get the context object that owns the service. execution_context& context(); protected: /// Constructor. /** * @param owner The execution_context object that owns the service. */ ASIO_DECL service(execution_context& owner); /// Destructor. ASIO_DECL virtual ~service(); private: /// Destroy all user-defined handler objects owned by the service. virtual void shutdown() = 0; /// Handle notification of a fork-related event to perform any necessary /// housekeeping. /** * This function is not a pure virtual so that services only have to * implement it if necessary. The default implementation does nothing. */ ASIO_DECL virtual void notify_fork( execution_context::fork_event event); friend class asio::detail::service_registry; struct key { key() : type_info_(0), id_(0) {} const std::type_info* type_info_; const execution_context::id* id_; } key_; execution_context& owner_; service* next_; }; /// Exception thrown when trying to add a duplicate service to an /// execution_context. class service_already_exists : public std::logic_error { public: ASIO_DECL service_already_exists(); }; /// Exception thrown when trying to add a service object to an /// execution_context where the service has a different owner. class invalid_service_owner : public std::logic_error { public: ASIO_DECL invalid_service_owner(); }; namespace detail { // Special derived service id type to keep classes header-file only. template class service_id : public execution_context::id { }; // Special service base class to keep classes header-file only. template class execution_context_service_base : public execution_context::service { public: static service_id id; // Constructor. execution_context_service_base(execution_context& e) : execution_context::service(e) { } }; template service_id execution_context_service_base::id; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/execution_context.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/execution_context.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_EXECUTION_CONTEXT_HPP asio-1.12.2/include/asio/executor.hpp000066400000000000000000000231461340672067200174720ustar00rootroot00000000000000// // executor.hpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXECUTOR_HPP #define ASIO_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/cstddef.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Exception thrown when trying to access an empty polymorphic executor. class bad_executor : public std::exception { public: /// Constructor. ASIO_DECL bad_executor() ASIO_NOEXCEPT; /// Obtain message associated with exception. ASIO_DECL virtual const char* what() const ASIO_NOEXCEPT_OR_NOTHROW; }; /// Polymorphic wrapper for executors. class executor { public: /// Default constructor. executor() ASIO_NOEXCEPT : impl_(0) { } /// Construct from nullptr. executor(nullptr_t) ASIO_NOEXCEPT : impl_(0) { } /// Copy constructor. executor(const executor& other) ASIO_NOEXCEPT : impl_(other.clone()) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. executor(executor&& other) ASIO_NOEXCEPT : impl_(other.impl_) { other.impl_ = 0; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Construct a polymorphic wrapper for the specified executor. template executor(Executor e); /// Allocator-aware constructor to create a polymorphic wrapper for the /// specified executor. template executor(allocator_arg_t, const Allocator& a, Executor e); /// Destructor. ~executor() { destroy(); } /// Assignment operator. executor& operator=(const executor& other) ASIO_NOEXCEPT { destroy(); impl_ = other.clone(); return *this; } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) // Move assignment operator. executor& operator=(executor&& other) ASIO_NOEXCEPT { destroy(); impl_ = other.impl_; other.impl_ = 0; return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Assignment operator for nullptr_t. executor& operator=(nullptr_t) ASIO_NOEXCEPT { destroy(); impl_ = 0; return *this; } /// Assignment operator to create a polymorphic wrapper for the specified /// executor. template executor& operator=(ASIO_MOVE_ARG(Executor) e) ASIO_NOEXCEPT { executor tmp(ASIO_MOVE_CAST(Executor)(e)); destroy(); impl_ = tmp.impl_; tmp.impl_ = 0; return *this; } /// Obtain the underlying execution context. execution_context& context() const ASIO_NOEXCEPT { return get_impl()->context(); } /// Inform the executor that it has some outstanding work to do. void on_work_started() const ASIO_NOEXCEPT { get_impl()->on_work_started(); } /// Inform the executor that some work is no longer outstanding. void on_work_finished() const ASIO_NOEXCEPT { get_impl()->on_work_finished(); } /// Request the executor to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object is executed according to the rules of the * target executor object. * * @param f The function object to be called. The executor will make a copy * of the handler object as required. The function signature of the function * object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the executor to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object is executed according to the rules of the * target executor object. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the executor to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object is executed according to the rules of the * target executor object. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; struct unspecified_bool_type_t {}; typedef void (*unspecified_bool_type)(unspecified_bool_type_t); static void unspecified_bool_true(unspecified_bool_type_t) {} /// Operator to test if the executor contains a valid target. operator unspecified_bool_type() const ASIO_NOEXCEPT { return impl_ ? &executor::unspecified_bool_true : 0; } /// Obtain type information for the target executor object. /** * @returns If @c *this has a target type of type @c T, typeid(T); * otherwise, typeid(void). */ #if !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) const std::type_info& target_type() const ASIO_NOEXCEPT { return impl_ ? impl_->target_type() : typeid(void); } #else // !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) const void* target_type() const ASIO_NOEXCEPT { return impl_ ? impl_->target_type() : 0; } #endif // !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) /// Obtain a pointer to the target executor object. /** * @returns If target_type() == typeid(T), a pointer to the stored * executor target; otherwise, a null pointer. */ template Executor* target() ASIO_NOEXCEPT; /// Obtain a pointer to the target executor object. /** * @returns If target_type() == typeid(T), a pointer to the stored * executor target; otherwise, a null pointer. */ template const Executor* target() const ASIO_NOEXCEPT; /// Compare two executors for equality. friend bool operator==(const executor& a, const executor& b) ASIO_NOEXCEPT { if (a.impl_ == b.impl_) return true; if (!a.impl_ || !b.impl_) return false; return a.impl_->equals(b.impl_); } /// Compare two executors for inequality. friend bool operator!=(const executor& a, const executor& b) ASIO_NOEXCEPT { return !(a == b); } private: #if !defined(GENERATING_DOCUMENTATION) class function; template class impl; #if !defined(ASIO_NO_TYPEID) typedef const std::type_info& type_id_result_type; #else // !defined(ASIO_NO_TYPEID) typedef const void* type_id_result_type; #endif // !defined(ASIO_NO_TYPEID) template static type_id_result_type type_id() { #if !defined(ASIO_NO_TYPEID) return typeid(T); #else // !defined(ASIO_NO_TYPEID) static int unique_id; return &unique_id; #endif // !defined(ASIO_NO_TYPEID) } // Base class for all polymorphic executor implementations. class impl_base { public: virtual impl_base* clone() const ASIO_NOEXCEPT = 0; virtual void destroy() ASIO_NOEXCEPT = 0; virtual execution_context& context() ASIO_NOEXCEPT = 0; virtual void on_work_started() ASIO_NOEXCEPT = 0; virtual void on_work_finished() ASIO_NOEXCEPT = 0; virtual void dispatch(ASIO_MOVE_ARG(function)) = 0; virtual void post(ASIO_MOVE_ARG(function)) = 0; virtual void defer(ASIO_MOVE_ARG(function)) = 0; virtual type_id_result_type target_type() const ASIO_NOEXCEPT = 0; virtual void* target() ASIO_NOEXCEPT = 0; virtual const void* target() const ASIO_NOEXCEPT = 0; virtual bool equals(const impl_base* e) const ASIO_NOEXCEPT = 0; protected: impl_base(bool fast_dispatch) : fast_dispatch_(fast_dispatch) {} virtual ~impl_base() {} private: friend class executor; const bool fast_dispatch_; }; // Helper function to check and return the implementation pointer. impl_base* get_impl() const { if (!impl_) { bad_executor ex; asio::detail::throw_exception(ex); } return impl_; } // Helper function to clone another implementation. impl_base* clone() const ASIO_NOEXCEPT { return impl_ ? impl_->clone() : 0; } // Helper function to destroy an implementation. void destroy() ASIO_NOEXCEPT { if (impl_) impl_->destroy(); } impl_base* impl_; #endif // !defined(GENERATING_DOCUMENTATION) }; } // namespace asio ASIO_USES_ALLOCATOR(asio::executor) #include "asio/detail/pop_options.hpp" #include "asio/impl/executor.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/executor.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_EXECUTOR_HPP asio-1.12.2/include/asio/executor_work_guard.hpp000066400000000000000000000116001340672067200217060ustar00rootroot00000000000000// // executor_work_guard.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXECUTOR_WORK_GUARD_HPP #define ASIO_EXECUTOR_WORK_GUARD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/type_traits.hpp" #include "asio/is_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// An object of type @c executor_work_guard controls ownership of executor work /// within a scope. template class executor_work_guard { public: /// The underlying executor type. typedef Executor executor_type; /// Constructs a @c executor_work_guard object for the specified executor. /** * Stores a copy of @c e and calls on_work_started() on it. */ explicit executor_work_guard(const executor_type& e) ASIO_NOEXCEPT : executor_(e), owns_(true) { executor_.on_work_started(); } /// Copy constructor. executor_work_guard(const executor_work_guard& other) ASIO_NOEXCEPT : executor_(other.executor_), owns_(other.owns_) { if (owns_) executor_.on_work_started(); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. executor_work_guard(executor_work_guard&& other) : executor_(ASIO_MOVE_CAST(Executor)(other.executor_)), owns_(other.owns_) { other.owns_ = false; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destructor. /** * Unless the object has already been reset, or is in a moved-from state, * calls on_work_finished() on the stored executor. */ ~executor_work_guard() { if (owns_) executor_.on_work_finished(); } /// Obtain the associated executor. executor_type get_executor() const ASIO_NOEXCEPT { return executor_; } /// Whether the executor_work_guard object owns some outstanding work. bool owns_work() const ASIO_NOEXCEPT { return owns_; } /// Indicate that the work is no longer outstanding. /* * Unless the object has already been reset, or is in a moved-from state, * calls on_work_finished() on the stored executor. */ void reset() ASIO_NOEXCEPT { if (owns_) { executor_.on_work_finished(); owns_ = false; } } private: // Disallow assignment. executor_work_guard& operator=(const executor_work_guard&); executor_type executor_; bool owns_; }; /// Create an @ref executor_work_guard object. template inline executor_work_guard make_work_guard(const Executor& ex, typename enable_if::value>::type* = 0) { return executor_work_guard(ex); } /// Create an @ref executor_work_guard object. template inline executor_work_guard make_work_guard(ExecutionContext& ctx, typename enable_if< is_convertible::value>::type* = 0) { return executor_work_guard( ctx.get_executor()); } /// Create an @ref executor_work_guard object. template inline executor_work_guard::type> make_work_guard(const T& t, typename enable_if::value && !is_convertible::value>::type* = 0) { return executor_work_guard::type>( associated_executor::get(t)); } /// Create an @ref executor_work_guard object. template inline executor_work_guard::type> make_work_guard(const T& t, const Executor& ex, typename enable_if::value>::type* = 0) { return executor_work_guard::type>( associated_executor::get(t, ex)); } /// Create an @ref executor_work_guard object. template inline executor_work_guard::type> make_work_guard(const T& t, ExecutionContext& ctx, typename enable_if::value && !is_convertible::value && is_convertible::value>::type* = 0) { return executor_work_guard::type>( associated_executor::get( t, ctx.get_executor())); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_EXECUTOR_WORK_GUARD_HPP asio-1.12.2/include/asio/experimental.hpp000066400000000000000000000011541340672067200203240ustar00rootroot00000000000000// // experimental.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_HPP #define ASIO_EXPERIMENTAL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/experimental/co_spawn.hpp" #include "asio/experimental/detached.hpp" #include "asio/experimental/redirect_error.hpp" #endif // ASIO_EXPERIMENTAL_HPP asio-1.12.2/include/asio/experimental/000077500000000000000000000000001340672067200176125ustar00rootroot00000000000000asio-1.12.2/include/asio/experimental/co_spawn.hpp000066400000000000000000000142031340672067200221340ustar00rootroot00000000000000// // experimental/co_spawn.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_CO_SPAWN_HPP #define ASIO_EXPERIMENTAL_CO_SPAWN_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION) #include #include "asio/executor.hpp" #include "asio/strand.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace experimental { namespace detail { using std::experimental::coroutine_handle; template class awaiter; template class awaitee_base; template class awaitee; template class await_handler_base; template auto co_spawn(const Executor& ex, F&& f, CompletionToken&& token); } // namespace detail namespace this_coro { /// Awaitable type that returns a completion token for the current coroutine. struct token_t {}; /// Awaitable object that returns a completion token for the current coroutine. constexpr inline token_t token() { return {}; } /// Awaitable type that returns the executor of the current coroutine. struct executor_t {}; /// Awaitable object that returns the executor of the current coroutine. constexpr inline executor_t executor() { return {}; } } // namespace this_coro /// A completion token that represents the currently executing coroutine. /** * The await_token class is used to represent the currently executing * coroutine. An await_token may be passed as a handler to an asynchronous * operation. For example: * * @code awaitable my_coroutine() * { * await_token token = co_await this_coro::token(); * ... * std::size_t n = co_await my_socket.async_read_some(buffer, token); * ... * } @endcode * * The initiating function (async_read_some in the above example) suspends the * current coroutine. The coroutine is resumed when the asynchronous operation * completes, and the result of the operation is returned. */ template class await_token { public: /// The associated executor type. typedef Executor executor_type; /// Copy constructor. await_token(const await_token& other) noexcept : awaiter_(other.awaiter_) { } /// Move constructor. await_token(await_token&& other) noexcept : awaiter_(std::exchange(other.awaiter_, nullptr)) { } /// Get the associated executor. executor_type get_executor() const noexcept { return awaiter_->get_executor(); } private: // No assignment allowed. await_token& operator=(const await_token&) = delete; template friend class detail::awaitee_base; template friend class detail::await_handler_base; // Private constructor used by awaitee_base. explicit await_token(detail::awaiter* a) : awaiter_(a) { } detail::awaiter* awaiter_; }; /// The return type of a coroutine or asynchronous operation. template > class awaitable { public: /// The type of the awaited value. typedef T value_type; /// The executor type that will be used for the coroutine. typedef Executor executor_type; /// Move constructor. awaitable(awaitable&& other) noexcept : awaitee_(std::exchange(other.awaitee_, nullptr)) { } /// Destructor ~awaitable() { if (awaitee_) { detail::coroutine_handle< detail::awaitee>::from_promise( *awaitee_).destroy(); } } #if !defined(GENERATING_DOCUMENTATION) // Support for co_await keyword. bool await_ready() const noexcept { return awaitee_->ready(); } // Support for co_await keyword. void await_suspend(detail::coroutine_handle> h) { awaitee_->attach_caller(h); } // Support for co_await keyword. template void await_suspend(detail::coroutine_handle> h) { awaitee_->attach_caller(h); } // Support for co_await keyword. T await_resume() { return awaitee_->get(); } #endif // !defined(GENERATING_DOCUMENTATION) private: template friend class detail::awaitee; template friend class detail::await_handler_base; // Not copy constructible or copy assignable. awaitable(const awaitable&) = delete; awaitable& operator=(const awaitable&) = delete; // Construct the awaitable from a coroutine's promise object. explicit awaitable(detail::awaitee* a) : awaitee_(a) {} detail::awaitee* awaitee_; }; /// Spawn a new thread of execution. template ::value>::type> inline auto co_spawn(const Executor& ex, F&& f, CompletionToken&& token) { return detail::co_spawn(ex, std::forward(f), std::forward(token)); } /// Spawn a new thread of execution. template ::value>::type> inline auto co_spawn(ExecutionContext& ctx, F&& f, CompletionToken&& token) { return detail::co_spawn(ctx.get_executor(), std::forward(f), std::forward(token)); } /// Spawn a new thread of execution. template inline auto co_spawn(const await_token& parent, F&& f, CompletionToken&& token) { return detail::co_spawn(parent.get_executor(), std::forward(f), std::forward(token)); } } // namespace experimental } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/experimental/impl/co_spawn.hpp" #endif // defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION) #endif // ASIO_EXPERIMENTAL_CO_SPAWN_HPP asio-1.12.2/include/asio/experimental/detached.hpp000066400000000000000000000032521340672067200220660ustar00rootroot00000000000000// // experimental/detached.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_DETACHED_HPP #define ASIO_EXPERIMENTAL_DETACHED_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/push_options.hpp" namespace asio { namespace experimental { /// Class used to specify that an asynchronous operation is detached. /** * The detached_t class is used to indicate that an asynchronous operation is * detached. That is, there is no completion handler waiting for the * operation's result. A detached_t object may be passed as a handler to an * asynchronous operation, typically using the special value * @c asio::experimental::detached. For example: * @code my_socket.async_send(my_buffer, asio::experimental::detached); * @endcode */ class detached_t { public: /// Constructor. ASIO_CONSTEXPR detached_t() { } }; /// A special value, similar to std::nothrow. /** * See the documentation for asio::experimental::detached_t for a usage * example. */ #if defined(ASIO_HAS_CONSTEXPR) || defined(GENERATING_DOCUMENTATION) constexpr detached_t detached; #elif defined(ASIO_MSVC) __declspec(selectany) detached_t detached; #endif } // namespace experimental } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/experimental/impl/detached.hpp" #endif // ASIO_EXPERIMENTAL_DETACHED_HPP asio-1.12.2/include/asio/experimental/impl/000077500000000000000000000000001340672067200205535ustar00rootroot00000000000000asio-1.12.2/include/asio/experimental/impl/co_spawn.hpp000066400000000000000000000467521340672067200231130ustar00rootroot00000000000000// // experimental/impl/co_spawn.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_IMPL_CO_SPAWN_HPP #define ASIO_EXPERIMENTAL_IMPL_CO_SPAWN_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include #include #include #include "asio/async_result.hpp" #include "asio/detail/thread_context.hpp" #include "asio/detail/thread_info_base.hpp" #include "asio/detail/type_traits.hpp" #include "asio/dispatch.hpp" #include "asio/post.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace experimental { namespace detail { // Promise object for coroutine at top of thread-of-execution "stack". template class awaiter { public: struct deleter { void operator()(awaiter* a) { if (a) a->release(); } }; typedef std::unique_ptr ptr; typedef Executor executor_type; ~awaiter() { if (has_executor_) static_cast(static_cast(executor_))->~Executor(); } void set_executor(const Executor& ex) { new (&executor_) Executor(ex); has_executor_ = true; } executor_type get_executor() const noexcept { return *static_cast(static_cast(executor_)); } awaiter* get_return_object() { return this; } auto initial_suspend() { return std::experimental::suspend_always(); } auto final_suspend() { return std::experimental::suspend_always(); } void return_void() { } awaiter* add_ref() { ++ref_count_; return this; } void release() { if (--ref_count_ == 0) coroutine_handle::from_promise(*this).destroy(); } void unhandled_exception() { pending_exception_ = std::current_exception(); } void rethrow_unhandled_exception() { if (pending_exception_) { std::exception_ptr ex = std::exchange(pending_exception_, nullptr); std::rethrow_exception(ex); } } private: std::size_t ref_count_ = 0; std::exception_ptr pending_exception_ = nullptr; alignas(Executor) unsigned char executor_[sizeof(Executor)]; bool has_executor_ = false; }; // Base promise for coroutines further down the thread-of-execution "stack". template class awaitee_base { public: #if !defined(ASIO_DISABLE_AWAITEE_RECYCLING) void* operator new(std::size_t size) { return asio::detail::thread_info_base::allocate( asio::detail::thread_info_base::awaitee_tag(), asio::detail::thread_context::thread_call_stack::top(), size); } void operator delete(void* pointer, std::size_t size) { asio::detail::thread_info_base::deallocate( asio::detail::thread_info_base::awaitee_tag(), asio::detail::thread_context::thread_call_stack::top(), pointer, size); } #endif // !defined(ASIO_DISABLE_AWAITEE_RECYCLING) auto initial_suspend() { return std::experimental::suspend_never(); } struct final_suspender { awaitee_base* this_; bool await_ready() const noexcept { return false; } void await_suspend(coroutine_handle) { this_->wake_caller(); } void await_resume() const noexcept { } }; auto final_suspend() { return final_suspender{this}; } void set_except(std::exception_ptr e) { pending_exception_ = e; } void unhandled_exception() { set_except(std::current_exception()); } void rethrow_exception() { if (pending_exception_) { std::exception_ptr ex = std::exchange(pending_exception_, nullptr); std::rethrow_exception(ex); } } awaiter* top() { return awaiter_; } coroutine_handle caller() { return caller_; } bool ready() const { return ready_; } void wake_caller() { if (caller_) caller_.resume(); else ready_ = true; } class awaitable_executor { public: explicit awaitable_executor(awaitee_base* a) : this_(a) { } bool await_ready() const noexcept { return this_->awaiter_ != nullptr; } template void await_suspend(coroutine_handle> h) noexcept { this_->resume_on_attach_ = h; } Executor await_resume() { return this_->awaiter_->get_executor(); } private: awaitee_base* this_; }; awaitable_executor await_transform(this_coro::executor_t) noexcept { return awaitable_executor(this); } class awaitable_token { public: explicit awaitable_token(awaitee_base* a) : this_(a) { } bool await_ready() const noexcept { return this_->awaiter_ != nullptr; } template void await_suspend(coroutine_handle> h) noexcept { this_->resume_on_attach_ = h; } await_token await_resume() { return await_token(this_->awaiter_); } private: awaitee_base* this_; }; awaitable_token await_transform(this_coro::token_t) noexcept { return awaitable_token(this); } template awaitable await_transform(awaitable& t) const { return std::move(t); } template awaitable await_transform(awaitable&& t) const { return std::move(t); } std::experimental::suspend_always await_transform( std::experimental::suspend_always) const { return std::experimental::suspend_always(); } void attach_caller(coroutine_handle> h) { this->caller_ = h; this->attach_callees(&h.promise()); } template void attach_caller(coroutine_handle> h) { this->caller_ = h; if (h.promise().awaiter_) this->attach_callees(h.promise().awaiter_); else h.promise().unattached_callee_ = this; } void attach_callees(awaiter* a) { for (awaitee_base* curr = this; curr != nullptr; curr = std::exchange(curr->unattached_callee_, nullptr)) { curr->awaiter_ = a; if (curr->resume_on_attach_) return std::exchange(curr->resume_on_attach_, nullptr).resume(); } } protected: awaiter* awaiter_ = nullptr; coroutine_handle caller_ = nullptr; awaitee_base* unattached_callee_ = nullptr; std::exception_ptr pending_exception_ = nullptr; coroutine_handle resume_on_attach_ = nullptr; bool ready_ = false; }; // Promise object for coroutines further down the thread-of-execution "stack". template class awaitee : public awaitee_base { public: awaitee() { } awaitee(awaitee&& other) noexcept : awaitee_base(std::move(other)) { } ~awaitee() { if (has_result_) static_cast(static_cast(result_))->~T(); } awaitable get_return_object() { return awaitable(this); }; template void return_value(U&& u) { new (&result_) T(std::forward(u)); has_result_ = true; } T get() { this->caller_ = nullptr; this->rethrow_exception(); return std::move(*static_cast(static_cast(result_))); } private: alignas(T) unsigned char result_[sizeof(T)]; bool has_result_ = false; }; // Promise object for coroutines further down the thread-of-execution "stack". template class awaitee : public awaitee_base { public: awaitable get_return_object() { return awaitable(this); }; void return_void() { } void get() { this->caller_ = nullptr; this->rethrow_exception(); } }; template class awaiter_task { public: typedef Executor executor_type; awaiter_task(awaiter* a) : awaiter_(a->add_ref()) { } awaiter_task(awaiter_task&& other) noexcept : awaiter_(std::exchange(other.awaiter_, nullptr)) { } ~awaiter_task() { if (awaiter_) { // Coroutine "stack unwinding" must be performed through the executor. executor_type ex(awaiter_->get_executor()); (post)(ex, [a = std::move(awaiter_)]() mutable { typename awaiter::ptr(std::move(a)); }); } } executor_type get_executor() const noexcept { return awaiter_->get_executor(); } protected: typename awaiter::ptr awaiter_; }; template class co_spawn_handler : public awaiter_task { public: using awaiter_task::awaiter_task; void operator()() { typename awaiter::ptr ptr(std::move(this->awaiter_)); coroutine_handle>::from_promise(*ptr.get()).resume(); } }; template class await_handler_base : public awaiter_task { public: typedef awaitable awaitable_type; await_handler_base(await_token token) : awaiter_task(token.awaiter_), awaitee_(nullptr) { } await_handler_base(await_handler_base&& other) noexcept : awaiter_task(std::move(other)), awaitee_(std::exchange(other.awaitee_, nullptr)) { } void attach_awaitee(const awaitable& a) { awaitee_ = a.awaitee_; } protected: awaitee* awaitee_; }; template class await_handler; template class await_handler : public await_handler_base { public: using await_handler_base::await_handler_base; void operator()() { typename awaiter::ptr ptr(std::move(this->awaiter_)); this->awaitee_->return_void(); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base { public: typedef void return_type; using await_handler_base::await_handler_base; void operator()(const asio::error_code& ec) { typename awaiter::ptr ptr(std::move(this->awaiter_)); if (ec) { this->awaitee_->set_except( std::make_exception_ptr(asio::system_error(ec))); } else this->awaitee_->return_void(); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base { public: using await_handler_base::await_handler_base; void operator()(std::exception_ptr ex) { typename awaiter::ptr ptr(std::move(this->awaiter_)); if (ex) this->awaitee_->set_except(ex); else this->awaitee_->return_void(); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base { public: using await_handler_base::await_handler_base; template void operator()(Arg&& arg) { typename awaiter::ptr ptr(std::move(this->awaiter_)); this->awaitee_->return_value(std::forward(arg)); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base { public: using await_handler_base::await_handler_base; template void operator()(const asio::error_code& ec, Arg&& arg) { typename awaiter::ptr ptr(std::move(this->awaiter_)); if (ec) { this->awaitee_->set_except( std::make_exception_ptr(asio::system_error(ec))); } else this->awaitee_->return_value(std::forward(arg)); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base { public: using await_handler_base::await_handler_base; template void operator()(std::exception_ptr ex, Arg&& arg) { typename awaiter::ptr ptr(std::move(this->awaiter_)); if (ex) this->awaitee_->set_except(ex); else this->awaitee_->return_value(std::forward(arg)); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base> { public: using await_handler_base>::await_handler_base; template void operator()(Args&&... args) { typename awaiter::ptr ptr(std::move(this->awaiter_)); this->awaitee_->return_value( std::forward_as_tuple(std::forward(args)...)); this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base> { public: using await_handler_base>::await_handler_base; template void operator()(const asio::error_code& ec, Args&&... args) { typename awaiter::ptr ptr(std::move(this->awaiter_)); if (ec) { this->awaitee_->set_except( std::make_exception_ptr(asio::system_error(ec))); } else { this->awaitee_->return_value( std::forward_as_tuple(std::forward(args)...)); } this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template class await_handler : public await_handler_base> { public: using await_handler_base>::await_handler_base; template void operator()(std::exception_ptr ex, Args&&... args) { typename awaiter::ptr ptr(std::move(this->awaiter_)); if (ex) this->awaitee_->set_except(ex); else { this->awaitee_->return_value( std::forward_as_tuple(std::forward(args)...)); } this->awaitee_->wake_caller(); ptr->rethrow_unhandled_exception(); } }; template struct awaitable_signature; template struct awaitable_signature> { typedef void type(std::exception_ptr, T); }; template struct awaitable_signature> { typedef void type(std::exception_ptr); }; template awaiter* co_spawn_entry_point(awaitable*, executor_work_guard work_guard, F f, Handler handler) { bool done = false; try { T t = co_await f(); done = true; (dispatch)(work_guard.get_executor(), [handler = std::move(handler), t = std::move(t)]() mutable { handler(std::exception_ptr(), std::move(t)); }); } catch (...) { if (done) throw; (dispatch)(work_guard.get_executor(), [handler = std::move(handler), e = std::current_exception()]() mutable { handler(e, T()); }); } } template awaiter* co_spawn_entry_point(awaitable*, executor_work_guard work_guard, F f, Handler handler) { std::exception_ptr e = nullptr; try { co_await f(); } catch (...) { e = std::current_exception(); } (dispatch)(work_guard.get_executor(), [handler = std::move(handler), e]() mutable { handler(e); }); } template auto co_spawn(const Executor& ex, F&& f, CompletionToken&& token) { typedef typename result_of::type awaitable_type; typedef typename awaitable_type::executor_type executor_type; typedef typename awaitable_signature::type signature_type; async_completion completion(token); executor_type ex2(ex); auto work_guard = make_work_guard(completion.completion_handler, ex2); auto* a = (co_spawn_entry_point)( static_cast(nullptr), std::move(work_guard), std::forward(f), std::move(completion.completion_handler)); a->set_executor(ex2); (post)(co_spawn_handler(a)); return completion.result.get(); } #if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable:4033) #endif // defined(_MSC_VER) #if defined(_MSC_VER) template T dummy_return() { return std::move(*static_cast(nullptr)); } template <> inline void dummy_return() { } #endif // defined(_MSC_VER) template inline Awaitable make_dummy_awaitable() { for (;;) co_await std::experimental::suspend_always(); #if defined(_MSC_VER) co_return dummy_return(); #endif // defined(_MSC_VER) } #if defined(_MSC_VER) # pragma warning(pop) #endif // defined(_MSC_VER) } // namespace detail } // namespace experimental template class async_result, R(Args...)> { public: typedef experimental::detail::await_handler< Executor, typename decay::type...> completion_handler_type; typedef typename experimental::detail::await_handler< Executor, Args...>::awaitable_type return_type; async_result(completion_handler_type& h) : awaitable_(experimental::detail::make_dummy_awaitable()) { h.attach_awaitee(awaitable_); } return_type get() { return std::move(awaitable_); } private: return_type awaitable_; }; #if !defined(ASIO_NO_DEPRECATED) template struct handler_type, R(Args...)> { typedef experimental::detail::await_handler< Executor, typename decay::type...> type; }; template class async_result> { public: typedef typename experimental::detail::await_handler< Executor, Args...>::awaitable_type type; async_result(experimental::detail::await_handler& h) : awaitable_(experimental::detail::make_dummy_awaitable()) { h.attach_awaitee(awaitable_); } type get() { return std::move(awaitable_); } private: type awaitable_; }; #endif // !defined(ASIO_NO_DEPRECATED) } // namespace asio namespace std { namespace experimental { template struct coroutine_traits< asio::experimental::detail::awaiter*, Args...> { typedef asio::experimental::detail::awaiter promise_type; }; template struct coroutine_traits< asio::experimental::awaitable, Args...> { typedef asio::experimental::detail::awaitee promise_type; }; }} // namespace std::experimental #include "asio/detail/pop_options.hpp" #endif // ASIO_EXPERIMENTAL_IMPL_CO_SPAWN_HPP asio-1.12.2/include/asio/experimental/impl/detached.hpp000066400000000000000000000036561340672067200230370ustar00rootroot00000000000000// // experimental/impl/detached.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_IMPL_DETACHED_HPP #define ASIO_EXPERIMENTAL_IMPL_DETACHED_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/detail/variadic_templates.hpp" #include "asio/handler_type.hpp" #include "asio/system_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace experimental { namespace detail { // Class to adapt a detached_t as a completion handler. class detached_handler { public: detached_handler(detached_t) { } #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template void operator()(Args...) { } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) void operator()() { } #define ASIO_PRIVATE_DETACHED_DEF(n) \ template \ void operator()(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ { \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_DETACHED_DEF) #undef ASIO_PRIVATE_DETACHED_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) }; } // namespace detail } // namespace experimental #if !defined(GENERATING_DOCUMENTATION) template struct async_result { typedef asio::experimental::detail::detached_handler completion_handler_type; typedef void return_type; explicit async_result(completion_handler_type&) { } void get() { } }; #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_EXPERIMENTAL_IMPL_DETACHED_HPP asio-1.12.2/include/asio/experimental/impl/redirect_error.hpp000066400000000000000000000175721340672067200243120ustar00rootroot00000000000000// // experimental/impl/redirect_error.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_IMPL_REDIRECT_ERROR_HPP #define ASIO_EXPERIMENTAL_IMPL_REDIRECT_ERROR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_executor.hpp" #include "asio/associated_allocator.hpp" #include "asio/async_result.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/variadic_templates.hpp" #include "asio/handler_type.hpp" #include "asio/system_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace experimental { namespace detail { // Class to adapt a redirect_error_t as a completion handler. template class redirect_error_handler { public: template redirect_error_handler(redirect_error_t e) : ec_(e.ec_), handler_(ASIO_MOVE_CAST(CompletionToken)(e.token_)) { } void operator()() { handler_(); } #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template typename enable_if< !is_same::type, asio::error_code>::value >::type operator()(ASIO_MOVE_ARG(Arg) arg, ASIO_MOVE_ARG(Args)... args) { handler_(ASIO_MOVE_CAST(Arg)(arg), ASIO_MOVE_CAST(Args)(args)...); } template void operator()(const asio::error_code& ec, ASIO_MOVE_ARG(Args)... args) { ec_ = ec; handler_(ASIO_MOVE_CAST(Args)(args)...); } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) template typename enable_if< !is_same::type, asio::error_code>::value >::type operator()(ASIO_MOVE_ARG(Arg) arg) { handler_(ASIO_MOVE_CAST(Arg)(arg)); } void operator()(const asio::error_code& ec) { ec_ = ec; handler_(); } #define ASIO_PRIVATE_REDIRECT_ERROR_DEF(n) \ template \ typename enable_if< \ !is_same::type, asio::error_code>::value \ >::type \ operator()(ASIO_MOVE_ARG(Arg) arg, ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ handler_(ASIO_MOVE_CAST(Arg)(arg), \ ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ \ template \ void operator()(const asio::error_code& ec, \ ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ ec_ = ec; \ handler_(ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_REDIRECT_ERROR_DEF) #undef ASIO_PRIVATE_REDIRECT_ERROR_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) //private: asio::error_code& ec_; Handler handler_; }; template inline void* asio_handler_allocate(std::size_t size, redirect_error_handler* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, redirect_error_handler* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( redirect_error_handler* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, redirect_error_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, redirect_error_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template struct redirect_error_signature { typedef Signature type; }; #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template struct redirect_error_signature { typedef R type(Args...); }; template struct redirect_error_signature { typedef R type(Args...); }; #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) template struct redirect_error_signature { typedef R type(); }; template struct redirect_error_signature { typedef R type(); }; #define ASIO_PRIVATE_REDIRECT_ERROR_DEF(n) \ template \ struct redirect_error_signature< \ R(asio::error_code, ASIO_VARIADIC_TARGS(n))> \ { \ typedef R type(ASIO_VARIADIC_TARGS(n)); \ }; \ \ template \ struct redirect_error_signature< \ R(const asio::error_code&, ASIO_VARIADIC_TARGS(n))> \ { \ typedef R type(ASIO_VARIADIC_TARGS(n)); \ }; \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_REDIRECT_ERROR_DEF) #undef ASIO_PRIVATE_REDIRECT_ERROR_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) } // namespace detail } // namespace experimental #if !defined(GENERATING_DOCUMENTATION) template struct async_result, Signature> : async_result::type> { typedef experimental::detail::redirect_error_handler< typename async_result::type> ::completion_handler_type> completion_handler_type; explicit async_result(completion_handler_type& h) : async_result::type>(h.handler_) { } }; #if !defined(ASIO_NO_DEPRECATED) template struct handler_type, Signature> { typedef experimental::detail::redirect_error_handler< typename async_result::type> ::completion_handler_type> type; }; template struct async_result > : async_result { explicit async_result( experimental::detail::redirect_error_handler& h) : async_result(h.handler_) { } }; #endif // !defined(ASIO_NO_DEPRECATED) template struct associated_executor< experimental::detail::redirect_error_handler, Executor> { typedef typename associated_executor::type type; static type get( const experimental::detail::redirect_error_handler& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; template struct associated_allocator< experimental::detail::redirect_error_handler, Allocator> { typedef typename associated_allocator::type type; static type get( const experimental::detail::redirect_error_handler& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_EXPERIMENTAL_IMPL_REDIRECT_ERROR_HPP asio-1.12.2/include/asio/experimental/redirect_error.hpp000066400000000000000000000035621340672067200233430ustar00rootroot00000000000000// // experimental/redirect_error.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_REDIRECT_ERROR_HPP #define ASIO_EXPERIMENTAL_REDIRECT_ERROR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error_code.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace experimental { /// Completion token type used to specify that an error produced by an /// asynchronous operation is captured to an error_code variable. /** * The redirect_error_t class is used to indicate that any error_code produced * by an asynchronous operation is captured to a specified variable. */ template class redirect_error_t { public: /// Constructor. template redirect_error_t(ASIO_MOVE_ARG(T) completion_token, asio::error_code& ec) : token_(ASIO_MOVE_CAST(T)(completion_token)), ec_(ec) { } //private: CompletionToken token_; asio::error_code& ec_; }; /// Create a completion token to capture error_code values to a variable. template inline redirect_error_t::type> redirect_error( CompletionToken&& completion_token, asio::error_code& ec) { return redirect_error_t::type>( ASIO_MOVE_CAST(CompletionToken)(completion_token), ec); } } // namespace experimental } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/experimental/impl/redirect_error.hpp" #endif // ASIO_EXPERIMENTAL_REDIRECT_ERROR_HPP asio-1.12.2/include/asio/generic/000077500000000000000000000000001340672067200165315ustar00rootroot00000000000000asio-1.12.2/include/asio/generic/basic_endpoint.hpp000066400000000000000000000111321340672067200222210ustar00rootroot00000000000000// // generic/basic_endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_BASIC_ENDPOINT_HPP #define ASIO_GENERIC_BASIC_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/generic/detail/endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { /// Describes an endpoint for any socket type. /** * The asio::generic::basic_endpoint class template describes an endpoint * that may be associated with any socket type. * * @note The socket types sockaddr type must be able to fit into a * @c sockaddr_storage structure. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * Endpoint. */ template class basic_endpoint { public: /// The protocol type associated with the endpoint. typedef Protocol protocol_type; /// The type of the endpoint structure. This type is dependent on the /// underlying implementation of the socket layer. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined data_type; #else typedef asio::detail::socket_addr_type data_type; #endif /// Default constructor. basic_endpoint() { } /// Construct an endpoint from the specified socket address. basic_endpoint(const void* socket_address, std::size_t socket_address_size, int socket_protocol = 0) : impl_(socket_address, socket_address_size, socket_protocol) { } /// Construct an endpoint from the specific endpoint type. template basic_endpoint(const Endpoint& endpoint) : impl_(endpoint.data(), endpoint.size(), endpoint.protocol().protocol()) { } /// Copy constructor. basic_endpoint(const basic_endpoint& other) : impl_(other.impl_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. basic_endpoint(basic_endpoint&& other) : impl_(other.impl_) { } #endif // defined(ASIO_HAS_MOVE) /// Assign from another endpoint. basic_endpoint& operator=(const basic_endpoint& other) { impl_ = other.impl_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move-assign from another endpoint. basic_endpoint& operator=(basic_endpoint&& other) { impl_ = other.impl_; return *this; } #endif // defined(ASIO_HAS_MOVE) /// The protocol associated with the endpoint. protocol_type protocol() const { return protocol_type(impl_.family(), impl_.protocol()); } /// Get the underlying endpoint in the native type. data_type* data() { return impl_.data(); } /// Get the underlying endpoint in the native type. const data_type* data() const { return impl_.data(); } /// Get the underlying size of the endpoint in the native type. std::size_t size() const { return impl_.size(); } /// Set the underlying size of the endpoint in the native type. void resize(std::size_t new_size) { impl_.resize(new_size); } /// Get the capacity of the endpoint in the native type. std::size_t capacity() const { return impl_.capacity(); } /// Compare two endpoints for equality. friend bool operator==(const basic_endpoint& e1, const basic_endpoint& e2) { return e1.impl_ == e2.impl_; } /// Compare two endpoints for inequality. friend bool operator!=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e1.impl_ == e2.impl_); } /// Compare endpoints for ordering. friend bool operator<(const basic_endpoint& e1, const basic_endpoint& e2) { return e1.impl_ < e2.impl_; } /// Compare endpoints for ordering. friend bool operator>(const basic_endpoint& e1, const basic_endpoint& e2) { return e2.impl_ < e1.impl_; } /// Compare endpoints for ordering. friend bool operator<=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e2 < e1); } /// Compare endpoints for ordering. friend bool operator>=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e1 < e2); } private: // The underlying generic endpoint. asio::generic::detail::endpoint impl_; }; } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_GENERIC_BASIC_ENDPOINT_HPP asio-1.12.2/include/asio/generic/datagram_protocol.hpp000066400000000000000000000061341340672067200227470ustar00rootroot00000000000000// // generic/datagram_protocol.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_DATAGRAM_PROTOCOL_HPP #define ASIO_GENERIC_DATAGRAM_PROTOCOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_datagram_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/generic/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { /// Encapsulates the flags needed for a generic datagram-oriented socket. /** * The asio::generic::datagram_protocol class contains flags necessary * for datagram-oriented sockets of any address family and protocol. * * @par Examples * Constructing using a native address family and socket protocol: * @code datagram_protocol p(AF_INET, IPPROTO_UDP); @endcode * Constructing from a specific protocol type: * @code datagram_protocol p(asio::ip::udp::v4()); @endcode * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol. */ class datagram_protocol { public: /// Construct a protocol object for a specific address family and protocol. datagram_protocol(int address_family, int socket_protocol) : family_(address_family), protocol_(socket_protocol) { } /// Construct a generic protocol object from a specific protocol. /** * @throws @c bad_cast Thrown if the source protocol is not datagram-oriented. */ template datagram_protocol(const Protocol& source_protocol) : family_(source_protocol.family()), protocol_(source_protocol.protocol()) { if (source_protocol.type() != type()) { std::bad_cast ex; asio::detail::throw_exception(ex); } } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_DGRAM); } /// Obtain an identifier for the protocol. int protocol() const { return protocol_; } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// Compare two protocols for equality. friend bool operator==(const datagram_protocol& p1, const datagram_protocol& p2) { return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; } /// Compare two protocols for inequality. friend bool operator!=(const datagram_protocol& p1, const datagram_protocol& p2) { return !(p1 == p2); } /// The type of an endpoint. typedef basic_endpoint endpoint; /// The generic socket type. typedef basic_datagram_socket socket; private: int family_; int protocol_; }; } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_GENERIC_DATAGRAM_PROTOCOL_HPP asio-1.12.2/include/asio/generic/detail/000077500000000000000000000000001340672067200177735ustar00rootroot00000000000000asio-1.12.2/include/asio/generic/detail/endpoint.hpp000066400000000000000000000061651340672067200223340ustar00rootroot00000000000000// // generic/detail/endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_DETAIL_ENDPOINT_HPP #define ASIO_GENERIC_DETAIL_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { namespace detail { // Helper class for implementing a generic socket endpoint. class endpoint { public: // Default constructor. ASIO_DECL endpoint(); // Construct an endpoint from the specified raw bytes. ASIO_DECL endpoint(const void* sock_addr, std::size_t sock_addr_size, int sock_protocol); // Copy constructor. endpoint(const endpoint& other) : data_(other.data_), size_(other.size_), protocol_(other.protocol_) { } // Assign from another endpoint. endpoint& operator=(const endpoint& other) { data_ = other.data_; size_ = other.size_; protocol_ = other.protocol_; return *this; } // Get the address family associated with the endpoint. int family() const { return data_.base.sa_family; } // Get the socket protocol associated with the endpoint. int protocol() const { return protocol_; } // Get the underlying endpoint in the native type. asio::detail::socket_addr_type* data() { return &data_.base; } // Get the underlying endpoint in the native type. const asio::detail::socket_addr_type* data() const { return &data_.base; } // Get the underlying size of the endpoint in the native type. std::size_t size() const { return size_; } // Set the underlying size of the endpoint in the native type. ASIO_DECL void resize(std::size_t size); // Get the capacity of the endpoint in the native type. std::size_t capacity() const { return sizeof(asio::detail::sockaddr_storage_type); } // Compare two endpoints for equality. ASIO_DECL friend bool operator==( const endpoint& e1, const endpoint& e2); // Compare endpoints for ordering. ASIO_DECL friend bool operator<( const endpoint& e1, const endpoint& e2); private: // The underlying socket address. union data_union { asio::detail::socket_addr_type base; asio::detail::sockaddr_storage_type generic; } data_; // The length of the socket address stored in the endpoint. std::size_t size_; // The socket protocol associated with the endpoint. int protocol_; // Initialise with a specified memory. ASIO_DECL void init(const void* sock_addr, std::size_t sock_addr_size, int sock_protocol); }; } // namespace detail } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/generic/detail/impl/endpoint.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_GENERIC_DETAIL_ENDPOINT_HPP asio-1.12.2/include/asio/generic/detail/impl/000077500000000000000000000000001340672067200207345ustar00rootroot00000000000000asio-1.12.2/include/asio/generic/detail/impl/endpoint.ipp000066400000000000000000000051621340672067200232720ustar00rootroot00000000000000// // generic/detail/impl/endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP #define ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/error.hpp" #include "asio/generic/detail/endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { namespace detail { endpoint::endpoint() { init(0, 0, 0); } endpoint::endpoint(const void* sock_addr, std::size_t sock_addr_size, int sock_protocol) { init(sock_addr, sock_addr_size, sock_protocol); } void endpoint::resize(std::size_t new_size) { if (new_size > sizeof(asio::detail::sockaddr_storage_type)) { asio::error_code ec(asio::error::invalid_argument); asio::detail::throw_error(ec); } else { size_ = new_size; protocol_ = 0; } } bool operator==(const endpoint& e1, const endpoint& e2) { using namespace std; // For memcmp. return e1.size() == e2.size() && memcmp(e1.data(), e2.data(), e1.size()) == 0; } bool operator<(const endpoint& e1, const endpoint& e2) { if (e1.protocol() < e2.protocol()) return true; if (e1.protocol() > e2.protocol()) return false; using namespace std; // For memcmp. std::size_t compare_size = e1.size() < e2.size() ? e1.size() : e2.size(); int compare_result = memcmp(e1.data(), e2.data(), compare_size); if (compare_result < 0) return true; if (compare_result > 0) return false; return e1.size() < e2.size(); } void endpoint::init(const void* sock_addr, std::size_t sock_addr_size, int sock_protocol) { if (sock_addr_size > sizeof(asio::detail::sockaddr_storage_type)) { asio::error_code ec(asio::error::invalid_argument); asio::detail::throw_error(ec); } using namespace std; // For memset and memcpy. memset(&data_.generic, 0, sizeof(asio::detail::sockaddr_storage_type)); if (sock_addr_size > 0) memcpy(&data_.generic, sock_addr, sock_addr_size); size_ = sock_addr_size; protocol_ = sock_protocol; } } // namespace detail } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP asio-1.12.2/include/asio/generic/raw_protocol.hpp000066400000000000000000000057201340672067200217600ustar00rootroot00000000000000// // generic/raw_protocol.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_RAW_PROTOCOL_HPP #define ASIO_GENERIC_RAW_PROTOCOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_raw_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/generic/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { /// Encapsulates the flags needed for a generic raw socket. /** * The asio::generic::raw_protocol class contains flags necessary for * raw sockets of any address family and protocol. * * @par Examples * Constructing using a native address family and socket protocol: * @code raw_protocol p(AF_INET, IPPROTO_ICMP); @endcode * Constructing from a specific protocol type: * @code raw_protocol p(asio::ip::icmp::v4()); @endcode * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol. */ class raw_protocol { public: /// Construct a protocol object for a specific address family and protocol. raw_protocol(int address_family, int socket_protocol) : family_(address_family), protocol_(socket_protocol) { } /// Construct a generic protocol object from a specific protocol. /** * @throws @c bad_cast Thrown if the source protocol is not raw-oriented. */ template raw_protocol(const Protocol& source_protocol) : family_(source_protocol.family()), protocol_(source_protocol.protocol()) { if (source_protocol.type() != type()) { std::bad_cast ex; asio::detail::throw_exception(ex); } } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_RAW); } /// Obtain an identifier for the protocol. int protocol() const { return protocol_; } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// Compare two protocols for equality. friend bool operator==(const raw_protocol& p1, const raw_protocol& p2) { return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; } /// Compare two protocols for inequality. friend bool operator!=(const raw_protocol& p1, const raw_protocol& p2) { return !(p1 == p2); } /// The type of an endpoint. typedef basic_endpoint endpoint; /// The generic socket type. typedef basic_raw_socket socket; private: int family_; int protocol_; }; } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_GENERIC_RAW_PROTOCOL_HPP asio-1.12.2/include/asio/generic/seq_packet_protocol.hpp000066400000000000000000000060551340672067200233100ustar00rootroot00000000000000// // generic/seq_packet_protocol.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_SEQ_PACKET_PROTOCOL_HPP #define ASIO_GENERIC_SEQ_PACKET_PROTOCOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_seq_packet_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/generic/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { /// Encapsulates the flags needed for a generic sequenced packet socket. /** * The asio::generic::seq_packet_protocol class contains flags necessary * for seq_packet-oriented sockets of any address family and protocol. * * @par Examples * Constructing using a native address family and socket protocol: * @code seq_packet_protocol p(AF_INET, IPPROTO_SCTP); @endcode * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol. */ class seq_packet_protocol { public: /// Construct a protocol object for a specific address family and protocol. seq_packet_protocol(int address_family, int socket_protocol) : family_(address_family), protocol_(socket_protocol) { } /// Construct a generic protocol object from a specific protocol. /** * @throws @c bad_cast Thrown if the source protocol is not based around * sequenced packets. */ template seq_packet_protocol(const Protocol& source_protocol) : family_(source_protocol.family()), protocol_(source_protocol.protocol()) { if (source_protocol.type() != type()) { std::bad_cast ex; asio::detail::throw_exception(ex); } } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_SEQPACKET); } /// Obtain an identifier for the protocol. int protocol() const { return protocol_; } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// Compare two protocols for equality. friend bool operator==(const seq_packet_protocol& p1, const seq_packet_protocol& p2) { return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; } /// Compare two protocols for inequality. friend bool operator!=(const seq_packet_protocol& p1, const seq_packet_protocol& p2) { return !(p1 == p2); } /// The type of an endpoint. typedef basic_endpoint endpoint; /// The generic socket type. typedef basic_seq_packet_socket socket; private: int family_; int protocol_; }; } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_GENERIC_SEQ_PACKET_PROTOCOL_HPP asio-1.12.2/include/asio/generic/stream_protocol.hpp000066400000000000000000000063671340672067200224720ustar00rootroot00000000000000// // generic/stream_protocol.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_GENERIC_STREAM_PROTOCOL_HPP #define ASIO_GENERIC_STREAM_PROTOCOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/basic_socket_iostream.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/generic/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace generic { /// Encapsulates the flags needed for a generic stream-oriented socket. /** * The asio::generic::stream_protocol class contains flags necessary for * stream-oriented sockets of any address family and protocol. * * @par Examples * Constructing using a native address family and socket protocol: * @code stream_protocol p(AF_INET, IPPROTO_TCP); @endcode * Constructing from a specific protocol type: * @code stream_protocol p(asio::ip::tcp::v4()); @endcode * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol. */ class stream_protocol { public: /// Construct a protocol object for a specific address family and protocol. stream_protocol(int address_family, int socket_protocol) : family_(address_family), protocol_(socket_protocol) { } /// Construct a generic protocol object from a specific protocol. /** * @throws @c bad_cast Thrown if the source protocol is not stream-oriented. */ template stream_protocol(const Protocol& source_protocol) : family_(source_protocol.family()), protocol_(source_protocol.protocol()) { if (source_protocol.type() != type()) { std::bad_cast ex; asio::detail::throw_exception(ex); } } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_STREAM); } /// Obtain an identifier for the protocol. int protocol() const { return protocol_; } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// Compare two protocols for equality. friend bool operator==(const stream_protocol& p1, const stream_protocol& p2) { return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; } /// Compare two protocols for inequality. friend bool operator!=(const stream_protocol& p1, const stream_protocol& p2) { return !(p1 == p2); } /// The type of an endpoint. typedef basic_endpoint endpoint; /// The generic socket type. typedef basic_stream_socket socket; #if !defined(ASIO_NO_IOSTREAM) /// The generic socket iostream type. typedef basic_socket_iostream iostream; #endif // !defined(ASIO_NO_IOSTREAM) private: int family_; int protocol_; }; } // namespace generic } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_GENERIC_STREAM_PROTOCOL_HPP asio-1.12.2/include/asio/handler_alloc_hook.hpp000066400000000000000000000045531340672067200214440ustar00rootroot00000000000000// // handler_alloc_hook.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_HANDLER_ALLOC_HOOK_HPP #define ASIO_HANDLER_ALLOC_HOOK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/push_options.hpp" namespace asio { /// Default allocation function for handlers. /** * Asynchronous operations may need to allocate temporary objects. Since * asynchronous operations have a handler function object, these temporary * objects can be said to be associated with the handler. * * Implement asio_handler_allocate and asio_handler_deallocate for your own * handlers to provide custom allocation for these temporary objects. * * The default implementation of these allocation hooks uses ::operator * new and ::operator delete. * * @note All temporary objects associated with a handler will be deallocated * before the upcall to the handler is performed. This allows the same memory to * be reused for a subsequent asynchronous operation initiated by the handler. * * @par Example * @code * class my_handler; * * void* asio_handler_allocate(std::size_t size, my_handler* context) * { * return ::operator new(size); * } * * void asio_handler_deallocate(void* pointer, std::size_t size, * my_handler* context) * { * ::operator delete(pointer); * } * @endcode */ ASIO_DECL void* asio_handler_allocate( std::size_t size, ...); /// Default deallocation function for handlers. /** * Implement asio_handler_allocate and asio_handler_deallocate for your own * handlers to provide custom allocation for the associated temporary objects. * * The default implementation of these allocation hooks uses ::operator * new and ::operator delete. * * @sa asio_handler_allocate. */ ASIO_DECL void asio_handler_deallocate( void* pointer, std::size_t size, ...); } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/handler_alloc_hook.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_HANDLER_ALLOC_HOOK_HPP asio-1.12.2/include/asio/handler_continuation_hook.hpp000066400000000000000000000025671340672067200230670ustar00rootroot00000000000000// // handler_continuation_hook.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_HANDLER_CONTINUATION_HOOK_HPP #define ASIO_HANDLER_CONTINUATION_HOOK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Default continuation function for handlers. /** * Asynchronous operations may represent a continuation of the asynchronous * control flow associated with the current handler. The implementation can use * this knowledge to optimise scheduling of the handler. * * Implement asio_handler_is_continuation for your own handlers to indicate * when a handler represents a continuation. * * The default implementation of the continuation hook returns false. * * @par Example * @code * class my_handler; * * bool asio_handler_is_continuation(my_handler* context) * { * return true; * } * @endcode */ inline bool asio_handler_is_continuation(...) { return false; } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_HANDLER_CONTINUATION_HOOK_HPP asio-1.12.2/include/asio/handler_invoke_hook.hpp000066400000000000000000000051541340672067200216430ustar00rootroot00000000000000// // handler_invoke_hook.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_HANDLER_INVOKE_HOOK_HPP #define ASIO_HANDLER_INVOKE_HOOK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { /** @defgroup asio_handler_invoke asio::asio_handler_invoke * * @brief Default invoke function for handlers. * * Completion handlers for asynchronous operations are invoked by the * io_context associated with the corresponding object (e.g. a socket or * deadline_timer). Certain guarantees are made on when the handler may be * invoked, in particular that a handler can only be invoked from a thread that * is currently calling @c run() on the corresponding io_context object. * Handlers may subsequently be invoked through other objects (such as * io_context::strand objects) that provide additional guarantees. * * When asynchronous operations are composed from other asynchronous * operations, all intermediate handlers should be invoked using the same * method as the final handler. This is required to ensure that user-defined * objects are not accessed in a way that may violate the guarantees. This * hooking function ensures that the invoked method used for the final handler * is accessible at each intermediate step. * * Implement asio_handler_invoke for your own handlers to specify a custom * invocation strategy. * * This default implementation invokes the function object like so: * @code function(); @endcode * If necessary, the default implementation makes a copy of the function object * so that the non-const operator() can be used. * * @par Example * @code * class my_handler; * * template * void asio_handler_invoke(Function function, my_handler* context) * { * context->strand_.dispatch(function); * } * @endcode */ /*@{*/ /// Default handler invocation hook used for non-const function objects. template inline void asio_handler_invoke(Function& function, ...) { function(); } /// Default handler invocation hook used for const function objects. template inline void asio_handler_invoke(const Function& function, ...) { Function tmp(function); tmp(); } /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_HANDLER_INVOKE_HOOK_HPP asio-1.12.2/include/asio/handler_type.hpp000066400000000000000000000027671340672067200203200ustar00rootroot00000000000000// // handler_type.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_HANDLER_TYPE_HPP #define ASIO_HANDLER_TYPE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// (Deprecated: Use two-parameter version of async_result.) Default handler /// type traits provided for all completion token types. /** * The handler_type traits class is used for determining the concrete handler * type to be used for an asynchronous operation. It allows the handler type to * be determined at the point where the specific completion handler signature * is known. * * This template may be specialised for user-defined completion token types. */ template struct handler_type { /// The handler type for the specific signature. typedef typename conditional< is_same::type>::value, decay, handler_type::type, Signature> >::type::type type; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_HANDLER_TYPE_HPP asio-1.12.2/include/asio/high_resolution_timer.hpp000066400000000000000000000024331340672067200222320ustar00rootroot00000000000000// // high_resolution_timer.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_HIGH_RESOLUTION_TIMER_HPP #define ASIO_HIGH_RESOLUTION_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) #include "asio/basic_waitable_timer.hpp" #include "asio/detail/chrono.hpp" namespace asio { /// Typedef for a timer based on the high resolution clock. /** * This typedef uses the C++11 @c <chrono> standard library facility, if * available. Otherwise, it may use the Boost.Chrono library. To explicitly * utilise Boost.Chrono, use the basic_waitable_timer template directly: * @code * typedef basic_waitable_timer timer; * @endcode */ typedef basic_waitable_timer< chrono::high_resolution_clock> high_resolution_timer; } // namespace asio #endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) #endif // ASIO_HIGH_RESOLUTION_TIMER_HPP asio-1.12.2/include/asio/impl/000077500000000000000000000000001340672067200160565ustar00rootroot00000000000000asio-1.12.2/include/asio/impl/buffered_read_stream.hpp000066400000000000000000000312371340672067200227250ustar00rootroot00000000000000// // impl/buffered_read_stream.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_BUFFERED_READ_STREAM_HPP #define ASIO_IMPL_BUFFERED_READ_STREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/push_options.hpp" namespace asio { template std::size_t buffered_read_stream::fill() { detail::buffer_resize_guard resize_guard(storage_); std::size_t previous_size = storage_.size(); storage_.resize(storage_.capacity()); storage_.resize(previous_size + next_layer_.read_some(buffer( storage_.data() + previous_size, storage_.size() - previous_size))); resize_guard.commit(); return storage_.size() - previous_size; } template std::size_t buffered_read_stream::fill(asio::error_code& ec) { detail::buffer_resize_guard resize_guard(storage_); std::size_t previous_size = storage_.size(); storage_.resize(storage_.capacity()); storage_.resize(previous_size + next_layer_.read_some(buffer( storage_.data() + previous_size, storage_.size() - previous_size), ec)); resize_guard.commit(); return storage_.size() - previous_size; } namespace detail { template class buffered_fill_handler { public: buffered_fill_handler(detail::buffered_stream_storage& storage, std::size_t previous_size, ReadHandler& handler) : storage_(storage), previous_size_(previous_size), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) buffered_fill_handler(const buffered_fill_handler& other) : storage_(other.storage_), previous_size_(other.previous_size_), handler_(other.handler_) { } buffered_fill_handler(buffered_fill_handler&& other) : storage_(other.storage_), previous_size_(other.previous_size_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, const std::size_t bytes_transferred) { storage_.resize(previous_size_ + bytes_transferred); handler_(ec, bytes_transferred); } //private: detail::buffered_stream_storage& storage_; std::size_t previous_size_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, buffered_fill_handler* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, buffered_fill_handler* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( buffered_fill_handler* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, buffered_fill_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, buffered_fill_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::buffered_fill_handler, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::buffered_fill_handler& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::buffered_fill_handler, Executor> { typedef typename associated_executor::type type; static type get(const detail::buffered_fill_handler& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) buffered_read_stream::async_fill( ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); std::size_t previous_size = storage_.size(); storage_.resize(storage_.capacity()); next_layer_.async_read_some( buffer( storage_.data() + previous_size, storage_.size() - previous_size), detail::buffered_fill_handler( storage_, previous_size, init.completion_handler)); return init.result.get(); } template template std::size_t buffered_read_stream::read_some( const MutableBufferSequence& buffers) { using asio::buffer_size; if (buffer_size(buffers) == 0) return 0; if (storage_.empty()) this->fill(); return this->copy(buffers); } template template std::size_t buffered_read_stream::read_some( const MutableBufferSequence& buffers, asio::error_code& ec) { ec = asio::error_code(); using asio::buffer_size; if (buffer_size(buffers) == 0) return 0; if (storage_.empty() && !this->fill(ec)) return 0; return this->copy(buffers); } namespace detail { template class buffered_read_some_handler { public: buffered_read_some_handler(detail::buffered_stream_storage& storage, const MutableBufferSequence& buffers, ReadHandler& handler) : storage_(storage), buffers_(buffers), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) buffered_read_some_handler(const buffered_read_some_handler& other) : storage_(other.storage_), buffers_(other.buffers_), handler_(other.handler_) { } buffered_read_some_handler(buffered_read_some_handler&& other) : storage_(other.storage_), buffers_(other.buffers_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t) { if (ec || storage_.empty()) { const std::size_t length = 0; handler_(ec, length); } else { const std::size_t bytes_copied = asio::buffer_copy( buffers_, storage_.data(), storage_.size()); storage_.consume(bytes_copied); handler_(ec, bytes_copied); } } //private: detail::buffered_stream_storage& storage_; MutableBufferSequence buffers_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, buffered_read_some_handler< MutableBufferSequence, ReadHandler>* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, buffered_read_some_handler< MutableBufferSequence, ReadHandler>* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( buffered_read_some_handler< MutableBufferSequence, ReadHandler>* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, buffered_read_some_handler< MutableBufferSequence, ReadHandler>* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, buffered_read_some_handler< MutableBufferSequence, ReadHandler>* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::buffered_read_some_handler, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::buffered_read_some_handler< MutableBufferSequence, ReadHandler>& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::buffered_read_some_handler, Executor> { typedef typename associated_executor::type type; static type get( const detail::buffered_read_some_handler< MutableBufferSequence, ReadHandler>& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) buffered_read_stream::async_read_some( const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); using asio::buffer_size; if (buffer_size(buffers) == 0 || !storage_.empty()) { next_layer_.async_read_some(ASIO_MUTABLE_BUFFER(0, 0), detail::buffered_read_some_handler< MutableBufferSequence, ASIO_HANDLER_TYPE( ReadHandler, void (asio::error_code, std::size_t))>( storage_, buffers, init.completion_handler)); } else { this->async_fill(detail::buffered_read_some_handler< MutableBufferSequence, ASIO_HANDLER_TYPE( ReadHandler, void (asio::error_code, std::size_t))>( storage_, buffers, init.completion_handler)); } return init.result.get(); } template template std::size_t buffered_read_stream::peek( const MutableBufferSequence& buffers) { if (storage_.empty()) this->fill(); return this->peek_copy(buffers); } template template std::size_t buffered_read_stream::peek( const MutableBufferSequence& buffers, asio::error_code& ec) { ec = asio::error_code(); if (storage_.empty() && !this->fill(ec)) return 0; return this->peek_copy(buffers); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_BUFFERED_READ_STREAM_HPP asio-1.12.2/include/asio/impl/buffered_write_stream.hpp000066400000000000000000000303531340672067200231420ustar00rootroot00000000000000// // impl/buffered_write_stream.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP #define ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/push_options.hpp" namespace asio { template std::size_t buffered_write_stream::flush() { std::size_t bytes_written = write(next_layer_, buffer(storage_.data(), storage_.size())); storage_.consume(bytes_written); return bytes_written; } template std::size_t buffered_write_stream::flush(asio::error_code& ec) { std::size_t bytes_written = write(next_layer_, buffer(storage_.data(), storage_.size()), transfer_all(), ec); storage_.consume(bytes_written); return bytes_written; } namespace detail { template class buffered_flush_handler { public: buffered_flush_handler(detail::buffered_stream_storage& storage, WriteHandler& handler) : storage_(storage), handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) buffered_flush_handler(const buffered_flush_handler& other) : storage_(other.storage_), handler_(other.handler_) { } buffered_flush_handler(buffered_flush_handler&& other) : storage_(other.storage_), handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, const std::size_t bytes_written) { storage_.consume(bytes_written); handler_(ec, bytes_written); } //private: detail::buffered_stream_storage& storage_; WriteHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, buffered_flush_handler* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, buffered_flush_handler* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( buffered_flush_handler* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, buffered_flush_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, buffered_flush_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::buffered_flush_handler, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::buffered_flush_handler& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::buffered_flush_handler, Executor> { typedef typename associated_executor::type type; static type get(const detail::buffered_flush_handler& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) buffered_write_stream::async_flush( ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); async_write(next_layer_, buffer(storage_.data(), storage_.size()), detail::buffered_flush_handler( storage_, init.completion_handler)); return init.result.get(); } template template std::size_t buffered_write_stream::write_some( const ConstBufferSequence& buffers) { using asio::buffer_size; if (buffer_size(buffers) == 0) return 0; if (storage_.size() == storage_.capacity()) this->flush(); return this->copy(buffers); } template template std::size_t buffered_write_stream::write_some( const ConstBufferSequence& buffers, asio::error_code& ec) { ec = asio::error_code(); using asio::buffer_size; if (buffer_size(buffers) == 0) return 0; if (storage_.size() == storage_.capacity() && !flush(ec)) return 0; return this->copy(buffers); } namespace detail { template class buffered_write_some_handler { public: buffered_write_some_handler(detail::buffered_stream_storage& storage, const ConstBufferSequence& buffers, WriteHandler& handler) : storage_(storage), buffers_(buffers), handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) buffered_write_some_handler(const buffered_write_some_handler& other) : storage_(other.storage_), buffers_(other.buffers_), handler_(other.handler_) { } buffered_write_some_handler(buffered_write_some_handler&& other) : storage_(other.storage_), buffers_(other.buffers_), handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t) { if (ec) { const std::size_t length = 0; handler_(ec, length); } else { using asio::buffer_size; std::size_t orig_size = storage_.size(); std::size_t space_avail = storage_.capacity() - orig_size; std::size_t bytes_avail = buffer_size(buffers_); std::size_t length = bytes_avail < space_avail ? bytes_avail : space_avail; storage_.resize(orig_size + length); const std::size_t bytes_copied = asio::buffer_copy( storage_.data() + orig_size, buffers_, length); handler_(ec, bytes_copied); } } //private: detail::buffered_stream_storage& storage_; ConstBufferSequence buffers_; WriteHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, buffered_write_some_handler< ConstBufferSequence, WriteHandler>* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, buffered_write_some_handler< ConstBufferSequence, WriteHandler>* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( buffered_write_some_handler< ConstBufferSequence, WriteHandler>* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, buffered_write_some_handler< ConstBufferSequence, WriteHandler>* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, buffered_write_some_handler< ConstBufferSequence, WriteHandler>* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::buffered_write_some_handler, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::buffered_write_some_handler< ConstBufferSequence, WriteHandler>& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::buffered_write_some_handler, Executor> { typedef typename associated_executor::type type; static type get( const detail::buffered_write_some_handler< ConstBufferSequence, WriteHandler>& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) buffered_write_stream::async_write_some( const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); using asio::buffer_size; if (buffer_size(buffers) == 0 || storage_.size() < storage_.capacity()) { next_layer_.async_write_some(ASIO_CONST_BUFFER(0, 0), detail::buffered_write_some_handler< ConstBufferSequence, ASIO_HANDLER_TYPE( WriteHandler, void (asio::error_code, std::size_t))>( storage_, buffers, init.completion_handler)); } else { this->async_flush(detail::buffered_write_some_handler< ConstBufferSequence, ASIO_HANDLER_TYPE( WriteHandler, void (asio::error_code, std::size_t))>( storage_, buffers, init.completion_handler)); } return init.result.get(); } template template std::size_t buffered_write_stream::copy( const ConstBufferSequence& buffers) { using asio::buffer_size; std::size_t orig_size = storage_.size(); std::size_t space_avail = storage_.capacity() - orig_size; std::size_t bytes_avail = buffer_size(buffers); std::size_t length = bytes_avail < space_avail ? bytes_avail : space_avail; storage_.resize(orig_size + length); return asio::buffer_copy( storage_.data() + orig_size, buffers, length); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP asio-1.12.2/include/asio/impl/connect.hpp000066400000000000000000000703701340672067200202270ustar00rootroot00000000000000// // impl/connect.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_CONNECT_HPP #define ASIO_IMPL_CONNECT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/post.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { struct default_connect_condition { template bool operator()(const asio::error_code&, const Endpoint&) { return true; } }; template inline typename Protocol::endpoint deref_connect_result( Iterator iter, asio::error_code& ec) { return ec ? typename Protocol::endpoint() : *iter; } template struct legacy_connect_condition_helper : T { typedef char (*fallback_func_type)(...); operator fallback_func_type() const; }; template struct legacy_connect_condition_helper { R operator()(Arg1, Arg2) const; char operator()(...) const; }; template struct is_legacy_connect_condition { static char asio_connect_condition_check(char); static char (&asio_connect_condition_check(Iterator))[2]; static const bool value = sizeof(asio_connect_condition_check( (*static_cast*>(0))( *static_cast(0), *static_cast(0)))) != 1; }; template inline Iterator call_connect_condition(ConnectCondition& connect_condition, const asio::error_code& ec, Iterator next, Iterator end, typename enable_if::value>::type* = 0) { if (next != end) return connect_condition(ec, next); return end; } template inline Iterator call_connect_condition(ConnectCondition& connect_condition, const asio::error_code& ec, Iterator next, Iterator end, typename enable_if::value>::type* = 0) { for (;next != end; ++next) if (connect_condition(ec, *next)) return next; return end; } } template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, typename enable_if::value>::type*) { asio::error_code ec; typename Protocol::endpoint result = connect(s, endpoints, ec); asio::detail::throw_error(ec, "connect"); return result; } template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, asio::error_code& ec, typename enable_if::value>::type*) { return detail::deref_connect_result( connect(s, endpoints.begin(), endpoints.end(), detail::default_connect_condition(), ec), ec); } #if !defined(ASIO_NO_DEPRECATED) template Iterator connect(basic_socket& s, Iterator begin, typename enable_if::value>::type*) { asio::error_code ec; Iterator result = connect(s, begin, ec); asio::detail::throw_error(ec, "connect"); return result; } template inline Iterator connect(basic_socket& s, Iterator begin, asio::error_code& ec, typename enable_if::value>::type*) { return connect(s, begin, Iterator(), detail::default_connect_condition(), ec); } #endif // !defined(ASIO_NO_DEPRECATED) template Iterator connect(basic_socket& s, Iterator begin, Iterator end) { asio::error_code ec; Iterator result = connect(s, begin, end, ec); asio::detail::throw_error(ec, "connect"); return result; } template inline Iterator connect(basic_socket& s, Iterator begin, Iterator end, asio::error_code& ec) { return connect(s, begin, end, detail::default_connect_condition(), ec); } template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, ConnectCondition connect_condition, typename enable_if::value>::type*) { asio::error_code ec; typename Protocol::endpoint result = connect( s, endpoints, connect_condition, ec); asio::detail::throw_error(ec, "connect"); return result; } template typename Protocol::endpoint connect( basic_socket& s, const EndpointSequence& endpoints, ConnectCondition connect_condition, asio::error_code& ec, typename enable_if::value>::type*) { return detail::deref_connect_result( connect(s, endpoints.begin(), endpoints.end(), connect_condition, ec), ec); } #if !defined(ASIO_NO_DEPRECATED) template Iterator connect(basic_socket& s, Iterator begin, ConnectCondition connect_condition, typename enable_if::value>::type*) { asio::error_code ec; Iterator result = connect(s, begin, connect_condition, ec); asio::detail::throw_error(ec, "connect"); return result; } template inline Iterator connect(basic_socket& s, Iterator begin, ConnectCondition connect_condition, asio::error_code& ec, typename enable_if::value>::type*) { return connect(s, begin, Iterator(), connect_condition, ec); } #endif // !defined(ASIO_NO_DEPRECATED) template Iterator connect(basic_socket& s, Iterator begin, Iterator end, ConnectCondition connect_condition) { asio::error_code ec; Iterator result = connect(s, begin, end, connect_condition, ec); asio::detail::throw_error(ec, "connect"); return result; } template Iterator connect(basic_socket& s, Iterator begin, Iterator end, ConnectCondition connect_condition, asio::error_code& ec) { ec = asio::error_code(); for (Iterator iter = begin; iter != end; ++iter) { iter = (detail::call_connect_condition(connect_condition, ec, iter, end)); if (iter != end) { s.close(ec); s.connect(*iter, ec); if (!ec) return iter; } else break; } if (!ec) ec = asio::error::not_found; return end; } namespace detail { // Enable the empty base class optimisation for the connect condition. template class base_from_connect_condition { protected: explicit base_from_connect_condition( const ConnectCondition& connect_condition) : connect_condition_(connect_condition) { } template void check_condition(const asio::error_code& ec, Iterator& iter, Iterator& end) { iter = detail::call_connect_condition(connect_condition_, ec, iter, end); } private: ConnectCondition connect_condition_; }; // The default_connect_condition implementation is essentially a no-op. This // template specialisation lets us eliminate all costs associated with it. template <> class base_from_connect_condition { protected: explicit base_from_connect_condition(const default_connect_condition&) { } template void check_condition(const asio::error_code&, Iterator&, Iterator&) { } }; template class range_connect_op : base_from_connect_condition { public: range_connect_op(basic_socket& sock, const EndpointSequence& endpoints, const ConnectCondition& connect_condition, RangeConnectHandler& handler) : base_from_connect_condition(connect_condition), socket_(sock), endpoints_(endpoints), index_(0), start_(0), handler_(ASIO_MOVE_CAST(RangeConnectHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) range_connect_op(const range_connect_op& other) : base_from_connect_condition(other), socket_(other.socket_), endpoints_(other.endpoints_), index_(other.index_), start_(other.start_), handler_(other.handler_) { } range_connect_op(range_connect_op&& other) : base_from_connect_condition(other), socket_(other.socket_), endpoints_(other.endpoints_), index_(other.index_), start_(other.start_), handler_(ASIO_MOVE_CAST(RangeConnectHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(asio::error_code ec, int start = 0) { typename EndpointSequence::const_iterator begin = endpoints_.begin(); typename EndpointSequence::const_iterator iter = begin; std::advance(iter, index_); typename EndpointSequence::const_iterator end = endpoints_.end(); switch (start_ = start) { case 1: for (;;) { this->check_condition(ec, iter, end); index_ = std::distance(begin, iter); if (iter != end) { socket_.close(ec); socket_.async_connect(*iter, ASIO_MOVE_CAST(range_connect_op)(*this)); return; } if (start) { ec = asio::error::not_found; asio::post(socket_.get_executor(), detail::bind_handler( ASIO_MOVE_CAST(range_connect_op)(*this), ec)); return; } default: if (iter == end) break; if (!socket_.is_open()) { ec = asio::error::operation_aborted; break; } if (!ec) break; ++iter; ++index_; } handler_(static_cast(ec), static_cast( ec || iter == end ? typename Protocol::endpoint() : *iter)); } } //private: basic_socket& socket_; EndpointSequence endpoints_; std::size_t index_; int start_; RangeConnectHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, range_connect_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, range_connect_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( range_connect_op* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, range_connect_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, range_connect_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template class iterator_connect_op : base_from_connect_condition { public: iterator_connect_op(basic_socket& sock, const Iterator& begin, const Iterator& end, const ConnectCondition& connect_condition, IteratorConnectHandler& handler) : base_from_connect_condition(connect_condition), socket_(sock), iter_(begin), end_(end), start_(0), handler_(ASIO_MOVE_CAST(IteratorConnectHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) iterator_connect_op(const iterator_connect_op& other) : base_from_connect_condition(other), socket_(other.socket_), iter_(other.iter_), end_(other.end_), start_(other.start_), handler_(other.handler_) { } iterator_connect_op(iterator_connect_op&& other) : base_from_connect_condition(other), socket_(other.socket_), iter_(other.iter_), end_(other.end_), start_(other.start_), handler_(ASIO_MOVE_CAST(IteratorConnectHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(asio::error_code ec, int start = 0) { switch (start_ = start) { case 1: for (;;) { this->check_condition(ec, iter_, end_); if (iter_ != end_) { socket_.close(ec); socket_.async_connect(*iter_, ASIO_MOVE_CAST(iterator_connect_op)(*this)); return; } if (start) { ec = asio::error::not_found; asio::post(socket_.get_executor(), detail::bind_handler( ASIO_MOVE_CAST(iterator_connect_op)(*this), ec)); return; } default: if (iter_ == end_) break; if (!socket_.is_open()) { ec = asio::error::operation_aborted; break; } if (!ec) break; ++iter_; } handler_(static_cast(ec), static_cast(iter_)); } } //private: basic_socket& socket_; Iterator iter_; Iterator end_; int start_; IteratorConnectHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, iterator_connect_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, iterator_connect_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( iterator_connect_op* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, iterator_connect_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, iterator_connect_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::range_connect_op, Allocator> { typedef typename associated_allocator< RangeConnectHandler, Allocator>::type type; static type get( const detail::range_connect_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::range_connect_op, Executor> { typedef typename associated_executor< RangeConnectHandler, Executor>::type type; static type get( const detail::range_connect_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; template struct associated_allocator< detail::iterator_connect_op, Allocator> { typedef typename associated_allocator< IteratorConnectHandler, Allocator>::type type; static type get( const detail::iterator_connect_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::iterator_connect_op, Executor> { typedef typename associated_executor< IteratorConnectHandler, Executor>::type type; static type get( const detail::iterator_connect_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, void (asio::error_code, typename Protocol::endpoint)) async_connect(basic_socket& s, const EndpointSequence& endpoints, ASIO_MOVE_ARG(RangeConnectHandler) handler, typename enable_if::value>::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a RangeConnectHandler. ASIO_RANGE_CONNECT_HANDLER_CHECK( RangeConnectHandler, handler, typename Protocol::endpoint) type_check; async_completion init(handler); detail::range_connect_op(s, endpoints, detail::default_connect_condition(), init.completion_handler)(asio::error_code(), 1); return init.result.get(); } #if !defined(ASIO_NO_DEPRECATED) template inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler, typename enable_if::value>::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a IteratorConnectHandler. ASIO_ITERATOR_CONNECT_HANDLER_CHECK( IteratorConnectHandler, handler, Iterator) type_check; async_completion init(handler); detail::iterator_connect_op(s, begin, Iterator(), detail::default_connect_condition(), init.completion_handler)(asio::error_code(), 1); return init.result.get(); } #endif // !defined(ASIO_NO_DEPRECATED) template inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, Iterator end, ASIO_MOVE_ARG(IteratorConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a IteratorConnectHandler. ASIO_ITERATOR_CONNECT_HANDLER_CHECK( IteratorConnectHandler, handler, Iterator) type_check; async_completion init(handler); detail::iterator_connect_op(s, begin, end, detail::default_connect_condition(), init.completion_handler)(asio::error_code(), 1); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, void (asio::error_code, typename Protocol::endpoint)) async_connect(basic_socket& s, const EndpointSequence& endpoints, ConnectCondition connect_condition, ASIO_MOVE_ARG(RangeConnectHandler) handler, typename enable_if::value>::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a RangeConnectHandler. ASIO_RANGE_CONNECT_HANDLER_CHECK( RangeConnectHandler, handler, typename Protocol::endpoint) type_check; async_completion init(handler); detail::range_connect_op(s, endpoints, connect_condition, init.completion_handler)( asio::error_code(), 1); return init.result.get(); } #if !defined(ASIO_NO_DEPRECATED) template inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, ConnectCondition connect_condition, ASIO_MOVE_ARG(IteratorConnectHandler) handler, typename enable_if::value>::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a IteratorConnectHandler. ASIO_ITERATOR_CONNECT_HANDLER_CHECK( IteratorConnectHandler, handler, Iterator) type_check; async_completion init(handler); detail::iterator_connect_op(s, begin, Iterator(), connect_condition, init.completion_handler)( asio::error_code(), 1); return init.result.get(); } #endif // !defined(ASIO_NO_DEPRECATED) template inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, void (asio::error_code, Iterator)) async_connect(basic_socket& s, Iterator begin, Iterator end, ConnectCondition connect_condition, ASIO_MOVE_ARG(IteratorConnectHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a IteratorConnectHandler. ASIO_ITERATOR_CONNECT_HANDLER_CHECK( IteratorConnectHandler, handler, Iterator) type_check; async_completion init(handler); detail::iterator_connect_op(s, begin, end, connect_condition, init.completion_handler)( asio::error_code(), 1); return init.result.get(); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_CONNECT_HPP asio-1.12.2/include/asio/impl/defer.hpp000066400000000000000000000043751340672067200176650ustar00rootroot00000000000000// // impl/defer.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_DEFER_HPP #define ASIO_IMPL_DEFER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/work_dispatcher.hpp" #include "asio/detail/push_options.hpp" namespace asio { template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( ASIO_MOVE_ARG(CompletionToken) token) { typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; async_completion init(token); typename associated_executor::type ex( (get_associated_executor)(init.completion_handler)); typename associated_allocator::type alloc( (get_associated_allocator)(init.completion_handler)); ex.defer(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc); return init.result.get(); } template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type*) { typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; async_completion init(token); typename associated_allocator::type alloc( (get_associated_allocator)(init.completion_handler)); ex.defer(detail::work_dispatcher(init.completion_handler), alloc); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type*) { return (defer)(ctx.get_executor(), ASIO_MOVE_CAST(CompletionToken)(token)); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_DEFER_HPP asio-1.12.2/include/asio/impl/dispatch.hpp000066400000000000000000000044471340672067200203770ustar00rootroot00000000000000// // impl/dispatch.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_DISPATCH_HPP #define ASIO_IMPL_DISPATCH_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/work_dispatcher.hpp" #include "asio/detail/push_options.hpp" namespace asio { template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( ASIO_MOVE_ARG(CompletionToken) token) { typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; async_completion init(token); typename associated_executor::type ex( (get_associated_executor)(init.completion_handler)); typename associated_allocator::type alloc( (get_associated_allocator)(init.completion_handler)); ex.dispatch(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc); return init.result.get(); } template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type*) { typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; async_completion init(token); typename associated_allocator::type alloc( (get_associated_allocator)(init.completion_handler)); ex.dispatch(detail::work_dispatcher( init.completion_handler), alloc); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type*) { return (dispatch)(ctx.get_executor(), ASIO_MOVE_CAST(CompletionToken)(token)); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_DISPATCH_HPP asio-1.12.2/include/asio/impl/error.ipp000066400000000000000000000055311340672067200177250ustar00rootroot00000000000000// // impl/error.ipp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_ERROR_IPP #define ASIO_IMPL_ERROR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace error { #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) namespace detail { class netdb_category : public asio::error_category { public: const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.netdb"; } std::string message(int value) const { if (value == error::host_not_found) return "Host not found (authoritative)"; if (value == error::host_not_found_try_again) return "Host not found (non-authoritative), try again later"; if (value == error::no_data) return "The query is valid, but it does not have associated data"; if (value == error::no_recovery) return "A non-recoverable error occurred during database lookup"; return "asio.netdb error"; } }; } // namespace detail const asio::error_category& get_netdb_category() { static detail::netdb_category instance; return instance; } namespace detail { class addrinfo_category : public asio::error_category { public: const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.addrinfo"; } std::string message(int value) const { if (value == error::service_not_found) return "Service not found"; if (value == error::socket_type_not_supported) return "Socket type not supported"; return "asio.addrinfo error"; } }; } // namespace detail const asio::error_category& get_addrinfo_category() { static detail::addrinfo_category instance; return instance; } #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) namespace detail { class misc_category : public asio::error_category { public: const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.misc"; } std::string message(int value) const { if (value == error::already_open) return "Already open"; if (value == error::eof) return "End of file"; if (value == error::not_found) return "Element not found"; if (value == error::fd_set_failure) return "The descriptor does not fit into the select call's fd_set"; return "asio.misc error"; } }; } // namespace detail const asio::error_category& get_misc_category() { static detail::misc_category instance; return instance; } } // namespace error } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_ERROR_IPP asio-1.12.2/include/asio/impl/error_code.ipp000066400000000000000000000142351340672067200207200ustar00rootroot00000000000000// // impl/error_code.ipp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_ERROR_CODE_IPP #define ASIO_IMPL_ERROR_CODE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # include #elif defined(ASIO_WINDOWS_RUNTIME) # include #else # include # include # include #endif #include "asio/detail/local_free_on_block_exit.hpp" #include "asio/detail/socket_types.hpp" #include "asio/error_code.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { class system_category : public error_category { public: const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.system"; } std::string message(int value) const { #if defined(ASIO_WINDOWS_RUNTIME) || defined(ASIO_WINDOWS_APP) std::wstring wmsg(128, wchar_t()); for (;;) { DWORD wlength = ::FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &wmsg[0], static_cast(wmsg.size()), 0); if (wlength == 0 && ::GetLastError() == ERROR_INSUFFICIENT_BUFFER) { wmsg.resize(wmsg.size() + wmsg.size() / 2); continue; } if (wlength && wmsg[wlength - 1] == '\n') --wlength; if (wlength && wmsg[wlength - 1] == '\r') --wlength; if (wlength) { std::string msg(wlength * 2, char()); int length = ::WideCharToMultiByte(CP_ACP, 0, wmsg.c_str(), static_cast(wlength), &msg[0], static_cast(wlength * 2), 0, 0); if (length <= 0) return "asio.system error"; msg.resize(static_cast(length)); return msg; } else return "asio.system error"; } #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) char* msg = 0; DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0); detail::local_free_on_block_exit local_free_obj(msg); if (length && msg[length - 1] == '\n') msg[--length] = '\0'; if (length && msg[length - 1] == '\r') msg[--length] = '\0'; if (length) return msg; else return "asio.system error"; #else // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__) #if !defined(__sun) if (value == ECANCELED) return "Operation aborted."; #endif // !defined(__sun) #if defined(__sun) || defined(__QNX__) || defined(__SYMBIAN32__) using namespace std; return strerror(value); #else char buf[256] = ""; using namespace std; return strerror_result(strerror_r(value, buf, sizeof(buf)), buf); #endif #endif // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__) } #if defined(ASIO_HAS_STD_ERROR_CODE) std::error_condition default_error_condition( int ev) const ASIO_ERROR_CATEGORY_NOEXCEPT { switch (ev) { case access_denied: return std::errc::permission_denied; case address_family_not_supported: return std::errc::address_family_not_supported; case address_in_use: return std::errc::address_in_use; case already_connected: return std::errc::already_connected; case already_started: return std::errc::connection_already_in_progress; case broken_pipe: return std::errc::broken_pipe; case connection_aborted: return std::errc::connection_aborted; case connection_refused: return std::errc::connection_refused; case connection_reset: return std::errc::connection_reset; case bad_descriptor: return std::errc::bad_file_descriptor; case fault: return std::errc::bad_address; case host_unreachable: return std::errc::host_unreachable; case in_progress: return std::errc::operation_in_progress; case interrupted: return std::errc::interrupted; case invalid_argument: return std::errc::invalid_argument; case message_size: return std::errc::message_size; case name_too_long: return std::errc::filename_too_long; case network_down: return std::errc::network_down; case network_reset: return std::errc::network_reset; case network_unreachable: return std::errc::network_unreachable; case no_descriptors: return std::errc::too_many_files_open; case no_buffer_space: return std::errc::no_buffer_space; case no_memory: return std::errc::not_enough_memory; case no_permission: return std::errc::operation_not_permitted; case no_protocol_option: return std::errc::no_protocol_option; case no_such_device: return std::errc::no_such_device; case not_connected: return std::errc::not_connected; case not_socket: return std::errc::not_a_socket; case operation_aborted: return std::errc::operation_canceled; case operation_not_supported: return std::errc::operation_not_supported; case shut_down: return std::make_error_condition(ev, *this); case timed_out: return std::errc::timed_out; case try_again: return std::errc::resource_unavailable_try_again; case would_block: return std::errc::operation_would_block; default: return std::make_error_condition(ev, *this); } #endif // defined(ASIO_HAS_STD_ERROR_CODE) private: // Helper function to adapt the result from glibc's variant of strerror_r. static const char* strerror_result(int, const char* s) { return s; } static const char* strerror_result(const char* s, const char*) { return s; } }; } // namespace detail const error_category& system_category() { static detail::system_category instance; return instance; } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_ERROR_CODE_IPP asio-1.12.2/include/asio/impl/execution_context.hpp000066400000000000000000000060211340672067200223350ustar00rootroot00000000000000// // impl/execution_context.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_EXECUTION_CONTEXT_HPP #define ASIO_IMPL_EXECUTION_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/service_registry.hpp" #include "asio/detail/push_options.hpp" namespace asio { template inline Service& use_service(execution_context& e) { // Check that Service meets the necessary type requirements. (void)static_cast(static_cast(0)); return e.service_registry_->template use_service(); } #if !defined(GENERATING_DOCUMENTATION) # if defined(ASIO_HAS_VARIADIC_TEMPLATES) template Service& make_service(execution_context& e, ASIO_MOVE_ARG(Args)... args) { detail::scoped_ptr svc( new Service(e, ASIO_MOVE_CAST(Args)(args)...)); e.service_registry_->template add_service(svc.get()); Service& result = *svc; svc.release(); return result; } # else // defined(ASIO_HAS_VARIADIC_TEMPLATES) template Service& make_service(execution_context& e) { detail::scoped_ptr svc(new Service(e)); e.service_registry_->template add_service(svc.get()); Service& result = *svc; svc.release(); return result; } #define ASIO_PRIVATE_MAKE_SERVICE_DEF(n) \ template \ Service& make_service(execution_context& e, \ ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ detail::scoped_ptr svc( \ new Service(e, ASIO_VARIADIC_MOVE_ARGS(n))); \ e.service_registry_->template add_service(svc.get()); \ Service& result = *svc; \ svc.release(); \ return result; \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_MAKE_SERVICE_DEF) #undef ASIO_PRIVATE_MAKE_SERVICE_DEF # endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) #endif // !defined(GENERATING_DOCUMENTATION) template inline void add_service(execution_context& e, Service* svc) { // Check that Service meets the necessary type requirements. (void)static_cast(static_cast(0)); e.service_registry_->template add_service(svc); } template inline bool has_service(execution_context& e) { // Check that Service meets the necessary type requirements. (void)static_cast(static_cast(0)); return e.service_registry_->template has_service(); } inline execution_context& execution_context::service::context() { return owner_; } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_EXECUTION_CONTEXT_HPP asio-1.12.2/include/asio/impl/execution_context.ipp000066400000000000000000000032441340672067200223420ustar00rootroot00000000000000// // impl/execution_context.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_EXECUTION_CONTEXT_IPP #define ASIO_IMPL_EXECUTION_CONTEXT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/execution_context.hpp" #include "asio/detail/service_registry.hpp" #include "asio/detail/push_options.hpp" namespace asio { execution_context::execution_context() : service_registry_(new asio::detail::service_registry(*this)) { } execution_context::~execution_context() { shutdown(); destroy(); delete service_registry_; } void execution_context::shutdown() { service_registry_->shutdown_services(); } void execution_context::destroy() { service_registry_->destroy_services(); } void execution_context::notify_fork( asio::execution_context::fork_event event) { service_registry_->notify_fork(event); } execution_context::service::service(execution_context& owner) : owner_(owner), next_(0) { } execution_context::service::~service() { } void execution_context::service::notify_fork(execution_context::fork_event) { } service_already_exists::service_already_exists() : std::logic_error("Service already exists.") { } invalid_service_owner::invalid_service_owner() : std::logic_error("Invalid service owner.") { } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_EXECUTION_CONTEXT_IPP asio-1.12.2/include/asio/impl/executor.hpp000066400000000000000000000175351340672067200204400ustar00rootroot00000000000000// // impl/executor.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_EXECUTOR_HPP #define ASIO_IMPL_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/atomic_count.hpp" #include "asio/detail/executor_op.hpp" #include "asio/detail/global.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/recycling_allocator.hpp" #include "asio/executor.hpp" #include "asio/system_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { #if !defined(GENERATING_DOCUMENTATION) #if defined(ASIO_HAS_MOVE) // Lightweight, move-only function object wrapper. class executor::function { public: template explicit function(F f, const Alloc& a) { // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; op_ = new (p.v) op(ASIO_MOVE_CAST(F)(f), a); p.v = 0; } function(function&& other) : op_(other.op_) { other.op_ = 0; } ~function() { if (op_) op_->destroy(); } void operator()() { if (op_) { detail::scheduler_operation* op = op_; op_ = 0; op->complete(this, asio::error_code(), 0); } } private: detail::scheduler_operation* op_; }; #else // defined(ASIO_HAS_MOVE) // Not so lightweight, copyable function object wrapper. class executor::function { public: template explicit function(const F& f, const Alloc&) : impl_(new impl(f)) { } void operator()() { impl_->invoke_(impl_.get()); } private: // Base class for polymorphic function implementations. struct impl_base { void (*invoke_)(impl_base*); }; // Polymorphic function implementation. template struct impl : impl_base { impl(const F& f) : function_(f) { invoke_ = &function::invoke; } F function_; }; // Helper to invoke a function. template static void invoke(impl_base* i) { static_cast*>(i)->function_(); } detail::shared_ptr impl_; }; #endif // defined(ASIO_HAS_MOVE) // Default polymorphic allocator implementation. template class executor::impl : public executor::impl_base { public: typedef ASIO_REBIND_ALLOC(Allocator, impl) allocator_type; static impl_base* create(const Executor& e, Allocator a = Allocator()) { raw_mem mem(a); impl* p = new (mem.ptr_) impl(e, a); mem.ptr_ = 0; return p; } impl(const Executor& e, const Allocator& a) ASIO_NOEXCEPT : impl_base(false), ref_count_(1), executor_(e), allocator_(a) { } impl_base* clone() const ASIO_NOEXCEPT { ++ref_count_; return const_cast(static_cast(this)); } void destroy() ASIO_NOEXCEPT { if (--ref_count_ == 0) { allocator_type alloc(allocator_); impl* p = this; p->~impl(); alloc.deallocate(p, 1); } } void on_work_started() ASIO_NOEXCEPT { executor_.on_work_started(); } void on_work_finished() ASIO_NOEXCEPT { executor_.on_work_finished(); } execution_context& context() ASIO_NOEXCEPT { return executor_.context(); } void dispatch(ASIO_MOVE_ARG(function) f) { executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_); } void post(ASIO_MOVE_ARG(function) f) { executor_.post(ASIO_MOVE_CAST(function)(f), allocator_); } void defer(ASIO_MOVE_ARG(function) f) { executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_); } type_id_result_type target_type() const ASIO_NOEXCEPT { return type_id(); } void* target() ASIO_NOEXCEPT { return &executor_; } const void* target() const ASIO_NOEXCEPT { return &executor_; } bool equals(const impl_base* e) const ASIO_NOEXCEPT { if (this == e) return true; if (target_type() != e->target_type()) return false; return executor_ == *static_cast(e->target()); } private: mutable detail::atomic_count ref_count_; Executor executor_; Allocator allocator_; struct raw_mem { allocator_type allocator_; impl* ptr_; explicit raw_mem(const Allocator& a) : allocator_(a), ptr_(allocator_.allocate(1)) { } ~raw_mem() { if (ptr_) allocator_.deallocate(ptr_, 1); } private: // Disallow copying and assignment. raw_mem(const raw_mem&); raw_mem operator=(const raw_mem&); }; }; // Polymorphic allocator specialisation for system_executor. template class executor::impl : public executor::impl_base { public: static impl_base* create(const system_executor&, const Allocator& = Allocator()) { return &detail::global > >(); } impl() : impl_base(true) { } impl_base* clone() const ASIO_NOEXCEPT { return const_cast(static_cast(this)); } void destroy() ASIO_NOEXCEPT { } void on_work_started() ASIO_NOEXCEPT { executor_.on_work_started(); } void on_work_finished() ASIO_NOEXCEPT { executor_.on_work_finished(); } execution_context& context() ASIO_NOEXCEPT { return executor_.context(); } void dispatch(ASIO_MOVE_ARG(function) f) { executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_); } void post(ASIO_MOVE_ARG(function) f) { executor_.post(ASIO_MOVE_CAST(function)(f), allocator_); } void defer(ASIO_MOVE_ARG(function) f) { executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_); } type_id_result_type target_type() const ASIO_NOEXCEPT { return type_id(); } void* target() ASIO_NOEXCEPT { return &executor_; } const void* target() const ASIO_NOEXCEPT { return &executor_; } bool equals(const impl_base* e) const ASIO_NOEXCEPT { return this == e; } private: system_executor executor_; Allocator allocator_; }; template executor::executor(Executor e) : impl_(impl >::create(e)) { } template executor::executor(allocator_arg_t, const Allocator& a, Executor e) : impl_(impl::create(e, a)) { } template void executor::dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { impl_base* i = get_impl(); if (i->fast_dispatch_) system_executor().dispatch(ASIO_MOVE_CAST(Function)(f), a); else i->dispatch(function(ASIO_MOVE_CAST(Function)(f), a)); } template void executor::post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { get_impl()->post(function(ASIO_MOVE_CAST(Function)(f), a)); } template void executor::defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { get_impl()->defer(function(ASIO_MOVE_CAST(Function)(f), a)); } template Executor* executor::target() ASIO_NOEXCEPT { return impl_ && impl_->target_type() == type_id() ? static_cast(impl_->target()) : 0; } template const Executor* executor::target() const ASIO_NOEXCEPT { return impl_ && impl_->target_type() == type_id() ? static_cast(impl_->target()) : 0; } #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_EXECUTOR_HPP asio-1.12.2/include/asio/impl/executor.ipp000066400000000000000000000014621340672067200204310ustar00rootroot00000000000000// // impl/executor.ipp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_EXECUTOR_IPP #define ASIO_IMPL_EXECUTOR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { bad_executor::bad_executor() ASIO_NOEXCEPT { } const char* bad_executor::what() const ASIO_NOEXCEPT_OR_NOTHROW { return "bad executor"; } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_EXECUTOR_IPP asio-1.12.2/include/asio/impl/handler_alloc_hook.ipp000066400000000000000000000030311340672067200223740ustar00rootroot00000000000000// // impl/handler_alloc_hook.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP #define ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/thread_context.hpp" #include "asio/detail/thread_info_base.hpp" #include "asio/handler_alloc_hook.hpp" #include "asio/detail/push_options.hpp" namespace asio { void* asio_handler_allocate(std::size_t size, ...) { #if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) return detail::thread_info_base::allocate( detail::thread_context::thread_call_stack::top(), size); #else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) return ::operator new(size); #endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) } void asio_handler_deallocate(void* pointer, std::size_t size, ...) { #if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) detail::thread_info_base::deallocate( detail::thread_context::thread_call_stack::top(), pointer, size); #else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) (void)size; ::operator delete(pointer); #endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP asio-1.12.2/include/asio/impl/io_context.hpp000066400000000000000000000227461340672067200207550ustar00rootroot00000000000000// // impl/io_context.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_IO_CONTEXT_HPP #define ASIO_IMPL_IO_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/completion_handler.hpp" #include "asio/detail/executor_op.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/recycling_allocator.hpp" #include "asio/detail/service_registry.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { template inline Service& use_service(io_context& ioc) { // Check that Service meets the necessary type requirements. (void)static_cast(static_cast(0)); (void)static_cast(&Service::id); return ioc.service_registry_->template use_service(ioc); } template <> inline detail::io_context_impl& use_service( io_context& ioc) { return ioc.impl_; } } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_io_context.hpp" #else # include "asio/detail/scheduler.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { inline io_context::executor_type io_context::get_executor() ASIO_NOEXCEPT { return executor_type(*this); } #if defined(ASIO_HAS_CHRONO) template std::size_t io_context::run_for( const chrono::duration& rel_time) { return this->run_until(chrono::steady_clock::now() + rel_time); } template std::size_t io_context::run_until( const chrono::time_point& abs_time) { std::size_t n = 0; while (this->run_one_until(abs_time)) if (n != (std::numeric_limits::max)()) ++n; return n; } template std::size_t io_context::run_one_for( const chrono::duration& rel_time) { return this->run_one_until(chrono::steady_clock::now() + rel_time); } template std::size_t io_context::run_one_until( const chrono::time_point& abs_time) { typename Clock::time_point now = Clock::now(); while (now < abs_time) { typename Clock::duration rel_time = abs_time - now; if (rel_time > chrono::seconds(1)) rel_time = chrono::seconds(1); asio::error_code ec; std::size_t s = impl_.wait_one( static_cast(chrono::duration_cast< chrono::microseconds>(rel_time).count()), ec); asio::detail::throw_error(ec); if (s || impl_.stopped()) return s; now = Clock::now(); } return 0; } #endif // defined(ASIO_HAS_CHRONO) #if !defined(ASIO_NO_DEPRECATED) inline void io_context::reset() { restart(); } template ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) io_context::dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a LegacyCompletionHandler. ASIO_LEGACY_COMPLETION_HANDLER_CHECK( LegacyCompletionHandler, handler) type_check; async_completion init(handler); if (impl_.can_dispatch()) { detail::fenced_block b(detail::fenced_block::full); asio_handler_invoke_helpers::invoke( init.completion_handler, init.completion_handler); } else { // Allocate and construct an operation to wrap the handler. typedef detail::completion_handler< typename handler_type::type> op; typename op::ptr p = { detail::addressof(init.completion_handler), op::ptr::allocate(init.completion_handler), 0 }; p.p = new (p.v) op(init.completion_handler); ASIO_HANDLER_CREATION((*this, *p.p, "io_context", this, 0, "dispatch")); impl_.do_dispatch(p.p); p.v = p.p = 0; } return init.result.get(); } template ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) io_context::post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a LegacyCompletionHandler. ASIO_LEGACY_COMPLETION_HANDLER_CHECK( LegacyCompletionHandler, handler) type_check; async_completion init(handler); bool is_continuation = asio_handler_cont_helpers::is_continuation(init.completion_handler); // Allocate and construct an operation to wrap the handler. typedef detail::completion_handler< typename handler_type::type> op; typename op::ptr p = { detail::addressof(init.completion_handler), op::ptr::allocate(init.completion_handler), 0 }; p.p = new (p.v) op(init.completion_handler); ASIO_HANDLER_CREATION((*this, *p.p, "io_context", this, 0, "post")); impl_.post_immediate_completion(p.p, is_continuation); p.v = p.p = 0; return init.result.get(); } template #if defined(GENERATING_DOCUMENTATION) unspecified #else inline detail::wrapped_handler #endif io_context::wrap(Handler handler) { return detail::wrapped_handler(*this, handler); } #endif // !defined(ASIO_NO_DEPRECATED) inline io_context& io_context::executor_type::context() const ASIO_NOEXCEPT { return io_context_; } inline void io_context::executor_type::on_work_started() const ASIO_NOEXCEPT { io_context_.impl_.work_started(); } inline void io_context::executor_type::on_work_finished() const ASIO_NOEXCEPT { io_context_.impl_.work_finished(); } template void io_context::executor_type::dispatch( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; // Invoke immediately if we are already inside the thread pool. if (io_context_.impl_.can_dispatch()) { // Make a local, non-const copy of the function. function_type tmp(ASIO_MOVE_CAST(Function)(f)); detail::fenced_block b(detail::fenced_block::full); asio_handler_invoke_helpers::invoke(tmp, tmp); return; } // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((this->context(), *p.p, "io_context", &this->context(), 0, "dispatch")); io_context_.impl_.post_immediate_completion(p.p, false); p.v = p.p = 0; } template void io_context::executor_type::post( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((this->context(), *p.p, "io_context", &this->context(), 0, "post")); io_context_.impl_.post_immediate_completion(p.p, false); p.v = p.p = 0; } template void io_context::executor_type::defer( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((this->context(), *p.p, "io_context", &this->context(), 0, "defer")); io_context_.impl_.post_immediate_completion(p.p, true); p.v = p.p = 0; } inline bool io_context::executor_type::running_in_this_thread() const ASIO_NOEXCEPT { return io_context_.impl_.can_dispatch(); } #if !defined(ASIO_NO_DEPRECATED) inline io_context::work::work(asio::io_context& io_context) : io_context_impl_(io_context.impl_) { io_context_impl_.work_started(); } inline io_context::work::work(const work& other) : io_context_impl_(other.io_context_impl_) { io_context_impl_.work_started(); } inline io_context::work::~work() { io_context_impl_.work_finished(); } inline asio::io_context& io_context::work::get_io_context() { return static_cast(io_context_impl_.context()); } inline asio::io_context& io_context::work::get_io_service() { return static_cast(io_context_impl_.context()); } #endif // !defined(ASIO_NO_DEPRECATED) inline asio::io_context& io_context::service::get_io_context() { return static_cast(context()); } #if !defined(ASIO_NO_DEPRECATED) inline asio::io_context& io_context::service::get_io_service() { return static_cast(context()); } #endif // !defined(ASIO_NO_DEPRECATED) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_IO_CONTEXT_HPP asio-1.12.2/include/asio/impl/io_context.ipp000066400000000000000000000072101340672067200207430ustar00rootroot00000000000000// // impl/io_context.ipp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_IO_CONTEXT_IPP #define ASIO_IMPL_IO_CONTEXT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/io_context.hpp" #include "asio/detail/concurrency_hint.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/scoped_ptr.hpp" #include "asio/detail/service_registry.hpp" #include "asio/detail/throw_error.hpp" #if defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_io_context.hpp" #else # include "asio/detail/scheduler.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { io_context::io_context() : impl_(add_impl(new impl_type(*this, ASIO_CONCURRENCY_HINT_DEFAULT))) { } io_context::io_context(int concurrency_hint) : impl_(add_impl(new impl_type(*this, concurrency_hint == 1 ? ASIO_CONCURRENCY_HINT_1 : concurrency_hint))) { } io_context::impl_type& io_context::add_impl(io_context::impl_type* impl) { asio::detail::scoped_ptr scoped_impl(impl); asio::add_service(*this, scoped_impl.get()); return *scoped_impl.release(); } io_context::~io_context() { } io_context::count_type io_context::run() { asio::error_code ec; count_type s = impl_.run(ec); asio::detail::throw_error(ec); return s; } #if !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::run(asio::error_code& ec) { return impl_.run(ec); } #endif // !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::run_one() { asio::error_code ec; count_type s = impl_.run_one(ec); asio::detail::throw_error(ec); return s; } #if !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::run_one(asio::error_code& ec) { return impl_.run_one(ec); } #endif // !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::poll() { asio::error_code ec; count_type s = impl_.poll(ec); asio::detail::throw_error(ec); return s; } #if !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::poll(asio::error_code& ec) { return impl_.poll(ec); } #endif // !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::poll_one() { asio::error_code ec; count_type s = impl_.poll_one(ec); asio::detail::throw_error(ec); return s; } #if !defined(ASIO_NO_DEPRECATED) io_context::count_type io_context::poll_one(asio::error_code& ec) { return impl_.poll_one(ec); } #endif // !defined(ASIO_NO_DEPRECATED) void io_context::stop() { impl_.stop(); } bool io_context::stopped() const { return impl_.stopped(); } void io_context::restart() { impl_.restart(); } io_context::service::service(asio::io_context& owner) : execution_context::service(owner) { } io_context::service::~service() { } void io_context::service::shutdown() { #if !defined(ASIO_NO_DEPRECATED) shutdown_service(); #endif // !defined(ASIO_NO_DEPRECATED) } #if !defined(ASIO_NO_DEPRECATED) void io_context::service::shutdown_service() { } #endif // !defined(ASIO_NO_DEPRECATED) void io_context::service::notify_fork(io_context::fork_event ev) { #if !defined(ASIO_NO_DEPRECATED) fork_service(ev); #else // !defined(ASIO_NO_DEPRECATED) (void)ev; #endif // !defined(ASIO_NO_DEPRECATED) } #if !defined(ASIO_NO_DEPRECATED) void io_context::service::fork_service(io_context::fork_event) { } #endif // !defined(ASIO_NO_DEPRECATED) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_IO_CONTEXT_IPP asio-1.12.2/include/asio/impl/post.hpp000066400000000000000000000043621340672067200175610ustar00rootroot00000000000000// // impl/post.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_POST_HPP #define ASIO_IMPL_POST_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/detail/work_dispatcher.hpp" #include "asio/detail/push_options.hpp" namespace asio { template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( ASIO_MOVE_ARG(CompletionToken) token) { typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; async_completion init(token); typename associated_executor::type ex( (get_associated_executor)(init.completion_handler)); typename associated_allocator::type alloc( (get_associated_allocator)(init.completion_handler)); ex.post(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc); return init.result.get(); } template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type*) { typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; async_completion init(token); typename associated_allocator::type alloc( (get_associated_allocator)(init.completion_handler)); ex.post(detail::work_dispatcher(init.completion_handler), alloc); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type*) { return (post)(ctx.get_executor(), ASIO_MOVE_CAST(CompletionToken)(token)); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_POST_HPP asio-1.12.2/include/asio/impl/read.hpp000066400000000000000000000611171340672067200175100ustar00rootroot00000000000000// // impl/read.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_READ_HPP #define ASIO_IMPL_READ_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/buffer.hpp" #include "asio/completion_condition.hpp" #include "asio/detail/array_fwd.hpp" #include "asio/detail/base_from_completion_cond.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/consuming_buffers.hpp" #include "asio/detail/dependent_type.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template std::size_t read_buffer_sequence(SyncReadStream& s, const MutableBufferSequence& buffers, const MutableBufferIterator&, CompletionCondition completion_condition, asio::error_code& ec) { ec = asio::error_code(); asio::detail::consuming_buffers tmp(buffers); while (!tmp.empty()) { if (std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, tmp.total_consumed()))) tmp.consume(s.read_some(tmp.prepare(max_size), ec)); else break; } return tmp.total_consumed();; } } // namespace detail template std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_mutable_buffer_sequence::value >::type*) { return detail::read_buffer_sequence(s, buffers, asio::buffer_sequence_begin(buffers), completion_condition, ec); } template inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, typename enable_if< is_mutable_buffer_sequence::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = read(s, buffers, transfer_all(), ec); asio::detail::throw_error(ec, "read"); return bytes_transferred; } template inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, asio::error_code& ec, typename enable_if< is_mutable_buffer_sequence::value >::type*) { return read(s, buffers, transfer_all(), ec); } template inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, typename enable_if< is_mutable_buffer_sequence::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = read(s, buffers, completion_condition, ec); asio::detail::throw_error(ec, "read"); return bytes_transferred; } template std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type*) { typename decay::type b( ASIO_MOVE_CAST(DynamicBuffer)(buffers)); ec = asio::error_code(); std::size_t total_transferred = 0; std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, total_transferred)); std::size_t bytes_available = std::min( std::max(512, b.capacity() - b.size()), std::min(max_size, b.max_size() - b.size())); while (bytes_available > 0) { std::size_t bytes_transferred = s.read_some(b.prepare(bytes_available), ec); b.commit(bytes_transferred); total_transferred += bytes_transferred; max_size = detail::adapt_completion_condition_result( completion_condition(ec, total_transferred)); bytes_available = std::min( std::max(512, b.capacity() - b.size()), std::min(max_size, b.max_size() - b.size())); } return total_transferred; } template inline std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, typename enable_if< is_dynamic_buffer::type>::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = read(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ec); asio::detail::throw_error(ec, "read"); return bytes_transferred; } template inline std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type*) { return read(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ec); } template inline std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, typename enable_if< is_dynamic_buffer::type>::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = read(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), completion_condition, ec); asio::detail::throw_error(ec, "read"); return bytes_transferred; } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) template inline std::size_t read(SyncReadStream& s, asio::basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec) { return read(s, basic_streambuf_ref(b), completion_condition, ec); } template inline std::size_t read(SyncReadStream& s, asio::basic_streambuf& b) { return read(s, basic_streambuf_ref(b)); } template inline std::size_t read(SyncReadStream& s, asio::basic_streambuf& b, asio::error_code& ec) { return read(s, basic_streambuf_ref(b), ec); } template inline std::size_t read(SyncReadStream& s, asio::basic_streambuf& b, CompletionCondition completion_condition) { return read(s, basic_streambuf_ref(b), completion_condition); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) namespace detail { template class read_op : detail::base_from_completion_cond { public: read_op(AsyncReadStream& stream, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(buffers), start_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_op(const read_op& other) : detail::base_from_completion_cond(other), stream_(other.stream_), buffers_(other.buffers_), start_(other.start_), handler_(other.handler_) { } read_op(read_op&& other) : detail::base_from_completion_cond(other), stream_(other.stream_), buffers_(other.buffers_), start_(other.start_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size; switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, buffers_.total_consumed()); do { stream_.async_read_some(buffers_.prepare(max_size), ASIO_MOVE_CAST(read_op)(*this)); return; default: buffers_.consume(bytes_transferred); if ((!ec && bytes_transferred == 0) || buffers_.empty()) break; max_size = this->check_for_completion(ec, buffers_.total_consumed()); } while (max_size > 0); handler_(ec, buffers_.total_consumed()); } } //private: AsyncReadStream& stream_; asio::detail::consuming_buffers buffers_; int start_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void start_read_buffer_sequence_op(AsyncReadStream& stream, const MutableBufferSequence& buffers, const MutableBufferIterator&, CompletionCondition completion_condition, ReadHandler& handler) { detail::read_op( stream, buffers, completion_condition, handler)( asio::error_code(), 0, 1); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_mutable_buffer_sequence::value >::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::start_read_buffer_sequence_op(s, buffers, asio::buffer_sequence_begin(buffers), completion_condition, init.completion_handler); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_mutable_buffer_sequence::value >::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::start_read_buffer_sequence_op(s, buffers, asio::buffer_sequence_begin(buffers), transfer_all(), init.completion_handler); return init.result.get(); } namespace detail { template class read_dynbuf_op : detail::base_from_completion_cond { public: template read_dynbuf_op(AsyncReadStream& stream, ASIO_MOVE_ARG(BufferSequence) buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), start_(0), total_transferred_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_dynbuf_op(const read_dynbuf_op& other) : detail::base_from_completion_cond(other), stream_(other.stream_), buffers_(other.buffers_), start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_dynbuf_op(read_dynbuf_op&& other) : detail::base_from_completion_cond(other), stream_(other.stream_), buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), start_(other.start_), total_transferred_(other.total_transferred_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size, bytes_available; switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, total_transferred_); bytes_available = std::min( std::max(512, buffers_.capacity() - buffers_.size()), std::min(max_size, buffers_.max_size() - buffers_.size())); for (;;) { stream_.async_read_some(buffers_.prepare(bytes_available), ASIO_MOVE_CAST(read_dynbuf_op)(*this)); return; default: total_transferred_ += bytes_transferred; buffers_.commit(bytes_transferred); max_size = this->check_for_completion(ec, total_transferred_); bytes_available = std::min( std::max(512, buffers_.capacity() - buffers_.size()), std::min(max_size, buffers_.max_size() - buffers_.size())); if ((!ec && bytes_transferred == 0) || bytes_available == 0) break; } handler_(ec, static_cast(total_transferred_)); } } //private: AsyncReadStream& stream_; DynamicBuffer buffers_; int start_; std::size_t total_transferred_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_dynbuf_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_dynbuf_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_dynbuf_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_dynbuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_dynbuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_dynbuf_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_dynbuf_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_dynbuf_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_dynbuf_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type*) { return async_read(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ASIO_MOVE_CAST(ReadHandler)(handler)); } template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_dynbuf_op::type, CompletionCondition, ASIO_HANDLER_TYPE( ReadHandler, void (asio::error_code, std::size_t))>( s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), completion_condition, init.completion_handler)( asio::error_code(), 0, 1); return init.result.get(); } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, basic_streambuf& b, ASIO_MOVE_ARG(ReadHandler) handler) { return async_read(s, basic_streambuf_ref(b), ASIO_MOVE_CAST(ReadHandler)(handler)); } template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler) { return async_read(s, basic_streambuf_ref(b), completion_condition, ASIO_MOVE_CAST(ReadHandler)(handler)); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_READ_HPP asio-1.12.2/include/asio/impl/read_at.hpp000066400000000000000000000554311340672067200201760ustar00rootroot00000000000000// // impl/read_at.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_READ_AT_HPP #define ASIO_IMPL_READ_AT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/buffer.hpp" #include "asio/completion_condition.hpp" #include "asio/detail/array_fwd.hpp" #include "asio/detail/base_from_completion_cond.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/consuming_buffers.hpp" #include "asio/detail/dependent_type.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template std::size_t read_at_buffer_sequence(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, const MutableBufferIterator&, CompletionCondition completion_condition, asio::error_code& ec) { ec = asio::error_code(); asio::detail::consuming_buffers tmp(buffers); while (!tmp.empty()) { if (std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, tmp.total_consumed()))) { tmp.consume(d.read_some_at(offset + tmp.total_consumed(), tmp.prepare(max_size), ec)); } else break; } return tmp.total_consumed();; } } // namespace detail template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec) { return detail::read_at_buffer_sequence(d, offset, buffers, asio::buffer_sequence_begin(buffers), completion_condition, ec); } template inline std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t bytes_transferred = read_at( d, offset, buffers, transfer_all(), ec); asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } template inline std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, asio::error_code& ec) { return read_at(d, offset, buffers, transfer_all(), ec); } template inline std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition) { asio::error_code ec; std::size_t bytes_transferred = read_at( d, offset, buffers, completion_condition, ec); asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, asio::basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec) { ec = asio::error_code(); std::size_t total_transferred = 0; std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, total_transferred)); std::size_t bytes_available = read_size_helper(b, max_size); while (bytes_available > 0) { std::size_t bytes_transferred = d.read_some_at( offset + total_transferred, b.prepare(bytes_available), ec); b.commit(bytes_transferred); total_transferred += bytes_transferred; max_size = detail::adapt_completion_condition_result( completion_condition(ec, total_transferred)); bytes_available = read_size_helper(b, max_size); } return total_transferred; } template inline std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, asio::basic_streambuf& b) { asio::error_code ec; std::size_t bytes_transferred = read_at( d, offset, b, transfer_all(), ec); asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } template inline std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, asio::basic_streambuf& b, asio::error_code& ec) { return read_at(d, offset, b, transfer_all(), ec); } template inline std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, asio::basic_streambuf& b, CompletionCondition completion_condition) { asio::error_code ec; std::size_t bytes_transferred = read_at( d, offset, b, completion_condition, ec); asio::detail::throw_error(ec, "read_at"); return bytes_transferred; } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) namespace detail { template class read_at_op : detail::base_from_completion_cond { public: read_at_op(AsyncRandomAccessReadDevice& device, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffers_(buffers), start_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_at_op(const read_at_op& other) : detail::base_from_completion_cond(other), device_(other.device_), offset_(other.offset_), buffers_(other.buffers_), start_(other.start_), handler_(other.handler_) { } read_at_op(read_at_op&& other) : detail::base_from_completion_cond(other), device_(other.device_), offset_(other.offset_), buffers_(other.buffers_), start_(other.start_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size; switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, buffers_.total_consumed()); do { device_.async_read_some_at( offset_ + buffers_.total_consumed(), buffers_.prepare(max_size), ASIO_MOVE_CAST(read_at_op)(*this)); return; default: buffers_.consume(bytes_transferred); if ((!ec && bytes_transferred == 0) || buffers_.empty()) break; max_size = this->check_for_completion(ec, buffers_.total_consumed()); } while (max_size > 0); handler_(ec, buffers_.total_consumed()); } } //private: AsyncRandomAccessReadDevice& device_; uint64_t offset_; asio::detail::consuming_buffers buffers_; int start_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_at_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_at_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_at_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_at_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_at_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void start_read_at_buffer_sequence_op(AsyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, const MutableBufferIterator&, CompletionCondition completion_condition, ReadHandler& handler) { detail::read_at_op( d, offset, buffers, completion_condition, handler)( asio::error_code(), 0, 1); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_at_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_at_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_at_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_at_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::start_read_at_buffer_sequence_op(d, offset, buffers, asio::buffer_sequence_begin(buffers), completion_condition, init.completion_handler); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::start_read_at_buffer_sequence_op(d, offset, buffers, asio::buffer_sequence_begin(buffers), transfer_all(), init.completion_handler); return init.result.get(); } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) namespace detail { template class read_at_streambuf_op : detail::base_from_completion_cond { public: read_at_streambuf_op(AsyncRandomAccessReadDevice& device, uint64_t offset, basic_streambuf& streambuf, CompletionCondition completion_condition, ReadHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), streambuf_(streambuf), start_(0), total_transferred_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_at_streambuf_op(const read_at_streambuf_op& other) : detail::base_from_completion_cond(other), device_(other.device_), offset_(other.offset_), streambuf_(other.streambuf_), start_(other.start_), total_transferred_(other.total_transferred_), handler_(other.handler_) { } read_at_streambuf_op(read_at_streambuf_op&& other) : detail::base_from_completion_cond(other), device_(other.device_), offset_(other.offset_), streambuf_(other.streambuf_), start_(other.start_), total_transferred_(other.total_transferred_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size, bytes_available; switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, total_transferred_); bytes_available = read_size_helper(streambuf_, max_size); for (;;) { device_.async_read_some_at(offset_ + total_transferred_, streambuf_.prepare(bytes_available), ASIO_MOVE_CAST(read_at_streambuf_op)(*this)); return; default: total_transferred_ += bytes_transferred; streambuf_.commit(bytes_transferred); max_size = this->check_for_completion(ec, total_transferred_); bytes_available = read_size_helper(streambuf_, max_size); if ((!ec && bytes_transferred == 0) || bytes_available == 0) break; } handler_(ec, static_cast(total_transferred_)); } } //private: AsyncRandomAccessReadDevice& device_; uint64_t offset_; asio::basic_streambuf& streambuf_; int start_; std::size_t total_transferred_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_at_streambuf_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_at_streambuf_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_at_streambuf_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_at_streambuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_at_streambuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_at_streambuf_op, Allocator1> { typedef typename associated_allocator::type type; static type get( const detail::read_at_streambuf_op& h, const Allocator1& a = Allocator1()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_at_streambuf_op, Executor1> { typedef typename associated_executor::type type; static type get( const detail::read_at_streambuf_op& h, const Executor1& ex = Executor1()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, asio::basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_at_streambuf_op( d, offset, b, completion_condition, init.completion_handler)( asio::error_code(), 0, 1); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, asio::basic_streambuf& b, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_at_streambuf_op( d, offset, b, transfer_all(), init.completion_handler)( asio::error_code(), 0, 1); return init.result.get(); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_READ_AT_HPP asio-1.12.2/include/asio/impl/read_until.hpp000066400000000000000000001377101340672067200207260ustar00rootroot00000000000000// // impl/read_until.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_READ_UNTIL_HPP #define ASIO_IMPL_READ_UNTIL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include #include #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/buffer.hpp" #include "asio/buffers_iterator.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/limits.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { template inline std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim) { asio::error_code ec; std::size_t bytes_transferred = read_until(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, ec); asio::detail::throw_error(ec, "read_until"); return bytes_transferred; } template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim, asio::error_code& ec) { typename decay::type b( ASIO_MOVE_CAST(DynamicBuffer)(buffers)); std::size_t search_position = 0; for (;;) { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = b.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position; iterator end = iterator::end(data_buffers); // Look for a match. iterator iter = std::find(start_pos, end, delim); if (iter != end) { // Found a match. We're done. ec = asio::error_code(); return iter - begin + 1; } else { // No match. Next search can start with the new data. search_position = end - begin; } // Check if buffer is full. if (b.size() == b.max_size()) { ec = error::not_found; return 0; } // Need more data. std::size_t bytes_to_read = std::min( std::max(512, b.capacity() - b.size()), std::min(65536, b.max_size() - b.size())); b.commit(s.read_some(b.prepare(bytes_to_read), ec)); if (ec) return 0; } } template inline std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_STRING_VIEW_PARAM delim) { asio::error_code ec; std::size_t bytes_transferred = read_until(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, ec); asio::detail::throw_error(ec, "read_until"); return bytes_transferred; } namespace detail { // Algorithm that finds a subsequence of equal values in a sequence. Returns // (iterator,true) if a full match was found, in which case the iterator // points to the beginning of the match. Returns (iterator,false) if a // partial match was found at the end of the first sequence, in which case // the iterator points to the beginning of the partial match. Returns // (last1,false) if no full or partial match was found. template std::pair partial_search( Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) { for (Iterator1 iter1 = first1; iter1 != last1; ++iter1) { Iterator1 test_iter1 = iter1; Iterator2 test_iter2 = first2; for (;; ++test_iter1, ++test_iter2) { if (test_iter2 == last2) return std::make_pair(iter1, true); if (test_iter1 == last1) { if (test_iter2 != first2) return std::make_pair(iter1, false); else break; } if (*test_iter1 != *test_iter2) break; } } return std::make_pair(last1, false); } } // namespace detail template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec) { typename decay::type b( ASIO_MOVE_CAST(DynamicBuffer)(buffers)); std::size_t search_position = 0; for (;;) { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = b.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position; iterator end = iterator::end(data_buffers); // Look for a match. std::pair result = detail::partial_search( start_pos, end, delim.begin(), delim.end()); if (result.first != end) { if (result.second) { // Full match. We're done. ec = asio::error_code(); return result.first - begin + delim.length(); } else { // Partial match. Next search needs to start from beginning of match. search_position = result.first - begin; } } else { // No match. Next search can start with the new data. search_position = end - begin; } // Check if buffer is full. if (b.size() == b.max_size()) { ec = error::not_found; return 0; } // Need more data. std::size_t bytes_to_read = std::min( std::max(512, b.capacity() - b.size()), std::min(65536, b.max_size() - b.size())); b.commit(s.read_some(b.prepare(bytes_to_read), ec)); if (ec) return 0; } } #if !defined(ASIO_NO_EXTENSIONS) #if defined(ASIO_HAS_BOOST_REGEX) template inline std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, const boost::regex& expr) { asio::error_code ec; std::size_t bytes_transferred = read_until(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), expr, ec); asio::detail::throw_error(ec, "read_until"); return bytes_transferred; } template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, const boost::regex& expr, asio::error_code& ec) { typename decay::type b( ASIO_MOVE_CAST(DynamicBuffer)(buffers)); std::size_t search_position = 0; for (;;) { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = b.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position; iterator end = iterator::end(data_buffers); // Look for a match. boost::match_results >::allocator_type> match_results; if (regex_search(start_pos, end, match_results, expr, boost::match_default | boost::match_partial)) { if (match_results[0].matched) { // Full match. We're done. ec = asio::error_code(); return match_results[0].second - begin; } else { // Partial match. Next search needs to start from beginning of match. search_position = match_results[0].first - begin; } } else { // No match. Next search can start with the new data. search_position = end - begin; } // Check if buffer is full. if (b.size() == b.max_size()) { ec = error::not_found; return 0; } // Need more data. std::size_t bytes_to_read = std::min( std::max(512, b.capacity() - b.size()), std::min(65536, b.max_size() - b.size())); b.commit(s.read_some(b.prepare(bytes_to_read), ec)); if (ec) return 0; } } #endif // defined(ASIO_HAS_BOOST_REGEX) template inline std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, MatchCondition match_condition, typename enable_if::value>::type*) { asio::error_code ec; std::size_t bytes_transferred = read_until(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), match_condition, ec); asio::detail::throw_error(ec, "read_until"); return bytes_transferred; } template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, MatchCondition match_condition, asio::error_code& ec, typename enable_if::value>::type*) { typename decay::type b( ASIO_MOVE_CAST(DynamicBuffer)(buffers)); std::size_t search_position = 0; for (;;) { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = b.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position; iterator end = iterator::end(data_buffers); // Look for a match. std::pair result = match_condition(start_pos, end); if (result.second) { // Full match. We're done. ec = asio::error_code(); return result.first - begin; } else if (result.first != end) { // Partial match. Next search needs to start from beginning of match. search_position = result.first - begin; } else { // No match. Next search can start with the new data. search_position = end - begin; } // Check if buffer is full. if (b.size() == b.max_size()) { ec = error::not_found; return 0; } // Need more data. std::size_t bytes_to_read = std::min( std::max(512, b.capacity() - b.size()), std::min(65536, b.max_size() - b.size())); b.commit(s.read_some(b.prepare(bytes_to_read), ec)); if (ec) return 0; } } #if !defined(ASIO_NO_IOSTREAM) template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, char delim) { return read_until(s, basic_streambuf_ref(b), delim); } template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, char delim, asio::error_code& ec) { return read_until(s, basic_streambuf_ref(b), delim, ec); } template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, ASIO_STRING_VIEW_PARAM delim) { return read_until(s, basic_streambuf_ref(b), delim); } template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec) { return read_until(s, basic_streambuf_ref(b), delim, ec); } #if defined(ASIO_HAS_BOOST_REGEX) template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, const boost::regex& expr) { return read_until(s, basic_streambuf_ref(b), expr); } template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, const boost::regex& expr, asio::error_code& ec) { return read_until(s, basic_streambuf_ref(b), expr, ec); } #endif // defined(ASIO_HAS_BOOST_REGEX) template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, MatchCondition match_condition, typename enable_if::value>::type*) { return read_until(s, basic_streambuf_ref(b), match_condition); } template inline std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, MatchCondition match_condition, asio::error_code& ec, typename enable_if::value>::type*) { return read_until(s, basic_streambuf_ref(b), match_condition, ec); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) namespace detail { template class read_until_delim_op { public: template read_until_delim_op(AsyncReadStream& stream, ASIO_MOVE_ARG(BufferSequence) buffers, char delim, ReadHandler& handler) : stream_(stream), buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), delim_(delim), start_(0), search_position_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_until_delim_op(const read_until_delim_op& other) : stream_(other.stream_), buffers_(other.buffers_), delim_(other.delim_), start_(other.start_), search_position_(other.search_position_), handler_(other.handler_) { } read_until_delim_op(read_until_delim_op&& other) : stream_(other.stream_), buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), delim_(other.delim_), start_(other.start_), search_position_(other.search_position_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { const std::size_t not_found = (std::numeric_limits::max)(); std::size_t bytes_to_read; switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = buffers_.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position_; iterator end = iterator::end(data_buffers); // Look for a match. iterator iter = std::find(start_pos, end, delim_); if (iter != end) { // Found a match. We're done. search_position_ = iter - begin + 1; bytes_to_read = 0; } // No match yet. Check if buffer is full. else if (buffers_.size() == buffers_.max_size()) { search_position_ = not_found; bytes_to_read = 0; } // Need to read some more data. else { // Next search can start with the new data. search_position_ = end - begin; bytes_to_read = std::min( std::max(512, buffers_.capacity() - buffers_.size()), std::min(65536, buffers_.max_size() - buffers_.size())); } } // Check if we're done. if (!start && bytes_to_read == 0) break; // Start a new asynchronous read operation to obtain more data. stream_.async_read_some(buffers_.prepare(bytes_to_read), ASIO_MOVE_CAST(read_until_delim_op)(*this)); return; default: buffers_.commit(bytes_transferred); if (ec || bytes_transferred == 0) break; } const asio::error_code result_ec = (search_position_ == not_found) ? error::not_found : ec; const std::size_t result_n = (ec || search_position_ == not_found) ? 0 : search_position_; handler_(result_ec, result_n); } } //private: AsyncReadStream& stream_; DynamicBuffer buffers_; char delim_; int start_; std::size_t search_position_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_until_delim_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_until_delim_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_until_delim_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_until_delim_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_until_delim_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_until_delim_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_until_delim_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_until_delim_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_until_delim_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_until_delim_op::type, ASIO_HANDLER_TYPE(ReadHandler, void (asio::error_code, std::size_t))>( s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, init.completion_handler)(asio::error_code(), 0, 1); return init.result.get(); } namespace detail { template class read_until_delim_string_op { public: template read_until_delim_string_op(AsyncReadStream& stream, ASIO_MOVE_ARG(BufferSequence) buffers, const std::string& delim, ReadHandler& handler) : stream_(stream), buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), delim_(delim), start_(0), search_position_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_until_delim_string_op(const read_until_delim_string_op& other) : stream_(other.stream_), buffers_(other.buffers_), delim_(other.delim_), start_(other.start_), search_position_(other.search_position_), handler_(other.handler_) { } read_until_delim_string_op(read_until_delim_string_op&& other) : stream_(other.stream_), buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), delim_(ASIO_MOVE_CAST(std::string)(other.delim_)), start_(other.start_), search_position_(other.search_position_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { const std::size_t not_found = (std::numeric_limits::max)(); std::size_t bytes_to_read; switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = buffers_.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position_; iterator end = iterator::end(data_buffers); // Look for a match. std::pair result = detail::partial_search( start_pos, end, delim_.begin(), delim_.end()); if (result.first != end && result.second) { // Full match. We're done. search_position_ = result.first - begin + delim_.length(); bytes_to_read = 0; } // No match yet. Check if buffer is full. else if (buffers_.size() == buffers_.max_size()) { search_position_ = not_found; bytes_to_read = 0; } // Need to read some more data. else { if (result.first != end) { // Partial match. Next search needs to start from beginning of // match. search_position_ = result.first - begin; } else { // Next search can start with the new data. search_position_ = end - begin; } bytes_to_read = std::min( std::max(512, buffers_.capacity() - buffers_.size()), std::min(65536, buffers_.max_size() - buffers_.size())); } } // Check if we're done. if (!start && bytes_to_read == 0) break; // Start a new asynchronous read operation to obtain more data. stream_.async_read_some(buffers_.prepare(bytes_to_read), ASIO_MOVE_CAST(read_until_delim_string_op)(*this)); return; default: buffers_.commit(bytes_transferred); if (ec || bytes_transferred == 0) break; } const asio::error_code result_ec = (search_position_ == not_found) ? error::not_found : ec; const std::size_t result_n = (ec || search_position_ == not_found) ? 0 : search_position_; handler_(result_ec, result_n); } } //private: AsyncReadStream& stream_; DynamicBuffer buffers_; std::string delim_; int start_; std::size_t search_position_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_until_delim_string_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_until_delim_string_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_until_delim_string_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_until_delim_string_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_until_delim_string_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_until_delim_string_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_until_delim_string_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_until_delim_string_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_until_delim_string_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_STRING_VIEW_PARAM delim, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_until_delim_string_op::type, ASIO_HANDLER_TYPE(ReadHandler, void (asio::error_code, std::size_t))>( s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), static_cast(delim), init.completion_handler)(asio::error_code(), 0, 1); return init.result.get(); } #if !defined(ASIO_NO_EXTENSIONS) #if defined(ASIO_HAS_BOOST_REGEX) namespace detail { template class read_until_expr_op { public: template read_until_expr_op(AsyncReadStream& stream, ASIO_MOVE_ARG(BufferSequence) buffers, const boost::regex& expr, ReadHandler& handler) : stream_(stream), buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), expr_(expr), start_(0), search_position_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_until_expr_op(const read_until_expr_op& other) : stream_(other.stream_), buffers_(other.buffers_), expr_(other.expr_), start_(other.start_), search_position_(other.search_position_), handler_(other.handler_) { } read_until_expr_op(read_until_expr_op&& other) : stream_(other.stream_), buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), expr_(other.expr_), start_(other.start_), search_position_(other.search_position_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { const std::size_t not_found = (std::numeric_limits::max)(); std::size_t bytes_to_read; switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = buffers_.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position_; iterator end = iterator::end(data_buffers); // Look for a match. boost::match_results >::allocator_type> match_results; bool match = regex_search(start_pos, end, match_results, expr_, boost::match_default | boost::match_partial); if (match && match_results[0].matched) { // Full match. We're done. search_position_ = match_results[0].second - begin; bytes_to_read = 0; } // No match yet. Check if buffer is full. else if (buffers_.size() == buffers_.max_size()) { search_position_ = not_found; bytes_to_read = 0; } // Need to read some more data. else { if (match) { // Partial match. Next search needs to start from beginning of // match. search_position_ = match_results[0].first - begin; } else { // Next search can start with the new data. search_position_ = end - begin; } bytes_to_read = std::min( std::max(512, buffers_.capacity() - buffers_.size()), std::min(65536, buffers_.max_size() - buffers_.size())); } } // Check if we're done. if (!start && bytes_to_read == 0) break; // Start a new asynchronous read operation to obtain more data. stream_.async_read_some(buffers_.prepare(bytes_to_read), ASIO_MOVE_CAST(read_until_expr_op)(*this)); return; default: buffers_.commit(bytes_transferred); if (ec || bytes_transferred == 0) break; } const asio::error_code result_ec = (search_position_ == not_found) ? error::not_found : ec; const std::size_t result_n = (ec || search_position_ == not_found) ? 0 : search_position_; handler_(result_ec, result_n); } } //private: AsyncReadStream& stream_; DynamicBuffer buffers_; RegEx expr_; int start_; std::size_t search_position_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_until_expr_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_until_expr_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_until_expr_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_until_expr_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_until_expr_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_until_expr_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_until_expr_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_until_expr_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_until_expr_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, const boost::regex& expr, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_until_expr_op::type, boost::regex, ASIO_HANDLER_TYPE(ReadHandler, void (asio::error_code, std::size_t))>( s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), expr, init.completion_handler)(asio::error_code(), 0, 1); return init.result.get(); } #endif // defined(ASIO_HAS_BOOST_REGEX) namespace detail { template class read_until_match_op { public: template read_until_match_op(AsyncReadStream& stream, ASIO_MOVE_ARG(BufferSequence) buffers, MatchCondition match_condition, ReadHandler& handler) : stream_(stream), buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), match_condition_(match_condition), start_(0), search_position_(0), handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) read_until_match_op(const read_until_match_op& other) : stream_(other.stream_), buffers_(other.buffers_), match_condition_(other.match_condition_), start_(other.start_), search_position_(other.search_position_), handler_(other.handler_) { } read_until_match_op(read_until_match_op&& other) : stream_(other.stream_), buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), match_condition_(other.match_condition_), start_(other.start_), search_position_(other.search_position_), handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { const std::size_t not_found = (std::numeric_limits::max)(); std::size_t bytes_to_read; switch (start_ = start) { case 1: for (;;) { { // Determine the range of the data to be searched. typedef typename DynamicBuffer::const_buffers_type buffers_type; typedef buffers_iterator iterator; buffers_type data_buffers = buffers_.data(); iterator begin = iterator::begin(data_buffers); iterator start_pos = begin + search_position_; iterator end = iterator::end(data_buffers); // Look for a match. std::pair result = match_condition_(start_pos, end); if (result.second) { // Full match. We're done. search_position_ = result.first - begin; bytes_to_read = 0; } // No match yet. Check if buffer is full. else if (buffers_.size() == buffers_.max_size()) { search_position_ = not_found; bytes_to_read = 0; } // Need to read some more data. else { if (result.first != end) { // Partial match. Next search needs to start from beginning of // match. search_position_ = result.first - begin; } else { // Next search can start with the new data. search_position_ = end - begin; } bytes_to_read = std::min( std::max(512, buffers_.capacity() - buffers_.size()), std::min(65536, buffers_.max_size() - buffers_.size())); } } // Check if we're done. if (!start && bytes_to_read == 0) break; // Start a new asynchronous read operation to obtain more data. stream_.async_read_some(buffers_.prepare(bytes_to_read), ASIO_MOVE_CAST(read_until_match_op)(*this)); return; default: buffers_.commit(bytes_transferred); if (ec || bytes_transferred == 0) break; } const asio::error_code result_ec = (search_position_ == not_found) ? error::not_found : ec; const std::size_t result_n = (ec || search_position_ == not_found) ? 0 : search_position_; handler_(result_ec, result_n); } } //private: AsyncReadStream& stream_; DynamicBuffer buffers_; MatchCondition match_condition_; int start_; std::size_t search_position_; ReadHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, read_until_match_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, read_until_match_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( read_until_match_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, read_until_match_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, read_until_match_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::read_until_match_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::read_until_match_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::read_until_match_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::read_until_match_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if::value>::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); detail::read_until_match_op::type, MatchCondition, ASIO_HANDLER_TYPE(ReadHandler, void (asio::error_code, std::size_t))>( s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), match_condition, init.completion_handler)( asio::error_code(), 0, 1); return init.result.get(); } #if !defined(ASIO_NO_IOSTREAM) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, char delim, ASIO_MOVE_ARG(ReadHandler) handler) { return async_read_until(s, basic_streambuf_ref(b), delim, ASIO_MOVE_CAST(ReadHandler)(handler)); } template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, ASIO_STRING_VIEW_PARAM delim, ASIO_MOVE_ARG(ReadHandler) handler) { return async_read_until(s, basic_streambuf_ref(b), delim, ASIO_MOVE_CAST(ReadHandler)(handler)); } #if defined(ASIO_HAS_BOOST_REGEX) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, const boost::regex& expr, ASIO_MOVE_ARG(ReadHandler) handler) { return async_read_until(s, basic_streambuf_ref(b), expr, ASIO_MOVE_CAST(ReadHandler)(handler)); } #endif // defined(ASIO_HAS_BOOST_REGEX) template inline ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if::value>::type*) { return async_read_until(s, basic_streambuf_ref(b), match_condition, ASIO_MOVE_CAST(ReadHandler)(handler)); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_READ_UNTIL_HPP asio-1.12.2/include/asio/impl/serial_port_base.hpp000066400000000000000000000024321340672067200221050ustar00rootroot00000000000000// // impl/serial_port_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SERIAL_PORT_BASE_HPP #define ASIO_IMPL_SERIAL_PORT_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/push_options.hpp" namespace asio { inline serial_port_base::baud_rate::baud_rate(unsigned int rate) : value_(rate) { } inline unsigned int serial_port_base::baud_rate::value() const { return value_; } inline serial_port_base::flow_control::type serial_port_base::flow_control::value() const { return value_; } inline serial_port_base::parity::type serial_port_base::parity::value() const { return value_; } inline serial_port_base::stop_bits::type serial_port_base::stop_bits::value() const { return value_; } inline unsigned int serial_port_base::character_size::value() const { return value_; } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_SERIAL_PORT_BASE_HPP asio-1.12.2/include/asio/impl/serial_port_base.ipp000066400000000000000000000306241340672067200221120ustar00rootroot00000000000000// // impl/serial_port_base.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SERIAL_PORT_BASE_IPP #define ASIO_IMPL_SERIAL_PORT_BASE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_SERIAL_PORT) #include #include "asio/error.hpp" #include "asio/serial_port_base.hpp" #include "asio/detail/throw_exception.hpp" #if defined(GENERATING_DOCUMENTATION) # define ASIO_OPTION_STORAGE implementation_defined #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) # define ASIO_OPTION_STORAGE DCB #else # define ASIO_OPTION_STORAGE termios #endif #include "asio/detail/push_options.hpp" namespace asio { ASIO_SYNC_OP_VOID serial_port_base::baud_rate::store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) storage.BaudRate = value_; #else speed_t baud; switch (value_) { // Do POSIX-specified rates first. case 0: baud = B0; break; case 50: baud = B50; break; case 75: baud = B75; break; case 110: baud = B110; break; case 134: baud = B134; break; case 150: baud = B150; break; case 200: baud = B200; break; case 300: baud = B300; break; case 600: baud = B600; break; case 1200: baud = B1200; break; case 1800: baud = B1800; break; case 2400: baud = B2400; break; case 4800: baud = B4800; break; case 9600: baud = B9600; break; case 19200: baud = B19200; break; case 38400: baud = B38400; break; // And now the extended ones conditionally. # ifdef B7200 case 7200: baud = B7200; break; # endif # ifdef B14400 case 14400: baud = B14400; break; # endif # ifdef B57600 case 57600: baud = B57600; break; # endif # ifdef B115200 case 115200: baud = B115200; break; # endif # ifdef B230400 case 230400: baud = B230400; break; # endif # ifdef B460800 case 460800: baud = B460800; break; # endif # ifdef B500000 case 500000: baud = B500000; break; # endif # ifdef B576000 case 576000: baud = B576000; break; # endif # ifdef B921600 case 921600: baud = B921600; break; # endif # ifdef B1000000 case 1000000: baud = B1000000; break; # endif # ifdef B1152000 case 1152000: baud = B1152000; break; # endif # ifdef B2000000 case 2000000: baud = B2000000; break; # endif # ifdef B3000000 case 3000000: baud = B3000000; break; # endif # ifdef B3500000 case 3500000: baud = B3500000; break; # endif # ifdef B4000000 case 4000000: baud = B4000000; break; # endif default: ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } # if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) ::cfsetspeed(&storage, baud); # else ::cfsetispeed(&storage, baud); ::cfsetospeed(&storage, baud); # endif #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID serial_port_base::baud_rate::load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) value_ = storage.BaudRate; #else speed_t baud = ::cfgetospeed(&storage); switch (baud) { // First do those specified by POSIX. case B0: value_ = 0; break; case B50: value_ = 50; break; case B75: value_ = 75; break; case B110: value_ = 110; break; case B134: value_ = 134; break; case B150: value_ = 150; break; case B200: value_ = 200; break; case B300: value_ = 300; break; case B600: value_ = 600; break; case B1200: value_ = 1200; break; case B1800: value_ = 1800; break; case B2400: value_ = 2400; break; case B4800: value_ = 4800; break; case B9600: value_ = 9600; break; case B19200: value_ = 19200; break; case B38400: value_ = 38400; break; // Now conditionally handle a bunch of extended rates. # ifdef B7200 case B7200: value_ = 7200; break; # endif # ifdef B14400 case B14400: value_ = 14400; break; # endif # ifdef B57600 case B57600: value_ = 57600; break; # endif # ifdef B115200 case B115200: value_ = 115200; break; # endif # ifdef B230400 case B230400: value_ = 230400; break; # endif # ifdef B460800 case B460800: value_ = 460800; break; # endif # ifdef B500000 case B500000: value_ = 500000; break; # endif # ifdef B576000 case B576000: value_ = 576000; break; # endif # ifdef B921600 case B921600: value_ = 921600; break; # endif # ifdef B1000000 case B1000000: value_ = 1000000; break; # endif # ifdef B1152000 case B1152000: value_ = 1152000; break; # endif # ifdef B2000000 case B2000000: value_ = 2000000; break; # endif # ifdef B3000000 case B3000000: value_ = 3000000; break; # endif # ifdef B3500000 case B3500000: value_ = 3500000; break; # endif # ifdef B4000000 case B4000000: value_ = 4000000; break; # endif default: value_ = 0; ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } serial_port_base::flow_control::flow_control( serial_port_base::flow_control::type t) : value_(t) { if (t != none && t != software && t != hardware) { std::out_of_range ex("invalid flow_control value"); asio::detail::throw_exception(ex); } } ASIO_SYNC_OP_VOID serial_port_base::flow_control::store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) storage.fOutxCtsFlow = FALSE; storage.fOutxDsrFlow = FALSE; storage.fTXContinueOnXoff = TRUE; storage.fDtrControl = DTR_CONTROL_ENABLE; storage.fDsrSensitivity = FALSE; storage.fOutX = FALSE; storage.fInX = FALSE; storage.fRtsControl = RTS_CONTROL_ENABLE; switch (value_) { case none: break; case software: storage.fOutX = TRUE; storage.fInX = TRUE; break; case hardware: storage.fOutxCtsFlow = TRUE; storage.fRtsControl = RTS_CONTROL_HANDSHAKE; break; default: break; } #else switch (value_) { case none: storage.c_iflag &= ~(IXOFF | IXON); # if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) storage.c_cflag &= ~CRTSCTS; # elif defined(__QNXNTO__) storage.c_cflag &= ~(IHFLOW | OHFLOW); # endif break; case software: storage.c_iflag |= IXOFF | IXON; # if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) storage.c_cflag &= ~CRTSCTS; # elif defined(__QNXNTO__) storage.c_cflag &= ~(IHFLOW | OHFLOW); # endif break; case hardware: # if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) storage.c_iflag &= ~(IXOFF | IXON); storage.c_cflag |= CRTSCTS; break; # elif defined(__QNXNTO__) storage.c_iflag &= ~(IXOFF | IXON); storage.c_cflag |= (IHFLOW | OHFLOW); break; # else ec = asio::error::operation_not_supported; ASIO_SYNC_OP_VOID_RETURN(ec); # endif default: break; } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID serial_port_base::flow_control::load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (storage.fOutX && storage.fInX) { value_ = software; } else if (storage.fOutxCtsFlow && storage.fRtsControl == RTS_CONTROL_HANDSHAKE) { value_ = hardware; } else { value_ = none; } #else if (storage.c_iflag & (IXOFF | IXON)) { value_ = software; } # if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) else if (storage.c_cflag & CRTSCTS) { value_ = hardware; } # elif defined(__QNXNTO__) else if (storage.c_cflag & IHFLOW && storage.c_cflag & OHFLOW) { value_ = hardware; } # endif else { value_ = none; } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } serial_port_base::parity::parity(serial_port_base::parity::type t) : value_(t) { if (t != none && t != odd && t != even) { std::out_of_range ex("invalid parity value"); asio::detail::throw_exception(ex); } } ASIO_SYNC_OP_VOID serial_port_base::parity::store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) switch (value_) { case none: storage.fParity = FALSE; storage.Parity = NOPARITY; break; case odd: storage.fParity = TRUE; storage.Parity = ODDPARITY; break; case even: storage.fParity = TRUE; storage.Parity = EVENPARITY; break; default: break; } #else switch (value_) { case none: storage.c_iflag |= IGNPAR; storage.c_cflag &= ~(PARENB | PARODD); break; case even: storage.c_iflag &= ~(IGNPAR | PARMRK); storage.c_iflag |= INPCK; storage.c_cflag |= PARENB; storage.c_cflag &= ~PARODD; break; case odd: storage.c_iflag &= ~(IGNPAR | PARMRK); storage.c_iflag |= INPCK; storage.c_cflag |= (PARENB | PARODD); break; default: break; } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID serial_port_base::parity::load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (storage.Parity == EVENPARITY) { value_ = even; } else if (storage.Parity == ODDPARITY) { value_ = odd; } else { value_ = none; } #else if (storage.c_cflag & PARENB) { if (storage.c_cflag & PARODD) { value_ = odd; } else { value_ = even; } } else { value_ = none; } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } serial_port_base::stop_bits::stop_bits( serial_port_base::stop_bits::type t) : value_(t) { if (t != one && t != onepointfive && t != two) { std::out_of_range ex("invalid stop_bits value"); asio::detail::throw_exception(ex); } } ASIO_SYNC_OP_VOID serial_port_base::stop_bits::store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) switch (value_) { case one: storage.StopBits = ONESTOPBIT; break; case onepointfive: storage.StopBits = ONE5STOPBITS; break; case two: storage.StopBits = TWOSTOPBITS; break; default: break; } #else switch (value_) { case one: storage.c_cflag &= ~CSTOPB; break; case two: storage.c_cflag |= CSTOPB; break; default: ec = asio::error::operation_not_supported; ASIO_SYNC_OP_VOID_RETURN(ec); } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID serial_port_base::stop_bits::load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) if (storage.StopBits == ONESTOPBIT) { value_ = one; } else if (storage.StopBits == ONE5STOPBITS) { value_ = onepointfive; } else if (storage.StopBits == TWOSTOPBITS) { value_ = two; } else { value_ = one; } #else value_ = (storage.c_cflag & CSTOPB) ? two : one; #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } serial_port_base::character_size::character_size(unsigned int t) : value_(t) { if (t < 5 || t > 8) { std::out_of_range ex("invalid character_size value"); asio::detail::throw_exception(ex); } } ASIO_SYNC_OP_VOID serial_port_base::character_size::store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) storage.ByteSize = value_; #else storage.c_cflag &= ~CSIZE; switch (value_) { case 5: storage.c_cflag |= CS5; break; case 6: storage.c_cflag |= CS6; break; case 7: storage.c_cflag |= CS7; break; case 8: storage.c_cflag |= CS8; break; default: break; } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID serial_port_base::character_size::load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) value_ = storage.ByteSize; #else if ((storage.c_cflag & CSIZE) == CS5) { value_ = 5; } else if ((storage.c_cflag & CSIZE) == CS6) { value_ = 6; } else if ((storage.c_cflag & CSIZE) == CS7) { value_ = 7; } else if ((storage.c_cflag & CSIZE) == CS8) { value_ = 8; } else { // Hmmm, use 8 for now. value_ = 8; } #endif ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } // namespace asio #include "asio/detail/pop_options.hpp" #undef ASIO_OPTION_STORAGE #endif // defined(ASIO_HAS_SERIAL_PORT) #endif // ASIO_IMPL_SERIAL_PORT_BASE_IPP asio-1.12.2/include/asio/impl/spawn.hpp000066400000000000000000000355741340672067200177350ustar00rootroot00000000000000// // impl/spawn.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SPAWN_HPP #define ASIO_IMPL_SPAWN_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/async_result.hpp" #include "asio/bind_executor.hpp" #include "asio/detail/atomic_count.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/type_traits.hpp" #include "asio/system_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class coro_handler { public: coro_handler(basic_yield_context ctx) : coro_(ctx.coro_.lock()), ca_(ctx.ca_), handler_(ctx.handler_), ready_(0), ec_(ctx.ec_), value_(0) { } void operator()(T value) { *ec_ = asio::error_code(); *value_ = ASIO_MOVE_CAST(T)(value); if (--*ready_ == 0) (*coro_)(); } void operator()(asio::error_code ec, T value) { *ec_ = ec; *value_ = ASIO_MOVE_CAST(T)(value); if (--*ready_ == 0) (*coro_)(); } //private: shared_ptr::callee_type> coro_; typename basic_yield_context::caller_type& ca_; Handler handler_; atomic_count* ready_; asio::error_code* ec_; T* value_; }; template class coro_handler { public: coro_handler(basic_yield_context ctx) : coro_(ctx.coro_.lock()), ca_(ctx.ca_), handler_(ctx.handler_), ready_(0), ec_(ctx.ec_) { } void operator()() { *ec_ = asio::error_code(); if (--*ready_ == 0) (*coro_)(); } void operator()(asio::error_code ec) { *ec_ = ec; if (--*ready_ == 0) (*coro_)(); } //private: shared_ptr::callee_type> coro_; typename basic_yield_context::caller_type& ca_; Handler handler_; atomic_count* ready_; asio::error_code* ec_; }; template inline void* asio_handler_allocate(std::size_t size, coro_handler* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, coro_handler* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation(coro_handler*) { return true; } template inline void asio_handler_invoke(Function& function, coro_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, coro_handler* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template class coro_async_result { public: typedef coro_handler completion_handler_type; typedef T return_type; explicit coro_async_result(completion_handler_type& h) : handler_(h), ca_(h.ca_), ready_(2) { h.ready_ = &ready_; out_ec_ = h.ec_; if (!out_ec_) h.ec_ = &ec_; h.value_ = &value_; } return_type get() { // Must not hold shared_ptr to coro while suspended. handler_.coro_.reset(); if (--ready_ != 0) ca_(); if (!out_ec_ && ec_) throw asio::system_error(ec_); return ASIO_MOVE_CAST(return_type)(value_); } private: completion_handler_type& handler_; typename basic_yield_context::caller_type& ca_; atomic_count ready_; asio::error_code* out_ec_; asio::error_code ec_; return_type value_; }; template class coro_async_result { public: typedef coro_handler completion_handler_type; typedef void return_type; explicit coro_async_result(completion_handler_type& h) : handler_(h), ca_(h.ca_), ready_(2) { h.ready_ = &ready_; out_ec_ = h.ec_; if (!out_ec_) h.ec_ = &ec_; } void get() { // Must not hold shared_ptr to coro while suspended. handler_.coro_.reset(); if (--ready_ != 0) ca_(); if (!out_ec_ && ec_) throw asio::system_error(ec_); } private: completion_handler_type& handler_; typename basic_yield_context::caller_type& ca_; atomic_count ready_; asio::error_code* out_ec_; asio::error_code ec_; }; } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template class async_result, ReturnType()> : public detail::coro_async_result { public: explicit async_result( typename detail::coro_async_result::completion_handler_type& h) : detail::coro_async_result(h) { } }; template class async_result, ReturnType(Arg1)> : public detail::coro_async_result::type> { public: explicit async_result( typename detail::coro_async_result::type>::completion_handler_type& h) : detail::coro_async_result::type>(h) { } }; template class async_result, ReturnType(asio::error_code)> : public detail::coro_async_result { public: explicit async_result( typename detail::coro_async_result::completion_handler_type& h) : detail::coro_async_result(h) { } }; template class async_result, ReturnType(asio::error_code, Arg2)> : public detail::coro_async_result::type> { public: explicit async_result( typename detail::coro_async_result::type>::completion_handler_type& h) : detail::coro_async_result::type>(h) { } }; #if !defined(ASIO_NO_DEPRECATED) template struct handler_type, ReturnType()> { typedef detail::coro_handler type; }; template struct handler_type, ReturnType(Arg1)> { typedef detail::coro_handler::type> type; }; template struct handler_type, ReturnType(asio::error_code)> { typedef detail::coro_handler type; }; template struct handler_type, ReturnType(asio::error_code, Arg2)> { typedef detail::coro_handler::type> type; }; template class async_result > : public detail::coro_async_result { public: typedef typename detail::coro_async_result::return_type type; explicit async_result( typename detail::coro_async_result::completion_handler_type& h) : detail::coro_async_result(h) { } }; #endif // !defined(ASIO_NO_DEPRECATED) template struct associated_allocator, Allocator> { typedef typename associated_allocator::type type; static type get(const detail::coro_handler& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor, Executor> { typedef typename associated_executor::type type; static type get(const detail::coro_handler& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; namespace detail { template struct spawn_data : private noncopyable { template spawn_data(ASIO_MOVE_ARG(Hand) handler, bool call_handler, ASIO_MOVE_ARG(Func) function) : handler_(ASIO_MOVE_CAST(Hand)(handler)), call_handler_(call_handler), function_(ASIO_MOVE_CAST(Func)(function)) { } weak_ptr::callee_type> coro_; Handler handler_; bool call_handler_; Function function_; }; template struct coro_entry_point { void operator()(typename basic_yield_context::caller_type& ca) { shared_ptr > data(data_); #if !defined(BOOST_COROUTINES_UNIDIRECT) && !defined(BOOST_COROUTINES_V2) ca(); // Yield until coroutine pointer has been initialised. #endif // !defined(BOOST_COROUTINES_UNIDIRECT) && !defined(BOOST_COROUTINES_V2) const basic_yield_context yield( data->coro_, ca, data->handler_); (data->function_)(yield); if (data->call_handler_) (data->handler_)(); } shared_ptr > data_; }; template struct spawn_helper { void operator()() { typedef typename basic_yield_context::callee_type callee_type; coro_entry_point entry_point = { data_ }; shared_ptr coro(new callee_type(entry_point, attributes_)); data_->coro_ = coro; (*coro)(); } shared_ptr > data_; boost::coroutines::attributes attributes_; }; template inline void asio_handler_invoke(Function& function, spawn_helper* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->data_->handler_); } template inline void asio_handler_invoke(const Function& function, spawn_helper* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->data_->handler_); } inline void default_spawn_handler() {} } // namespace detail template inline void spawn(ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes) { typedef typename decay::type function_type; typename associated_executor::type ex( (get_associated_executor)(function)); asio::spawn(ex, ASIO_MOVE_CAST(Function)(function), attributes); } template void spawn(ASIO_MOVE_ARG(Handler) handler, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes, typename enable_if::type>::value && !is_convertible::value>::type*) { typedef typename decay::type handler_type; typedef typename decay::type function_type; typename associated_executor::type ex( (get_associated_executor)(handler)); typename associated_allocator::type a( (get_associated_allocator)(handler)); detail::spawn_helper helper; helper.data_.reset( new detail::spawn_data( ASIO_MOVE_CAST(Handler)(handler), true, ASIO_MOVE_CAST(Function)(function))); helper.attributes_ = attributes; ex.dispatch(helper, a); } template void spawn(basic_yield_context ctx, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes) { typedef typename decay::type function_type; Handler handler(ctx.handler_); // Explicit copy that might be moved from. typename associated_executor::type ex( (get_associated_executor)(handler)); typename associated_allocator::type a( (get_associated_allocator)(handler)); detail::spawn_helper helper; helper.data_.reset( new detail::spawn_data( ASIO_MOVE_CAST(Handler)(handler), false, ASIO_MOVE_CAST(Function)(function))); helper.attributes_ = attributes; ex.dispatch(helper, a); } template inline void spawn(const Executor& ex, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes, typename enable_if::value>::type*) { asio::spawn(asio::strand(ex), ASIO_MOVE_CAST(Function)(function), attributes); } template inline void spawn(const strand& ex, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes) { asio::spawn(asio::bind_executor( ex, &detail::default_spawn_handler), ASIO_MOVE_CAST(Function)(function), attributes); } template inline void spawn(const asio::io_context::strand& s, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes) { asio::spawn(asio::bind_executor( s, &detail::default_spawn_handler), ASIO_MOVE_CAST(Function)(function), attributes); } template inline void spawn(ExecutionContext& ctx, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes, typename enable_if::value>::type*) { asio::spawn(ctx.get_executor(), ASIO_MOVE_CAST(Function)(function), attributes); } #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_SPAWN_HPP asio-1.12.2/include/asio/impl/src.cpp000066400000000000000000000012661340672067200173560ustar00rootroot00000000000000// // impl/src.cpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #if defined(_MSC_VER) \ || defined(__BORLANDC__) \ || defined(__DMC__) # pragma message ( \ "This file is deprecated. " \ "Please #include instead.") #elif defined(__GNUC__) \ || defined(__HP_aCC) \ || defined(__SUNPRO_CC) \ || defined(__IBMCPP__) # warning "This file is deprecated." # warning "Please #include instead." #endif #include "asio/impl/src.hpp" asio-1.12.2/include/asio/impl/src.hpp000066400000000000000000000063531340672067200173650ustar00rootroot00000000000000// // impl/src.hpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SRC_HPP #define ASIO_IMPL_SRC_HPP #define ASIO_SOURCE #include "asio/detail/config.hpp" #if defined(ASIO_HEADER_ONLY) # error Do not compile Asio library source with ASIO_HEADER_ONLY defined #endif #include "asio/impl/error.ipp" #include "asio/impl/error_code.ipp" #include "asio/impl/execution_context.ipp" #include "asio/impl/executor.ipp" #include "asio/impl/handler_alloc_hook.ipp" #include "asio/impl/io_context.ipp" #include "asio/impl/serial_port_base.ipp" #include "asio/impl/system_context.ipp" #include "asio/impl/thread_pool.ipp" #include "asio/detail/impl/buffer_sequence_adapter.ipp" #include "asio/detail/impl/descriptor_ops.ipp" #include "asio/detail/impl/dev_poll_reactor.ipp" #include "asio/detail/impl/epoll_reactor.ipp" #include "asio/detail/impl/eventfd_select_interrupter.ipp" #include "asio/detail/impl/handler_tracking.ipp" #include "asio/detail/impl/kqueue_reactor.ipp" #include "asio/detail/impl/null_event.ipp" #include "asio/detail/impl/pipe_select_interrupter.ipp" #include "asio/detail/impl/posix_event.ipp" #include "asio/detail/impl/posix_mutex.ipp" #include "asio/detail/impl/posix_thread.ipp" #include "asio/detail/impl/posix_tss_ptr.ipp" #include "asio/detail/impl/reactive_descriptor_service.ipp" #include "asio/detail/impl/reactive_serial_port_service.ipp" #include "asio/detail/impl/reactive_socket_service_base.ipp" #include "asio/detail/impl/resolver_service_base.ipp" #include "asio/detail/impl/scheduler.ipp" #include "asio/detail/impl/select_reactor.ipp" #include "asio/detail/impl/service_registry.ipp" #include "asio/detail/impl/signal_set_service.ipp" #include "asio/detail/impl/socket_ops.ipp" #include "asio/detail/impl/socket_select_interrupter.ipp" #include "asio/detail/impl/strand_executor_service.ipp" #include "asio/detail/impl/strand_service.ipp" #include "asio/detail/impl/throw_error.ipp" #include "asio/detail/impl/timer_queue_ptime.ipp" #include "asio/detail/impl/timer_queue_set.ipp" #include "asio/detail/impl/win_iocp_handle_service.ipp" #include "asio/detail/impl/win_iocp_io_context.ipp" #include "asio/detail/impl/win_iocp_serial_port_service.ipp" #include "asio/detail/impl/win_iocp_socket_service_base.ipp" #include "asio/detail/impl/win_event.ipp" #include "asio/detail/impl/win_mutex.ipp" #include "asio/detail/impl/win_object_handle_service.ipp" #include "asio/detail/impl/win_static_mutex.ipp" #include "asio/detail/impl/win_thread.ipp" #include "asio/detail/impl/win_tss_ptr.ipp" #include "asio/detail/impl/winrt_ssocket_service_base.ipp" #include "asio/detail/impl/winrt_timer_scheduler.ipp" #include "asio/detail/impl/winsock_init.ipp" #include "asio/generic/detail/impl/endpoint.ipp" #include "asio/ip/impl/address.ipp" #include "asio/ip/impl/address_v4.ipp" #include "asio/ip/impl/address_v6.ipp" #include "asio/ip/impl/host_name.ipp" #include "asio/ip/impl/network_v4.ipp" #include "asio/ip/impl/network_v6.ipp" #include "asio/ip/detail/impl/endpoint.ipp" #include "asio/local/detail/impl/endpoint.ipp" #endif // ASIO_IMPL_SRC_HPP asio-1.12.2/include/asio/impl/system_context.hpp000066400000000000000000000014321340672067200216570ustar00rootroot00000000000000// // impl/system_context.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SYSTEM_CONTEXT_HPP #define ASIO_IMPL_SYSTEM_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/system_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { inline system_context::executor_type system_context::get_executor() ASIO_NOEXCEPT { return system_executor(); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_SYSTEM_CONTEXT_HPP asio-1.12.2/include/asio/impl/system_context.ipp000066400000000000000000000027271340672067200216700ustar00rootroot00000000000000// // impl/system_context.ipp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SYSTEM_CONTEXT_IPP #define ASIO_IMPL_SYSTEM_CONTEXT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/system_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { struct system_context::thread_function { detail::scheduler* scheduler_; void operator()() { asio::error_code ec; scheduler_->run(ec); } }; system_context::system_context() : scheduler_(use_service(*this)) { scheduler_.work_started(); thread_function f = { &scheduler_ }; std::size_t num_threads = detail::thread::hardware_concurrency() * 2; threads_.create_threads(f, num_threads ? num_threads : 2); } system_context::~system_context() { scheduler_.work_finished(); scheduler_.stop(); threads_.join(); } void system_context::stop() { scheduler_.stop(); } bool system_context::stopped() const ASIO_NOEXCEPT { return scheduler_.stopped(); } void system_context::join() { scheduler_.work_finished(); threads_.join(); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_SYSTEM_CONTEXT_IPP asio-1.12.2/include/asio/impl/system_executor.hpp000066400000000000000000000050101340672067200220250ustar00rootroot00000000000000// // impl/system_executor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_SYSTEM_EXECUTOR_HPP #define ASIO_IMPL_SYSTEM_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/executor_op.hpp" #include "asio/detail/global.hpp" #include "asio/detail/recycling_allocator.hpp" #include "asio/detail/type_traits.hpp" #include "asio/system_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { inline system_context& system_executor::context() const ASIO_NOEXCEPT { return detail::global(); } template void system_executor::dispatch( ASIO_MOVE_ARG(Function) f, const Allocator&) const { typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); asio_handler_invoke_helpers::invoke(tmp, tmp); } template void system_executor::post( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; system_context& ctx = detail::global(); // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((ctx, *p.p, "system_executor", &this->context(), 0, "post")); ctx.scheduler_.post_immediate_completion(p.p, false); p.v = p.p = 0; } template void system_executor::defer( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; system_context& ctx = detail::global(); // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((ctx, *p.p, "system_executor", &this->context(), 0, "defer")); ctx.scheduler_.post_immediate_completion(p.p, true); p.v = p.p = 0; } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_SYSTEM_EXECUTOR_HPP asio-1.12.2/include/asio/impl/thread_pool.hpp000066400000000000000000000070711340672067200210740ustar00rootroot00000000000000// // impl/thread_pool.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_THREAD_POOL_HPP #define ASIO_IMPL_THREAD_POOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/executor_op.hpp" #include "asio/detail/fenced_block.hpp" #include "asio/detail/recycling_allocator.hpp" #include "asio/detail/type_traits.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { inline thread_pool::executor_type thread_pool::get_executor() ASIO_NOEXCEPT { return executor_type(*this); } inline thread_pool& thread_pool::executor_type::context() const ASIO_NOEXCEPT { return pool_; } inline void thread_pool::executor_type::on_work_started() const ASIO_NOEXCEPT { pool_.scheduler_.work_started(); } inline void thread_pool::executor_type::on_work_finished() const ASIO_NOEXCEPT { pool_.scheduler_.work_finished(); } template void thread_pool::executor_type::dispatch( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; // Invoke immediately if we are already inside the thread pool. if (pool_.scheduler_.can_dispatch()) { // Make a local, non-const copy of the function. function_type tmp(ASIO_MOVE_CAST(Function)(f)); detail::fenced_block b(detail::fenced_block::full); asio_handler_invoke_helpers::invoke(tmp, tmp); return; } // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((pool_, *p.p, "thread_pool", &this->context(), 0, "dispatch")); pool_.scheduler_.post_immediate_completion(p.p, false); p.v = p.p = 0; } template void thread_pool::executor_type::post( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((pool_, *p.p, "thread_pool", &this->context(), 0, "post")); pool_.scheduler_.post_immediate_completion(p.p, false); p.v = p.p = 0; } template void thread_pool::executor_type::defer( ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typedef typename decay::type function_type; // Allocate and construct an operation to wrap the function. typedef detail::executor_op op; typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); ASIO_HANDLER_CREATION((pool_, *p.p, "thread_pool", &this->context(), 0, "defer")); pool_.scheduler_.post_immediate_completion(p.p, true); p.v = p.p = 0; } inline bool thread_pool::executor_type::running_in_this_thread() const ASIO_NOEXCEPT { return pool_.scheduler_.can_dispatch(); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_THREAD_POOL_HPP asio-1.12.2/include/asio/impl/thread_pool.ipp000066400000000000000000000030041340672067200210650ustar00rootroot00000000000000// // impl/thread_pool.ipp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_THREAD_POOL_IPP #define ASIO_IMPL_THREAD_POOL_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/thread_pool.hpp" #include "asio/detail/push_options.hpp" namespace asio { struct thread_pool::thread_function { detail::scheduler* scheduler_; void operator()() { asio::error_code ec; scheduler_->run(ec); } }; thread_pool::thread_pool() : scheduler_(use_service(*this)) { scheduler_.work_started(); thread_function f = { &scheduler_ }; std::size_t num_threads = detail::thread::hardware_concurrency() * 2; threads_.create_threads(f, num_threads ? num_threads : 2); } thread_pool::thread_pool(std::size_t num_threads) : scheduler_(use_service(*this)) { scheduler_.work_started(); thread_function f = { &scheduler_ }; threads_.create_threads(f, num_threads); } thread_pool::~thread_pool() { stop(); join(); } void thread_pool::stop() { scheduler_.stop(); } void thread_pool::join() { scheduler_.work_finished(); threads_.join(); } } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_THREAD_POOL_IPP asio-1.12.2/include/asio/impl/use_future.hpp000066400000000000000000000570411340672067200207640ustar00rootroot00000000000000// // impl/use_future.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_USE_FUTURE_HPP #define ASIO_IMPL_USE_FUTURE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/detail/memory.hpp" #include "asio/error_code.hpp" #include "asio/packaged_task.hpp" #include "asio/system_error.hpp" #include "asio/system_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template inline void promise_invoke_and_set(std::promise& p, F& f, ASIO_MOVE_ARG(Args)... args) { #if !defined(ASIO_NO_EXCEPTIONS) try #endif // !defined(ASIO_NO_EXCEPTIONS) { p.set_value(f(ASIO_MOVE_CAST(Args)(args)...)); } #if !defined(ASIO_NO_EXCEPTIONS) catch (...) { p.set_exception(std::current_exception()); } #endif // !defined(ASIO_NO_EXCEPTIONS) } template inline void promise_invoke_and_set(std::promise& p, F& f, ASIO_MOVE_ARG(Args)... args) { #if !defined(ASIO_NO_EXCEPTIONS) try #endif // !defined(ASIO_NO_EXCEPTIONS) { f(ASIO_MOVE_CAST(Args)(args)...); p.set_value(); } #if !defined(ASIO_NO_EXCEPTIONS) catch (...) { p.set_exception(std::current_exception()); } #endif // !defined(ASIO_NO_EXCEPTIONS) } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) template inline void promise_invoke_and_set(std::promise& p, F& f) { #if !defined(ASIO_NO_EXCEPTIONS) try #endif // !defined(ASIO_NO_EXCEPTIONS) { p.set_value(f()); } #if !defined(ASIO_NO_EXCEPTIONS) catch (...) { p.set_exception(std::current_exception()); } #endif // !defined(ASIO_NO_EXCEPTIONS) } template inline void promise_invoke_and_set(std::promise& p, F& f) { #if !defined(ASIO_NO_EXCEPTIONS) try #endif // !defined(ASIO_NO_EXCEPTIONS) { f(); p.set_value(); #if !defined(ASIO_NO_EXCEPTIONS) } catch (...) { p.set_exception(std::current_exception()); } #endif // !defined(ASIO_NO_EXCEPTIONS) } #if defined(ASIO_NO_EXCEPTIONS) #define ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \ template \ inline void promise_invoke_and_set(std::promise& p, \ F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ p.set_value(f(ASIO_VARIADIC_MOVE_ARGS(n))); \ } \ \ template \ inline void promise_invoke_and_set(std::promise& p, \ F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ f(ASIO_VARIADIC_MOVE_ARGS(n)); \ p.set_value(); \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_INVOKE_DEF) #undef ASIO_PRIVATE_PROMISE_INVOKE_DEF #else // defined(ASIO_NO_EXCEPTIONS) #define ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \ template \ inline void promise_invoke_and_set(std::promise& p, \ F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ try \ { \ p.set_value(f(ASIO_VARIADIC_MOVE_ARGS(n))); \ } \ catch (...) \ { \ p.set_exception(std::current_exception()); \ } \ } \ \ template \ inline void promise_invoke_and_set(std::promise& p, \ F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ { \ try \ { \ f(ASIO_VARIADIC_MOVE_ARGS(n)); \ p.set_value(); \ } \ catch (...) \ { \ p.set_exception(std::current_exception()); \ } \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_INVOKE_DEF) #undef ASIO_PRIVATE_PROMISE_INVOKE_DEF #endif // defined(ASIO_NO_EXCEPTIONS) #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) // A function object adapter to invoke a nullary function object and capture // any exception thrown into a promise. template class promise_invoker { public: promise_invoker(const shared_ptr >& p, ASIO_MOVE_ARG(F) f) : p_(p), f_(ASIO_MOVE_CAST(F)(f)) { } void operator()() { #if !defined(ASIO_NO_EXCEPTIONS) try #endif // !defined(ASIO_NO_EXCEPTIONS) { f_(); } #if !defined(ASIO_NO_EXCEPTIONS) catch (...) { p_->set_exception(std::current_exception()); } #endif // !defined(ASIO_NO_EXCEPTIONS) } private: shared_ptr > p_; typename decay::type f_; }; // An executor that adapts the system_executor to capture any exeption thrown // by a submitted function object and save it into a promise. template class promise_executor { public: explicit promise_executor(const shared_ptr >& p) : p_(p) { } execution_context& context() const ASIO_NOEXCEPT { return system_executor().context(); } void on_work_started() const ASIO_NOEXCEPT {} void on_work_finished() const ASIO_NOEXCEPT {} template void dispatch(ASIO_MOVE_ARG(F) f, const A&) const { promise_invoker(p_, ASIO_MOVE_CAST(F)(f))(); } template void post(ASIO_MOVE_ARG(F) f, const A& a) const { system_executor().post( promise_invoker(p_, ASIO_MOVE_CAST(F)(f)), a); } template void defer(ASIO_MOVE_ARG(F) f, const A& a) const { system_executor().defer( promise_invoker(p_, ASIO_MOVE_CAST(F)(f)), a); } friend bool operator==(const promise_executor& a, const promise_executor& b) ASIO_NOEXCEPT { return a.p_ == b.p_; } friend bool operator!=(const promise_executor& a, const promise_executor& b) ASIO_NOEXCEPT { return a.p_ != b.p_; } private: shared_ptr > p_; }; // The base class for all completion handlers that create promises. template class promise_creator { public: typedef promise_executor executor_type; executor_type get_executor() const ASIO_NOEXCEPT { return executor_type(p_); } typedef std::future future_type; future_type get_future() { return p_->get_future(); } protected: template void create_promise(const Allocator& a) { ASIO_REBIND_ALLOC(Allocator, char) b(a); p_ = std::allocate_shared>(b, std::allocator_arg, b); } shared_ptr > p_; }; // For completion signature void(). class promise_handler_0 : public promise_creator { public: void operator()() { this->p_->set_value(); } }; // For completion signature void(error_code). class promise_handler_ec_0 : public promise_creator { public: void operator()(const asio::error_code& ec) { if (ec) { this->p_->set_exception( std::make_exception_ptr( asio::system_error(ec))); } else { this->p_->set_value(); } } }; // For completion signature void(exception_ptr). class promise_handler_ex_0 : public promise_creator { public: void operator()(const std::exception_ptr& ex) { if (ex) { this->p_->set_exception(ex); } else { this->p_->set_value(); } } }; // For completion signature void(T). template class promise_handler_1 : public promise_creator { public: template void operator()(ASIO_MOVE_ARG(Arg) arg) { this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg)); } }; // For completion signature void(error_code, T). template class promise_handler_ec_1 : public promise_creator { public: template void operator()(const asio::error_code& ec, ASIO_MOVE_ARG(Arg) arg) { if (ec) { this->p_->set_exception( std::make_exception_ptr( asio::system_error(ec))); } else this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg)); } }; // For completion signature void(exception_ptr, T). template class promise_handler_ex_1 : public promise_creator { public: template void operator()(const std::exception_ptr& ex, ASIO_MOVE_ARG(Arg) arg) { if (ex) this->p_->set_exception(ex); else this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg)); } }; // For completion signature void(T1, ..., Tn); template class promise_handler_n : public promise_creator { public: #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template void operator()(ASIO_MOVE_ARG(Args)... args) { this->p_->set_value( std::forward_as_tuple( ASIO_MOVE_CAST(Args)(args)...)); } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) #define ASIO_PRIVATE_CALL_OP_DEF(n) \ template \ void operator()(ASIO_VARIADIC_MOVE_PARAMS(n)) \ {\ this->p_->set_value( \ std::forward_as_tuple( \ ASIO_VARIADIC_MOVE_ARGS(n))); \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) #undef ASIO_PRIVATE_CALL_OP_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) }; // For completion signature void(error_code, T1, ..., Tn); template class promise_handler_ec_n : public promise_creator { public: #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template void operator()(const asio::error_code& ec, ASIO_MOVE_ARG(Args)... args) { if (ec) { this->p_->set_exception( std::make_exception_ptr( asio::system_error(ec))); } else { this->p_->set_value( std::forward_as_tuple( ASIO_MOVE_CAST(Args)(args)...)); } } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) #define ASIO_PRIVATE_CALL_OP_DEF(n) \ template \ void operator()(const asio::error_code& ec, \ ASIO_VARIADIC_MOVE_PARAMS(n)) \ {\ if (ec) \ { \ this->p_->set_exception( \ std::make_exception_ptr( \ asio::system_error(ec))); \ } \ else \ { \ this->p_->set_value( \ std::forward_as_tuple( \ ASIO_VARIADIC_MOVE_ARGS(n))); \ } \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) #undef ASIO_PRIVATE_CALL_OP_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) }; // For completion signature void(exception_ptr, T1, ..., Tn); template class promise_handler_ex_n : public promise_creator { public: #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template void operator()(const std::exception_ptr& ex, ASIO_MOVE_ARG(Args)... args) { if (ex) this->p_->set_exception(ex); else { this->p_->set_value( std::forward_as_tuple( ASIO_MOVE_CAST(Args)(args)...)); } } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) #define ASIO_PRIVATE_CALL_OP_DEF(n) \ template \ void operator()(const std::exception_ptr& ex, \ ASIO_VARIADIC_MOVE_PARAMS(n)) \ {\ if (ex) \ this->p_->set_exception(ex); \ else \ { \ this->p_->set_value( \ std::forward_as_tuple( \ ASIO_VARIADIC_MOVE_ARGS(n))); \ } \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) #undef ASIO_PRIVATE_CALL_OP_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) }; // Helper template to choose the appropriate concrete promise handler // implementation based on the supplied completion signature. template class promise_handler_selector; template <> class promise_handler_selector : public promise_handler_0 {}; template <> class promise_handler_selector : public promise_handler_ec_0 {}; template <> class promise_handler_selector : public promise_handler_ex_0 {}; template class promise_handler_selector : public promise_handler_1 {}; template class promise_handler_selector : public promise_handler_ec_1 {}; template class promise_handler_selector : public promise_handler_ex_1 {}; #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template class promise_handler_selector : public promise_handler_n > {}; template class promise_handler_selector : public promise_handler_ec_n > {}; template class promise_handler_selector : public promise_handler_ex_n > {}; #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) #define ASIO_PRIVATE_PROMISE_SELECTOR_DEF(n) \ template \ class promise_handler_selector< \ void(Arg, ASIO_VARIADIC_TARGS(n))> \ : public promise_handler_n< \ std::tuple > {}; \ \ template \ class promise_handler_selector< \ void(asio::error_code, Arg, ASIO_VARIADIC_TARGS(n))> \ : public promise_handler_ec_n< \ std::tuple > {}; \ \ template \ class promise_handler_selector< \ void(std::exception_ptr, Arg, ASIO_VARIADIC_TARGS(n))> \ : public promise_handler_ex_n< \ std::tuple > {}; \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_SELECTOR_DEF) #undef ASIO_PRIVATE_PROMISE_SELECTOR_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) // Completion handlers produced from the use_future completion token, when not // using use_future::operator(). template class promise_handler : public promise_handler_selector { public: typedef Allocator allocator_type; typedef void result_type; promise_handler(use_future_t u) : allocator_(u.get_allocator()) { this->create_promise(allocator_); } allocator_type get_allocator() const ASIO_NOEXCEPT { return allocator_; } private: Allocator allocator_; }; template inline void asio_handler_invoke(Function& f, promise_handler* h) { typename promise_handler::executor_type ex(h->get_executor()); ex.dispatch(ASIO_MOVE_CAST(Function)(f), std::allocator()); } template inline void asio_handler_invoke(const Function& f, promise_handler* h) { typename promise_handler::executor_type ex(h->get_executor()); ex.dispatch(f, std::allocator()); } // Helper base class for async_result specialisation. template class promise_async_result { public: typedef promise_handler completion_handler_type; typedef typename completion_handler_type::future_type return_type; explicit promise_async_result(completion_handler_type& h) : future_(h.get_future()) { } return_type get() { return ASIO_MOVE_CAST(return_type)(future_); } private: return_type future_; }; // Return value from use_future::operator(). template class packaged_token { public: packaged_token(Function f, const Allocator& a) : function_(ASIO_MOVE_CAST(Function)(f)), allocator_(a) { } //private: Function function_; Allocator allocator_; }; // Completion handlers produced from the use_future completion token, when // using use_future::operator(). template class packaged_handler : public promise_creator { public: typedef Allocator allocator_type; typedef void result_type; packaged_handler(packaged_token t) : function_(ASIO_MOVE_CAST(Function)(t.function_)), allocator_(t.allocator_) { this->create_promise(allocator_); } allocator_type get_allocator() const ASIO_NOEXCEPT { return allocator_; } #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template void operator()(ASIO_MOVE_ARG(Args)... args) { (promise_invoke_and_set)(*this->p_, function_, ASIO_MOVE_CAST(Args)(args)...); } #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) void operator()() { (promise_invoke_and_set)(*this->p_, function_); } #define ASIO_PRIVATE_CALL_OP_DEF(n) \ template \ void operator()(ASIO_VARIADIC_MOVE_PARAMS(n)) \ {\ (promise_invoke_and_set)(*this->p_, \ function_, ASIO_VARIADIC_MOVE_ARGS(n)); \ } \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) #undef ASIO_PRIVATE_CALL_OP_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) private: Function function_; Allocator allocator_; }; template inline void asio_handler_invoke(Function& f, packaged_handler* h) { typename packaged_handler::executor_type ex(h->get_executor()); ex.dispatch(ASIO_MOVE_CAST(Function)(f), std::allocator()); } template inline void asio_handler_invoke(const Function& f, packaged_handler* h) { typename packaged_handler::executor_type ex(h->get_executor()); ex.dispatch(f, std::allocator()); } // Helper base class for async_result specialisation. template class packaged_async_result { public: typedef packaged_handler completion_handler_type; typedef typename completion_handler_type::future_type return_type; explicit packaged_async_result(completion_handler_type& h) : future_(h.get_future()) { } return_type get() { return ASIO_MOVE_CAST(return_type)(future_); } private: return_type future_; }; } // namespace detail template template inline detail::packaged_token::type, Allocator> use_future_t::operator()(ASIO_MOVE_ARG(Function) f) const { return detail::packaged_token::type, Allocator>( ASIO_MOVE_CAST(Function)(f), allocator_); } #if !defined(GENERATING_DOCUMENTATION) #if defined(ASIO_HAS_VARIADIC_TEMPLATES) template class async_result, Result(Args...)> : public detail::promise_async_result< void(typename decay::type...), Allocator> { public: explicit async_result( typename detail::promise_async_result::type...), Allocator>::completion_handler_type& h) : detail::promise_async_result< void(typename decay::type...), Allocator>(h) { } }; template class async_result, Result(Args...)> : public detail::packaged_async_result::type> { public: explicit async_result( typename detail::packaged_async_result::type>::completion_handler_type& h) : detail::packaged_async_result::type>(h) { } }; #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) template class async_result, Result()> : public detail::promise_async_result { public: explicit async_result( typename detail::promise_async_result< void(), Allocator>::completion_handler_type& h) : detail::promise_async_result(h) { } }; template class async_result, Result()> : public detail::packaged_async_result::type> { public: explicit async_result( typename detail::packaged_async_result::type>::completion_handler_type& h) : detail::packaged_async_result::type>(h) { } }; #define ASIO_PRIVATE_ASYNC_RESULT_DEF(n) \ template \ class async_result, \ Result(ASIO_VARIADIC_TARGS(n))> \ : public detail::promise_async_result< \ void(ASIO_VARIADIC_DECAY(n)), Allocator> \ { \ public: \ explicit async_result( \ typename detail::promise_async_result< \ void(ASIO_VARIADIC_DECAY(n)), \ Allocator>::completion_handler_type& h) \ : detail::promise_async_result< \ void(ASIO_VARIADIC_DECAY(n)), Allocator>(h) \ { \ } \ }; \ \ template \ class async_result, \ Result(ASIO_VARIADIC_TARGS(n))> \ : public detail::packaged_async_result::type> \ { \ public: \ explicit async_result( \ typename detail::packaged_async_result::type \ >::completion_handler_type& h) \ : detail::packaged_async_result::type>(h) \ { \ } \ }; \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_ASYNC_RESULT_DEF) #undef ASIO_PRIVATE_ASYNC_RESULT_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) #if !defined(ASIO_NO_DEPRECATED) template struct handler_type, Signature> { typedef typename async_result, Signature>::completion_handler_type type; }; template class async_result > : public detail::promise_async_result { public: typedef typename detail::promise_async_result< Signature, Allocator>::return_type type; explicit async_result( typename detail::promise_async_result< Signature, Allocator>::completion_handler_type& h) : detail::promise_async_result(h) { } }; template struct handler_type, Signature> { typedef typename async_result, Signature>::completion_handler_type type; }; template class async_result > : public detail::packaged_async_result { public: typedef typename detail::packaged_async_result< Function, Allocator, Result>::return_type type; explicit async_result( typename detail::packaged_async_result< Function, Allocator, Result>::completion_handler_type& h) : detail::packaged_async_result(h) { } }; #endif // !defined(ASIO_NO_DEPRECATED) #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_USE_FUTURE_HPP asio-1.12.2/include/asio/impl/write.hpp000066400000000000000000000554431340672067200177340ustar00rootroot00000000000000// // impl/write.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_WRITE_HPP #define ASIO_IMPL_WRITE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/buffer.hpp" #include "asio/completion_condition.hpp" #include "asio/detail/array_fwd.hpp" #include "asio/detail/base_from_completion_cond.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/consuming_buffers.hpp" #include "asio/detail/dependent_type.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template std::size_t write_buffer_sequence(SyncWriteStream& s, const ConstBufferSequence& buffers, const ConstBufferIterator&, CompletionCondition completion_condition, asio::error_code& ec) { ec = asio::error_code(); asio::detail::consuming_buffers tmp(buffers); while (!tmp.empty()) { if (std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, tmp.total_consumed()))) tmp.consume(s.write_some(tmp.prepare(max_size), ec)); else break; } return tmp.total_consumed();; } } // namespace detail template inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_const_buffer_sequence::value >::type*) { return detail::write_buffer_sequence(s, buffers, asio::buffer_sequence_begin(buffers), completion_condition, ec); } template inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, typename enable_if< is_const_buffer_sequence::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = write(s, buffers, transfer_all(), ec); asio::detail::throw_error(ec, "write"); return bytes_transferred; } template inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, asio::error_code& ec, typename enable_if< is_const_buffer_sequence::value >::type*) { return write(s, buffers, transfer_all(), ec); } template inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, typename enable_if< is_const_buffer_sequence::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = write(s, buffers, completion_condition, ec); asio::detail::throw_error(ec, "write"); return bytes_transferred; } template std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type*) { typename decay::type b( ASIO_MOVE_CAST(DynamicBuffer)(buffers)); std::size_t bytes_transferred = write(s, b.data(), completion_condition, ec); b.consume(bytes_transferred); return bytes_transferred; } template inline std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, typename enable_if< is_dynamic_buffer::type>::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = write(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ec); asio::detail::throw_error(ec, "write"); return bytes_transferred; } template inline std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type*) { return write(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ec); } template inline std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, typename enable_if< is_dynamic_buffer::type>::value >::type*) { asio::error_code ec; std::size_t bytes_transferred = write(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), completion_condition, ec); asio::detail::throw_error(ec, "write"); return bytes_transferred; } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) template inline std::size_t write(SyncWriteStream& s, asio::basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec) { return write(s, basic_streambuf_ref(b), completion_condition, ec); } template inline std::size_t write(SyncWriteStream& s, asio::basic_streambuf& b) { return write(s, basic_streambuf_ref(b)); } template inline std::size_t write(SyncWriteStream& s, asio::basic_streambuf& b, asio::error_code& ec) { return write(s, basic_streambuf_ref(b), ec); } template inline std::size_t write(SyncWriteStream& s, asio::basic_streambuf& b, CompletionCondition completion_condition) { return write(s, basic_streambuf_ref(b), completion_condition); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) namespace detail { template class write_op : detail::base_from_completion_cond { public: write_op(AsyncWriteStream& stream, const ConstBufferSequence& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), stream_(stream), buffers_(buffers), start_(0), handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) write_op(const write_op& other) : detail::base_from_completion_cond(other), stream_(other.stream_), buffers_(other.buffers_), start_(other.start_), handler_(other.handler_) { } write_op(write_op&& other) : detail::base_from_completion_cond(other), stream_(other.stream_), buffers_(other.buffers_), start_(other.start_), handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size; switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, buffers_.total_consumed()); do { stream_.async_write_some(buffers_.prepare(max_size), ASIO_MOVE_CAST(write_op)(*this)); return; default: buffers_.consume(bytes_transferred); if ((!ec && bytes_transferred == 0) || buffers_.empty()) break; max_size = this->check_for_completion(ec, buffers_.total_consumed()); } while (max_size > 0); handler_(ec, buffers_.total_consumed()); } } //private: AsyncWriteStream& stream_; asio::detail::consuming_buffers buffers_; int start_; WriteHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, write_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, write_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( write_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, write_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, write_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void start_write_buffer_sequence_op(AsyncWriteStream& stream, const ConstBufferSequence& buffers, const ConstBufferIterator&, CompletionCondition completion_condition, WriteHandler& handler) { detail::write_op( stream, buffers, completion_condition, handler)( asio::error_code(), 0, 1); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::write_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::write_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::write_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::write_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_const_buffer_sequence::value >::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); detail::start_write_buffer_sequence_op(s, buffers, asio::buffer_sequence_begin(buffers), completion_condition, init.completion_handler); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_const_buffer_sequence::value >::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); detail::start_write_buffer_sequence_op(s, buffers, asio::buffer_sequence_begin(buffers), transfer_all(), init.completion_handler); return init.result.get(); } namespace detail { template class write_dynbuf_op { public: template write_dynbuf_op(AsyncWriteStream& stream, ASIO_MOVE_ARG(BufferSequence) buffers, CompletionCondition completion_condition, WriteHandler& handler) : stream_(stream), buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), completion_condition_( ASIO_MOVE_CAST(CompletionCondition)(completion_condition)), handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) write_dynbuf_op(const write_dynbuf_op& other) : stream_(other.stream_), buffers_(other.buffers_), completion_condition_(other.completion_condition_), handler_(other.handler_) { } write_dynbuf_op(write_dynbuf_op&& other) : stream_(other.stream_), buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), completion_condition_( ASIO_MOVE_CAST(CompletionCondition)( other.completion_condition_)), handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { switch (start) { case 1: async_write(stream_, buffers_.data(), completion_condition_, ASIO_MOVE_CAST(write_dynbuf_op)(*this)); return; default: buffers_.consume(bytes_transferred); handler_(ec, static_cast(bytes_transferred)); } } //private: AsyncWriteStream& stream_; DynamicBuffer buffers_; CompletionCondition completion_condition_; WriteHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, write_dynbuf_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, write_dynbuf_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( write_dynbuf_op* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, write_dynbuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, write_dynbuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::write_dynbuf_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::write_dynbuf_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::write_dynbuf_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::write_dynbuf_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type*) { return async_write(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ASIO_MOVE_CAST(WriteHandler)(handler)); } template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type*) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); detail::write_dynbuf_op::type, CompletionCondition, ASIO_HANDLER_TYPE( WriteHandler, void (asio::error_code, std::size_t))>( s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), completion_condition, init.completion_handler)( asio::error_code(), 0, 1); return init.result.get(); } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, asio::basic_streambuf& b, ASIO_MOVE_ARG(WriteHandler) handler) { return async_write(s, basic_streambuf_ref(b), ASIO_MOVE_CAST(WriteHandler)(handler)); } template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, asio::basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler) { return async_write(s, basic_streambuf_ref(b), completion_condition, ASIO_MOVE_CAST(WriteHandler)(handler)); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_WRITE_HPP asio-1.12.2/include/asio/impl/write_at.hpp000066400000000000000000000472361340672067200204210ustar00rootroot00000000000000// // impl/write_at.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IMPL_WRITE_AT_HPP #define ASIO_IMPL_WRITE_AT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/associated_allocator.hpp" #include "asio/associated_executor.hpp" #include "asio/buffer.hpp" #include "asio/completion_condition.hpp" #include "asio/detail/array_fwd.hpp" #include "asio/detail/base_from_completion_cond.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/consuming_buffers.hpp" #include "asio/detail/dependent_type.hpp" #include "asio/detail/handler_alloc_helpers.hpp" #include "asio/detail/handler_cont_helpers.hpp" #include "asio/detail/handler_invoke_helpers.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template std::size_t write_at_buffer_sequence(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, const ConstBufferIterator&, CompletionCondition completion_condition, asio::error_code& ec) { ec = asio::error_code(); asio::detail::consuming_buffers tmp(buffers); while (!tmp.empty()) { if (std::size_t max_size = detail::adapt_completion_condition_result( completion_condition(ec, tmp.total_consumed()))) { tmp.consume(d.write_some_at(offset + tmp.total_consumed(), tmp.prepare(max_size), ec)); } else break; } return tmp.total_consumed();; } } // namespace detail template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec) { return detail::write_at_buffer_sequence(d, offset, buffers, asio::buffer_sequence_begin(buffers), completion_condition, ec); } template inline std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t bytes_transferred = write_at( d, offset, buffers, transfer_all(), ec); asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } template inline std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, asio::error_code& ec) { return write_at(d, offset, buffers, transfer_all(), ec); } template inline std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition) { asio::error_code ec; std::size_t bytes_transferred = write_at( d, offset, buffers, completion_condition, ec); asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, asio::basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec) { std::size_t bytes_transferred = write_at( d, offset, b.data(), completion_condition, ec); b.consume(bytes_transferred); return bytes_transferred; } template inline std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, asio::basic_streambuf& b) { asio::error_code ec; std::size_t bytes_transferred = write_at(d, offset, b, transfer_all(), ec); asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } template inline std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, asio::basic_streambuf& b, asio::error_code& ec) { return write_at(d, offset, b, transfer_all(), ec); } template inline std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, asio::basic_streambuf& b, CompletionCondition completion_condition) { asio::error_code ec; std::size_t bytes_transferred = write_at( d, offset, b, completion_condition, ec); asio::detail::throw_error(ec, "write_at"); return bytes_transferred; } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) namespace detail { template class write_at_op : detail::base_from_completion_cond { public: write_at_op(AsyncRandomAccessWriteDevice& device, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, WriteHandler& handler) : detail::base_from_completion_cond< CompletionCondition>(completion_condition), device_(device), offset_(offset), buffers_(buffers), start_(0), handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) write_at_op(const write_at_op& other) : detail::base_from_completion_cond(other), device_(other.device_), offset_(other.offset_), buffers_(other.buffers_), start_(other.start_), handler_(other.handler_) { } write_at_op(write_at_op&& other) : detail::base_from_completion_cond(other), device_(other.device_), offset_(other.offset_), buffers_(other.buffers_), start_(other.start_), handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, std::size_t bytes_transferred, int start = 0) { std::size_t max_size; switch (start_ = start) { case 1: max_size = this->check_for_completion(ec, buffers_.total_consumed()); do { device_.async_write_some_at( offset_ + buffers_.total_consumed(), buffers_.prepare(max_size), ASIO_MOVE_CAST(write_at_op)(*this)); return; default: buffers_.consume(bytes_transferred); if ((!ec && bytes_transferred == 0) || buffers_.empty()) break; max_size = this->check_for_completion(ec, buffers_.total_consumed()); } while (max_size > 0); handler_(ec, buffers_.total_consumed()); } } //private: AsyncRandomAccessWriteDevice& device_; uint64_t offset_; asio::detail::consuming_buffers buffers_; int start_; WriteHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, write_at_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, write_at_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( write_at_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, write_at_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, write_at_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void start_write_at_buffer_sequence_op(AsyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, const ConstBufferIterator&, CompletionCondition completion_condition, WriteHandler& handler) { detail::write_at_op( d, offset, buffers, completion_condition, handler)( asio::error_code(), 0, 1); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::write_at_op, Allocator> { typedef typename associated_allocator::type type; static type get( const detail::write_at_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::write_at_op, Executor> { typedef typename associated_executor::type type; static type get( const detail::write_at_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); detail::start_write_at_buffer_sequence_op(d, offset, buffers, asio::buffer_sequence_begin(buffers), completion_condition, init.completion_handler); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); detail::start_write_at_buffer_sequence_op(d, offset, buffers, asio::buffer_sequence_begin(buffers), transfer_all(), init.completion_handler); return init.result.get(); } #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) namespace detail { template class write_at_streambuf_op { public: write_at_streambuf_op( asio::basic_streambuf& streambuf, WriteHandler& handler) : streambuf_(streambuf), handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) { } #if defined(ASIO_HAS_MOVE) write_at_streambuf_op(const write_at_streambuf_op& other) : streambuf_(other.streambuf_), handler_(other.handler_) { } write_at_streambuf_op(write_at_streambuf_op&& other) : streambuf_(other.streambuf_), handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(const asio::error_code& ec, const std::size_t bytes_transferred) { streambuf_.consume(bytes_transferred); handler_(ec, bytes_transferred); } //private: asio::basic_streambuf& streambuf_; WriteHandler handler_; }; template inline void* asio_handler_allocate(std::size_t size, write_at_streambuf_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, write_at_streambuf_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( write_at_streambuf_op* this_handler) { return asio_handler_cont_helpers::is_continuation( this_handler->handler_); } template inline void asio_handler_invoke(Function& function, write_at_streambuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, write_at_streambuf_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline write_at_streambuf_op make_write_at_streambuf_op( asio::basic_streambuf& b, WriteHandler handler) { return write_at_streambuf_op(b, handler); } } // namespace detail #if !defined(GENERATING_DOCUMENTATION) template struct associated_allocator< detail::write_at_streambuf_op, Allocator1> { typedef typename associated_allocator::type type; static type get( const detail::write_at_streambuf_op& h, const Allocator1& a = Allocator1()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< detail::write_at_streambuf_op, Executor1> { typedef typename associated_executor::type type; static type get( const detail::write_at_streambuf_op& h, const Executor1& ex = Executor1()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; #endif // !defined(GENERATING_DOCUMENTATION) template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, asio::basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); async_write_at(d, offset, b.data(), completion_condition, detail::write_at_streambuf_op( b, init.completion_handler)); return init.result.get(); } template inline ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, asio::basic_streambuf& b, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); async_write_at(d, offset, b.data(), transfer_all(), detail::write_at_streambuf_op( b, init.completion_handler)); return init.result.get(); } #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IMPL_WRITE_AT_HPP asio-1.12.2/include/asio/io_context.hpp000066400000000000000000000772311340672067200200130ustar00rootroot00000000000000// // io_context.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IO_CONTEXT_HPP #define ASIO_IO_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include "asio/async_result.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/wrapped_handler.hpp" #include "asio/error_code.hpp" #include "asio/execution_context.hpp" #if defined(ASIO_HAS_CHRONO) # include "asio/detail/chrono.hpp" #endif // defined(ASIO_HAS_CHRONO) #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) # include "asio/detail/winsock_init.hpp" #elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \ || defined(__osf__) # include "asio/detail/signal_init.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { namespace detail { #if defined(ASIO_HAS_IOCP) typedef class win_iocp_io_context io_context_impl; class win_iocp_overlapped_ptr; #else typedef class scheduler io_context_impl; #endif } // namespace detail /// Provides core I/O functionality. /** * The io_context class provides the core I/O functionality for users of the * asynchronous I/O objects, including: * * @li asio::ip::tcp::socket * @li asio::ip::tcp::acceptor * @li asio::ip::udp::socket * @li asio::deadline_timer. * * The io_context class also includes facilities intended for developers of * custom asynchronous services. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe, with the specific exceptions of the restart() * and notify_fork() functions. Calling restart() while there are unfinished * run(), run_one(), run_for(), run_until(), poll() or poll_one() calls results * in undefined behaviour. The notify_fork() function should not be called * while any io_context function, or any function on an I/O object that is * associated with the io_context, is being called in another thread. * * @par Concepts: * Dispatcher. * * @par Synchronous and asynchronous operations * * Synchronous operations on I/O objects implicitly run the io_context object * for an individual operation. The io_context functions run(), run_one(), * run_for(), run_until(), poll() or poll_one() must be called for the * io_context to perform asynchronous operations on behalf of a C++ program. * Notification that an asynchronous operation has completed is delivered by * invocation of the associated handler. Handlers are invoked only by a thread * that is currently calling any overload of run(), run_one(), run_for(), * run_until(), poll() or poll_one() for the io_context. * * @par Effect of exceptions thrown from handlers * * If an exception is thrown from a handler, the exception is allowed to * propagate through the throwing thread's invocation of run(), run_one(), * run_for(), run_until(), poll() or poll_one(). No other threads that are * calling any of these functions are affected. It is then the responsibility * of the application to catch the exception. * * After the exception has been caught, the run(), run_one(), run_for(), * run_until(), poll() or poll_one() call may be restarted @em without the need * for an intervening call to restart(). This allows the thread to rejoin the * io_context object's thread pool without impacting any other threads in the * pool. * * For example: * * @code * asio::io_context io_context; * ... * for (;;) * { * try * { * io_context.run(); * break; // run() exited normally * } * catch (my_exception& e) * { * // Deal with exception as appropriate. * } * } * @endcode * * @par Submitting arbitrary tasks to the io_context * * To submit functions to the io_context, use the @ref asio::dispatch, * @ref asio::post or @ref asio::defer free functions. * * For example: * * @code void my_task() * { * ... * } * * ... * * asio::io_context io_context; * * // Submit a function to the io_context. * asio::post(io_context, my_task); * * // Submit a lambda object to the io_context. * asio::post(io_context, * []() * { * ... * }); * * // Run the io_context until it runs out of work. * io_context.run(); @endcode * * @par Stopping the io_context from running out of work * * Some applications may need to prevent an io_context object's run() call from * returning when there is no more work to do. For example, the io_context may * be being run in a background thread that is launched prior to the * application's asynchronous operations. The run() call may be kept running by * creating an object of type * asio::executor_work_guard: * * @code asio::io_context io_context; * asio::executor_work_guard * = asio::make_work_guard(io_context); * ... @endcode * * To effect a shutdown, the application will then need to call the io_context * object's stop() member function. This will cause the io_context run() call * to return as soon as possible, abandoning unfinished operations and without * permitting ready handlers to be dispatched. * * Alternatively, if the application requires that all operations and handlers * be allowed to finish normally, the work object may be explicitly reset. * * @code asio::io_context io_context; * asio::executor_work_guard * = asio::make_work_guard(io_context); * ... * work.reset(); // Allow run() to exit. @endcode */ class io_context : public execution_context { private: typedef detail::io_context_impl impl_type; #if defined(ASIO_HAS_IOCP) friend class detail::win_iocp_overlapped_ptr; #endif public: class executor_type; friend class executor_type; #if !defined(ASIO_NO_DEPRECATED) class work; friend class work; #endif // !defined(ASIO_NO_DEPRECATED) class service; #if !defined(ASIO_NO_EXTENSIONS) class strand; #endif // !defined(ASIO_NO_EXTENSIONS) /// The type used to count the number of handlers executed by the context. typedef std::size_t count_type; /// Constructor. ASIO_DECL io_context(); /// Constructor. /** * Construct with a hint about the required level of concurrency. * * @param concurrency_hint A suggestion to the implementation on how many * threads it should allow to run simultaneously. */ ASIO_DECL explicit io_context(int concurrency_hint); /// Destructor. /** * On destruction, the io_context performs the following sequence of * operations: * * @li For each service object @c svc in the io_context set, in reverse order * of the beginning of service object lifetime, performs * @c svc->shutdown(). * * @li Uninvoked handler objects that were scheduled for deferred invocation * on the io_context, or any associated strand, are destroyed. * * @li For each service object @c svc in the io_context set, in reverse order * of the beginning of service object lifetime, performs * delete static_cast(svc). * * @note The destruction sequence described above permits programs to * simplify their resource management by using @c shared_ptr<>. Where an * object's lifetime is tied to the lifetime of a connection (or some other * sequence of asynchronous operations), a @c shared_ptr to the object would * be bound into the handlers for all asynchronous operations associated with * it. This works as follows: * * @li When a single connection ends, all associated asynchronous operations * complete. The corresponding handler objects are destroyed, and all * @c shared_ptr references to the objects are destroyed. * * @li To shut down the whole program, the io_context function stop() is * called to terminate any run() calls as soon as possible. The io_context * destructor defined above destroys all handlers, causing all @c shared_ptr * references to all connection objects to be destroyed. */ ASIO_DECL ~io_context(); /// Obtains the executor associated with the io_context. executor_type get_executor() ASIO_NOEXCEPT; /// Run the io_context object's event processing loop. /** * The run() function blocks until all work has finished and there are no * more handlers to be dispatched, or until the io_context has been stopped. * * Multiple threads may call the run() function to set up a pool of threads * from which the io_context may execute handlers. All threads that are * waiting in the pool are equivalent and the io_context may choose any one * of them to invoke a handler. * * A normal exit from the run() function implies that the io_context object * is stopped (the stopped() function returns @c true). Subsequent calls to * run(), run_one(), poll() or poll_one() will return immediately unless there * is a prior call to restart(). * * @return The number of handlers that were executed. * * @note Calling the run() function from a thread that is currently calling * one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on * the same io_context object may introduce the potential for deadlock. It is * the caller's reponsibility to avoid this. * * The poll() function may also be used to dispatch ready handlers, but * without blocking. */ ASIO_DECL count_type run(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overload.) Run the io_context object's /// event processing loop. /** * The run() function blocks until all work has finished and there are no * more handlers to be dispatched, or until the io_context has been stopped. * * Multiple threads may call the run() function to set up a pool of threads * from which the io_context may execute handlers. All threads that are * waiting in the pool are equivalent and the io_context may choose any one * of them to invoke a handler. * * A normal exit from the run() function implies that the io_context object * is stopped (the stopped() function returns @c true). Subsequent calls to * run(), run_one(), poll() or poll_one() will return immediately unless there * is a prior call to restart(). * * @param ec Set to indicate what error occurred, if any. * * @return The number of handlers that were executed. * * @note Calling the run() function from a thread that is currently calling * one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on * the same io_context object may introduce the potential for deadlock. It is * the caller's reponsibility to avoid this. * * The poll() function may also be used to dispatch ready handlers, but * without blocking. */ ASIO_DECL count_type run(asio::error_code& ec); #endif // !defined(ASIO_NO_DEPRECATED) #if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) /// Run the io_context object's event processing loop for a specified /// duration. /** * The run_for() function blocks until all work has finished and there are no * more handlers to be dispatched, until the io_context has been stopped, or * until the specified duration has elapsed. * * @param rel_time The duration for which the call may block. * * @return The number of handlers that were executed. */ template std::size_t run_for(const chrono::duration& rel_time); /// Run the io_context object's event processing loop until a specified time. /** * The run_until() function blocks until all work has finished and there are * no more handlers to be dispatched, until the io_context has been stopped, * or until the specified time has been reached. * * @param abs_time The time point until which the call may block. * * @return The number of handlers that were executed. */ template std::size_t run_until(const chrono::time_point& abs_time); #endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) /// Run the io_context object's event processing loop to execute at most one /// handler. /** * The run_one() function blocks until one handler has been dispatched, or * until the io_context has been stopped. * * @return The number of handlers that were executed. A zero return value * implies that the io_context object is stopped (the stopped() function * returns @c true). Subsequent calls to run(), run_one(), poll() or * poll_one() will return immediately unless there is a prior call to * restart(). * * @note Calling the run_one() function from a thread that is currently * calling one of run(), run_one(), run_for(), run_until(), poll() or * poll_one() on the same io_context object may introduce the potential for * deadlock. It is the caller's reponsibility to avoid this. */ ASIO_DECL count_type run_one(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overlaod.) Run the io_context object's /// event processing loop to execute at most one handler. /** * The run_one() function blocks until one handler has been dispatched, or * until the io_context has been stopped. * * @return The number of handlers that were executed. A zero return value * implies that the io_context object is stopped (the stopped() function * returns @c true). Subsequent calls to run(), run_one(), poll() or * poll_one() will return immediately unless there is a prior call to * restart(). * * @return The number of handlers that were executed. * * @note Calling the run_one() function from a thread that is currently * calling one of run(), run_one(), run_for(), run_until(), poll() or * poll_one() on the same io_context object may introduce the potential for * deadlock. It is the caller's reponsibility to avoid this. */ ASIO_DECL count_type run_one(asio::error_code& ec); #endif // !defined(ASIO_NO_DEPRECATED) #if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) /// Run the io_context object's event processing loop for a specified duration /// to execute at most one handler. /** * The run_one_for() function blocks until one handler has been dispatched, * until the io_context has been stopped, or until the specified duration has * elapsed. * * @param rel_time The duration for which the call may block. * * @return The number of handlers that were executed. */ template std::size_t run_one_for(const chrono::duration& rel_time); /// Run the io_context object's event processing loop until a specified time /// to execute at most one handler. /** * The run_one_until() function blocks until one handler has been dispatched, * until the io_context has been stopped, or until the specified time has * been reached. * * @param abs_time The time point until which the call may block. * * @return The number of handlers that were executed. */ template std::size_t run_one_until( const chrono::time_point& abs_time); #endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) /// Run the io_context object's event processing loop to execute ready /// handlers. /** * The poll() function runs handlers that are ready to run, without blocking, * until the io_context has been stopped or there are no more ready handlers. * * @return The number of handlers that were executed. */ ASIO_DECL count_type poll(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overload.) Run the io_context object's /// event processing loop to execute ready handlers. /** * The poll() function runs handlers that are ready to run, without blocking, * until the io_context has been stopped or there are no more ready handlers. * * @param ec Set to indicate what error occurred, if any. * * @return The number of handlers that were executed. */ ASIO_DECL count_type poll(asio::error_code& ec); #endif // !defined(ASIO_NO_DEPRECATED) /// Run the io_context object's event processing loop to execute one ready /// handler. /** * The poll_one() function runs at most one handler that is ready to run, * without blocking. * * @return The number of handlers that were executed. */ ASIO_DECL count_type poll_one(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use non-error_code overload.) Run the io_context object's /// event processing loop to execute one ready handler. /** * The poll_one() function runs at most one handler that is ready to run, * without blocking. * * @param ec Set to indicate what error occurred, if any. * * @return The number of handlers that were executed. */ ASIO_DECL count_type poll_one(asio::error_code& ec); #endif // !defined(ASIO_NO_DEPRECATED) /// Stop the io_context object's event processing loop. /** * This function does not block, but instead simply signals the io_context to * stop. All invocations of its run() or run_one() member functions should * return as soon as possible. Subsequent calls to run(), run_one(), poll() * or poll_one() will return immediately until restart() is called. */ ASIO_DECL void stop(); /// Determine whether the io_context object has been stopped. /** * This function is used to determine whether an io_context object has been * stopped, either through an explicit call to stop(), or due to running out * of work. When an io_context object is stopped, calls to run(), run_one(), * poll() or poll_one() will return immediately without invoking any * handlers. * * @return @c true if the io_context object is stopped, otherwise @c false. */ ASIO_DECL bool stopped() const; /// Restart the io_context in preparation for a subsequent run() invocation. /** * This function must be called prior to any second or later set of * invocations of the run(), run_one(), poll() or poll_one() functions when a * previous invocation of these functions returned due to the io_context * being stopped or running out of work. After a call to restart(), the * io_context object's stopped() function will return @c false. * * This function must not be called while there are any unfinished calls to * the run(), run_one(), poll() or poll_one() functions. */ ASIO_DECL void restart(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use restart().) Reset the io_context in preparation for a /// subsequent run() invocation. /** * This function must be called prior to any second or later set of * invocations of the run(), run_one(), poll() or poll_one() functions when a * previous invocation of these functions returned due to the io_context * being stopped or running out of work. After a call to restart(), the * io_context object's stopped() function will return @c false. * * This function must not be called while there are any unfinished calls to * the run(), run_one(), poll() or poll_one() functions. */ void reset(); /// (Deprecated: Use asio::dispatch().) Request the io_context to /// invoke the given handler. /** * This function is used to ask the io_context to execute the given handler. * * The io_context guarantees that the handler will only be called in a thread * in which the run(), run_one(), poll() or poll_one() member functions is * currently being invoked. The handler may be executed inside this function * if the guarantee can be met. * * @param handler The handler to be called. The io_context will make * a copy of the handler object as required. The function signature of the * handler must be: @code void handler(); @endcode * * @note This function throws an exception only if: * * @li the handler's @c asio_handler_allocate function; or * * @li the handler's copy constructor * * throws an exception. */ template ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler); /// (Deprecated: Use asio::post().) Request the io_context to invoke /// the given handler and return immediately. /** * This function is used to ask the io_context to execute the given handler, * but without allowing the io_context to call the handler from inside this * function. * * The io_context guarantees that the handler will only be called in a thread * in which the run(), run_one(), poll() or poll_one() member functions is * currently being invoked. * * @param handler The handler to be called. The io_context will make * a copy of the handler object as required. The function signature of the * handler must be: @code void handler(); @endcode * * @note This function throws an exception only if: * * @li the handler's @c asio_handler_allocate function; or * * @li the handler's copy constructor * * throws an exception. */ template ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler); /// (Deprecated: Use asio::bind_executor().) Create a new handler that /// automatically dispatches the wrapped handler on the io_context. /** * This function is used to create a new handler function object that, when * invoked, will automatically pass the wrapped handler to the io_context * object's dispatch function. * * @param handler The handler to be wrapped. The io_context will make a copy * of the handler object as required. The function signature of the handler * must be: @code void handler(A1 a1, ... An an); @endcode * * @return A function object that, when invoked, passes the wrapped handler to * the io_context object's dispatch function. Given a function object with the * signature: * @code R f(A1 a1, ... An an); @endcode * If this function object is passed to the wrap function like so: * @code io_context.wrap(f); @endcode * then the return value is a function object with the signature * @code void g(A1 a1, ... An an); @endcode * that, when invoked, executes code equivalent to: * @code io_context.dispatch(boost::bind(f, a1, ... an)); @endcode */ template #if defined(GENERATING_DOCUMENTATION) unspecified #else detail::wrapped_handler #endif wrap(Handler handler); #endif // !defined(ASIO_NO_DEPRECATED) private: // Helper function to add the implementation. ASIO_DECL impl_type& add_impl(impl_type* impl); // Backwards compatible overload for use with services derived from // io_context::service. template friend Service& use_service(io_context& ioc); #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) detail::winsock_init<> init_; #elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \ || defined(__osf__) detail::signal_init<> init_; #endif // The implementation. impl_type& impl_; }; /// Executor used to submit functions to an io_context. class io_context::executor_type { public: /// Obtain the underlying execution context. io_context& context() const ASIO_NOEXCEPT; /// Inform the io_context that it has some outstanding work to do. /** * This function is used to inform the io_context that some work has begun. * This ensures that the io_context's run() and run_one() functions do not * exit while the work is underway. */ void on_work_started() const ASIO_NOEXCEPT; /// Inform the io_context that some work is no longer outstanding. /** * This function is used to inform the io_context that some work has * finished. Once the count of unfinished work reaches zero, the io_context * is stopped and the run() and run_one() functions may exit. */ void on_work_finished() const ASIO_NOEXCEPT; /// Request the io_context to invoke the given function object. /** * This function is used to ask the io_context to execute the given function * object. If the current thread is running the io_context, @c dispatch() * executes the function before returning. Otherwise, the function will be * scheduled to run on the io_context. * * @param f The function object to be called. The executor will make a copy * of the handler object as required. The function signature of the function * object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the io_context to invoke the given function object. /** * This function is used to ask the io_context to execute the given function * object. The function object will never be executed inside @c post(). * Instead, it will be scheduled to run on the io_context. * * @param f The function object to be called. The executor will make a copy * of the handler object as required. The function signature of the function * object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the io_context to invoke the given function object. /** * This function is used to ask the io_context to execute the given function * object. The function object will never be executed inside @c defer(). * Instead, it will be scheduled to run on the io_context. * * If the current thread belongs to the io_context, @c defer() will delay * scheduling the function object until the current thread returns control to * the pool. * * @param f The function object to be called. The executor will make a copy * of the handler object as required. The function signature of the function * object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Determine whether the io_context is running in the current thread. /** * @return @c true if the current thread is running the io_context. Otherwise * returns @c false. */ bool running_in_this_thread() const ASIO_NOEXCEPT; /// Compare two executors for equality. /** * Two executors are equal if they refer to the same underlying io_context. */ friend bool operator==(const executor_type& a, const executor_type& b) ASIO_NOEXCEPT { return &a.io_context_ == &b.io_context_; } /// Compare two executors for inequality. /** * Two executors are equal if they refer to the same underlying io_context. */ friend bool operator!=(const executor_type& a, const executor_type& b) ASIO_NOEXCEPT { return &a.io_context_ != &b.io_context_; } private: friend class io_context; // Constructor. explicit executor_type(io_context& i) : io_context_(i) {} // The underlying io_context. io_context& io_context_; }; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use executor_work_guard.) Class to inform the io_context when /// it has work to do. /** * The work class is used to inform the io_context when work starts and * finishes. This ensures that the io_context object's run() function will not * exit while work is underway, and that it does exit when there is no * unfinished work remaining. * * The work class is copy-constructible so that it may be used as a data member * in a handler class. It is not assignable. */ class io_context::work { public: /// Constructor notifies the io_context that work is starting. /** * The constructor is used to inform the io_context that some work has begun. * This ensures that the io_context object's run() function will not exit * while the work is underway. */ explicit work(asio::io_context& io_context); /// Copy constructor notifies the io_context that work is starting. /** * The constructor is used to inform the io_context that some work has begun. * This ensures that the io_context object's run() function will not exit * while the work is underway. */ work(const work& other); /// Destructor notifies the io_context that the work is complete. /** * The destructor is used to inform the io_context that some work has * finished. Once the count of unfinished work reaches zero, the io_context * object's run() function is permitted to exit. */ ~work(); /// Get the io_context associated with the work. asio::io_context& get_io_context(); /// (Deprecated: Use get_io_context().) Get the io_context associated with the /// work. asio::io_context& get_io_service(); private: // Prevent assignment. void operator=(const work& other); // The io_context implementation. detail::io_context_impl& io_context_impl_; }; #endif // !defined(ASIO_NO_DEPRECATED) /// Base class for all io_context services. class io_context::service : public execution_context::service { public: /// Get the io_context object that owns the service. asio::io_context& get_io_context(); #if !defined(ASIO_NO_DEPRECATED) /// Get the io_context object that owns the service. asio::io_context& get_io_service(); #endif // !defined(ASIO_NO_DEPRECATED) private: /// Destroy all user-defined handler objects owned by the service. ASIO_DECL virtual void shutdown(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use shutdown().) Destroy all user-defined handler objects /// owned by the service. ASIO_DECL virtual void shutdown_service(); #endif // !defined(ASIO_NO_DEPRECATED) /// Handle notification of a fork-related event to perform any necessary /// housekeeping. /** * This function is not a pure virtual so that services only have to * implement it if necessary. The default implementation does nothing. */ ASIO_DECL virtual void notify_fork( execution_context::fork_event event); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use notify_fork().) Handle notification of a fork-related /// event to perform any necessary housekeeping. /** * This function is not a pure virtual so that services only have to * implement it if necessary. The default implementation does nothing. */ ASIO_DECL virtual void fork_service( execution_context::fork_event event); #endif // !defined(ASIO_NO_DEPRECATED) protected: /// Constructor. /** * @param owner The io_context object that owns the service. */ ASIO_DECL service(asio::io_context& owner); /// Destructor. ASIO_DECL virtual ~service(); }; namespace detail { // Special service base class to keep classes header-file only. template class service_base : public asio::io_context::service { public: static asio::detail::service_id id; // Constructor. service_base(asio::io_context& io_context) : asio::io_context::service(io_context) { } }; template asio::detail::service_id service_base::id; } // namespace detail } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/io_context.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/io_context.ipp" #endif // defined(ASIO_HEADER_ONLY) // If both io_context.hpp and strand.hpp have been included, automatically // include the header file needed for the io_context::strand class. #if !defined(ASIO_NO_EXTENSIONS) # if defined(ASIO_STRAND_HPP) # include "asio/io_context_strand.hpp" # endif // defined(ASIO_STRAND_HPP) #endif // !defined(ASIO_NO_EXTENSIONS) #endif // ASIO_IO_CONTEXT_HPP asio-1.12.2/include/asio/io_context_strand.hpp000066400000000000000000000324641340672067200213650ustar00rootroot00000000000000// // io_context_strand.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IO_CONTEXT_STRAND_HPP #define ASIO_IO_CONTEXT_STRAND_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_NO_EXTENSIONS) #include "asio/async_result.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/strand_service.hpp" #include "asio/detail/wrapped_handler.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Provides serialised handler execution. /** * The io_context::strand class provides the ability to post and dispatch * handlers with the guarantee that none of those handlers will execute * concurrently. * * @par Order of handler invocation * Given: * * @li a strand object @c s * * @li an object @c a meeting completion handler requirements * * @li an object @c a1 which is an arbitrary copy of @c a made by the * implementation * * @li an object @c b meeting completion handler requirements * * @li an object @c b1 which is an arbitrary copy of @c b made by the * implementation * * if any of the following conditions are true: * * @li @c s.post(a) happens-before @c s.post(b) * * @li @c s.post(a) happens-before @c s.dispatch(b), where the latter is * performed outside the strand * * @li @c s.dispatch(a) happens-before @c s.post(b), where the former is * performed outside the strand * * @li @c s.dispatch(a) happens-before @c s.dispatch(b), where both are * performed outside the strand * * then @c asio_handler_invoke(a1, &a1) happens-before * @c asio_handler_invoke(b1, &b1). * * Note that in the following case: * @code async_op_1(..., s.wrap(a)); * async_op_2(..., s.wrap(b)); @endcode * the completion of the first async operation will perform @c s.dispatch(a), * and the second will perform @c s.dispatch(b), but the order in which those * are performed is unspecified. That is, you cannot state whether one * happens-before the other. Therefore none of the above conditions are met and * no ordering guarantee is made. * * @note The implementation makes no guarantee that handlers posted or * dispatched through different @c strand objects will be invoked concurrently. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Dispatcher. */ class io_context::strand { public: /// Constructor. /** * Constructs the strand. * * @param io_context The io_context object that the strand will use to * dispatch handlers that are ready to be run. */ explicit strand(asio::io_context& io_context) : service_(asio::use_service< asio::detail::strand_service>(io_context)) { service_.construct(impl_); } /// Destructor. /** * Destroys a strand. * * Handlers posted through the strand that have not yet been invoked will * still be dispatched in a way that meets the guarantee of non-concurrency. */ ~strand() { } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use context().) Get the io_context associated with the /// strand. /** * This function may be used to obtain the io_context object that the strand * uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the strand will use to * dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return service_.get_io_context(); } /// (Deprecated: Use context().) Get the io_context associated with the /// strand. /** * This function may be used to obtain the io_context object that the strand * uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the strand will use to * dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return service_.get_io_context(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Obtain the underlying execution context. asio::io_context& context() const ASIO_NOEXCEPT { return service_.get_io_context(); } /// Inform the strand that it has some outstanding work to do. /** * The strand delegates this call to its underlying io_context. */ void on_work_started() const ASIO_NOEXCEPT { context().get_executor().on_work_started(); } /// Inform the strand that some work is no longer outstanding. /** * The strand delegates this call to its underlying io_context. */ void on_work_finished() const ASIO_NOEXCEPT { context().get_executor().on_work_finished(); } /// Request the strand to invoke the given function object. /** * This function is used to ask the strand to execute the given function * object on its underlying io_context. The function object will be executed * inside this function if the strand is not otherwise busy and if the * underlying io_context's executor's @c dispatch() function is also able to * execute the function before returning. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); service_.dispatch(impl_, tmp); (void)a; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use asio::dispatch().) Request the strand to invoke /// the given handler. /** * This function is used to ask the strand to execute the given handler. * * The strand object guarantees that handlers posted or dispatched through * the strand will not be executed concurrently. The handler may be executed * inside this function if the guarantee can be met. If this function is * called from within a handler that was posted or dispatched through the same * strand, then the new handler will be executed immediately. * * The strand's guarantee is in addition to the guarantee provided by the * underlying io_context. The io_context guarantees that the handler will only * be called in a thread in which the io_context's run member function is * currently being invoked. * * @param handler The handler to be called. The strand will make a copy of the * handler object as required. The function signature of the handler must be: * @code void handler(); @endcode */ template ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a LegacyCompletionHandler. ASIO_LEGACY_COMPLETION_HANDLER_CHECK( LegacyCompletionHandler, handler) type_check; async_completion init(handler); service_.dispatch(impl_, init.completion_handler); return init.result.get(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Request the strand to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will never be executed inside this function. * Instead, it will be scheduled to run by the underlying io_context. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); service_.post(impl_, tmp); (void)a; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use asio::post().) Request the strand to invoke the /// given handler and return immediately. /** * This function is used to ask the strand to execute the given handler, but * without allowing the strand to call the handler from inside this function. * * The strand object guarantees that handlers posted or dispatched through * the strand will not be executed concurrently. The strand's guarantee is in * addition to the guarantee provided by the underlying io_context. The * io_context guarantees that the handler will only be called in a thread in * which the io_context's run member function is currently being invoked. * * @param handler The handler to be called. The strand will make a copy of the * handler object as required. The function signature of the handler must be: * @code void handler(); @endcode */ template ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a LegacyCompletionHandler. ASIO_LEGACY_COMPLETION_HANDLER_CHECK( LegacyCompletionHandler, handler) type_check; async_completion init(handler); service_.post(impl_, init.completion_handler); return init.result.get(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Request the strand to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will never be executed inside this function. * Instead, it will be scheduled to run by the underlying io_context. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); service_.post(impl_, tmp); (void)a; } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use asio::bind_executor().) Create a new handler that /// automatically dispatches the wrapped handler on the strand. /** * This function is used to create a new handler function object that, when * invoked, will automatically pass the wrapped handler to the strand's * dispatch function. * * @param handler The handler to be wrapped. The strand will make a copy of * the handler object as required. The function signature of the handler must * be: @code void handler(A1 a1, ... An an); @endcode * * @return A function object that, when invoked, passes the wrapped handler to * the strand's dispatch function. Given a function object with the signature: * @code R f(A1 a1, ... An an); @endcode * If this function object is passed to the wrap function like so: * @code strand.wrap(f); @endcode * then the return value is a function object with the signature * @code void g(A1 a1, ... An an); @endcode * that, when invoked, executes code equivalent to: * @code strand.dispatch(boost::bind(f, a1, ... an)); @endcode */ template #if defined(GENERATING_DOCUMENTATION) unspecified #else detail::wrapped_handler #endif wrap(Handler handler) { return detail::wrapped_handler(*this, handler); } #endif // !defined(ASIO_NO_DEPRECATED) /// Determine whether the strand is running in the current thread. /** * @return @c true if the current thread is executing a handler that was * submitted to the strand using post(), dispatch() or wrap(). Otherwise * returns @c false. */ bool running_in_this_thread() const ASIO_NOEXCEPT { return service_.running_in_this_thread(impl_); } /// Compare two strands for equality. /** * Two strands are equal if they refer to the same ordered, non-concurrent * state. */ friend bool operator==(const strand& a, const strand& b) ASIO_NOEXCEPT { return a.impl_ == b.impl_; } /// Compare two strands for inequality. /** * Two strands are equal if they refer to the same ordered, non-concurrent * state. */ friend bool operator!=(const strand& a, const strand& b) ASIO_NOEXCEPT { return a.impl_ != b.impl_; } private: asio::detail::strand_service& service_; mutable asio::detail::strand_service::implementation_type impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_EXTENSIONS) #endif // ASIO_IO_CONTEXT_STRAND_HPP asio-1.12.2/include/asio/io_service.hpp000066400000000000000000000014061340672067200177560ustar00rootroot00000000000000// // io_service.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IO_SERVICE_HPP #define ASIO_IO_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { #if !defined(ASIO_NO_DEPRECATED) /// Typedef for backwards compatibility. typedef io_context io_service; #endif // !defined(ASIO_NO_DEPRECATED) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IO_SERVICE_HPP asio-1.12.2/include/asio/io_service_strand.hpp000066400000000000000000000010471340672067200213320ustar00rootroot00000000000000// // io_service_strand.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IO_SERVICE_STRAND_HPP #define ASIO_IO_SERVICE_STRAND_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/io_context_strand.hpp" #endif // ASIO_IO_SERVICE_STRAND_HPP asio-1.12.2/include/asio/ip/000077500000000000000000000000001340672067200155255ustar00rootroot00000000000000asio-1.12.2/include/asio/ip/address.hpp000066400000000000000000000162331340672067200176700ustar00rootroot00000000000000// // ip/address.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_HPP #define ASIO_IP_ADDRESS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/throw_exception.hpp" #include "asio/detail/string_view.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error_code.hpp" #include "asio/ip/address_v4.hpp" #include "asio/ip/address_v6.hpp" #include "asio/ip/bad_address_cast.hpp" #if !defined(ASIO_NO_IOSTREAM) # include #endif // !defined(ASIO_NO_IOSTREAM) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Implements version-independent IP addresses. /** * The asio::ip::address class provides the ability to use either IP * version 4 or version 6 addresses. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class address { public: /// Default constructor. ASIO_DECL address(); /// Construct an address from an IPv4 address. ASIO_DECL address(const asio::ip::address_v4& ipv4_address); /// Construct an address from an IPv6 address. ASIO_DECL address(const asio::ip::address_v6& ipv6_address); /// Copy constructor. ASIO_DECL address(const address& other); #if defined(ASIO_HAS_MOVE) /// Move constructor. ASIO_DECL address(address&& other); #endif // defined(ASIO_HAS_MOVE) /// Assign from another address. ASIO_DECL address& operator=(const address& other); #if defined(ASIO_HAS_MOVE) /// Move-assign from another address. ASIO_DECL address& operator=(address&& other); #endif // defined(ASIO_HAS_MOVE) /// Assign from an IPv4 address. ASIO_DECL address& operator=( const asio::ip::address_v4& ipv4_address); /// Assign from an IPv6 address. ASIO_DECL address& operator=( const asio::ip::address_v6& ipv6_address); /// Get whether the address is an IP version 4 address. bool is_v4() const { return type_ == ipv4; } /// Get whether the address is an IP version 6 address. bool is_v6() const { return type_ == ipv6; } /// Get the address as an IP version 4 address. ASIO_DECL asio::ip::address_v4 to_v4() const; /// Get the address as an IP version 6 address. ASIO_DECL asio::ip::address_v6 to_v6() const; /// Get the address as a string. ASIO_DECL std::string to_string() const; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use other overload.) Get the address as a string. ASIO_DECL std::string to_string(asio::error_code& ec) const; /// (Deprecated: Use make_address().) Create an address from an IPv4 address /// string in dotted decimal form, or from an IPv6 address in hexadecimal /// notation. static address from_string(const char* str); /// (Deprecated: Use make_address().) Create an address from an IPv4 address /// string in dotted decimal form, or from an IPv6 address in hexadecimal /// notation. static address from_string(const char* str, asio::error_code& ec); /// (Deprecated: Use make_address().) Create an address from an IPv4 address /// string in dotted decimal form, or from an IPv6 address in hexadecimal /// notation. static address from_string(const std::string& str); /// (Deprecated: Use make_address().) Create an address from an IPv4 address /// string in dotted decimal form, or from an IPv6 address in hexadecimal /// notation. static address from_string( const std::string& str, asio::error_code& ec); #endif // !defined(ASIO_NO_DEPRECATED) /// Determine whether the address is a loopback address. ASIO_DECL bool is_loopback() const; /// Determine whether the address is unspecified. ASIO_DECL bool is_unspecified() const; /// Determine whether the address is a multicast address. ASIO_DECL bool is_multicast() const; /// Compare two addresses for equality. ASIO_DECL friend bool operator==(const address& a1, const address& a2); /// Compare two addresses for inequality. friend bool operator!=(const address& a1, const address& a2) { return !(a1 == a2); } /// Compare addresses for ordering. ASIO_DECL friend bool operator<(const address& a1, const address& a2); /// Compare addresses for ordering. friend bool operator>(const address& a1, const address& a2) { return a2 < a1; } /// Compare addresses for ordering. friend bool operator<=(const address& a1, const address& a2) { return !(a2 < a1); } /// Compare addresses for ordering. friend bool operator>=(const address& a1, const address& a2) { return !(a1 < a2); } private: // The type of the address. enum { ipv4, ipv6 } type_; // The underlying IPv4 address. asio::ip::address_v4 ipv4_address_; // The underlying IPv6 address. asio::ip::address_v6 ipv6_address_; }; /// Create an address from an IPv4 address string in dotted decimal form, /// or from an IPv6 address in hexadecimal notation. /** * @relates address */ ASIO_DECL address make_address(const char* str); /// Create an address from an IPv4 address string in dotted decimal form, /// or from an IPv6 address in hexadecimal notation. /** * @relates address */ ASIO_DECL address make_address( const char* str, asio::error_code& ec); /// Create an address from an IPv4 address string in dotted decimal form, /// or from an IPv6 address in hexadecimal notation. /** * @relates address */ ASIO_DECL address make_address(const std::string& str); /// Create an address from an IPv4 address string in dotted decimal form, /// or from an IPv6 address in hexadecimal notation. /** * @relates address */ ASIO_DECL address make_address( const std::string& str, asio::error_code& ec); #if defined(ASIO_HAS_STRING_VIEW) \ || defined(GENERATING_DOCUMENTATION) /// Create an address from an IPv4 address string in dotted decimal form, /// or from an IPv6 address in hexadecimal notation. /** * @relates address */ ASIO_DECL address make_address(string_view str); /// Create an address from an IPv4 address string in dotted decimal form, /// or from an IPv6 address in hexadecimal notation. /** * @relates address */ ASIO_DECL address make_address( string_view str, asio::error_code& ec); #endif // defined(ASIO_HAS_STRING_VIEW) // || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_IOSTREAM) /// Output an address as a string. /** * Used to output a human-readable string for a specified address. * * @param os The output stream to which the string will be written. * * @param addr The address to be written. * * @return The output stream. * * @relates asio::ip::address */ template std::basic_ostream& operator<<( std::basic_ostream& os, const address& addr); #endif // !defined(ASIO_NO_IOSTREAM) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ip/impl/address.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/impl/address.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_ADDRESS_HPP asio-1.12.2/include/asio/ip/address_v4.hpp000066400000000000000000000217201340672067200202760ustar00rootroot00000000000000// // ip/address_v4.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_V4_HPP #define ASIO_IP_ADDRESS_V4_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/array.hpp" #include "asio/detail/cstdint.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/string_view.hpp" #include "asio/detail/winsock_init.hpp" #include "asio/error_code.hpp" #if !defined(ASIO_NO_IOSTREAM) # include #endif // !defined(ASIO_NO_IOSTREAM) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Implements IP version 4 style addresses. /** * The asio::ip::address_v4 class provides the ability to use and * manipulate IP version 4 addresses. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class address_v4 { public: /// The type used to represent an address as an unsigned integer. typedef uint_least32_t uint_type; /// The type used to represent an address as an array of bytes. /** * @note This type is defined in terms of the C++0x template @c std::array * when it is available. Otherwise, it uses @c boost:array. */ #if defined(GENERATING_DOCUMENTATION) typedef array bytes_type; #else typedef asio::detail::array bytes_type; #endif /// Default constructor. address_v4() { addr_.s_addr = 0; } /// Construct an address from raw bytes. ASIO_DECL explicit address_v4(const bytes_type& bytes); /// Construct an address from an unsigned integer in host byte order. ASIO_DECL explicit address_v4(uint_type addr); /// Copy constructor. address_v4(const address_v4& other) : addr_(other.addr_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. address_v4(address_v4&& other) : addr_(other.addr_) { } #endif // defined(ASIO_HAS_MOVE) /// Assign from another address. address_v4& operator=(const address_v4& other) { addr_ = other.addr_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move-assign from another address. address_v4& operator=(address_v4&& other) { addr_ = other.addr_; return *this; } #endif // defined(ASIO_HAS_MOVE) /// Get the address in bytes, in network byte order. ASIO_DECL bytes_type to_bytes() const; /// Get the address as an unsigned integer in host byte order ASIO_DECL uint_type to_uint() const; #if !defined(ASIO_NO_DEPRECATED) /// Get the address as an unsigned long in host byte order ASIO_DECL unsigned long to_ulong() const; #endif // !defined(ASIO_NO_DEPRECATED) /// Get the address as a string in dotted decimal format. ASIO_DECL std::string to_string() const; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use other overload.) Get the address as a string in dotted /// decimal format. ASIO_DECL std::string to_string(asio::error_code& ec) const; /// (Deprecated: Use make_address_v4().) Create an address from an IP address /// string in dotted decimal form. static address_v4 from_string(const char* str); /// (Deprecated: Use make_address_v4().) Create an address from an IP address /// string in dotted decimal form. static address_v4 from_string( const char* str, asio::error_code& ec); /// (Deprecated: Use make_address_v4().) Create an address from an IP address /// string in dotted decimal form. static address_v4 from_string(const std::string& str); /// (Deprecated: Use make_address_v4().) Create an address from an IP address /// string in dotted decimal form. static address_v4 from_string( const std::string& str, asio::error_code& ec); #endif // !defined(ASIO_NO_DEPRECATED) /// Determine whether the address is a loopback address. ASIO_DECL bool is_loopback() const; /// Determine whether the address is unspecified. ASIO_DECL bool is_unspecified() const; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use network_v4 class.) Determine whether the address is a /// class A address. ASIO_DECL bool is_class_a() const; /// (Deprecated: Use network_v4 class.) Determine whether the address is a /// class B address. ASIO_DECL bool is_class_b() const; /// (Deprecated: Use network_v4 class.) Determine whether the address is a /// class C address. ASIO_DECL bool is_class_c() const; #endif // !defined(ASIO_NO_DEPRECATED) /// Determine whether the address is a multicast address. ASIO_DECL bool is_multicast() const; /// Compare two addresses for equality. friend bool operator==(const address_v4& a1, const address_v4& a2) { return a1.addr_.s_addr == a2.addr_.s_addr; } /// Compare two addresses for inequality. friend bool operator!=(const address_v4& a1, const address_v4& a2) { return a1.addr_.s_addr != a2.addr_.s_addr; } /// Compare addresses for ordering. friend bool operator<(const address_v4& a1, const address_v4& a2) { return a1.to_uint() < a2.to_uint(); } /// Compare addresses for ordering. friend bool operator>(const address_v4& a1, const address_v4& a2) { return a1.to_uint() > a2.to_uint(); } /// Compare addresses for ordering. friend bool operator<=(const address_v4& a1, const address_v4& a2) { return a1.to_uint() <= a2.to_uint(); } /// Compare addresses for ordering. friend bool operator>=(const address_v4& a1, const address_v4& a2) { return a1.to_uint() >= a2.to_uint(); } /// Obtain an address object that represents any address. static address_v4 any() { return address_v4(); } /// Obtain an address object that represents the loopback address. static address_v4 loopback() { return address_v4(0x7F000001); } /// Obtain an address object that represents the broadcast address. static address_v4 broadcast() { return address_v4(0xFFFFFFFF); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use network_v4 class.) Obtain an address object that /// represents the broadcast address that corresponds to the specified /// address and netmask. ASIO_DECL static address_v4 broadcast( const address_v4& addr, const address_v4& mask); /// (Deprecated: Use network_v4 class.) Obtain the netmask that corresponds /// to the address, based on its address class. ASIO_DECL static address_v4 netmask(const address_v4& addr); #endif // !defined(ASIO_NO_DEPRECATED) private: // The underlying IPv4 address. asio::detail::in4_addr_type addr_; }; /// Create an IPv4 address from raw bytes in network order. /** * @relates address_v4 */ inline address_v4 make_address_v4(const address_v4::bytes_type& bytes) { return address_v4(bytes); } /// Create an IPv4 address from an unsigned integer in host byte order. /** * @relates address_v4 */ inline address_v4 make_address_v4(address_v4::uint_type addr) { return address_v4(addr); } /// Create an IPv4 address from an IP address string in dotted decimal form. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4(const char* str); /// Create an IPv4 address from an IP address string in dotted decimal form. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4( const char* str, asio::error_code& ec); /// Create an IPv4 address from an IP address string in dotted decimal form. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4(const std::string& str); /// Create an IPv4 address from an IP address string in dotted decimal form. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4( const std::string& str, asio::error_code& ec); #if defined(ASIO_HAS_STRING_VIEW) \ || defined(GENERATING_DOCUMENTATION) /// Create an IPv4 address from an IP address string in dotted decimal form. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4(string_view str); /// Create an IPv4 address from an IP address string in dotted decimal form. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4( string_view str, asio::error_code& ec); #endif // defined(ASIO_HAS_STRING_VIEW) // || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_IOSTREAM) /// Output an address as a string. /** * Used to output a human-readable string for a specified address. * * @param os The output stream to which the string will be written. * * @param addr The address to be written. * * @return The output stream. * * @relates asio::ip::address_v4 */ template std::basic_ostream& operator<<( std::basic_ostream& os, const address_v4& addr); #endif // !defined(ASIO_NO_IOSTREAM) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ip/impl/address_v4.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/impl/address_v4.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_ADDRESS_V4_HPP asio-1.12.2/include/asio/ip/address_v4_iterator.hpp000066400000000000000000000077631340672067200222220ustar00rootroot00000000000000// // ip/address_v4_iterator.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_V4_ITERATOR_HPP #define ASIO_IP_ADDRESS_V4_ITERATOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ip/address_v4.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template class basic_address_iterator; /// An input iterator that can be used for traversing IPv4 addresses. /** * In addition to satisfying the input iterator requirements, this iterator * also supports decrement. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template <> class basic_address_iterator { public: /// The type of the elements pointed to by the iterator. typedef address_v4 value_type; /// Distance between two iterators. typedef std::ptrdiff_t difference_type; /// The type of a pointer to an element pointed to by the iterator. typedef const address_v4* pointer; /// The type of a reference to an element pointed to by the iterator. typedef const address_v4& reference; /// Denotes that the iterator satisfies the input iterator requirements. typedef std::input_iterator_tag iterator_category; /// Construct an iterator that points to the specified address. basic_address_iterator(const address_v4& addr) ASIO_NOEXCEPT : address_(addr) { } /// Copy constructor. basic_address_iterator( const basic_address_iterator& other) ASIO_NOEXCEPT : address_(other.address_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT : address_(ASIO_MOVE_CAST(address_v4)(other.address_)) { } #endif // defined(ASIO_HAS_MOVE) /// Assignment operator. basic_address_iterator& operator=( const basic_address_iterator& other) ASIO_NOEXCEPT { address_ = other.address_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move assignment operator. basic_address_iterator& operator=( basic_address_iterator&& other) ASIO_NOEXCEPT { address_ = ASIO_MOVE_CAST(address_v4)(other.address_); return *this; } #endif // defined(ASIO_HAS_MOVE) /// Dereference the iterator. const address_v4& operator*() const ASIO_NOEXCEPT { return address_; } /// Dereference the iterator. const address_v4* operator->() const ASIO_NOEXCEPT { return &address_; } /// Pre-increment operator. basic_address_iterator& operator++() ASIO_NOEXCEPT { address_ = address_v4((address_.to_uint() + 1) & 0xFFFFFFFF); return *this; } /// Post-increment operator. basic_address_iterator operator++(int) ASIO_NOEXCEPT { basic_address_iterator tmp(*this); ++*this; return tmp; } /// Pre-decrement operator. basic_address_iterator& operator--() ASIO_NOEXCEPT { address_ = address_v4((address_.to_uint() - 1) & 0xFFFFFFFF); return *this; } /// Post-decrement operator. basic_address_iterator operator--(int) { basic_address_iterator tmp(*this); --*this; return tmp; } /// Compare two addresses for equality. friend bool operator==(const basic_address_iterator& a, const basic_address_iterator& b) { return a.address_ == b.address_; } /// Compare two addresses for inequality. friend bool operator!=(const basic_address_iterator& a, const basic_address_iterator& b) { return a.address_ != b.address_; } private: address_v4 address_; }; /// An input iterator that can be used for traversing IPv4 addresses. typedef basic_address_iterator address_v4_iterator; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_ADDRESS_V4_ITERATOR_HPP asio-1.12.2/include/asio/ip/address_v4_range.hpp000066400000000000000000000061751340672067200214610ustar00rootroot00000000000000// // ip/address_v4_range.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_V4_RANGE_HPP #define ASIO_IP_ADDRESS_V4_RANGE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ip/address_v4_iterator.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template class basic_address_range; /// Represents a range of IPv4 addresses. /** * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template <> class basic_address_range { public: /// The type of an iterator that points into the range. typedef basic_address_iterator iterator; /// Construct an empty range. basic_address_range() ASIO_NOEXCEPT : begin_(address_v4()), end_(address_v4()) { } /// Construct an range that represents the given range of addresses. explicit basic_address_range(const iterator& first, const iterator& last) ASIO_NOEXCEPT : begin_(first), end_(last) { } /// Copy constructor. basic_address_range(const basic_address_range& other) ASIO_NOEXCEPT : begin_(other.begin_), end_(other.end_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. basic_address_range(basic_address_range&& other) ASIO_NOEXCEPT : begin_(ASIO_MOVE_CAST(iterator)(other.begin_)), end_(ASIO_MOVE_CAST(iterator)(other.end_)) { } #endif // defined(ASIO_HAS_MOVE) /// Assignment operator. basic_address_range& operator=( const basic_address_range& other) ASIO_NOEXCEPT { begin_ = other.begin_; end_ = other.end_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move assignment operator. basic_address_range& operator=( basic_address_range&& other) ASIO_NOEXCEPT { begin_ = ASIO_MOVE_CAST(iterator)(other.begin_); end_ = ASIO_MOVE_CAST(iterator)(other.end_); return *this; } #endif // defined(ASIO_HAS_MOVE) /// Obtain an iterator that points to the start of the range. iterator begin() const ASIO_NOEXCEPT { return begin_; } /// Obtain an iterator that points to the end of the range. iterator end() const ASIO_NOEXCEPT { return end_; } /// Determine whether the range is empty. bool empty() const ASIO_NOEXCEPT { return size() == 0; } /// Return the size of the range. std::size_t size() const ASIO_NOEXCEPT { return end_->to_uint() - begin_->to_uint(); } /// Find an address in the range. iterator find(const address_v4& addr) const ASIO_NOEXCEPT { return addr >= *begin_ && addr < *end_ ? iterator(addr) : end_; } private: iterator begin_; iterator end_; }; /// Represents a range of IPv4 addresses. typedef basic_address_range address_v4_range; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_ADDRESS_V4_RANGE_HPP asio-1.12.2/include/asio/ip/address_v6.hpp000066400000000000000000000223121340672067200202760ustar00rootroot00000000000000// // ip/address_v6.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_V6_HPP #define ASIO_IP_ADDRESS_V6_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/array.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/string_view.hpp" #include "asio/detail/winsock_init.hpp" #include "asio/error_code.hpp" #include "asio/ip/address_v4.hpp" #if !defined(ASIO_NO_IOSTREAM) # include #endif // !defined(ASIO_NO_IOSTREAM) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template class basic_address_iterator; /// Implements IP version 6 style addresses. /** * The asio::ip::address_v6 class provides the ability to use and * manipulate IP version 6 addresses. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class address_v6 { public: /// The type used to represent an address as an array of bytes. /** * @note This type is defined in terms of the C++0x template @c std::array * when it is available. Otherwise, it uses @c boost:array. */ #if defined(GENERATING_DOCUMENTATION) typedef array bytes_type; #else typedef asio::detail::array bytes_type; #endif /// Default constructor. ASIO_DECL address_v6(); /// Construct an address from raw bytes and scope ID. ASIO_DECL explicit address_v6(const bytes_type& bytes, unsigned long scope_id = 0); /// Copy constructor. ASIO_DECL address_v6(const address_v6& other); #if defined(ASIO_HAS_MOVE) /// Move constructor. ASIO_DECL address_v6(address_v6&& other); #endif // defined(ASIO_HAS_MOVE) /// Assign from another address. ASIO_DECL address_v6& operator=(const address_v6& other); #if defined(ASIO_HAS_MOVE) /// Move-assign from another address. ASIO_DECL address_v6& operator=(address_v6&& other); #endif // defined(ASIO_HAS_MOVE) /// The scope ID of the address. /** * Returns the scope ID associated with the IPv6 address. */ unsigned long scope_id() const { return scope_id_; } /// The scope ID of the address. /** * Modifies the scope ID associated with the IPv6 address. */ void scope_id(unsigned long id) { scope_id_ = id; } /// Get the address in bytes, in network byte order. ASIO_DECL bytes_type to_bytes() const; /// Get the address as a string. ASIO_DECL std::string to_string() const; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use other overload.) Get the address as a string. ASIO_DECL std::string to_string(asio::error_code& ec) const; /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP /// address string. static address_v6 from_string(const char* str); /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP /// address string. static address_v6 from_string( const char* str, asio::error_code& ec); /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP /// address string. static address_v6 from_string(const std::string& str); /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP /// address string. static address_v6 from_string( const std::string& str, asio::error_code& ec); /// (Deprecated: Use make_address_v4().) Converts an IPv4-mapped or /// IPv4-compatible address to an IPv4 address. ASIO_DECL address_v4 to_v4() const; #endif // !defined(ASIO_NO_DEPRECATED) /// Determine whether the address is a loopback address. ASIO_DECL bool is_loopback() const; /// Determine whether the address is unspecified. ASIO_DECL bool is_unspecified() const; /// Determine whether the address is link local. ASIO_DECL bool is_link_local() const; /// Determine whether the address is site local. ASIO_DECL bool is_site_local() const; /// Determine whether the address is a mapped IPv4 address. ASIO_DECL bool is_v4_mapped() const; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: No replacement.) Determine whether the address is an /// IPv4-compatible address. ASIO_DECL bool is_v4_compatible() const; #endif // !defined(ASIO_NO_DEPRECATED) /// Determine whether the address is a multicast address. ASIO_DECL bool is_multicast() const; /// Determine whether the address is a global multicast address. ASIO_DECL bool is_multicast_global() const; /// Determine whether the address is a link-local multicast address. ASIO_DECL bool is_multicast_link_local() const; /// Determine whether the address is a node-local multicast address. ASIO_DECL bool is_multicast_node_local() const; /// Determine whether the address is a org-local multicast address. ASIO_DECL bool is_multicast_org_local() const; /// Determine whether the address is a site-local multicast address. ASIO_DECL bool is_multicast_site_local() const; /// Compare two addresses for equality. ASIO_DECL friend bool operator==( const address_v6& a1, const address_v6& a2); /// Compare two addresses for inequality. friend bool operator!=(const address_v6& a1, const address_v6& a2) { return !(a1 == a2); } /// Compare addresses for ordering. ASIO_DECL friend bool operator<( const address_v6& a1, const address_v6& a2); /// Compare addresses for ordering. friend bool operator>(const address_v6& a1, const address_v6& a2) { return a2 < a1; } /// Compare addresses for ordering. friend bool operator<=(const address_v6& a1, const address_v6& a2) { return !(a2 < a1); } /// Compare addresses for ordering. friend bool operator>=(const address_v6& a1, const address_v6& a2) { return !(a1 < a2); } /// Obtain an address object that represents any address. static address_v6 any() { return address_v6(); } /// Obtain an address object that represents the loopback address. ASIO_DECL static address_v6 loopback(); #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address. ASIO_DECL static address_v6 v4_mapped(const address_v4& addr); /// (Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. ASIO_DECL static address_v6 v4_compatible(const address_v4& addr); #endif // !defined(ASIO_NO_DEPRECATED) private: friend class basic_address_iterator; // The underlying IPv6 address. asio::detail::in6_addr_type addr_; // The scope ID associated with the address. unsigned long scope_id_; }; /// Create an IPv6 address from raw bytes and scope ID. /** * @relates address_v6 */ inline address_v6 make_address_v6(const address_v6::bytes_type& bytes, unsigned long scope_id = 0) { return address_v6(bytes, scope_id); } /// Create an IPv6 address from an IP address string. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6(const char* str); /// Create an IPv6 address from an IP address string. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6( const char* str, asio::error_code& ec); /// Createan IPv6 address from an IP address string. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6(const std::string& str); /// Create an IPv6 address from an IP address string. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6( const std::string& str, asio::error_code& ec); #if defined(ASIO_HAS_STRING_VIEW) \ || defined(GENERATING_DOCUMENTATION) /// Create an IPv6 address from an IP address string. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6(string_view str); /// Create an IPv6 address from an IP address string. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6( string_view str, asio::error_code& ec); #endif // defined(ASIO_HAS_STRING_VIEW) // || defined(GENERATING_DOCUMENTATION) /// Tag type used for distinguishing overloads that deal in IPv4-mapped IPv6 /// addresses. enum v4_mapped_t { v4_mapped }; /// Create an IPv4 address from a IPv4-mapped IPv6 address. /** * @relates address_v4 */ ASIO_DECL address_v4 make_address_v4( v4_mapped_t, const address_v6& v6_addr); /// Create an IPv4-mapped IPv6 address from an IPv4 address. /** * @relates address_v6 */ ASIO_DECL address_v6 make_address_v6( v4_mapped_t, const address_v4& v4_addr); #if !defined(ASIO_NO_IOSTREAM) /// Output an address as a string. /** * Used to output a human-readable string for a specified address. * * @param os The output stream to which the string will be written. * * @param addr The address to be written. * * @return The output stream. * * @relates asio::ip::address_v6 */ template std::basic_ostream& operator<<( std::basic_ostream& os, const address_v6& addr); #endif // !defined(ASIO_NO_IOSTREAM) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ip/impl/address_v6.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/impl/address_v6.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_ADDRESS_V6_HPP asio-1.12.2/include/asio/ip/address_v6_iterator.hpp000066400000000000000000000105111340672067200222050ustar00rootroot00000000000000// // ip/address_v6_iterator.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_V6_ITERATOR_HPP #define ASIO_IP_ADDRESS_V6_ITERATOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ip/address_v6.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template class basic_address_iterator; /// An input iterator that can be used for traversing IPv6 addresses. /** * In addition to satisfying the input iterator requirements, this iterator * also supports decrement. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template <> class basic_address_iterator { public: /// The type of the elements pointed to by the iterator. typedef address_v6 value_type; /// Distance between two iterators. typedef std::ptrdiff_t difference_type; /// The type of a pointer to an element pointed to by the iterator. typedef const address_v6* pointer; /// The type of a reference to an element pointed to by the iterator. typedef const address_v6& reference; /// Denotes that the iterator satisfies the input iterator requirements. typedef std::input_iterator_tag iterator_category; /// Construct an iterator that points to the specified address. basic_address_iterator(const address_v6& addr) ASIO_NOEXCEPT : address_(addr) { } /// Copy constructor. basic_address_iterator( const basic_address_iterator& other) ASIO_NOEXCEPT : address_(other.address_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT : address_(ASIO_MOVE_CAST(address_v6)(other.address_)) { } #endif // defined(ASIO_HAS_MOVE) /// Assignment operator. basic_address_iterator& operator=( const basic_address_iterator& other) ASIO_NOEXCEPT { address_ = other.address_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move assignment operator. basic_address_iterator& operator=( basic_address_iterator&& other) ASIO_NOEXCEPT { address_ = ASIO_MOVE_CAST(address_v6)(other.address_); return *this; } #endif // defined(ASIO_HAS_MOVE) /// Dereference the iterator. const address_v6& operator*() const ASIO_NOEXCEPT { return address_; } /// Dereference the iterator. const address_v6* operator->() const ASIO_NOEXCEPT { return &address_; } /// Pre-increment operator. basic_address_iterator& operator++() ASIO_NOEXCEPT { for (int i = 15; i >= 0; --i) { if (address_.addr_.s6_addr[i] < 0xFF) { ++address_.addr_.s6_addr[i]; break; } address_.addr_.s6_addr[i] = 0; } return *this; } /// Post-increment operator. basic_address_iterator operator++(int) ASIO_NOEXCEPT { basic_address_iterator tmp(*this); ++*this; return tmp; } /// Pre-decrement operator. basic_address_iterator& operator--() ASIO_NOEXCEPT { for (int i = 15; i >= 0; --i) { if (address_.addr_.s6_addr[i] > 0) { --address_.addr_.s6_addr[i]; break; } address_.addr_.s6_addr[i] = 0xFF; } return *this; } /// Post-decrement operator. basic_address_iterator operator--(int) { basic_address_iterator tmp(*this); --*this; return tmp; } /// Compare two addresses for equality. friend bool operator==(const basic_address_iterator& a, const basic_address_iterator& b) { return a.address_ == b.address_; } /// Compare two addresses for inequality. friend bool operator!=(const basic_address_iterator& a, const basic_address_iterator& b) { return a.address_ != b.address_; } private: address_v6 address_; }; /// An input iterator that can be used for traversing IPv6 addresses. typedef basic_address_iterator address_v6_iterator; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_ADDRESS_V6_ITERATOR_HPP asio-1.12.2/include/asio/ip/address_v6_range.hpp000066400000000000000000000061121340672067200214520ustar00rootroot00000000000000// // ip/address_v6_range.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ADDRESS_V6_RANGE_HPP #define ASIO_IP_ADDRESS_V6_RANGE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ip/address_v6_iterator.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template class basic_address_range; /// Represents a range of IPv6 addresses. /** * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template <> class basic_address_range { public: /// The type of an iterator that points into the range. typedef basic_address_iterator iterator; /// Construct an empty range. basic_address_range() ASIO_NOEXCEPT : begin_(address_v6()), end_(address_v6()) { } /// Construct an range that represents the given range of addresses. explicit basic_address_range(const iterator& first, const iterator& last) ASIO_NOEXCEPT : begin_(first), end_(last) { } /// Copy constructor. basic_address_range(const basic_address_range& other) ASIO_NOEXCEPT : begin_(other.begin_), end_(other.end_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. basic_address_range(basic_address_range&& other) ASIO_NOEXCEPT : begin_(ASIO_MOVE_CAST(iterator)(other.begin_)), end_(ASIO_MOVE_CAST(iterator)(other.end_)) { } #endif // defined(ASIO_HAS_MOVE) /// Assignment operator. basic_address_range& operator=( const basic_address_range& other) ASIO_NOEXCEPT { begin_ = other.begin_; end_ = other.end_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move assignment operator. basic_address_range& operator=( basic_address_range&& other) ASIO_NOEXCEPT { begin_ = ASIO_MOVE_CAST(iterator)(other.begin_); end_ = ASIO_MOVE_CAST(iterator)(other.end_); return *this; } #endif // defined(ASIO_HAS_MOVE) /// Obtain an iterator that points to the start of the range. iterator begin() const ASIO_NOEXCEPT { return begin_; } /// Obtain an iterator that points to the end of the range. iterator end() const ASIO_NOEXCEPT { return end_; } /// Determine whether the range is empty. bool empty() const ASIO_NOEXCEPT { return begin_ == end_; } /// Find an address in the range. iterator find(const address_v6& addr) const ASIO_NOEXCEPT { return addr >= *begin_ && addr < *end_ ? iterator(addr) : end_; } private: iterator begin_; iterator end_; }; /// Represents a range of IPv6 addresses. typedef basic_address_range address_v6_range; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_ADDRESS_V6_RANGE_HPP asio-1.12.2/include/asio/ip/bad_address_cast.hpp000066400000000000000000000023101340672067200214770ustar00rootroot00000000000000// // ip/bad_address_cast.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BAD_ADDRESS_CAST_HPP #define ASIO_IP_BAD_ADDRESS_CAST_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Thrown to indicate a failed address conversion. class bad_address_cast : #if defined(ASIO_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS public std::exception #else public std::bad_cast #endif { public: /// Default constructor. bad_address_cast() {} /// Destructor. virtual ~bad_address_cast() ASIO_NOEXCEPT_OR_NOTHROW {} /// Get the message associated with the exception. virtual const char* what() const ASIO_NOEXCEPT_OR_NOTHROW { return "bad address cast"; } }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_ADDRESS_HPP asio-1.12.2/include/asio/ip/basic_endpoint.hpp000066400000000000000000000152061340672067200212230ustar00rootroot00000000000000// // ip/basic_endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BASIC_ENDPOINT_HPP #define ASIO_IP_BASIC_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ip/address.hpp" #include "asio/ip/detail/endpoint.hpp" #if !defined(ASIO_NO_IOSTREAM) # include #endif // !defined(ASIO_NO_IOSTREAM) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Describes an endpoint for a version-independent IP socket. /** * The asio::ip::basic_endpoint class template describes an endpoint that * may be associated with a particular socket. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * Endpoint. */ template class basic_endpoint { public: /// The protocol type associated with the endpoint. typedef InternetProtocol protocol_type; /// The type of the endpoint structure. This type is dependent on the /// underlying implementation of the socket layer. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined data_type; #else typedef asio::detail::socket_addr_type data_type; #endif /// Default constructor. basic_endpoint() : impl_() { } /// Construct an endpoint using a port number, specified in the host's byte /// order. The IP address will be the any address (i.e. INADDR_ANY or /// in6addr_any). This constructor would typically be used for accepting new /// connections. /** * @par Examples * To initialise an IPv4 TCP endpoint for port 1234, use: * @code * asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234); * @endcode * * To specify an IPv6 UDP endpoint for port 9876, use: * @code * asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876); * @endcode */ basic_endpoint(const InternetProtocol& internet_protocol, unsigned short port_num) : impl_(internet_protocol.family(), port_num) { } /// Construct an endpoint using a port number and an IP address. This /// constructor may be used for accepting connections on a specific interface /// or for making a connection to a remote endpoint. basic_endpoint(const asio::ip::address& addr, unsigned short port_num) : impl_(addr, port_num) { } /// Copy constructor. basic_endpoint(const basic_endpoint& other) : impl_(other.impl_) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. basic_endpoint(basic_endpoint&& other) : impl_(other.impl_) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Assign from another endpoint. basic_endpoint& operator=(const basic_endpoint& other) { impl_ = other.impl_; return *this; } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-assign from another endpoint. basic_endpoint& operator=(basic_endpoint&& other) { impl_ = other.impl_; return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// The protocol associated with the endpoint. protocol_type protocol() const { if (impl_.is_v4()) return InternetProtocol::v4(); return InternetProtocol::v6(); } /// Get the underlying endpoint in the native type. data_type* data() { return impl_.data(); } /// Get the underlying endpoint in the native type. const data_type* data() const { return impl_.data(); } /// Get the underlying size of the endpoint in the native type. std::size_t size() const { return impl_.size(); } /// Set the underlying size of the endpoint in the native type. void resize(std::size_t new_size) { impl_.resize(new_size); } /// Get the capacity of the endpoint in the native type. std::size_t capacity() const { return impl_.capacity(); } /// Get the port associated with the endpoint. The port number is always in /// the host's byte order. unsigned short port() const { return impl_.port(); } /// Set the port associated with the endpoint. The port number is always in /// the host's byte order. void port(unsigned short port_num) { impl_.port(port_num); } /// Get the IP address associated with the endpoint. asio::ip::address address() const { return impl_.address(); } /// Set the IP address associated with the endpoint. void address(const asio::ip::address& addr) { impl_.address(addr); } /// Compare two endpoints for equality. friend bool operator==(const basic_endpoint& e1, const basic_endpoint& e2) { return e1.impl_ == e2.impl_; } /// Compare two endpoints for inequality. friend bool operator!=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e1 == e2); } /// Compare endpoints for ordering. friend bool operator<(const basic_endpoint& e1, const basic_endpoint& e2) { return e1.impl_ < e2.impl_; } /// Compare endpoints for ordering. friend bool operator>(const basic_endpoint& e1, const basic_endpoint& e2) { return e2.impl_ < e1.impl_; } /// Compare endpoints for ordering. friend bool operator<=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e2 < e1); } /// Compare endpoints for ordering. friend bool operator>=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e1 < e2); } private: // The underlying IP endpoint. asio::ip::detail::endpoint impl_; }; #if !defined(ASIO_NO_IOSTREAM) /// Output an endpoint as a string. /** * Used to output a human-readable string for a specified endpoint. * * @param os The output stream to which the string will be written. * * @param endpoint The endpoint to be written. * * @return The output stream. * * @relates asio::ip::basic_endpoint */ template std::basic_ostream& operator<<( std::basic_ostream& os, const basic_endpoint& endpoint); #endif // !defined(ASIO_NO_IOSTREAM) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ip/impl/basic_endpoint.hpp" #endif // ASIO_IP_BASIC_ENDPOINT_HPP asio-1.12.2/include/asio/ip/basic_resolver.hpp000066400000000000000000001254721340672067200212530ustar00rootroot00000000000000// // ip/basic_resolver.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BASIC_RESOLVER_HPP #define ASIO_IP_BASIC_RESOLVER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/string_view.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_results.hpp" #include "asio/ip/resolver_base.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/ip/resolver_service.hpp" #else // defined(ASIO_ENABLE_OLD_SERVICES) # if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_resolver_service.hpp" # define ASIO_SVC_T \ asio::detail::winrt_resolver_service # else # include "asio/detail/resolver_service.hpp" # define ASIO_SVC_T \ asio::detail::resolver_service # endif #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Provides endpoint resolution functionality. /** * The basic_resolver class template provides the ability to resolve a query * to a list of endpoints. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template )> class basic_resolver : ASIO_SVC_ACCESS basic_io_object, public resolver_base { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The protocol type. typedef InternetProtocol protocol_type; /// The endpoint type. typedef typename InternetProtocol::endpoint endpoint_type; #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated.) The query type. typedef basic_resolver_query query; /// (Deprecated.) The iterator type. typedef basic_resolver_iterator iterator; #endif // !defined(ASIO_NO_DEPRECATED) /// The results type. typedef basic_resolver_results results_type; /// Constructor. /** * This constructor creates a basic_resolver. * * @param io_context The io_context object that the resolver will use to * dispatch handlers for any asynchronous operations performed on the * resolver. */ explicit basic_resolver(asio::io_context& io_context) : basic_io_object(io_context) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_resolver from another. /** * This constructor moves a resolver from one object to another. * * @param other The other basic_resolver object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_resolver(io_context&) constructor. */ basic_resolver(basic_resolver&& other) : basic_io_object(std::move(other)) { } /// Move-assign a basic_resolver from another. /** * This assignment operator moves a resolver from one object to another. * Cancels any outstanding asynchronous operations associated with the target * object. * * @param other The other basic_resolver object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_resolver(io_context&) constructor. */ basic_resolver& operator=(basic_resolver&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the resolver. /** * This function destroys the resolver, cancelling any outstanding * asynchronous wait operations associated with the resolver as if by calling * @c cancel. */ ~basic_resolver() { } #if defined(ASIO_ENABLE_OLD_SERVICES) // These functions are provided by basic_io_object<>. #else // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } #endif // defined(ASIO_ENABLE_OLD_SERVICES) /// Cancel any asynchronous operations that are waiting on the resolver. /** * This function forces the completion of any pending asynchronous * operations on the host resolver. The handler for each cancelled operation * will be invoked with the asio::error::operation_aborted error code. */ void cancel() { return this->get_service().cancel(this->get_implementation()); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use overload with separate host and service parameters.) /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve a query into a list of endpoint entries. * * @param q A query object that determines what endpoints will be returned. * * @returns A range object representing the list of endpoint entries. A * successful call to this function is guaranteed to return a non-empty * range. * * @throws asio::system_error Thrown on failure. */ results_type resolve(const query& q) { asio::error_code ec; results_type r = this->get_service().resolve( this->get_implementation(), q, ec); asio::detail::throw_error(ec, "resolve"); return r; } /// (Deprecated: Use overload with separate host and service parameters.) /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve a query into a list of endpoint entries. * * @param q A query object that determines what endpoints will be returned. * * @param ec Set to indicate what error occurred, if any. * * @returns A range object representing the list of endpoint entries. An * empty range is returned if an error occurs. A successful call to this * function is guaranteed to return a non-empty range. */ results_type resolve(const query& q, asio::error_code& ec) { return this->get_service().resolve(this->get_implementation(), q, ec); } #endif // !defined(ASIO_NO_DEPRECATED) /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @returns A range object representing the list of endpoint entries. A * successful call to this function is guaranteed to return a non-empty * range. * * @throws asio::system_error Thrown on failure. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service) { return resolve(host, service, resolver_base::flags()); } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param ec Set to indicate what error occurred, if any. * * @returns A range object representing the list of endpoint entries. An * empty range is returned if an error occurs. A successful call to this * function is guaranteed to return a non-empty range. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, asio::error_code& ec) { return resolve(host, service, resolver_base::flags(), ec); } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @returns A range object representing the list of endpoint entries. A * successful call to this function is guaranteed to return a non-empty * range. * * @throws asio::system_error Thrown on failure. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags) { asio::error_code ec; basic_resolver_query q(static_cast(host), static_cast(service), resolve_flags); results_type r = this->get_service().resolve( this->get_implementation(), q, ec); asio::detail::throw_error(ec, "resolve"); return r; } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @param ec Set to indicate what error occurred, if any. * * @returns A range object representing the list of endpoint entries. An * empty range is returned if an error occurs. A successful call to this * function is guaranteed to return a non-empty range. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags, asio::error_code& ec) { basic_resolver_query q(static_cast(host), static_cast(service), resolve_flags); return this->get_service().resolve(this->get_implementation(), q, ec); } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @returns A range object representing the list of endpoint entries. A * successful call to this function is guaranteed to return a non-empty * range. * * @throws asio::system_error Thrown on failure. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(const protocol_type& protocol, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service) { return resolve(protocol, host, service, resolver_base::flags()); } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param ec Set to indicate what error occurred, if any. * * @returns A range object representing the list of endpoint entries. An * empty range is returned if an error occurs. A successful call to this * function is guaranteed to return a non-empty range. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(const protocol_type& protocol, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, asio::error_code& ec) { return resolve(protocol, host, service, resolver_base::flags(), ec); } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @returns A range object representing the list of endpoint entries. A * successful call to this function is guaranteed to return a non-empty * range. * * @throws asio::system_error Thrown on failure. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(const protocol_type& protocol, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags) { asio::error_code ec; basic_resolver_query q( protocol, static_cast(host), static_cast(service), resolve_flags); results_type r = this->get_service().resolve( this->get_implementation(), q, ec); asio::detail::throw_error(ec, "resolve"); return r; } /// Perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @param ec Set to indicate what error occurred, if any. * * @returns A range object representing the list of endpoint entries. An * empty range is returned if an error occurs. A successful call to this * function is guaranteed to return a non-empty range. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ results_type resolve(const protocol_type& protocol, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags, asio::error_code& ec) { basic_resolver_query q( protocol, static_cast(host), static_cast(service), resolve_flags); return this->get_service().resolve(this->get_implementation(), q, ec); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use overload with separate host and service parameters.) /// Asynchronously perform forward resolution of a query to a list of entries. /** * This function is used to asynchronously resolve a query into a list of * endpoint entries. * * @param q A query object that determines what endpoints will be returned. * * @param handler The handler to be called when the resolve operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * resolver::results_type results // Resolved endpoints as a range. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * A successful resolve operation is guaranteed to pass a non-empty range to * the handler. */ template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(const query& q, ASIO_MOVE_ARG(ResolveHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ResolveHandler. ASIO_RESOLVE_HANDLER_CHECK( ResolveHandler, handler, results_type) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_resolve(this->get_implementation(), q, ASIO_MOVE_CAST(ResolveHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) asio::async_completion init(handler); this->get_service().async_resolve( this->get_implementation(), q, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } #endif // !defined(ASIO_NO_DEPRECATED) /// Asynchronously perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param handler The handler to be called when the resolve operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * resolver::results_type results // Resolved endpoints as a range. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * A successful resolve operation is guaranteed to pass a non-empty range to * the handler. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, ASIO_MOVE_ARG(ResolveHandler) handler) { return async_resolve(host, service, resolver_base::flags(), ASIO_MOVE_CAST(ResolveHandler)(handler)); } /// Asynchronously perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @param handler The handler to be called when the resolve operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * resolver::results_type results // Resolved endpoints as a range. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * A successful resolve operation is guaranteed to pass a non-empty range to * the handler. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags, ASIO_MOVE_ARG(ResolveHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ResolveHandler. ASIO_RESOLVE_HANDLER_CHECK( ResolveHandler, handler, results_type) type_check; basic_resolver_query q(static_cast(host), static_cast(service), resolve_flags); #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_resolve(this->get_implementation(), q, ASIO_MOVE_CAST(ResolveHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) asio::async_completion init(handler); this->get_service().async_resolve( this->get_implementation(), q, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Asynchronously perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param handler The handler to be called when the resolve operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * resolver::results_type results // Resolved endpoints as a range. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * A successful resolve operation is guaranteed to pass a non-empty range to * the handler. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(const protocol_type& protocol, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, ASIO_MOVE_ARG(ResolveHandler) handler) { return async_resolve(protocol, host, service, resolver_base::flags(), ASIO_MOVE_CAST(ResolveHandler)(handler)); } /// Asynchronously perform forward resolution of a query to a list of entries. /** * This function is used to resolve host and service names into a list of * endpoint entries. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @param handler The handler to be called when the resolve operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * resolver::results_type results // Resolved endpoints as a range. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * A successful resolve operation is guaranteed to pass a non-empty range to * the handler. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(const protocol_type& protocol, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags, ASIO_MOVE_ARG(ResolveHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ResolveHandler. ASIO_RESOLVE_HANDLER_CHECK( ResolveHandler, handler, results_type) type_check; basic_resolver_query q( protocol, static_cast(host), static_cast(service), resolve_flags); #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_resolve(this->get_implementation(), q, ASIO_MOVE_CAST(ResolveHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) asio::async_completion init(handler); this->get_service().async_resolve( this->get_implementation(), q, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } /// Perform reverse resolution of an endpoint to a list of entries. /** * This function is used to resolve an endpoint into a list of endpoint * entries. * * @param e An endpoint object that determines what endpoints will be * returned. * * @returns A range object representing the list of endpoint entries. A * successful call to this function is guaranteed to return a non-empty * range. * * @throws asio::system_error Thrown on failure. */ results_type resolve(const endpoint_type& e) { asio::error_code ec; results_type i = this->get_service().resolve( this->get_implementation(), e, ec); asio::detail::throw_error(ec, "resolve"); return i; } /// Perform reverse resolution of an endpoint to a list of entries. /** * This function is used to resolve an endpoint into a list of endpoint * entries. * * @param e An endpoint object that determines what endpoints will be * returned. * * @param ec Set to indicate what error occurred, if any. * * @returns A range object representing the list of endpoint entries. An * empty range is returned if an error occurs. A successful call to this * function is guaranteed to return a non-empty range. */ results_type resolve(const endpoint_type& e, asio::error_code& ec) { return this->get_service().resolve(this->get_implementation(), e, ec); } /// Asynchronously perform reverse resolution of an endpoint to a list of /// entries. /** * This function is used to asynchronously resolve an endpoint into a list of * endpoint entries. * * @param e An endpoint object that determines what endpoints will be * returned. * * @param handler The handler to be called when the resolve operation * completes. Copies will be made of the handler as required. The function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * resolver::results_type results // Resolved endpoints as a range. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * A successful resolve operation is guaranteed to pass a non-empty range to * the handler. */ template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(const endpoint_type& e, ASIO_MOVE_ARG(ResolveHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ResolveHandler. ASIO_RESOLVE_HANDLER_CHECK( ResolveHandler, handler, results_type) type_check; #if defined(ASIO_ENABLE_OLD_SERVICES) return this->get_service().async_resolve(this->get_implementation(), e, ASIO_MOVE_CAST(ResolveHandler)(handler)); #else // defined(ASIO_ENABLE_OLD_SERVICES) asio::async_completion init(handler); this->get_service().async_resolve( this->get_implementation(), e, init.completion_handler); return init.result.get(); #endif // defined(ASIO_ENABLE_OLD_SERVICES) } }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_IP_BASIC_RESOLVER_HPP asio-1.12.2/include/asio/ip/basic_resolver_entry.hpp000066400000000000000000000055501340672067200224660ustar00rootroot00000000000000// // ip/basic_resolver_entry.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BASIC_RESOLVER_ENTRY_HPP #define ASIO_IP_BASIC_RESOLVER_ENTRY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/string_view.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// An entry produced by a resolver. /** * The asio::ip::basic_resolver_entry class template describes an entry * as returned by a resolver. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_resolver_entry { public: /// The protocol type associated with the endpoint entry. typedef InternetProtocol protocol_type; /// The endpoint type associated with the endpoint entry. typedef typename InternetProtocol::endpoint endpoint_type; /// Default constructor. basic_resolver_entry() { } /// Construct with specified endpoint, host name and service name. basic_resolver_entry(const endpoint_type& ep, ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service) : endpoint_(ep), host_name_(static_cast(host)), service_name_(static_cast(service)) { } /// Get the endpoint associated with the entry. endpoint_type endpoint() const { return endpoint_; } /// Convert to the endpoint associated with the entry. operator endpoint_type() const { return endpoint_; } /// Get the host name associated with the entry. std::string host_name() const { return host_name_; } /// Get the host name associated with the entry. template std::basic_string, Allocator> host_name( const Allocator& alloc = Allocator()) const { return std::basic_string, Allocator>( host_name_.c_str(), alloc); } /// Get the service name associated with the entry. std::string service_name() const { return service_name_; } /// Get the service name associated with the entry. template std::basic_string, Allocator> service_name( const Allocator& alloc = Allocator()) const { return std::basic_string, Allocator>( service_name_.c_str(), alloc); } private: endpoint_type endpoint_; std::string host_name_; std::string service_name_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_BASIC_RESOLVER_ENTRY_HPP asio-1.12.2/include/asio/ip/basic_resolver_iterator.hpp000066400000000000000000000115731340672067200231600ustar00rootroot00000000000000// // ip/basic_resolver_iterator.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP #define ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include #include #include "asio/detail/memory.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/ip/basic_resolver_entry.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_utils.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// An iterator over the entries produced by a resolver. /** * The asio::ip::basic_resolver_iterator class template is used to define * iterators over the results returned by a resolver. * * The iterator's value_type, obtained when the iterator is dereferenced, is: * @code const basic_resolver_entry @endcode * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_resolver_iterator { public: /// The type used for the distance between two iterators. typedef std::ptrdiff_t difference_type; /// The type of the value pointed to by the iterator. typedef basic_resolver_entry value_type; /// The type of the result of applying operator->() to the iterator. typedef const basic_resolver_entry* pointer; /// The type of the result of applying operator*() to the iterator. typedef const basic_resolver_entry& reference; /// The iterator category. typedef std::forward_iterator_tag iterator_category; /// Default constructor creates an end iterator. basic_resolver_iterator() : index_(0) { } /// Copy constructor. basic_resolver_iterator(const basic_resolver_iterator& other) : values_(other.values_), index_(other.index_) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. basic_resolver_iterator(basic_resolver_iterator&& other) : values_(ASIO_MOVE_CAST(values_ptr_type)(other.values_)), index_(other.index_) { other.index_ = 0; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Assignment operator. basic_resolver_iterator& operator=(const basic_resolver_iterator& other) { values_ = other.values_; index_ = other.index_; return *this; } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-assignment operator. basic_resolver_iterator& operator=(basic_resolver_iterator&& other) { if (this != &other) { values_ = ASIO_MOVE_CAST(values_ptr_type)(other.values_); index_ = other.index_; other.index_ = 0; } return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Dereference an iterator. const basic_resolver_entry& operator*() const { return dereference(); } /// Dereference an iterator. const basic_resolver_entry* operator->() const { return &dereference(); } /// Increment operator (prefix). basic_resolver_iterator& operator++() { increment(); return *this; } /// Increment operator (postfix). basic_resolver_iterator operator++(int) { basic_resolver_iterator tmp(*this); ++*this; return tmp; } /// Test two iterators for equality. friend bool operator==(const basic_resolver_iterator& a, const basic_resolver_iterator& b) { return a.equal(b); } /// Test two iterators for inequality. friend bool operator!=(const basic_resolver_iterator& a, const basic_resolver_iterator& b) { return !a.equal(b); } protected: void increment() { if (++index_ == values_->size()) { // Reset state to match a default constructed end iterator. values_.reset(); index_ = 0; } } bool equal(const basic_resolver_iterator& other) const { if (!values_ && !other.values_) return true; if (values_ != other.values_) return false; return index_ == other.index_; } const basic_resolver_entry& dereference() const { return (*values_)[index_]; } typedef std::vector > values_type; typedef asio::detail::shared_ptr values_ptr_type; values_ptr_type values_; std::size_t index_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP asio-1.12.2/include/asio/ip/basic_resolver_query.hpp000066400000000000000000000220321340672067200224640ustar00rootroot00000000000000// // ip/basic_resolver_query.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BASIC_RESOLVER_QUERY_HPP #define ASIO_IP_BASIC_RESOLVER_QUERY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/socket_ops.hpp" #include "asio/ip/resolver_query_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// An query to be passed to a resolver. /** * The asio::ip::basic_resolver_query class template describes a query * that can be passed to a resolver. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_resolver_query : public resolver_query_base { public: /// The protocol type associated with the endpoint query. typedef InternetProtocol protocol_type; /// Construct with specified service name for any protocol. /** * This constructor is typically used to perform name resolution for local * service binding. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for local service * binding. * * @note On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ basic_resolver_query(const std::string& service, resolver_query_base::flags resolve_flags = passive | address_configured) : hints_(), host_name_(), service_name_(service) { typename InternetProtocol::endpoint endpoint; hints_.ai_flags = static_cast(resolve_flags); hints_.ai_family = PF_UNSPEC; hints_.ai_socktype = endpoint.protocol().type(); hints_.ai_protocol = endpoint.protocol().protocol(); hints_.ai_addrlen = 0; hints_.ai_canonname = 0; hints_.ai_addr = 0; hints_.ai_next = 0; } /// Construct with specified service name for a given protocol. /** * This constructor is typically used to perform name resolution for local * service binding with a specific protocol version. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for local service * binding. * * @note On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ basic_resolver_query(const protocol_type& protocol, const std::string& service, resolver_query_base::flags resolve_flags = passive | address_configured) : hints_(), host_name_(), service_name_(service) { hints_.ai_flags = static_cast(resolve_flags); hints_.ai_family = protocol.family(); hints_.ai_socktype = protocol.type(); hints_.ai_protocol = protocol.protocol(); hints_.ai_addrlen = 0; hints_.ai_canonname = 0; hints_.ai_addr = 0; hints_.ai_next = 0; } /// Construct with specified host name and service name for any protocol. /** * This constructor is typically used to perform name resolution for * communication with remote hosts. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ basic_resolver_query(const std::string& host, const std::string& service, resolver_query_base::flags resolve_flags = address_configured) : hints_(), host_name_(host), service_name_(service) { typename InternetProtocol::endpoint endpoint; hints_.ai_flags = static_cast(resolve_flags); hints_.ai_family = ASIO_OS_DEF(AF_UNSPEC); hints_.ai_socktype = endpoint.protocol().type(); hints_.ai_protocol = endpoint.protocol().protocol(); hints_.ai_addrlen = 0; hints_.ai_canonname = 0; hints_.ai_addr = 0; hints_.ai_next = 0; } /// Construct with specified host name and service name for a given protocol. /** * This constructor is typically used to perform name resolution for * communication with remote hosts. * * @param protocol A protocol object, normally representing either the IPv4 or * IPv6 version of an internet protocol. * * @param host A string identifying a location. May be a descriptive name or * a numeric address string. If an empty string and the passive flag has been * specified, the resolved endpoints are suitable for local service binding. * If an empty string and passive is not specified, the resolved endpoints * will use the loopback address. * * @param service A string identifying the requested service. This may be a * descriptive name or a numeric string corresponding to a port number. May * be an empty string, in which case all resolved endpoints will have a port * number of 0. * * @param resolve_flags A set of flags that determine how name resolution * should be performed. The default flags are suitable for communication with * remote hosts. * * @note On POSIX systems, host names may be locally defined in the file * /etc/hosts. On Windows, host names may be defined in the file * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name * resolution is performed using DNS. Operating systems may use additional * locations when resolving host names (such as NETBIOS names on Windows). * * On POSIX systems, service names are typically defined in the file * /etc/services. On Windows, service names may be found in the file * c:\\windows\\system32\\drivers\\etc\\services. Operating systems * may use additional locations when resolving service names. */ basic_resolver_query(const protocol_type& protocol, const std::string& host, const std::string& service, resolver_query_base::flags resolve_flags = address_configured) : hints_(), host_name_(host), service_name_(service) { hints_.ai_flags = static_cast(resolve_flags); hints_.ai_family = protocol.family(); hints_.ai_socktype = protocol.type(); hints_.ai_protocol = protocol.protocol(); hints_.ai_addrlen = 0; hints_.ai_canonname = 0; hints_.ai_addr = 0; hints_.ai_next = 0; } /// Get the hints associated with the query. const asio::detail::addrinfo_type& hints() const { return hints_; } /// Get the host name associated with the query. std::string host_name() const { return host_name_; } /// Get the service name associated with the query. std::string service_name() const { return service_name_; } private: asio::detail::addrinfo_type hints_; std::string host_name_; std::string service_name_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_BASIC_RESOLVER_QUERY_HPP asio-1.12.2/include/asio/ip/basic_resolver_results.hpp000066400000000000000000000224131340672067200230230ustar00rootroot00000000000000// // ip/basic_resolver_results.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_BASIC_RESOLVER_RESULTS_HPP #define ASIO_IP_BASIC_RESOLVER_RESULTS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_utils.hpp" #endif // defined(ASIO_WINDOWS_RUNTIME) #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// A range of entries produced by a resolver. /** * The asio::ip::basic_resolver_results class template is used to define * a range over the results returned by a resolver. * * The iterator's value_type, obtained when a results iterator is dereferenced, * is: @code const basic_resolver_entry @endcode * * @note For backward compatibility, basic_resolver_results is derived from * basic_resolver_iterator. This derivation is deprecated. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_resolver_results #if !defined(ASIO_NO_DEPRECATED) : public basic_resolver_iterator #else // !defined(ASIO_NO_DEPRECATED) : private basic_resolver_iterator #endif // !defined(ASIO_NO_DEPRECATED) { public: /// The protocol type associated with the results. typedef InternetProtocol protocol_type; /// The endpoint type associated with the results. typedef typename protocol_type::endpoint endpoint_type; /// The type of a value in the results range. typedef basic_resolver_entry value_type; /// The type of a const reference to a value in the range. typedef const value_type& const_reference; /// The type of a non-const reference to a value in the range. typedef value_type& reference; /// The type of an iterator into the range. typedef basic_resolver_iterator const_iterator; /// The type of an iterator into the range. typedef const_iterator iterator; /// Type used to represent the distance between two iterators in the range. typedef std::ptrdiff_t difference_type; /// Type used to represent a count of the elements in the range. typedef std::size_t size_type; /// Default constructor creates an empty range. basic_resolver_results() { } /// Copy constructor. basic_resolver_results(const basic_resolver_results& other) : basic_resolver_iterator(other) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. basic_resolver_results(basic_resolver_results&& other) : basic_resolver_iterator( ASIO_MOVE_CAST(basic_resolver_results)(other)) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Assignment operator. basic_resolver_results& operator=(const basic_resolver_results& other) { basic_resolver_iterator::operator=(other); return *this; } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-assignment operator. basic_resolver_results& operator=(basic_resolver_results&& other) { basic_resolver_iterator::operator=( ASIO_MOVE_CAST(basic_resolver_results)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) #if !defined(GENERATING_DOCUMENTATION) // Create results from an addrinfo list returned by getaddrinfo. static basic_resolver_results create( asio::detail::addrinfo_type* address_info, const std::string& host_name, const std::string& service_name) { basic_resolver_results results; if (!address_info) return results; std::string actual_host_name = host_name; if (address_info->ai_canonname) actual_host_name = address_info->ai_canonname; results.values_.reset(new values_type); while (address_info) { if (address_info->ai_family == ASIO_OS_DEF(AF_INET) || address_info->ai_family == ASIO_OS_DEF(AF_INET6)) { using namespace std; // For memcpy. typename InternetProtocol::endpoint endpoint; endpoint.resize(static_cast(address_info->ai_addrlen)); memcpy(endpoint.data(), address_info->ai_addr, address_info->ai_addrlen); results.values_->push_back( basic_resolver_entry(endpoint, actual_host_name, service_name)); } address_info = address_info->ai_next; } return results; } // Create results from an endpoint, host name and service name. static basic_resolver_results create(const endpoint_type& endpoint, const std::string& host_name, const std::string& service_name) { basic_resolver_results results; results.values_.reset(new values_type); results.values_->push_back( basic_resolver_entry( endpoint, host_name, service_name)); return results; } // Create results from a sequence of endpoints, host and service name. template static basic_resolver_results create( EndpointIterator begin, EndpointIterator end, const std::string& host_name, const std::string& service_name) { basic_resolver_results results; if (begin != end) { results.values_.reset(new values_type); for (EndpointIterator ep_iter = begin; ep_iter != end; ++ep_iter) { results.values_->push_back( basic_resolver_entry( *ep_iter, host_name, service_name)); } } return results; } # if defined(ASIO_WINDOWS_RUNTIME) // Create results from a Windows Runtime list of EndpointPair objects. static basic_resolver_results create( Windows::Foundation::Collections::IVectorView< Windows::Networking::EndpointPair^>^ endpoints, const asio::detail::addrinfo_type& hints, const std::string& host_name, const std::string& service_name) { basic_resolver_results results; if (endpoints->Size) { results.values_.reset(new values_type); for (unsigned int i = 0; i < endpoints->Size; ++i) { auto pair = endpoints->GetAt(i); if (hints.ai_family == ASIO_OS_DEF(AF_INET) && pair->RemoteHostName->Type != Windows::Networking::HostNameType::Ipv4) continue; if (hints.ai_family == ASIO_OS_DEF(AF_INET6) && pair->RemoteHostName->Type != Windows::Networking::HostNameType::Ipv6) continue; results.values_->push_back( basic_resolver_entry( typename InternetProtocol::endpoint( ip::make_address( asio::detail::winrt_utils::string( pair->RemoteHostName->CanonicalName)), asio::detail::winrt_utils::integer( pair->RemoteServiceName)), host_name, service_name)); } } return results; } # endif // defined(ASIO_WINDOWS_RUNTIME) #endif // !defined(GENERATING_DOCUMENTATION) /// Get the number of entries in the results range. size_type size() const ASIO_NOEXCEPT { return this->values_ ? this->values_->size() : 0; } /// Get the maximum number of entries permitted in a results range. size_type max_size() const ASIO_NOEXCEPT { return this->values_ ? this->values_->max_size() : values_type().max_size(); } /// Determine whether the results range is empty. bool empty() const ASIO_NOEXCEPT { return this->values_ ? this->values_->empty() : true; } /// Obtain a begin iterator for the results range. const_iterator begin() const { basic_resolver_results tmp(*this); tmp.index_ = 0; return ASIO_MOVE_CAST(basic_resolver_results)(tmp); } /// Obtain an end iterator for the results range. const_iterator end() const { return const_iterator(); } /// Obtain a begin iterator for the results range. const_iterator cbegin() const { return begin(); } /// Obtain an end iterator for the results range. const_iterator cend() const { return end(); } /// Swap the results range with another. void swap(basic_resolver_results& that) ASIO_NOEXCEPT { if (this != &that) { this->values_.swap(that.values_); std::size_t index = this->index_; this->index_ = that.index_; that.index_ = index; } } /// Test two iterators for equality. friend bool operator==(const basic_resolver_results& a, const basic_resolver_results& b) { return a.equal(b); } /// Test two iterators for inequality. friend bool operator!=(const basic_resolver_results& a, const basic_resolver_results& b) { return !a.equal(b); } private: typedef std::vector > values_type; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_BASIC_RESOLVER_RESULTS_HPP asio-1.12.2/include/asio/ip/detail/000077500000000000000000000000001340672067200167675ustar00rootroot00000000000000asio-1.12.2/include/asio/ip/detail/endpoint.hpp000066400000000000000000000066461340672067200213340ustar00rootroot00000000000000// // ip/detail/endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_DETAIL_ENDPOINT_HPP #define ASIO_IP_DETAIL_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/socket_types.hpp" #include "asio/detail/winsock_init.hpp" #include "asio/error_code.hpp" #include "asio/ip/address.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { namespace detail { // Helper class for implementating an IP endpoint. class endpoint { public: // Default constructor. ASIO_DECL endpoint(); // Construct an endpoint using a family and port number. ASIO_DECL endpoint(int family, unsigned short port_num); // Construct an endpoint using an address and port number. ASIO_DECL endpoint(const asio::ip::address& addr, unsigned short port_num); // Copy constructor. endpoint(const endpoint& other) : data_(other.data_) { } // Assign from another endpoint. endpoint& operator=(const endpoint& other) { data_ = other.data_; return *this; } // Get the underlying endpoint in the native type. asio::detail::socket_addr_type* data() { return &data_.base; } // Get the underlying endpoint in the native type. const asio::detail::socket_addr_type* data() const { return &data_.base; } // Get the underlying size of the endpoint in the native type. std::size_t size() const { if (is_v4()) return sizeof(asio::detail::sockaddr_in4_type); else return sizeof(asio::detail::sockaddr_in6_type); } // Set the underlying size of the endpoint in the native type. ASIO_DECL void resize(std::size_t new_size); // Get the capacity of the endpoint in the native type. std::size_t capacity() const { return sizeof(data_); } // Get the port associated with the endpoint. ASIO_DECL unsigned short port() const; // Set the port associated with the endpoint. ASIO_DECL void port(unsigned short port_num); // Get the IP address associated with the endpoint. ASIO_DECL asio::ip::address address() const; // Set the IP address associated with the endpoint. ASIO_DECL void address(const asio::ip::address& addr); // Compare two endpoints for equality. ASIO_DECL friend bool operator==( const endpoint& e1, const endpoint& e2); // Compare endpoints for ordering. ASIO_DECL friend bool operator<( const endpoint& e1, const endpoint& e2); // Determine whether the endpoint is IPv4. bool is_v4() const { return data_.base.sa_family == ASIO_OS_DEF(AF_INET); } #if !defined(ASIO_NO_IOSTREAM) // Convert to a string. ASIO_DECL std::string to_string() const; #endif // !defined(ASIO_NO_IOSTREAM) private: // The underlying IP socket address. union data_union { asio::detail::socket_addr_type base; asio::detail::sockaddr_in4_type v4; asio::detail::sockaddr_in6_type v6; } data_; }; } // namespace detail } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/detail/impl/endpoint.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_DETAIL_ENDPOINT_HPP asio-1.12.2/include/asio/ip/detail/impl/000077500000000000000000000000001340672067200177305ustar00rootroot00000000000000asio-1.12.2/include/asio/ip/detail/impl/endpoint.ipp000066400000000000000000000123061340672067200222640ustar00rootroot00000000000000// // ip/detail/impl/endpoint.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP #define ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #if !defined(ASIO_NO_IOSTREAM) # include #endif // !defined(ASIO_NO_IOSTREAM) #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/ip/detail/endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { namespace detail { endpoint::endpoint() : data_() { data_.v4.sin_family = ASIO_OS_DEF(AF_INET); data_.v4.sin_port = 0; data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY); } endpoint::endpoint(int family, unsigned short port_num) : data_() { using namespace std; // For memcpy. if (family == ASIO_OS_DEF(AF_INET)) { data_.v4.sin_family = ASIO_OS_DEF(AF_INET); data_.v4.sin_port = asio::detail::socket_ops::host_to_network_short(port_num); data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY); } else { data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6); data_.v6.sin6_port = asio::detail::socket_ops::host_to_network_short(port_num); data_.v6.sin6_flowinfo = 0; data_.v6.sin6_addr.s6_addr[0] = 0; data_.v6.sin6_addr.s6_addr[1] = 0; data_.v6.sin6_addr.s6_addr[2] = 0; data_.v6.sin6_addr.s6_addr[3] = 0; data_.v6.sin6_addr.s6_addr[4] = 0; data_.v6.sin6_addr.s6_addr[5] = 0; data_.v6.sin6_addr.s6_addr[6] = 0; data_.v6.sin6_addr.s6_addr[7] = 0; data_.v6.sin6_addr.s6_addr[8] = 0; data_.v6.sin6_addr.s6_addr[9] = 0; data_.v6.sin6_addr.s6_addr[10] = 0; data_.v6.sin6_addr.s6_addr[11] = 0; data_.v6.sin6_addr.s6_addr[12] = 0; data_.v6.sin6_addr.s6_addr[13] = 0; data_.v6.sin6_addr.s6_addr[14] = 0; data_.v6.sin6_addr.s6_addr[15] = 0; data_.v6.sin6_scope_id = 0; } } endpoint::endpoint(const asio::ip::address& addr, unsigned short port_num) : data_() { using namespace std; // For memcpy. if (addr.is_v4()) { data_.v4.sin_family = ASIO_OS_DEF(AF_INET); data_.v4.sin_port = asio::detail::socket_ops::host_to_network_short(port_num); data_.v4.sin_addr.s_addr = asio::detail::socket_ops::host_to_network_long( addr.to_v4().to_uint()); } else { data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6); data_.v6.sin6_port = asio::detail::socket_ops::host_to_network_short(port_num); data_.v6.sin6_flowinfo = 0; asio::ip::address_v6 v6_addr = addr.to_v6(); asio::ip::address_v6::bytes_type bytes = v6_addr.to_bytes(); memcpy(data_.v6.sin6_addr.s6_addr, bytes.data(), 16); data_.v6.sin6_scope_id = static_cast( v6_addr.scope_id()); } } void endpoint::resize(std::size_t new_size) { if (new_size > sizeof(asio::detail::sockaddr_storage_type)) { asio::error_code ec(asio::error::invalid_argument); asio::detail::throw_error(ec); } } unsigned short endpoint::port() const { if (is_v4()) { return asio::detail::socket_ops::network_to_host_short( data_.v4.sin_port); } else { return asio::detail::socket_ops::network_to_host_short( data_.v6.sin6_port); } } void endpoint::port(unsigned short port_num) { if (is_v4()) { data_.v4.sin_port = asio::detail::socket_ops::host_to_network_short(port_num); } else { data_.v6.sin6_port = asio::detail::socket_ops::host_to_network_short(port_num); } } asio::ip::address endpoint::address() const { using namespace std; // For memcpy. if (is_v4()) { return asio::ip::address_v4( asio::detail::socket_ops::network_to_host_long( data_.v4.sin_addr.s_addr)); } else { asio::ip::address_v6::bytes_type bytes; #if defined(ASIO_HAS_STD_ARRAY) memcpy(bytes.data(), data_.v6.sin6_addr.s6_addr, 16); #else // defined(ASIO_HAS_STD_ARRAY) memcpy(bytes.elems, data_.v6.sin6_addr.s6_addr, 16); #endif // defined(ASIO_HAS_STD_ARRAY) return asio::ip::address_v6(bytes, data_.v6.sin6_scope_id); } } void endpoint::address(const asio::ip::address& addr) { endpoint tmp_endpoint(addr, port()); data_ = tmp_endpoint.data_; } bool operator==(const endpoint& e1, const endpoint& e2) { return e1.address() == e2.address() && e1.port() == e2.port(); } bool operator<(const endpoint& e1, const endpoint& e2) { if (e1.address() < e2.address()) return true; if (e1.address() != e2.address()) return false; return e1.port() < e2.port(); } #if !defined(ASIO_NO_IOSTREAM) std::string endpoint::to_string() const { std::ostringstream tmp_os; tmp_os.imbue(std::locale::classic()); if (is_v4()) tmp_os << address(); else tmp_os << '[' << address() << ']'; tmp_os << ':' << port(); return tmp_os.str(); } #endif // !defined(ASIO_NO_IOSTREAM) } // namespace detail } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP asio-1.12.2/include/asio/ip/detail/socket_option.hpp000066400000000000000000000332361340672067200223670ustar00rootroot00000000000000// // detail/socket_option.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_DETAIL_SOCKET_OPTION_HPP #define ASIO_IP_DETAIL_SOCKET_OPTION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include "asio/detail/socket_ops.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/ip/address.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { namespace detail { namespace socket_option { // Helper template for implementing multicast enable loopback options. template class multicast_enable_loopback { public: #if defined(__sun) || defined(__osf__) typedef unsigned char ipv4_value_type; typedef unsigned char ipv6_value_type; #elif defined(_AIX) || defined(__hpux) || defined(__QNXNTO__) typedef unsigned char ipv4_value_type; typedef unsigned int ipv6_value_type; #else typedef int ipv4_value_type; typedef int ipv6_value_type; #endif // Default constructor. multicast_enable_loopback() : ipv4_value_(0), ipv6_value_(0) { } // Construct with a specific option value. explicit multicast_enable_loopback(bool v) : ipv4_value_(v ? 1 : 0), ipv6_value_(v ? 1 : 0) { } // Set the value of the boolean. multicast_enable_loopback& operator=(bool v) { ipv4_value_ = v ? 1 : 0; ipv6_value_ = v ? 1 : 0; return *this; } // Get the current value of the boolean. bool value() const { return !!ipv4_value_; } // Convert to bool. operator bool() const { return !!ipv4_value_; } // Test for false. bool operator!() const { return !ipv4_value_; } // Get the level of the socket option. template int level(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Level; return IPv4_Level; } // Get the name of the socket option. template int name(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Name; return IPv4_Name; } // Get the address of the boolean data. template void* data(const Protocol& protocol) { if (protocol.family() == PF_INET6) return &ipv6_value_; return &ipv4_value_; } // Get the address of the boolean data. template const void* data(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return &ipv6_value_; return &ipv4_value_; } // Get the size of the boolean data. template std::size_t size(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return sizeof(ipv6_value_); return sizeof(ipv4_value_); } // Set the size of the boolean data. template void resize(const Protocol& protocol, std::size_t s) { if (protocol.family() == PF_INET6) { if (s != sizeof(ipv6_value_)) { std::length_error ex("multicast_enable_loopback socket option resize"); asio::detail::throw_exception(ex); } ipv4_value_ = ipv6_value_ ? 1 : 0; } else { if (s != sizeof(ipv4_value_)) { std::length_error ex("multicast_enable_loopback socket option resize"); asio::detail::throw_exception(ex); } ipv6_value_ = ipv4_value_ ? 1 : 0; } } private: ipv4_value_type ipv4_value_; ipv6_value_type ipv6_value_; }; // Helper template for implementing unicast hops options. template class unicast_hops { public: // Default constructor. unicast_hops() : value_(0) { } // Construct with a specific option value. explicit unicast_hops(int v) : value_(v) { } // Set the value of the option. unicast_hops& operator=(int v) { value_ = v; return *this; } // Get the current value of the option. int value() const { return value_; } // Get the level of the socket option. template int level(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Level; return IPv4_Level; } // Get the name of the socket option. template int name(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Name; return IPv4_Name; } // Get the address of the data. template int* data(const Protocol&) { return &value_; } // Get the address of the data. template const int* data(const Protocol&) const { return &value_; } // Get the size of the data. template std::size_t size(const Protocol&) const { return sizeof(value_); } // Set the size of the data. template void resize(const Protocol&, std::size_t s) { if (s != sizeof(value_)) { std::length_error ex("unicast hops socket option resize"); asio::detail::throw_exception(ex); } #if defined(__hpux) if (value_ < 0) value_ = value_ & 0xFF; #endif } private: int value_; }; // Helper template for implementing multicast hops options. template class multicast_hops { public: #if defined(ASIO_WINDOWS) && defined(UNDER_CE) typedef int ipv4_value_type; #else typedef unsigned char ipv4_value_type; #endif typedef int ipv6_value_type; // Default constructor. multicast_hops() : ipv4_value_(0), ipv6_value_(0) { } // Construct with a specific option value. explicit multicast_hops(int v) { if (v < 0 || v > 255) { std::out_of_range ex("multicast hops value out of range"); asio::detail::throw_exception(ex); } ipv4_value_ = (ipv4_value_type)v; ipv6_value_ = v; } // Set the value of the option. multicast_hops& operator=(int v) { if (v < 0 || v > 255) { std::out_of_range ex("multicast hops value out of range"); asio::detail::throw_exception(ex); } ipv4_value_ = (ipv4_value_type)v; ipv6_value_ = v; return *this; } // Get the current value of the option. int value() const { return ipv6_value_; } // Get the level of the socket option. template int level(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Level; return IPv4_Level; } // Get the name of the socket option. template int name(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Name; return IPv4_Name; } // Get the address of the data. template void* data(const Protocol& protocol) { if (protocol.family() == PF_INET6) return &ipv6_value_; return &ipv4_value_; } // Get the address of the data. template const void* data(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return &ipv6_value_; return &ipv4_value_; } // Get the size of the data. template std::size_t size(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return sizeof(ipv6_value_); return sizeof(ipv4_value_); } // Set the size of the data. template void resize(const Protocol& protocol, std::size_t s) { if (protocol.family() == PF_INET6) { if (s != sizeof(ipv6_value_)) { std::length_error ex("multicast hops socket option resize"); asio::detail::throw_exception(ex); } if (ipv6_value_ < 0) ipv4_value_ = 0; else if (ipv6_value_ > 255) ipv4_value_ = 255; else ipv4_value_ = (ipv4_value_type)ipv6_value_; } else { if (s != sizeof(ipv4_value_)) { std::length_error ex("multicast hops socket option resize"); asio::detail::throw_exception(ex); } ipv6_value_ = ipv4_value_; } } private: ipv4_value_type ipv4_value_; ipv6_value_type ipv6_value_; }; // Helper template for implementing ip_mreq-based options. template class multicast_request { public: // Default constructor. multicast_request() : ipv4_value_(), // Zero-initialisation gives the "any" address. ipv6_value_() // Zero-initialisation gives the "any" address. { } // Construct with multicast address only. explicit multicast_request(const address& multicast_address) : ipv4_value_(), // Zero-initialisation gives the "any" address. ipv6_value_() // Zero-initialisation gives the "any" address. { if (multicast_address.is_v6()) { using namespace std; // For memcpy. address_v6 ipv6_address = multicast_address.to_v6(); address_v6::bytes_type bytes = ipv6_address.to_bytes(); memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.data(), 16); ipv6_value_.ipv6mr_interface = ipv6_address.scope_id(); } else { ipv4_value_.imr_multiaddr.s_addr = asio::detail::socket_ops::host_to_network_long( multicast_address.to_v4().to_uint()); ipv4_value_.imr_interface.s_addr = asio::detail::socket_ops::host_to_network_long( address_v4::any().to_uint()); } } // Construct with multicast address and IPv4 address specifying an interface. explicit multicast_request(const address_v4& multicast_address, const address_v4& network_interface = address_v4::any()) : ipv6_value_() // Zero-initialisation gives the "any" address. { ipv4_value_.imr_multiaddr.s_addr = asio::detail::socket_ops::host_to_network_long( multicast_address.to_uint()); ipv4_value_.imr_interface.s_addr = asio::detail::socket_ops::host_to_network_long( network_interface.to_uint()); } // Construct with multicast address and IPv6 network interface index. explicit multicast_request( const address_v6& multicast_address, unsigned long network_interface = 0) : ipv4_value_() // Zero-initialisation gives the "any" address. { using namespace std; // For memcpy. address_v6::bytes_type bytes = multicast_address.to_bytes(); memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.data(), 16); if (network_interface) ipv6_value_.ipv6mr_interface = network_interface; else ipv6_value_.ipv6mr_interface = multicast_address.scope_id(); } // Get the level of the socket option. template int level(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Level; return IPv4_Level; } // Get the name of the socket option. template int name(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Name; return IPv4_Name; } // Get the address of the option data. template const void* data(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return &ipv6_value_; return &ipv4_value_; } // Get the size of the option data. template std::size_t size(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return sizeof(ipv6_value_); return sizeof(ipv4_value_); } private: asio::detail::in4_mreq_type ipv4_value_; asio::detail::in6_mreq_type ipv6_value_; }; // Helper template for implementing options that specify a network interface. template class network_interface { public: // Default constructor. network_interface() { ipv4_value_.s_addr = asio::detail::socket_ops::host_to_network_long( address_v4::any().to_uint()); ipv6_value_ = 0; } // Construct with IPv4 interface. explicit network_interface(const address_v4& ipv4_interface) { ipv4_value_.s_addr = asio::detail::socket_ops::host_to_network_long( ipv4_interface.to_uint()); ipv6_value_ = 0; } // Construct with IPv6 interface. explicit network_interface(unsigned int ipv6_interface) { ipv4_value_.s_addr = asio::detail::socket_ops::host_to_network_long( address_v4::any().to_uint()); ipv6_value_ = ipv6_interface; } // Get the level of the socket option. template int level(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Level; return IPv4_Level; } // Get the name of the socket option. template int name(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return IPv6_Name; return IPv4_Name; } // Get the address of the option data. template const void* data(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return &ipv6_value_; return &ipv4_value_; } // Get the size of the option data. template std::size_t size(const Protocol& protocol) const { if (protocol.family() == PF_INET6) return sizeof(ipv6_value_); return sizeof(ipv4_value_); } private: asio::detail::in4_addr_type ipv4_value_; unsigned int ipv6_value_; }; } // namespace socket_option } // namespace detail } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_DETAIL_SOCKET_OPTION_HPP asio-1.12.2/include/asio/ip/host_name.hpp000066400000000000000000000017301340672067200202140ustar00rootroot00000000000000// // ip/host_name.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_HOST_NAME_HPP #define ASIO_IP_HOST_NAME_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/error_code.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Get the current host name. ASIO_DECL std::string host_name(); /// Get the current host name. ASIO_DECL std::string host_name(asio::error_code& ec); } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/impl/host_name.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_HOST_NAME_HPP asio-1.12.2/include/asio/ip/icmp.hpp000066400000000000000000000050451340672067200171720ustar00rootroot00000000000000// // ip/icmp.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_ICMP_HPP #define ASIO_IP_ICMP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/socket_types.hpp" #include "asio/basic_raw_socket.hpp" #include "asio/ip/basic_endpoint.hpp" #include "asio/ip/basic_resolver.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Encapsulates the flags needed for ICMP. /** * The asio::ip::icmp class contains flags necessary for ICMP sockets. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol, InternetProtocol. */ class icmp { public: /// The type of a ICMP endpoint. typedef basic_endpoint endpoint; /// Construct to represent the IPv4 ICMP protocol. static icmp v4() { return icmp(ASIO_OS_DEF(IPPROTO_ICMP), ASIO_OS_DEF(AF_INET)); } /// Construct to represent the IPv6 ICMP protocol. static icmp v6() { return icmp(ASIO_OS_DEF(IPPROTO_ICMPV6), ASIO_OS_DEF(AF_INET6)); } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_RAW); } /// Obtain an identifier for the protocol. int protocol() const { return protocol_; } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// The ICMP socket type. typedef basic_raw_socket socket; /// The ICMP resolver type. typedef basic_resolver resolver; /// Compare two protocols for equality. friend bool operator==(const icmp& p1, const icmp& p2) { return p1.protocol_ == p2.protocol_ && p1.family_ == p2.family_; } /// Compare two protocols for inequality. friend bool operator!=(const icmp& p1, const icmp& p2) { return p1.protocol_ != p2.protocol_ || p1.family_ != p2.family_; } private: // Construct with a specific family. explicit icmp(int protocol_id, int protocol_family) : protocol_(protocol_id), family_(protocol_family) { } int protocol_; int family_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_ICMP_HPP asio-1.12.2/include/asio/ip/impl/000077500000000000000000000000001340672067200164665ustar00rootroot00000000000000asio-1.12.2/include/asio/ip/impl/address.hpp000066400000000000000000000027301340672067200206260ustar00rootroot00000000000000// // ip/impl/address.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_ADDRESS_HPP #define ASIO_IP_IMPL_ADDRESS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if !defined(ASIO_NO_IOSTREAM) #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { #if !defined(ASIO_NO_DEPRECATED) inline address address::from_string(const char* str) { return asio::ip::make_address(str); } inline address address::from_string( const char* str, asio::error_code& ec) { return asio::ip::make_address(str, ec); } inline address address::from_string(const std::string& str) { return asio::ip::make_address(str); } inline address address::from_string( const std::string& str, asio::error_code& ec) { return asio::ip::make_address(str, ec); } #endif // !defined(ASIO_NO_DEPRECATED) template std::basic_ostream& operator<<( std::basic_ostream& os, const address& addr) { return os << addr.to_string().c_str(); } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_IP_IMPL_ADDRESS_HPP asio-1.12.2/include/asio/ip/impl/address.ipp000066400000000000000000000116041340672067200206270ustar00rootroot00000000000000// // ip/impl/address.ipp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_ADDRESS_IPP #define ASIO_IP_IMPL_ADDRESS_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/error.hpp" #include "asio/ip/address.hpp" #include "asio/ip/bad_address_cast.hpp" #include "asio/system_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { address::address() : type_(ipv4), ipv4_address_(), ipv6_address_() { } address::address(const asio::ip::address_v4& ipv4_address) : type_(ipv4), ipv4_address_(ipv4_address), ipv6_address_() { } address::address(const asio::ip::address_v6& ipv6_address) : type_(ipv6), ipv4_address_(), ipv6_address_(ipv6_address) { } address::address(const address& other) : type_(other.type_), ipv4_address_(other.ipv4_address_), ipv6_address_(other.ipv6_address_) { } #if defined(ASIO_HAS_MOVE) address::address(address&& other) : type_(other.type_), ipv4_address_(other.ipv4_address_), ipv6_address_(other.ipv6_address_) { } #endif // defined(ASIO_HAS_MOVE) address& address::operator=(const address& other) { type_ = other.type_; ipv4_address_ = other.ipv4_address_; ipv6_address_ = other.ipv6_address_; return *this; } #if defined(ASIO_HAS_MOVE) address& address::operator=(address&& other) { type_ = other.type_; ipv4_address_ = other.ipv4_address_; ipv6_address_ = other.ipv6_address_; return *this; } #endif // defined(ASIO_HAS_MOVE) address& address::operator=(const asio::ip::address_v4& ipv4_address) { type_ = ipv4; ipv4_address_ = ipv4_address; ipv6_address_ = asio::ip::address_v6(); return *this; } address& address::operator=(const asio::ip::address_v6& ipv6_address) { type_ = ipv6; ipv4_address_ = asio::ip::address_v4(); ipv6_address_ = ipv6_address; return *this; } address make_address(const char* str) { asio::error_code ec; address addr = make_address(str, ec); asio::detail::throw_error(ec); return addr; } address make_address(const char* str, asio::error_code& ec) { asio::ip::address_v6 ipv6_address = asio::ip::make_address_v6(str, ec); if (!ec) return address(ipv6_address); asio::ip::address_v4 ipv4_address = asio::ip::make_address_v4(str, ec); if (!ec) return address(ipv4_address); return address(); } address make_address(const std::string& str) { return make_address(str.c_str()); } address make_address(const std::string& str, asio::error_code& ec) { return make_address(str.c_str(), ec); } #if defined(ASIO_HAS_STRING_VIEW) address make_address(string_view str) { return make_address(static_cast(str)); } address make_address(string_view str, asio::error_code& ec) { return make_address(static_cast(str), ec); } #endif // defined(ASIO_HAS_STRING_VIEW) asio::ip::address_v4 address::to_v4() const { if (type_ != ipv4) { bad_address_cast ex; asio::detail::throw_exception(ex); } return ipv4_address_; } asio::ip::address_v6 address::to_v6() const { if (type_ != ipv6) { bad_address_cast ex; asio::detail::throw_exception(ex); } return ipv6_address_; } std::string address::to_string() const { if (type_ == ipv6) return ipv6_address_.to_string(); return ipv4_address_.to_string(); } #if !defined(ASIO_NO_DEPRECATED) std::string address::to_string(asio::error_code& ec) const { if (type_ == ipv6) return ipv6_address_.to_string(ec); return ipv4_address_.to_string(ec); } #endif // !defined(ASIO_NO_DEPRECATED) bool address::is_loopback() const { return (type_ == ipv4) ? ipv4_address_.is_loopback() : ipv6_address_.is_loopback(); } bool address::is_unspecified() const { return (type_ == ipv4) ? ipv4_address_.is_unspecified() : ipv6_address_.is_unspecified(); } bool address::is_multicast() const { return (type_ == ipv4) ? ipv4_address_.is_multicast() : ipv6_address_.is_multicast(); } bool operator==(const address& a1, const address& a2) { if (a1.type_ != a2.type_) return false; if (a1.type_ == address::ipv6) return a1.ipv6_address_ == a2.ipv6_address_; return a1.ipv4_address_ == a2.ipv4_address_; } bool operator<(const address& a1, const address& a2) { if (a1.type_ < a2.type_) return true; if (a1.type_ > a2.type_) return false; if (a1.type_ == address::ipv6) return a1.ipv6_address_ < a2.ipv6_address_; return a1.ipv4_address_ < a2.ipv4_address_; } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_IMPL_ADDRESS_IPP asio-1.12.2/include/asio/ip/impl/address_v4.hpp000066400000000000000000000030161340672067200212350ustar00rootroot00000000000000// // ip/impl/address_v4.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_ADDRESS_V4_HPP #define ASIO_IP_IMPL_ADDRESS_V4_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if !defined(ASIO_NO_IOSTREAM) #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { #if !defined(ASIO_NO_DEPRECATED) inline address_v4 address_v4::from_string(const char* str) { return asio::ip::make_address_v4(str); } inline address_v4 address_v4::from_string( const char* str, asio::error_code& ec) { return asio::ip::make_address_v4(str, ec); } inline address_v4 address_v4::from_string(const std::string& str) { return asio::ip::make_address_v4(str); } inline address_v4 address_v4::from_string( const std::string& str, asio::error_code& ec) { return asio::ip::make_address_v4(str, ec); } #endif // !defined(ASIO_NO_DEPRECATED) template std::basic_ostream& operator<<( std::basic_ostream& os, const address_v4& addr) { return os << addr.to_string().c_str(); } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_IP_IMPL_ADDRESS_V4_HPP asio-1.12.2/include/asio/ip/impl/address_v4.ipp000066400000000000000000000117771340672067200212530ustar00rootroot00000000000000// // ip/impl/address_v4.ipp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_ADDRESS_V4_IPP #define ASIO_IP_IMPL_ADDRESS_V4_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include "asio/error.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/ip/address_v4.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { address_v4::address_v4(const address_v4::bytes_type& bytes) { #if UCHAR_MAX > 0xFF if (bytes[0] > 0xFF || bytes[1] > 0xFF || bytes[2] > 0xFF || bytes[3] > 0xFF) { std::out_of_range ex("address_v4 from bytes_type"); asio::detail::throw_exception(ex); } #endif // UCHAR_MAX > 0xFF using namespace std; // For memcpy. memcpy(&addr_.s_addr, bytes.data(), 4); } address_v4::address_v4(address_v4::uint_type addr) { if ((std::numeric_limits::max)() > 0xFFFFFFFF) { std::out_of_range ex("address_v4 from unsigned integer"); asio::detail::throw_exception(ex); } addr_.s_addr = asio::detail::socket_ops::host_to_network_long( static_cast(addr)); } address_v4::bytes_type address_v4::to_bytes() const { using namespace std; // For memcpy. bytes_type bytes; #if defined(ASIO_HAS_STD_ARRAY) memcpy(bytes.data(), &addr_.s_addr, 4); #else // defined(ASIO_HAS_STD_ARRAY) memcpy(bytes.elems, &addr_.s_addr, 4); #endif // defined(ASIO_HAS_STD_ARRAY) return bytes; } address_v4::uint_type address_v4::to_uint() const { return asio::detail::socket_ops::network_to_host_long(addr_.s_addr); } #if !defined(ASIO_NO_DEPRECATED) unsigned long address_v4::to_ulong() const { return asio::detail::socket_ops::network_to_host_long(addr_.s_addr); } #endif // !defined(ASIO_NO_DEPRECATED) std::string address_v4::to_string() const { asio::error_code ec; char addr_str[asio::detail::max_addr_v4_str_len]; const char* addr = asio::detail::socket_ops::inet_ntop( ASIO_OS_DEF(AF_INET), &addr_, addr_str, asio::detail::max_addr_v4_str_len, 0, ec); if (addr == 0) asio::detail::throw_error(ec); return addr; } #if !defined(ASIO_NO_DEPRECATED) std::string address_v4::to_string(asio::error_code& ec) const { char addr_str[asio::detail::max_addr_v4_str_len]; const char* addr = asio::detail::socket_ops::inet_ntop( ASIO_OS_DEF(AF_INET), &addr_, addr_str, asio::detail::max_addr_v4_str_len, 0, ec); if (addr == 0) return std::string(); return addr; } #endif // !defined(ASIO_NO_DEPRECATED) bool address_v4::is_loopback() const { return (to_uint() & 0xFF000000) == 0x7F000000; } bool address_v4::is_unspecified() const { return to_uint() == 0; } #if !defined(ASIO_NO_DEPRECATED) bool address_v4::is_class_a() const { return (to_uint() & 0x80000000) == 0; } bool address_v4::is_class_b() const { return (to_uint() & 0xC0000000) == 0x80000000; } bool address_v4::is_class_c() const { return (to_uint() & 0xE0000000) == 0xC0000000; } #endif // !defined(ASIO_NO_DEPRECATED) bool address_v4::is_multicast() const { return (to_uint() & 0xF0000000) == 0xE0000000; } #if !defined(ASIO_NO_DEPRECATED) address_v4 address_v4::broadcast(const address_v4& addr, const address_v4& mask) { return address_v4(addr.to_uint() | (mask.to_uint() ^ 0xFFFFFFFF)); } address_v4 address_v4::netmask(const address_v4& addr) { if (addr.is_class_a()) return address_v4(0xFF000000); if (addr.is_class_b()) return address_v4(0xFFFF0000); if (addr.is_class_c()) return address_v4(0xFFFFFF00); return address_v4(0xFFFFFFFF); } #endif // !defined(ASIO_NO_DEPRECATED) address_v4 make_address_v4(const char* str) { asio::error_code ec; address_v4 addr = make_address_v4(str, ec); asio::detail::throw_error(ec); return addr; } address_v4 make_address_v4( const char* str, asio::error_code& ec) { address_v4::bytes_type bytes; if (asio::detail::socket_ops::inet_pton( ASIO_OS_DEF(AF_INET), str, &bytes, 0, ec) <= 0) return address_v4(); return address_v4(bytes); } address_v4 make_address_v4(const std::string& str) { return make_address_v4(str.c_str()); } address_v4 make_address_v4( const std::string& str, asio::error_code& ec) { return make_address_v4(str.c_str(), ec); } #if defined(ASIO_HAS_STRING_VIEW) address_v4 make_address_v4(string_view str) { return make_address_v4(static_cast(str)); } address_v4 make_address_v4(string_view str, asio::error_code& ec) { return make_address_v4(static_cast(str), ec); } #endif // defined(ASIO_HAS_STRING_VIEW) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_IMPL_ADDRESS_V4_IPP asio-1.12.2/include/asio/ip/impl/address_v6.hpp000066400000000000000000000030161340672067200212370ustar00rootroot00000000000000// // ip/impl/address_v6.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_ADDRESS_V6_HPP #define ASIO_IP_IMPL_ADDRESS_V6_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if !defined(ASIO_NO_IOSTREAM) #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { #if !defined(ASIO_NO_DEPRECATED) inline address_v6 address_v6::from_string(const char* str) { return asio::ip::make_address_v6(str); } inline address_v6 address_v6::from_string( const char* str, asio::error_code& ec) { return asio::ip::make_address_v6(str, ec); } inline address_v6 address_v6::from_string(const std::string& str) { return asio::ip::make_address_v6(str); } inline address_v6 address_v6::from_string( const std::string& str, asio::error_code& ec) { return asio::ip::make_address_v6(str, ec); } #endif // !defined(ASIO_NO_DEPRECATED) template std::basic_ostream& operator<<( std::basic_ostream& os, const address_v6& addr) { return os << addr.to_string().c_str(); } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_IP_IMPL_ADDRESS_V6_HPP asio-1.12.2/include/asio/ip/impl/address_v6.ipp000066400000000000000000000225421340672067200212450ustar00rootroot00000000000000// // ip/impl/address_v6.ipp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_ADDRESS_V6_IPP #define ASIO_IP_IMPL_ADDRESS_V6_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/error.hpp" #include "asio/ip/address_v6.hpp" #include "asio/ip/bad_address_cast.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { address_v6::address_v6() : addr_(), scope_id_(0) { } address_v6::address_v6(const address_v6::bytes_type& bytes, unsigned long scope) : scope_id_(scope) { #if UCHAR_MAX > 0xFF for (std::size_t i = 0; i < bytes.size(); ++i) { if (bytes[i] > 0xFF) { std::out_of_range ex("address_v6 from bytes_type"); asio::detail::throw_exception(ex); } } #endif // UCHAR_MAX > 0xFF using namespace std; // For memcpy. memcpy(addr_.s6_addr, bytes.data(), 16); } address_v6::address_v6(const address_v6& other) : addr_(other.addr_), scope_id_(other.scope_id_) { } #if defined(ASIO_HAS_MOVE) address_v6::address_v6(address_v6&& other) : addr_(other.addr_), scope_id_(other.scope_id_) { } #endif // defined(ASIO_HAS_MOVE) address_v6& address_v6::operator=(const address_v6& other) { addr_ = other.addr_; scope_id_ = other.scope_id_; return *this; } #if defined(ASIO_HAS_MOVE) address_v6& address_v6::operator=(address_v6&& other) { addr_ = other.addr_; scope_id_ = other.scope_id_; return *this; } #endif // defined(ASIO_HAS_MOVE) address_v6::bytes_type address_v6::to_bytes() const { using namespace std; // For memcpy. bytes_type bytes; #if defined(ASIO_HAS_STD_ARRAY) memcpy(bytes.data(), addr_.s6_addr, 16); #else // defined(ASIO_HAS_STD_ARRAY) memcpy(bytes.elems, addr_.s6_addr, 16); #endif // defined(ASIO_HAS_STD_ARRAY) return bytes; } std::string address_v6::to_string() const { asio::error_code ec; char addr_str[asio::detail::max_addr_v6_str_len]; const char* addr = asio::detail::socket_ops::inet_ntop( ASIO_OS_DEF(AF_INET6), &addr_, addr_str, asio::detail::max_addr_v6_str_len, scope_id_, ec); if (addr == 0) asio::detail::throw_error(ec); return addr; } #if !defined(ASIO_NO_DEPRECATED) std::string address_v6::to_string(asio::error_code& ec) const { char addr_str[asio::detail::max_addr_v6_str_len]; const char* addr = asio::detail::socket_ops::inet_ntop( ASIO_OS_DEF(AF_INET6), &addr_, addr_str, asio::detail::max_addr_v6_str_len, scope_id_, ec); if (addr == 0) return std::string(); return addr; } address_v4 address_v6::to_v4() const { if (!is_v4_mapped() && !is_v4_compatible()) { bad_address_cast ex; asio::detail::throw_exception(ex); } address_v4::bytes_type v4_bytes = { { addr_.s6_addr[12], addr_.s6_addr[13], addr_.s6_addr[14], addr_.s6_addr[15] } }; return address_v4(v4_bytes); } #endif // !defined(ASIO_NO_DEPRECATED) bool address_v6::is_loopback() const { return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) && (addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) && (addr_.s6_addr[14] == 0) && (addr_.s6_addr[15] == 1)); } bool address_v6::is_unspecified() const { return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) && (addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) && (addr_.s6_addr[14] == 0) && (addr_.s6_addr[15] == 0)); } bool address_v6::is_link_local() const { return ((addr_.s6_addr[0] == 0xfe) && ((addr_.s6_addr[1] & 0xc0) == 0x80)); } bool address_v6::is_site_local() const { return ((addr_.s6_addr[0] == 0xfe) && ((addr_.s6_addr[1] & 0xc0) == 0xc0)); } bool address_v6::is_v4_mapped() const { return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) && (addr_.s6_addr[10] == 0xff) && (addr_.s6_addr[11] == 0xff)); } #if !defined(ASIO_NO_DEPRECATED) bool address_v6::is_v4_compatible() const { return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) && !((addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) && (addr_.s6_addr[14] == 0) && ((addr_.s6_addr[15] == 0) || (addr_.s6_addr[15] == 1)))); } #endif // !defined(ASIO_NO_DEPRECATED) bool address_v6::is_multicast() const { return (addr_.s6_addr[0] == 0xff); } bool address_v6::is_multicast_global() const { return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x0e)); } bool address_v6::is_multicast_link_local() const { return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x02)); } bool address_v6::is_multicast_node_local() const { return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x01)); } bool address_v6::is_multicast_org_local() const { return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x08)); } bool address_v6::is_multicast_site_local() const { return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x05)); } bool operator==(const address_v6& a1, const address_v6& a2) { using namespace std; // For memcmp. return memcmp(&a1.addr_, &a2.addr_, sizeof(asio::detail::in6_addr_type)) == 0 && a1.scope_id_ == a2.scope_id_; } bool operator<(const address_v6& a1, const address_v6& a2) { using namespace std; // For memcmp. int memcmp_result = memcmp(&a1.addr_, &a2.addr_, sizeof(asio::detail::in6_addr_type)); if (memcmp_result < 0) return true; if (memcmp_result > 0) return false; return a1.scope_id_ < a2.scope_id_; } address_v6 address_v6::loopback() { address_v6 tmp; tmp.addr_.s6_addr[15] = 1; return tmp; } #if !defined(ASIO_NO_DEPRECATED) address_v6 address_v6::v4_mapped(const address_v4& addr) { address_v4::bytes_type v4_bytes = addr.to_bytes(); bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; return address_v6(v6_bytes); } address_v6 address_v6::v4_compatible(const address_v4& addr) { address_v4::bytes_type v4_bytes = addr.to_bytes(); bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; return address_v6(v6_bytes); } #endif // !defined(ASIO_NO_DEPRECATED) address_v6 make_address_v6(const char* str) { asio::error_code ec; address_v6 addr = make_address_v6(str, ec); asio::detail::throw_error(ec); return addr; } address_v6 make_address_v6( const char* str, asio::error_code& ec) { address_v6::bytes_type bytes; unsigned long scope_id = 0; if (asio::detail::socket_ops::inet_pton( ASIO_OS_DEF(AF_INET6), str, &bytes[0], &scope_id, ec) <= 0) return address_v6(); return address_v6(bytes, scope_id); } address_v6 make_address_v6(const std::string& str) { return make_address_v6(str.c_str()); } address_v6 make_address_v6( const std::string& str, asio::error_code& ec) { return make_address_v6(str.c_str(), ec); } #if defined(ASIO_HAS_STRING_VIEW) address_v6 make_address_v6(string_view str) { return make_address_v6(static_cast(str)); } address_v6 make_address_v6(string_view str, asio::error_code& ec) { return make_address_v6(static_cast(str), ec); } #endif // defined(ASIO_HAS_STRING_VIEW) address_v4 make_address_v4( v4_mapped_t, const address_v6& v6_addr) { if (!v6_addr.is_v4_mapped()) { bad_address_cast ex; asio::detail::throw_exception(ex); } address_v6::bytes_type v6_bytes = v6_addr.to_bytes(); address_v4::bytes_type v4_bytes = { { v6_bytes[12], v6_bytes[13], v6_bytes[14], v6_bytes[15] } }; return address_v4(v4_bytes); } address_v6 make_address_v6( v4_mapped_t, const address_v4& v4_addr) { address_v4::bytes_type v4_bytes = v4_addr.to_bytes(); address_v6::bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; return address_v6(v6_bytes); } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_IMPL_ADDRESS_V6_IPP asio-1.12.2/include/asio/ip/impl/basic_endpoint.hpp000066400000000000000000000021551340672067200221630ustar00rootroot00000000000000// // ip/impl/basic_endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_BASIC_ENDPOINT_HPP #define ASIO_IP_IMPL_BASIC_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if !defined(ASIO_NO_IOSTREAM) #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template std::basic_ostream& operator<<( std::basic_ostream& os, const basic_endpoint& endpoint) { asio::ip::detail::endpoint tmp_ep(endpoint.address(), endpoint.port()); return os << tmp_ep.to_string().c_str(); } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_IP_IMPL_BASIC_ENDPOINT_HPP asio-1.12.2/include/asio/ip/impl/host_name.ipp000066400000000000000000000024101340672067200211520ustar00rootroot00000000000000// // ip/impl/host_name.ipp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_HOST_NAME_IPP #define ASIO_IP_IMPL_HOST_NAME_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/winsock_init.hpp" #include "asio/ip/host_name.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { std::string host_name() { char name[1024]; asio::error_code ec; if (asio::detail::socket_ops::gethostname(name, sizeof(name), ec) != 0) { asio::detail::throw_error(ec); return std::string(); } return std::string(name); } std::string host_name(asio::error_code& ec) { char name[1024]; if (asio::detail::socket_ops::gethostname(name, sizeof(name), ec) != 0) return std::string(); return std::string(name); } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_IMPL_HOST_NAME_IPP asio-1.12.2/include/asio/ip/impl/network_v4.hpp000066400000000000000000000025451340672067200213070ustar00rootroot00000000000000// // ip/impl/network_v4.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_NETWORK_V4_HPP #define ASIO_IP_IMPL_NETWORK_V4_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if !defined(ASIO_NO_IOSTREAM) #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template std::basic_ostream& operator<<( std::basic_ostream& os, const network_v4& addr) { asio::error_code ec; std::string s = addr.to_string(ec); if (ec) { if (os.exceptions() & std::basic_ostream::failbit) asio::detail::throw_error(ec); else os.setstate(std::basic_ostream::failbit); } else for (std::string::iterator i = s.begin(); i != s.end(); ++i) os << os.widen(*i); return os; } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_IP_IMPL_NETWORK_V4_HPP asio-1.12.2/include/asio/ip/impl/network_v4.ipp000066400000000000000000000123501340672067200213030ustar00rootroot00000000000000// // ip/impl/network_v4.ipp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_NETWORK_V4_IPP #define ASIO_IP_IMPL_NETWORK_V4_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include #include "asio/error.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/ip/network_v4.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { network_v4::network_v4(const address_v4& addr, unsigned short prefix_len) : address_(addr), prefix_length_(prefix_len) { if (prefix_len > 32) { std::out_of_range ex("prefix length too large"); asio::detail::throw_exception(ex); } } network_v4::network_v4(const address_v4& addr, const address_v4& mask) : address_(addr), prefix_length_(0) { address_v4::bytes_type mask_bytes = mask.to_bytes(); bool finished = false; for (std::size_t i = 0; i < mask_bytes.size(); ++i) { if (finished) { if (mask_bytes[i]) { std::invalid_argument ex("non-contiguous netmask"); asio::detail::throw_exception(ex); } continue; } else { switch (mask_bytes[i]) { case 255: prefix_length_ += 8; break; case 254: // prefix_length_ += 7 prefix_length_ += 1; case 252: // prefix_length_ += 6 prefix_length_ += 1; case 248: // prefix_length_ += 5 prefix_length_ += 1; case 240: // prefix_length_ += 4 prefix_length_ += 1; case 224: // prefix_length_ += 3 prefix_length_ += 1; case 192: // prefix_length_ += 2 prefix_length_ += 1; case 128: // prefix_length_ += 1 prefix_length_ += 1; case 0: // nbits += 0 finished = true; break; default: std::out_of_range ex("non-contiguous netmask"); asio::detail::throw_exception(ex); } } } } address_v4 network_v4::netmask() const ASIO_NOEXCEPT { uint32_t nmbits = 0xffffffff; if (prefix_length_ == 0) nmbits = 0; else nmbits = nmbits << (32 - prefix_length_); return address_v4(nmbits); } address_v4_range network_v4::hosts() const ASIO_NOEXCEPT { return is_host() ? address_v4_range(address_, address_v4(address_.to_uint() + 1)) : address_v4_range(address_v4(network().to_uint() + 1), broadcast()); } bool network_v4::is_subnet_of(const network_v4& other) const { if (other.prefix_length_ >= prefix_length_) return false; // Only real subsets are allowed. const network_v4 me(address_, other.prefix_length_); return other.canonical() == me.canonical(); } std::string network_v4::to_string() const { asio::error_code ec; std::string addr = to_string(ec); asio::detail::throw_error(ec); return addr; } std::string network_v4::to_string(asio::error_code& ec) const { using namespace std; // For sprintf. ec = asio::error_code(); char prefix_len[16]; #if defined(ASIO_HAS_SECURE_RTL) sprintf_s(prefix_len, sizeof(prefix_len), "/%u", prefix_length_); #else // defined(ASIO_HAS_SECURE_RTL) sprintf(prefix_len, "/%u", prefix_length_); #endif // defined(ASIO_HAS_SECURE_RTL) return address_.to_string() + prefix_len; } network_v4 make_network_v4(const char* str) { return make_network_v4(std::string(str)); } network_v4 make_network_v4(const char* str, asio::error_code& ec) { return make_network_v4(std::string(str), ec); } network_v4 make_network_v4(const std::string& str) { asio::error_code ec; network_v4 net = make_network_v4(str, ec); asio::detail::throw_error(ec); return net; } network_v4 make_network_v4(const std::string& str, asio::error_code& ec) { std::string::size_type pos = str.find_first_of("/"); if (pos == std::string::npos) { ec = asio::error::invalid_argument; return network_v4(); } if (pos == str.size() - 1) { ec = asio::error::invalid_argument; return network_v4(); } std::string::size_type end = str.find_first_not_of("0123456789", pos + 1); if (end != std::string::npos) { ec = asio::error::invalid_argument; return network_v4(); } const address_v4 addr = make_address_v4(str.substr(0, pos), ec); if (ec) return network_v4(); const int prefix_len = std::atoi(str.substr(pos + 1).c_str()); if (prefix_len < 0 || prefix_len > 32) { ec = asio::error::invalid_argument; return network_v4(); } return network_v4(addr, static_cast(prefix_len)); } #if defined(ASIO_HAS_STRING_VIEW) network_v4 make_network_v4(string_view str) { return make_network_v4(static_cast(str)); } network_v4 make_network_v4(string_view str, asio::error_code& ec) { return make_network_v4(static_cast(str), ec); } #endif // defined(ASIO_HAS_STRING_VIEW) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_IMPL_NETWORK_V4_IPP asio-1.12.2/include/asio/ip/impl/network_v6.hpp000066400000000000000000000024321340672067200213040ustar00rootroot00000000000000// // ip/impl/network_v6.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_NETWORK_V6_HPP #define ASIO_IP_IMPL_NETWORK_V6_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #if !defined(ASIO_NO_IOSTREAM) #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { template std::basic_ostream& operator<<( std::basic_ostream& os, const network_v6& addr) { asio::error_code ec; std::string s = addr.to_string(ec); if (ec) { if (os.exceptions() & std::basic_ostream::failbit) asio::detail::throw_error(ec); else os.setstate(std::basic_ostream::failbit); } else for (std::string::iterator i = s.begin(); i != s.end(); ++i) os << os.widen(*i); return os; } } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_IP_IMPL_NETWORK_V6_HPP asio-1.12.2/include/asio/ip/impl/network_v6.ipp000066400000000000000000000111361340672067200213060ustar00rootroot00000000000000// // ip/impl/network_v6.ipp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_IMPL_NETWORK_V6_IPP #define ASIO_IP_IMPL_NETWORK_V6_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include #include #include "asio/error.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/throw_exception.hpp" #include "asio/ip/network_v6.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { network_v6::network_v6(const address_v6& addr, unsigned short prefix_len) : address_(addr), prefix_length_(prefix_len) { if (prefix_len > 128) { std::out_of_range ex("prefix length too large"); asio::detail::throw_exception(ex); } } ASIO_DECL address_v6 network_v6::network() const ASIO_NOEXCEPT { address_v6::bytes_type bytes(address_.to_bytes()); for (std::size_t i = 0; i < 16; ++i) { if (prefix_length_ <= i * 8) bytes[i] = 0; else if (prefix_length_ < (i + 1) * 8) bytes[i] &= 0xFF00 >> (prefix_length_ % 8); } return address_v6(bytes, address_.scope_id()); } address_v6_range network_v6::hosts() const ASIO_NOEXCEPT { address_v6::bytes_type begin_bytes(address_.to_bytes()); address_v6::bytes_type end_bytes(address_.to_bytes()); for (std::size_t i = 0; i < 16; ++i) { if (prefix_length_ <= i * 8) { begin_bytes[i] = 0; end_bytes[i] = 0xFF; } else if (prefix_length_ < (i + 1) * 8) { begin_bytes[i] &= 0xFF00 >> (prefix_length_ % 8); end_bytes[i] |= 0xFF >> (prefix_length_ % 8); } } return address_v6_range( address_v6_iterator(address_v6(begin_bytes, address_.scope_id())), ++address_v6_iterator(address_v6(end_bytes, address_.scope_id()))); } bool network_v6::is_subnet_of(const network_v6& other) const { if (other.prefix_length_ >= prefix_length_) return false; // Only real subsets are allowed. const network_v6 me(address_, other.prefix_length_); return other.canonical() == me.canonical(); } std::string network_v6::to_string() const { asio::error_code ec; std::string addr = to_string(ec); asio::detail::throw_error(ec); return addr; } std::string network_v6::to_string(asio::error_code& ec) const { using namespace std; // For sprintf. ec = asio::error_code(); char prefix_len[16]; #if defined(ASIO_HAS_SECURE_RTL) sprintf_s(prefix_len, sizeof(prefix_len), "/%u", prefix_length_); #else // defined(ASIO_HAS_SECURE_RTL) sprintf(prefix_len, "/%u", prefix_length_); #endif // defined(ASIO_HAS_SECURE_RTL) return address_.to_string() + prefix_len; } network_v6 make_network_v6(const char* str) { return make_network_v6(std::string(str)); } network_v6 make_network_v6(const char* str, asio::error_code& ec) { return make_network_v6(std::string(str), ec); } network_v6 make_network_v6(const std::string& str) { asio::error_code ec; network_v6 net = make_network_v6(str, ec); asio::detail::throw_error(ec); return net; } network_v6 make_network_v6(const std::string& str, asio::error_code& ec) { std::string::size_type pos = str.find_first_of("/"); if (pos == std::string::npos) { ec = asio::error::invalid_argument; return network_v6(); } if (pos == str.size() - 1) { ec = asio::error::invalid_argument; return network_v6(); } std::string::size_type end = str.find_first_not_of("0123456789", pos + 1); if (end != std::string::npos) { ec = asio::error::invalid_argument; return network_v6(); } const address_v6 addr = make_address_v6(str.substr(0, pos), ec); if (ec) return network_v6(); const int prefix_len = std::atoi(str.substr(pos + 1).c_str()); if (prefix_len < 0 || prefix_len > 128) { ec = asio::error::invalid_argument; return network_v6(); } return network_v6(addr, static_cast(prefix_len)); } #if defined(ASIO_HAS_STRING_VIEW) network_v6 make_network_v6(string_view str) { return make_network_v6(static_cast(str)); } network_v6 make_network_v6(string_view str, asio::error_code& ec) { return make_network_v6(static_cast(str), ec); } #endif // defined(ASIO_HAS_STRING_VIEW) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_IMPL_NETWORK_V6_IPP asio-1.12.2/include/asio/ip/multicast.hpp000066400000000000000000000120071340672067200202430ustar00rootroot00000000000000// // ip/multicast.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_MULTICAST_HPP #define ASIO_IP_MULTICAST_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/ip/detail/socket_option.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { namespace multicast { /// Socket option to join a multicast group on a specified interface. /** * Implements the IPPROTO_IP/IP_ADD_MEMBERSHIP socket option. * * @par Examples * Setting the option to join a multicast group: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::address multicast_address = * asio::ip::address::from_string("225.0.0.1"); * asio::ip::multicast::join_group option(multicast_address); * socket.set_option(option); * @endcode * * @par Concepts: * SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined join_group; #else typedef asio::ip::detail::socket_option::multicast_request< ASIO_OS_DEF(IPPROTO_IP), ASIO_OS_DEF(IP_ADD_MEMBERSHIP), ASIO_OS_DEF(IPPROTO_IPV6), ASIO_OS_DEF(IPV6_JOIN_GROUP)> join_group; #endif /// Socket option to leave a multicast group on a specified interface. /** * Implements the IPPROTO_IP/IP_DROP_MEMBERSHIP socket option. * * @par Examples * Setting the option to leave a multicast group: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::address multicast_address = * asio::ip::address::from_string("225.0.0.1"); * asio::ip::multicast::leave_group option(multicast_address); * socket.set_option(option); * @endcode * * @par Concepts: * SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined leave_group; #else typedef asio::ip::detail::socket_option::multicast_request< ASIO_OS_DEF(IPPROTO_IP), ASIO_OS_DEF(IP_DROP_MEMBERSHIP), ASIO_OS_DEF(IPPROTO_IPV6), ASIO_OS_DEF(IPV6_LEAVE_GROUP)> leave_group; #endif /// Socket option for local interface to use for outgoing multicast packets. /** * Implements the IPPROTO_IP/IP_MULTICAST_IF socket option. * * @par Examples * Setting the option: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::address_v4 local_interface = * asio::ip::address_v4::from_string("1.2.3.4"); * asio::ip::multicast::outbound_interface option(local_interface); * socket.set_option(option); * @endcode * * @par Concepts: * SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined outbound_interface; #else typedef asio::ip::detail::socket_option::network_interface< ASIO_OS_DEF(IPPROTO_IP), ASIO_OS_DEF(IP_MULTICAST_IF), ASIO_OS_DEF(IPPROTO_IPV6), ASIO_OS_DEF(IPV6_MULTICAST_IF)> outbound_interface; #endif /// Socket option for time-to-live associated with outgoing multicast packets. /** * Implements the IPPROTO_IP/IP_MULTICAST_TTL socket option. * * @par Examples * Setting the option: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::multicast::hops option(4); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::multicast::hops option; * socket.get_option(option); * int ttl = option.value(); * @endcode * * @par Concepts: * GettableSocketOption, SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined hops; #else typedef asio::ip::detail::socket_option::multicast_hops< ASIO_OS_DEF(IPPROTO_IP), ASIO_OS_DEF(IP_MULTICAST_TTL), ASIO_OS_DEF(IPPROTO_IPV6), ASIO_OS_DEF(IPV6_MULTICAST_HOPS)> hops; #endif /// Socket option determining whether outgoing multicast packets will be /// received on the same socket if it is a member of the multicast group. /** * Implements the IPPROTO_IP/IP_MULTICAST_LOOP socket option. * * @par Examples * Setting the option: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::multicast::enable_loopback option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::multicast::enable_loopback option; * socket.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * GettableSocketOption, SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined enable_loopback; #else typedef asio::ip::detail::socket_option::multicast_enable_loopback< ASIO_OS_DEF(IPPROTO_IP), ASIO_OS_DEF(IP_MULTICAST_LOOP), ASIO_OS_DEF(IPPROTO_IPV6), ASIO_OS_DEF(IPV6_MULTICAST_LOOP)> enable_loopback; #endif } // namespace multicast } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_MULTICAST_HPP asio-1.12.2/include/asio/ip/network_v4.hpp000066400000000000000000000153621340672067200203470ustar00rootroot00000000000000// // ip/network_v4.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_NETWORK_V4_HPP #define ASIO_IP_NETWORK_V4_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/string_view.hpp" #include "asio/error_code.hpp" #include "asio/ip/address_v4_range.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Represents an IPv4 network. /** * The asio::ip::network_v4 class provides the ability to use and * manipulate IP version 4 networks. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class network_v4 { public: /// Default constructor. network_v4() ASIO_NOEXCEPT : address_(), prefix_length_(0) { } /// Construct a network based on the specified address and prefix length. ASIO_DECL network_v4(const address_v4& addr, unsigned short prefix_len); /// Construct network based on the specified address and netmask. ASIO_DECL network_v4(const address_v4& addr, const address_v4& mask); /// Copy constructor. network_v4(const network_v4& other) ASIO_NOEXCEPT : address_(other.address_), prefix_length_(other.prefix_length_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. network_v4(network_v4&& other) ASIO_NOEXCEPT : address_(ASIO_MOVE_CAST(address_v4)(other.address_)), prefix_length_(other.prefix_length_) { } #endif // defined(ASIO_HAS_MOVE) /// Assign from another network. network_v4& operator=(const network_v4& other) ASIO_NOEXCEPT { address_ = other.address_; prefix_length_ = other.prefix_length_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move-assign from another network. network_v4& operator=(network_v4&& other) ASIO_NOEXCEPT { address_ = ASIO_MOVE_CAST(address_v4)(other.address_); prefix_length_ = other.prefix_length_; return *this; } #endif // defined(ASIO_HAS_MOVE) /// Obtain the address object specified when the network object was created. address_v4 address() const ASIO_NOEXCEPT { return address_; } /// Obtain the prefix length that was specified when the network object was /// created. unsigned short prefix_length() const ASIO_NOEXCEPT { return prefix_length_; } /// Obtain the netmask that was specified when the network object was created. ASIO_DECL address_v4 netmask() const ASIO_NOEXCEPT; /// Obtain an address object that represents the network address. address_v4 network() const ASIO_NOEXCEPT { return address_v4(address_.to_uint() & netmask().to_uint()); } /// Obtain an address object that represents the network's broadcast address. address_v4 broadcast() const ASIO_NOEXCEPT { return address_v4(network().to_uint() | (netmask().to_uint() ^ 0xFFFFFFFF)); } /// Obtain an address range corresponding to the hosts in the network. ASIO_DECL address_v4_range hosts() const ASIO_NOEXCEPT; /// Obtain the true network address, omitting any host bits. network_v4 canonical() const ASIO_NOEXCEPT { return network_v4(network(), netmask()); } /// Test if network is a valid host address. bool is_host() const ASIO_NOEXCEPT { return prefix_length_ == 32; } /// Test if a network is a real subnet of another network. ASIO_DECL bool is_subnet_of(const network_v4& other) const; /// Get the network as an address in dotted decimal format. ASIO_DECL std::string to_string() const; /// Get the network as an address in dotted decimal format. ASIO_DECL std::string to_string(asio::error_code& ec) const; /// Compare two networks for equality. friend bool operator==(const network_v4& a, const network_v4& b) { return a.address_ == b.address_ && a.prefix_length_ == b.prefix_length_; } /// Compare two networks for inequality. friend bool operator!=(const network_v4& a, const network_v4& b) { return !(a == b); } private: address_v4 address_; unsigned short prefix_length_; }; /// Create an IPv4 network from an address and prefix length. /** * @relates address_v4 */ inline network_v4 make_network_v4( const address_v4& addr, unsigned short prefix_len) { return network_v4(addr, prefix_len); } /// Create an IPv4 network from an address and netmask. /** * @relates address_v4 */ inline network_v4 make_network_v4( const address_v4& addr, const address_v4& mask) { return network_v4(addr, mask); } /// Create an IPv4 network from a string containing IP address and prefix /// length. /** * @relates network_v4 */ ASIO_DECL network_v4 make_network_v4(const char* str); /// Create an IPv4 network from a string containing IP address and prefix /// length. /** * @relates network_v4 */ ASIO_DECL network_v4 make_network_v4( const char* str, asio::error_code& ec); /// Create an IPv4 network from a string containing IP address and prefix /// length. /** * @relates network_v4 */ ASIO_DECL network_v4 make_network_v4(const std::string& str); /// Create an IPv4 network from a string containing IP address and prefix /// length. /** * @relates network_v4 */ ASIO_DECL network_v4 make_network_v4( const std::string& str, asio::error_code& ec); #if defined(ASIO_HAS_STRING_VIEW) \ || defined(GENERATING_DOCUMENTATION) /// Create an IPv4 network from a string containing IP address and prefix /// length. /** * @relates network_v4 */ ASIO_DECL network_v4 make_network_v4(string_view str); /// Create an IPv4 network from a string containing IP address and prefix /// length. /** * @relates network_v4 */ ASIO_DECL network_v4 make_network_v4( string_view str, asio::error_code& ec); #endif // defined(ASIO_HAS_STRING_VIEW) // || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_IOSTREAM) /// Output a network as a string. /** * Used to output a human-readable string for a specified network. * * @param os The output stream to which the string will be written. * * @param net The network to be written. * * @return The output stream. * * @relates asio::ip::address_v4 */ template std::basic_ostream& operator<<( std::basic_ostream& os, const network_v4& net); #endif // !defined(ASIO_NO_IOSTREAM) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ip/impl/network_v4.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/impl/network_v4.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_NETWORK_V4_HPP asio-1.12.2/include/asio/ip/network_v6.hpp000066400000000000000000000137651340672067200203560ustar00rootroot00000000000000// // ip/network_v6.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_NETWORK_V6_HPP #define ASIO_IP_NETWORK_V6_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/string_view.hpp" #include "asio/error_code.hpp" #include "asio/ip/address_v6_range.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Represents an IPv6 network. /** * The asio::ip::network_v6 class provides the ability to use and * manipulate IP version 6 networks. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class network_v6 { public: /// Default constructor. network_v6() ASIO_NOEXCEPT : address_(), prefix_length_(0) { } /// Construct a network based on the specified address and prefix length. ASIO_DECL network_v6(const address_v6& addr, unsigned short prefix_len); /// Copy constructor. network_v6(const network_v6& other) ASIO_NOEXCEPT : address_(other.address_), prefix_length_(other.prefix_length_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. network_v6(network_v6&& other) ASIO_NOEXCEPT : address_(ASIO_MOVE_CAST(address_v6)(other.address_)), prefix_length_(other.prefix_length_) { } #endif // defined(ASIO_HAS_MOVE) /// Assign from another network. network_v6& operator=(const network_v6& other) ASIO_NOEXCEPT { address_ = other.address_; prefix_length_ = other.prefix_length_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move-assign from another network. network_v6& operator=(network_v6&& other) ASIO_NOEXCEPT { address_ = ASIO_MOVE_CAST(address_v6)(other.address_); prefix_length_ = other.prefix_length_; return *this; } #endif // defined(ASIO_HAS_MOVE) /// Obtain the address object specified when the network object was created. address_v6 address() const ASIO_NOEXCEPT { return address_; } /// Obtain the prefix length that was specified when the network object was /// created. unsigned short prefix_length() const ASIO_NOEXCEPT { return prefix_length_; } /// Obtain an address object that represents the network address. ASIO_DECL address_v6 network() const ASIO_NOEXCEPT; /// Obtain an address range corresponding to the hosts in the network. ASIO_DECL address_v6_range hosts() const ASIO_NOEXCEPT; /// Obtain the true network address, omitting any host bits. network_v6 canonical() const ASIO_NOEXCEPT { return network_v6(network(), prefix_length()); } /// Test if network is a valid host address. bool is_host() const ASIO_NOEXCEPT { return prefix_length_ == 128; } /// Test if a network is a real subnet of another network. ASIO_DECL bool is_subnet_of(const network_v6& other) const; /// Get the network as an address in dotted decimal format. ASIO_DECL std::string to_string() const; /// Get the network as an address in dotted decimal format. ASIO_DECL std::string to_string(asio::error_code& ec) const; /// Compare two networks for equality. friend bool operator==(const network_v6& a, const network_v6& b) { return a.address_ == b.address_ && a.prefix_length_ == b.prefix_length_; } /// Compare two networks for inequality. friend bool operator!=(const network_v6& a, const network_v6& b) { return !(a == b); } private: address_v6 address_; unsigned short prefix_length_; }; /// Create an IPv6 network from an address and prefix length. /** * @relates address_v6 */ inline network_v6 make_network_v6( const address_v6& addr, unsigned short prefix_len) { return network_v6(addr, prefix_len); } /// Create an IPv6 network from a string containing IP address and prefix /// length. /** * @relates network_v6 */ ASIO_DECL network_v6 make_network_v6(const char* str); /// Create an IPv6 network from a string containing IP address and prefix /// length. /** * @relates network_v6 */ ASIO_DECL network_v6 make_network_v6( const char* str, asio::error_code& ec); /// Create an IPv6 network from a string containing IP address and prefix /// length. /** * @relates network_v6 */ ASIO_DECL network_v6 make_network_v6(const std::string& str); /// Create an IPv6 network from a string containing IP address and prefix /// length. /** * @relates network_v6 */ ASIO_DECL network_v6 make_network_v6( const std::string& str, asio::error_code& ec); #if defined(ASIO_HAS_STRING_VIEW) \ || defined(GENERATING_DOCUMENTATION) /// Create an IPv6 network from a string containing IP address and prefix /// length. /** * @relates network_v6 */ ASIO_DECL network_v6 make_network_v6(string_view str); /// Create an IPv6 network from a string containing IP address and prefix /// length. /** * @relates network_v6 */ ASIO_DECL network_v6 make_network_v6( string_view str, asio::error_code& ec); #endif // defined(ASIO_HAS_STRING_VIEW) // || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_IOSTREAM) /// Output a network as a string. /** * Used to output a human-readable string for a specified network. * * @param os The output stream to which the string will be written. * * @param net The network to be written. * * @return The output stream. * * @relates asio::ip::address_v6 */ template std::basic_ostream& operator<<( std::basic_ostream& os, const network_v6& net); #endif // !defined(ASIO_NO_IOSTREAM) } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ip/impl/network_v6.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ip/impl/network_v6.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_IP_NETWORK_V6_HPP asio-1.12.2/include/asio/ip/resolver_base.hpp000066400000000000000000000071011340672067200210700ustar00rootroot00000000000000// // ip/resolver_base.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_RESOLVER_BASE_HPP #define ASIO_IP_RESOLVER_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// The resolver_base class is used as a base for the basic_resolver class /// templates to provide a common place to define the flag constants. class resolver_base { public: #if defined(GENERATING_DOCUMENTATION) /// A bitmask type (C++ Std [lib.bitmask.types]). typedef unspecified flags; /// Determine the canonical name of the host specified in the query. static const flags canonical_name = implementation_defined; /// Indicate that returned endpoint is intended for use as a locally bound /// socket endpoint. static const flags passive = implementation_defined; /// Host name should be treated as a numeric string defining an IPv4 or IPv6 /// address and no name resolution should be attempted. static const flags numeric_host = implementation_defined; /// Service name should be treated as a numeric string defining a port number /// and no name resolution should be attempted. static const flags numeric_service = implementation_defined; /// If the query protocol family is specified as IPv6, return IPv4-mapped /// IPv6 addresses on finding no IPv6 addresses. static const flags v4_mapped = implementation_defined; /// If used with v4_mapped, return all matching IPv6 and IPv4 addresses. static const flags all_matching = implementation_defined; /// Only return IPv4 addresses if a non-loopback IPv4 address is configured /// for the system. Only return IPv6 addresses if a non-loopback IPv6 address /// is configured for the system. static const flags address_configured = implementation_defined; #else enum flags { canonical_name = ASIO_OS_DEF(AI_CANONNAME), passive = ASIO_OS_DEF(AI_PASSIVE), numeric_host = ASIO_OS_DEF(AI_NUMERICHOST), numeric_service = ASIO_OS_DEF(AI_NUMERICSERV), v4_mapped = ASIO_OS_DEF(AI_V4MAPPED), all_matching = ASIO_OS_DEF(AI_ALL), address_configured = ASIO_OS_DEF(AI_ADDRCONFIG) }; // Implement bitmask operations as shown in C++ Std [lib.bitmask.types]. friend flags operator&(flags x, flags y) { return static_cast( static_cast(x) & static_cast(y)); } friend flags operator|(flags x, flags y) { return static_cast( static_cast(x) | static_cast(y)); } friend flags operator^(flags x, flags y) { return static_cast( static_cast(x) ^ static_cast(y)); } friend flags operator~(flags x) { return static_cast(~static_cast(x)); } friend flags& operator&=(flags& x, flags y) { x = x & y; return x; } friend flags& operator|=(flags& x, flags y) { x = x | y; return x; } friend flags& operator^=(flags& x, flags y) { x = x ^ y; return x; } #endif protected: /// Protected destructor to prevent deletion through this type. ~resolver_base() { } }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_RESOLVER_BASE_HPP asio-1.12.2/include/asio/ip/resolver_query_base.hpp000066400000000000000000000021001340672067200223070ustar00rootroot00000000000000// // ip/resolver_query_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_RESOLVER_QUERY_BASE_HPP #define ASIO_IP_RESOLVER_QUERY_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ip/resolver_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// The resolver_query_base class is used as a base for the /// basic_resolver_query class templates to provide a common place to define /// the flag constants. class resolver_query_base : public resolver_base { protected: /// Protected destructor to prevent deletion through this type. ~resolver_query_base() { } }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_RESOLVER_QUERY_BASE_HPP asio-1.12.2/include/asio/ip/resolver_service.hpp000066400000000000000000000127331340672067200216250ustar00rootroot00000000000000// // ip/resolver_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_RESOLVER_SERVICE_HPP #define ASIO_IP_RESOLVER_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/async_result.hpp" #include "asio/error_code.hpp" #include "asio/io_context.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_results.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_resolver_service.hpp" #else # include "asio/detail/resolver_service.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Default service implementation for a resolver. template class resolver_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base< resolver_service > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The protocol type. typedef InternetProtocol protocol_type; /// The endpoint type. typedef typename InternetProtocol::endpoint endpoint_type; /// The query type. typedef basic_resolver_query query_type; /// The iterator type. typedef basic_resolver_iterator iterator_type; /// The results type. typedef basic_resolver_results results_type; private: // The type of the platform-specific implementation. #if defined(ASIO_WINDOWS_RUNTIME) typedef asio::detail::winrt_resolver_service service_impl_type; #else typedef asio::detail::resolver_service service_impl_type; #endif public: /// The type of a resolver implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// Construct a new resolver service for the specified io_context. explicit resolver_service(asio::io_context& io_context) : asio::detail::service_base< resolver_service >(io_context), service_impl_(io_context) { } /// Construct a new resolver implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new resolver implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another resolver implementation. void move_assign(implementation_type& impl, resolver_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a resolver implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Cancel pending asynchronous operations. void cancel(implementation_type& impl) { service_impl_.cancel(impl); } /// Resolve a query to a list of entries. results_type resolve(implementation_type& impl, const query_type& query, asio::error_code& ec) { return service_impl_.resolve(impl, query, ec); } /// Asynchronously resolve a query to a list of entries. template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(implementation_type& impl, const query_type& query, ASIO_MOVE_ARG(ResolveHandler) handler) { asio::async_completion init(handler); service_impl_.async_resolve(impl, query, init.completion_handler); return init.result.get(); } /// Resolve an endpoint to a list of entries. results_type resolve(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { return service_impl_.resolve(impl, endpoint, ec); } /// Asynchronously resolve an endpoint to a list of entries. template ASIO_INITFN_RESULT_TYPE(ResolveHandler, void (asio::error_code, results_type)) async_resolve(implementation_type& impl, const endpoint_type& endpoint, ASIO_MOVE_ARG(ResolveHandler) handler) { asio::async_completion init(handler); service_impl_.async_resolve(impl, endpoint, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // Perform any fork-related housekeeping. void notify_fork(asio::io_context::fork_event event) { service_impl_.notify_fork(event); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_IP_RESOLVER_SERVICE_HPP asio-1.12.2/include/asio/ip/tcp.hpp000066400000000000000000000070071340672067200170300ustar00rootroot00000000000000// // ip/tcp.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_TCP_HPP #define ASIO_IP_TCP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/basic_socket_acceptor.hpp" #include "asio/basic_socket_iostream.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/detail/socket_option.hpp" #include "asio/detail/socket_types.hpp" #include "asio/ip/basic_endpoint.hpp" #include "asio/ip/basic_resolver.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Encapsulates the flags needed for TCP. /** * The asio::ip::tcp class contains flags necessary for TCP sockets. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol, InternetProtocol. */ class tcp { public: /// The type of a TCP endpoint. typedef basic_endpoint endpoint; /// Construct to represent the IPv4 TCP protocol. static tcp v4() { return tcp(ASIO_OS_DEF(AF_INET)); } /// Construct to represent the IPv6 TCP protocol. static tcp v6() { return tcp(ASIO_OS_DEF(AF_INET6)); } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_STREAM); } /// Obtain an identifier for the protocol. int protocol() const { return ASIO_OS_DEF(IPPROTO_TCP); } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// The TCP socket type. typedef basic_stream_socket socket; /// The TCP acceptor type. typedef basic_socket_acceptor acceptor; /// The TCP resolver type. typedef basic_resolver resolver; #if !defined(ASIO_NO_IOSTREAM) /// The TCP iostream type. typedef basic_socket_iostream iostream; #endif // !defined(ASIO_NO_IOSTREAM) /// Socket option for disabling the Nagle algorithm. /** * Implements the IPPROTO_TCP/TCP_NODELAY socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::no_delay option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::tcp::no_delay option; * socket.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined no_delay; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(IPPROTO_TCP), ASIO_OS_DEF(TCP_NODELAY)> no_delay; #endif /// Compare two protocols for equality. friend bool operator==(const tcp& p1, const tcp& p2) { return p1.family_ == p2.family_; } /// Compare two protocols for inequality. friend bool operator!=(const tcp& p1, const tcp& p2) { return p1.family_ != p2.family_; } private: // Construct with a specific family. explicit tcp(int protocol_family) : family_(protocol_family) { } int family_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_TCP_HPP asio-1.12.2/include/asio/ip/udp.hpp000066400000000000000000000045361340672067200170360ustar00rootroot00000000000000// // ip/udp.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_UDP_HPP #define ASIO_IP_UDP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/basic_datagram_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/ip/basic_endpoint.hpp" #include "asio/ip/basic_resolver.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Encapsulates the flags needed for UDP. /** * The asio::ip::udp class contains flags necessary for UDP sockets. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol, InternetProtocol. */ class udp { public: /// The type of a UDP endpoint. typedef basic_endpoint endpoint; /// Construct to represent the IPv4 UDP protocol. static udp v4() { return udp(ASIO_OS_DEF(AF_INET)); } /// Construct to represent the IPv6 UDP protocol. static udp v6() { return udp(ASIO_OS_DEF(AF_INET6)); } /// Obtain an identifier for the type of the protocol. int type() const { return ASIO_OS_DEF(SOCK_DGRAM); } /// Obtain an identifier for the protocol. int protocol() const { return ASIO_OS_DEF(IPPROTO_UDP); } /// Obtain an identifier for the protocol family. int family() const { return family_; } /// The UDP socket type. typedef basic_datagram_socket socket; /// The UDP resolver type. typedef basic_resolver resolver; /// Compare two protocols for equality. friend bool operator==(const udp& p1, const udp& p2) { return p1.family_ == p2.family_; } /// Compare two protocols for inequality. friend bool operator!=(const udp& p1, const udp& p2) { return p1.family_ != p2.family_; } private: // Construct with a specific family. explicit udp(int protocol_family) : family_(protocol_family) { } int family_; }; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_UDP_HPP asio-1.12.2/include/asio/ip/unicast.hpp000066400000000000000000000031571340672067200177120ustar00rootroot00000000000000// // ip/unicast.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_UNICAST_HPP #define ASIO_IP_UNICAST_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/ip/detail/socket_option.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { namespace unicast { /// Socket option for time-to-live associated with outgoing unicast packets. /** * Implements the IPPROTO_IP/IP_UNICAST_TTL socket option. * * @par Examples * Setting the option: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::unicast::hops option(4); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::ip::unicast::hops option; * socket.get_option(option); * int ttl = option.value(); * @endcode * * @par Concepts: * GettableSocketOption, SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined hops; #else typedef asio::ip::detail::socket_option::unicast_hops< ASIO_OS_DEF(IPPROTO_IP), ASIO_OS_DEF(IP_TTL), ASIO_OS_DEF(IPPROTO_IPV6), ASIO_OS_DEF(IPV6_UNICAST_HOPS)> hops; #endif } // namespace unicast } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_UNICAST_HPP asio-1.12.2/include/asio/ip/v6_only.hpp000066400000000000000000000032121340672067200176300ustar00rootroot00000000000000// // ip/v6_only.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IP_V6_ONLY_HPP #define ASIO_IP_V6_ONLY_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/socket_option.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ip { /// Socket option for determining whether an IPv6 socket supports IPv6 /// communication only. /** * Implements the IPPROTO_IPV6/IP_V6ONLY socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::v6_only option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::ip::v6_only option; * socket.get_option(option); * bool v6_only = option.value(); * @endcode * * @par Concepts: * GettableSocketOption, SettableSocketOption. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined v6_only; #elif defined(IPV6_V6ONLY) typedef asio::detail::socket_option::boolean< IPPROTO_IPV6, IPV6_V6ONLY> v6_only; #else typedef asio::detail::socket_option::boolean< asio::detail::custom_socket_option_level, asio::detail::always_fail_option> v6_only; #endif } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IP_V6_ONLY_HPP asio-1.12.2/include/asio/is_executor.hpp000066400000000000000000000023021340672067200201540ustar00rootroot00000000000000// // is_executor.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IS_EXECUTOR_HPP #define ASIO_IS_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/is_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// The is_executor trait detects whether a type T meets the Executor type /// requirements. /** * Class template @c is_executor is a UnaryTypeTrait that is derived from @c * true_type if the type @c T meets the syntactic requirements for Executor, * otherwise @c false_type. */ template struct is_executor #if defined(GENERATING_DOCUMENTATION) : integral_constant #else // defined(GENERATING_DOCUMENTATION) : asio::detail::is_executor #endif // defined(GENERATING_DOCUMENTATION) { }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IS_EXECUTOR_HPP asio-1.12.2/include/asio/is_read_buffered.hpp000066400000000000000000000030211340672067200210720ustar00rootroot00000000000000// // is_read_buffered.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IS_READ_BUFFERED_HPP #define ASIO_IS_READ_BUFFERED_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/buffered_read_stream_fwd.hpp" #include "asio/buffered_stream_fwd.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template char is_read_buffered_helper(buffered_stream* s); template char is_read_buffered_helper(buffered_read_stream* s); struct is_read_buffered_big_type { char data[10]; }; is_read_buffered_big_type is_read_buffered_helper(...); } // namespace detail /// The is_read_buffered class is a traits class that may be used to determine /// whether a stream type supports buffering of read data. template class is_read_buffered { public: #if defined(GENERATING_DOCUMENTATION) /// The value member is true only if the Stream type supports buffering of /// read data. static const bool value; #else ASIO_STATIC_CONSTANT(bool, value = sizeof(detail::is_read_buffered_helper((Stream*)0)) == 1); #endif }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IS_READ_BUFFERED_HPP asio-1.12.2/include/asio/is_write_buffered.hpp000066400000000000000000000030461340672067200213200ustar00rootroot00000000000000// // is_write_buffered.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_IS_WRITE_BUFFERED_HPP #define ASIO_IS_WRITE_BUFFERED_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/buffered_stream_fwd.hpp" #include "asio/buffered_write_stream_fwd.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template char is_write_buffered_helper(buffered_stream* s); template char is_write_buffered_helper(buffered_write_stream* s); struct is_write_buffered_big_type { char data[10]; }; is_write_buffered_big_type is_write_buffered_helper(...); } // namespace detail /// The is_write_buffered class is a traits class that may be used to determine /// whether a stream type supports buffering of written data. template class is_write_buffered { public: #if defined(GENERATING_DOCUMENTATION) /// The value member is true only if the Stream type supports buffering of /// written data. static const bool value; #else ASIO_STATIC_CONSTANT(bool, value = sizeof(detail::is_write_buffered_helper((Stream*)0)) == 1); #endif }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_IS_WRITE_BUFFERED_HPP asio-1.12.2/include/asio/local/000077500000000000000000000000001340672067200162075ustar00rootroot00000000000000asio-1.12.2/include/asio/local/basic_endpoint.hpp000066400000000000000000000126671340672067200217150ustar00rootroot00000000000000// // local/basic_endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Derived from a public domain implementation written by Daniel Casimiro. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_LOCAL_BASIC_ENDPOINT_HPP #define ASIO_LOCAL_BASIC_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) \ || defined(GENERATING_DOCUMENTATION) #include "asio/local/detail/endpoint.hpp" #if !defined(ASIO_NO_IOSTREAM) # include #endif // !defined(ASIO_NO_IOSTREAM) #include "asio/detail/push_options.hpp" namespace asio { namespace local { /// Describes an endpoint for a UNIX socket. /** * The asio::local::basic_endpoint class template describes an endpoint * that may be associated with a particular UNIX socket. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * Endpoint. */ template class basic_endpoint { public: /// The protocol type associated with the endpoint. typedef Protocol protocol_type; /// The type of the endpoint structure. This type is dependent on the /// underlying implementation of the socket layer. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined data_type; #else typedef asio::detail::socket_addr_type data_type; #endif /// Default constructor. basic_endpoint() { } /// Construct an endpoint using the specified path name. basic_endpoint(const char* path_name) : impl_(path_name) { } /// Construct an endpoint using the specified path name. basic_endpoint(const std::string& path_name) : impl_(path_name) { } /// Copy constructor. basic_endpoint(const basic_endpoint& other) : impl_(other.impl_) { } #if defined(ASIO_HAS_MOVE) /// Move constructor. basic_endpoint(basic_endpoint&& other) : impl_(other.impl_) { } #endif // defined(ASIO_HAS_MOVE) /// Assign from another endpoint. basic_endpoint& operator=(const basic_endpoint& other) { impl_ = other.impl_; return *this; } #if defined(ASIO_HAS_MOVE) /// Move-assign from another endpoint. basic_endpoint& operator=(basic_endpoint&& other) { impl_ = other.impl_; return *this; } #endif // defined(ASIO_HAS_MOVE) /// The protocol associated with the endpoint. protocol_type protocol() const { return protocol_type(); } /// Get the underlying endpoint in the native type. data_type* data() { return impl_.data(); } /// Get the underlying endpoint in the native type. const data_type* data() const { return impl_.data(); } /// Get the underlying size of the endpoint in the native type. std::size_t size() const { return impl_.size(); } /// Set the underlying size of the endpoint in the native type. void resize(std::size_t new_size) { impl_.resize(new_size); } /// Get the capacity of the endpoint in the native type. std::size_t capacity() const { return impl_.capacity(); } /// Get the path associated with the endpoint. std::string path() const { return impl_.path(); } /// Set the path associated with the endpoint. void path(const char* p) { impl_.path(p); } /// Set the path associated with the endpoint. void path(const std::string& p) { impl_.path(p); } /// Compare two endpoints for equality. friend bool operator==(const basic_endpoint& e1, const basic_endpoint& e2) { return e1.impl_ == e2.impl_; } /// Compare two endpoints for inequality. friend bool operator!=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e1.impl_ == e2.impl_); } /// Compare endpoints for ordering. friend bool operator<(const basic_endpoint& e1, const basic_endpoint& e2) { return e1.impl_ < e2.impl_; } /// Compare endpoints for ordering. friend bool operator>(const basic_endpoint& e1, const basic_endpoint& e2) { return e2.impl_ < e1.impl_; } /// Compare endpoints for ordering. friend bool operator<=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e2 < e1); } /// Compare endpoints for ordering. friend bool operator>=(const basic_endpoint& e1, const basic_endpoint& e2) { return !(e1 < e2); } private: // The underlying UNIX domain endpoint. asio::local::detail::endpoint impl_; }; /// Output an endpoint as a string. /** * Used to output a human-readable string for a specified endpoint. * * @param os The output stream to which the string will be written. * * @param endpoint The endpoint to be written. * * @return The output stream. * * @relates asio::local::basic_endpoint */ template std::basic_ostream& operator<<( std::basic_ostream& os, const basic_endpoint& endpoint) { os << endpoint.path(); return os; } } // namespace local } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_LOCAL_SOCKETS) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_LOCAL_BASIC_ENDPOINT_HPP asio-1.12.2/include/asio/local/connect_pair.hpp000066400000000000000000000061171340672067200213710ustar00rootroot00000000000000// // local/connect_pair.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_LOCAL_CONNECT_PAIR_HPP #define ASIO_LOCAL_CONNECT_PAIR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) \ || defined(GENERATING_DOCUMENTATION) #include "asio/basic_socket.hpp" #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/local/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace local { /// Create a pair of connected sockets. template void connect_pair( basic_socket& socket1, basic_socket& socket2); /// Create a pair of connected sockets. template ASIO_SYNC_OP_VOID connect_pair( basic_socket& socket1, basic_socket& socket2, asio::error_code& ec); template inline void connect_pair( basic_socket& socket1, basic_socket& socket2) { asio::error_code ec; connect_pair(socket1, socket2, ec); asio::detail::throw_error(ec, "connect_pair"); } template inline ASIO_SYNC_OP_VOID connect_pair( basic_socket& socket1, basic_socket& socket2, asio::error_code& ec) { // Check that this function is only being used with a UNIX domain socket. asio::local::basic_endpoint* tmp = static_cast(0); (void)tmp; Protocol protocol; asio::detail::socket_type sv[2]; if (asio::detail::socket_ops::socketpair(protocol.family(), protocol.type(), protocol.protocol(), sv, ec) == asio::detail::socket_error_retval) ASIO_SYNC_OP_VOID_RETURN(ec); socket1.assign(protocol, sv[0], ec); if (ec) { asio::error_code temp_ec; asio::detail::socket_ops::state_type state[2] = { 0, 0 }; asio::detail::socket_ops::close(sv[0], state[0], true, temp_ec); asio::detail::socket_ops::close(sv[1], state[1], true, temp_ec); ASIO_SYNC_OP_VOID_RETURN(ec); } socket2.assign(protocol, sv[1], ec); if (ec) { asio::error_code temp_ec; socket1.close(temp_ec); asio::detail::socket_ops::state_type state = 0; asio::detail::socket_ops::close(sv[1], state, true, temp_ec); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID_RETURN(ec); } } // namespace local } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_LOCAL_SOCKETS) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_LOCAL_CONNECT_PAIR_HPP asio-1.12.2/include/asio/local/datagram_protocol.hpp000066400000000000000000000035261340672067200224270ustar00rootroot00000000000000// // local/datagram_protocol.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_LOCAL_DATAGRAM_PROTOCOL_HPP #define ASIO_LOCAL_DATAGRAM_PROTOCOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) \ || defined(GENERATING_DOCUMENTATION) #include "asio/basic_datagram_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/local/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace local { /// Encapsulates the flags needed for datagram-oriented UNIX sockets. /** * The asio::local::datagram_protocol class contains flags necessary for * datagram-oriented UNIX domain sockets. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol. */ class datagram_protocol { public: /// Obtain an identifier for the type of the protocol. int type() const { return SOCK_DGRAM; } /// Obtain an identifier for the protocol. int protocol() const { return 0; } /// Obtain an identifier for the protocol family. int family() const { return AF_UNIX; } /// The type of a UNIX domain endpoint. typedef basic_endpoint endpoint; /// The UNIX domain socket type. typedef basic_datagram_socket socket; }; } // namespace local } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_LOCAL_SOCKETS) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_LOCAL_DATAGRAM_PROTOCOL_HPP asio-1.12.2/include/asio/local/detail/000077500000000000000000000000001340672067200174515ustar00rootroot00000000000000asio-1.12.2/include/asio/local/detail/endpoint.hpp000066400000000000000000000064271340672067200220130ustar00rootroot00000000000000// // local/detail/endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Derived from a public domain implementation written by Daniel Casimiro. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_LOCAL_DETAIL_ENDPOINT_HPP #define ASIO_LOCAL_DETAIL_ENDPOINT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) #include #include #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace local { namespace detail { // Helper class for implementing a UNIX domain endpoint. class endpoint { public: // Default constructor. ASIO_DECL endpoint(); // Construct an endpoint using the specified path name. ASIO_DECL endpoint(const char* path_name); // Construct an endpoint using the specified path name. ASIO_DECL endpoint(const std::string& path_name); // Copy constructor. endpoint(const endpoint& other) : data_(other.data_), path_length_(other.path_length_) { } // Assign from another endpoint. endpoint& operator=(const endpoint& other) { data_ = other.data_; path_length_ = other.path_length_; return *this; } // Get the underlying endpoint in the native type. asio::detail::socket_addr_type* data() { return &data_.base; } // Get the underlying endpoint in the native type. const asio::detail::socket_addr_type* data() const { return &data_.base; } // Get the underlying size of the endpoint in the native type. std::size_t size() const { return path_length_ + offsetof(asio::detail::sockaddr_un_type, sun_path); } // Set the underlying size of the endpoint in the native type. ASIO_DECL void resize(std::size_t size); // Get the capacity of the endpoint in the native type. std::size_t capacity() const { return sizeof(asio::detail::sockaddr_un_type); } // Get the path associated with the endpoint. ASIO_DECL std::string path() const; // Set the path associated with the endpoint. ASIO_DECL void path(const char* p); // Set the path associated with the endpoint. ASIO_DECL void path(const std::string& p); // Compare two endpoints for equality. ASIO_DECL friend bool operator==( const endpoint& e1, const endpoint& e2); // Compare endpoints for ordering. ASIO_DECL friend bool operator<( const endpoint& e1, const endpoint& e2); private: // The underlying UNIX socket address. union data_union { asio::detail::socket_addr_type base; asio::detail::sockaddr_un_type local; } data_; // The length of the path associated with the endpoint. std::size_t path_length_; // Initialise with a specified path. ASIO_DECL void init(const char* path, std::size_t path_length); }; } // namespace detail } // namespace local } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/local/detail/impl/endpoint.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_LOCAL_SOCKETS) #endif // ASIO_LOCAL_DETAIL_ENDPOINT_HPP asio-1.12.2/include/asio/local/detail/impl/000077500000000000000000000000001340672067200204125ustar00rootroot00000000000000asio-1.12.2/include/asio/local/detail/impl/endpoint.ipp000066400000000000000000000061061340672067200227470ustar00rootroot00000000000000// // local/detail/impl/endpoint.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Derived from a public domain implementation written by Daniel Casimiro. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP #define ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) #include #include "asio/detail/socket_ops.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/local/detail/endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace local { namespace detail { endpoint::endpoint() { init("", 0); } endpoint::endpoint(const char* path_name) { using namespace std; // For strlen. init(path_name, strlen(path_name)); } endpoint::endpoint(const std::string& path_name) { init(path_name.data(), path_name.length()); } void endpoint::resize(std::size_t new_size) { if (new_size > sizeof(asio::detail::sockaddr_un_type)) { asio::error_code ec(asio::error::invalid_argument); asio::detail::throw_error(ec); } else if (new_size == 0) { path_length_ = 0; } else { path_length_ = new_size - offsetof(asio::detail::sockaddr_un_type, sun_path); // The path returned by the operating system may be NUL-terminated. if (path_length_ > 0 && data_.local.sun_path[path_length_ - 1] == 0) --path_length_; } } std::string endpoint::path() const { return std::string(data_.local.sun_path, path_length_); } void endpoint::path(const char* p) { using namespace std; // For strlen. init(p, strlen(p)); } void endpoint::path(const std::string& p) { init(p.data(), p.length()); } bool operator==(const endpoint& e1, const endpoint& e2) { return e1.path() == e2.path(); } bool operator<(const endpoint& e1, const endpoint& e2) { return e1.path() < e2.path(); } void endpoint::init(const char* path_name, std::size_t path_length) { if (path_length > sizeof(data_.local.sun_path) - 1) { // The buffer is not large enough to store this address. asio::error_code ec(asio::error::name_too_long); asio::detail::throw_error(ec); } using namespace std; // For memcpy. data_.local = asio::detail::sockaddr_un_type(); data_.local.sun_family = AF_UNIX; if (path_length > 0) memcpy(data_.local.sun_path, path_name, path_length); path_length_ = path_length; // NUL-terminate normal path names. Names that start with a NUL are in the // UNIX domain protocol's "abstract namespace" and are not NUL-terminated. if (path_length > 0 && data_.local.sun_path[0] == 0) data_.local.sun_path[path_length] = 0; } } // namespace detail } // namespace local } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_LOCAL_SOCKETS) #endif // ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP asio-1.12.2/include/asio/local/stream_protocol.hpp000066400000000000000000000042271340672067200221410ustar00rootroot00000000000000// // local/stream_protocol.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_LOCAL_STREAM_PROTOCOL_HPP #define ASIO_LOCAL_STREAM_PROTOCOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) \ || defined(GENERATING_DOCUMENTATION) #include "asio/basic_socket_acceptor.hpp" #include "asio/basic_socket_iostream.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/detail/socket_types.hpp" #include "asio/local/basic_endpoint.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace local { /// Encapsulates the flags needed for stream-oriented UNIX sockets. /** * The asio::local::stream_protocol class contains flags necessary for * stream-oriented UNIX domain sockets. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Safe. * * @par Concepts: * Protocol. */ class stream_protocol { public: /// Obtain an identifier for the type of the protocol. int type() const { return SOCK_STREAM; } /// Obtain an identifier for the protocol. int protocol() const { return 0; } /// Obtain an identifier for the protocol family. int family() const { return AF_UNIX; } /// The type of a UNIX domain endpoint. typedef basic_endpoint endpoint; /// The UNIX domain socket type. typedef basic_stream_socket socket; /// The UNIX domain acceptor type. typedef basic_socket_acceptor acceptor; #if !defined(ASIO_NO_IOSTREAM) /// The UNIX domain iostream type. typedef basic_socket_iostream iostream; #endif // !defined(ASIO_NO_IOSTREAM) }; } // namespace local } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_LOCAL_SOCKETS) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_LOCAL_STREAM_PROTOCOL_HPP asio-1.12.2/include/asio/packaged_task.hpp000066400000000000000000000061631340672067200204150ustar00rootroot00000000000000// // packaged_task.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_PACKAGED_TASK_HPP #define ASIO_PACKAGED_TASK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/future.hpp" #if defined(ASIO_HAS_STD_FUTURE_CLASS) \ || defined(GENERATING_DOCUMENTATION) #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/variadic_templates.hpp" #include "asio/detail/push_options.hpp" namespace asio { #if defined(ASIO_HAS_VARIADIC_TEMPLATES) \ || defined(GENERATING_DOCUMENTATION) /// Partial specialisation of @c async_result for @c std::packaged_task. template class async_result, Signature> { public: /// The packaged task is the concrete completion handler type. typedef std::packaged_task completion_handler_type; /// The return type of the initiating function is the future obtained from /// the packaged task. typedef std::future return_type; /// The constructor extracts the future from the packaged task. explicit async_result(completion_handler_type& h) : future_(h.get_future()) { } /// Returns the packaged task's future. return_type get() { return std::move(future_); } private: return_type future_; }; #else // defined(ASIO_HAS_VARIADIC_TEMPLATES) // || defined(GENERATING_DOCUMENTATION) template struct async_result, Signature> { typedef std::packaged_task completion_handler_type; typedef std::future return_type; explicit async_result(completion_handler_type& h) : future_(h.get_future()) { } return_type get() { return std::move(future_); } private: return_type future_; }; #define ASIO_PRIVATE_ASYNC_RESULT_DEF(n) \ template \ class async_result< \ std::packaged_task, Signature> \ { \ public: \ typedef std::packaged_task< \ Result(ASIO_VARIADIC_TARGS(n))> \ completion_handler_type; \ \ typedef std::future return_type; \ \ explicit async_result(completion_handler_type& h) \ : future_(h.get_future()) \ { \ } \ \ return_type get() \ { \ return std::move(future_); \ } \ \ private: \ return_type future_; \ }; \ /**/ ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_ASYNC_RESULT_DEF) #undef ASIO_PRIVATE_ASYNC_RESULT_DEF #endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) // || defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_STD_FUTURE_CLASS) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_PACKAGED_TASK_HPP asio-1.12.2/include/asio/placeholders.hpp000066400000000000000000000075131340672067200203010ustar00rootroot00000000000000// // placeholders.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_PLACEHOLDERS_HPP #define ASIO_PLACEHOLDERS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_BIND) # include #endif // defined(ASIO_HAS_BOOST_BIND) #include "asio/detail/push_options.hpp" namespace asio { namespace placeholders { #if defined(GENERATING_DOCUMENTATION) /// An argument placeholder, for use with boost::bind(), that corresponds to /// the error argument of a handler for any of the asynchronous functions. unspecified error; /// An argument placeholder, for use with boost::bind(), that corresponds to /// the bytes_transferred argument of a handler for asynchronous functions such /// as asio::basic_stream_socket::async_write_some or /// asio::async_write. unspecified bytes_transferred; /// An argument placeholder, for use with boost::bind(), that corresponds to /// the iterator argument of a handler for asynchronous functions such as /// asio::async_connect. unspecified iterator; /// An argument placeholder, for use with boost::bind(), that corresponds to /// the results argument of a handler for asynchronous functions such as /// asio::basic_resolver::async_resolve. unspecified results; /// An argument placeholder, for use with boost::bind(), that corresponds to /// the results argument of a handler for asynchronous functions such as /// asio::async_connect. unspecified endpoint; /// An argument placeholder, for use with boost::bind(), that corresponds to /// the signal_number argument of a handler for asynchronous functions such as /// asio::signal_set::async_wait. unspecified signal_number; #elif defined(ASIO_HAS_BOOST_BIND) # if defined(__BORLANDC__) || defined(__GNUC__) inline boost::arg<1> error() { return boost::arg<1>(); } inline boost::arg<2> bytes_transferred() { return boost::arg<2>(); } inline boost::arg<2> iterator() { return boost::arg<2>(); } inline boost::arg<2> results() { return boost::arg<2>(); } inline boost::arg<2> endpoint() { return boost::arg<2>(); } inline boost::arg<2> signal_number() { return boost::arg<2>(); } # else namespace detail { template struct placeholder { static boost::arg& get() { static boost::arg result; return result; } }; } # if defined(ASIO_MSVC) && (ASIO_MSVC < 1400) static boost::arg<1>& error = asio::placeholders::detail::placeholder<1>::get(); static boost::arg<2>& bytes_transferred = asio::placeholders::detail::placeholder<2>::get(); static boost::arg<2>& iterator = asio::placeholders::detail::placeholder<2>::get(); static boost::arg<2>& results = asio::placeholders::detail::placeholder<2>::get(); static boost::arg<2>& endpoint = asio::placeholders::detail::placeholder<2>::get(); static boost::arg<2>& signal_number = asio::placeholders::detail::placeholder<2>::get(); # else namespace { boost::arg<1>& error = asio::placeholders::detail::placeholder<1>::get(); boost::arg<2>& bytes_transferred = asio::placeholders::detail::placeholder<2>::get(); boost::arg<2>& iterator = asio::placeholders::detail::placeholder<2>::get(); boost::arg<2>& results = asio::placeholders::detail::placeholder<2>::get(); boost::arg<2>& endpoint = asio::placeholders::detail::placeholder<2>::get(); boost::arg<2>& signal_number = asio::placeholders::detail::placeholder<2>::get(); } // namespace # endif # endif #endif } // namespace placeholders } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_PLACEHOLDERS_HPP asio-1.12.2/include/asio/posix/000077500000000000000000000000001340672067200162575ustar00rootroot00000000000000asio-1.12.2/include/asio/posix/basic_descriptor.hpp000066400000000000000000000463411340672067200223170ustar00rootroot00000000000000// // posix/basic_descriptor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POSIX_BASIC_DESCRIPTOR_HPP #define ASIO_POSIX_BASIC_DESCRIPTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ || defined(GENERATING_DOCUMENTATION) #include "asio/basic_io_object.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/posix/descriptor_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace posix { /// Provides POSIX descriptor functionality. /** * The posix::basic_descriptor class template provides the ability to wrap a * POSIX descriptor. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_descriptor : public basic_io_object, public descriptor_base { public: /// The native representation of a descriptor. typedef typename DescriptorService::native_handle_type native_handle_type; /// A basic_descriptor is always the lowest layer. typedef basic_descriptor lowest_layer_type; /// Construct a basic_descriptor without opening it. /** * This constructor creates a descriptor without opening it. * * @param io_context The io_context object that the descriptor will use to * dispatch handlers for any asynchronous operations performed on the * descriptor. */ explicit basic_descriptor(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct a basic_descriptor on an existing native descriptor. /** * This constructor creates a descriptor object to hold an existing native * descriptor. * * @param io_context The io_context object that the descriptor will use to * dispatch handlers for any asynchronous operations performed on the * descriptor. * * @param native_descriptor A native descriptor. * * @throws asio::system_error Thrown on failure. */ basic_descriptor(asio::io_context& io_context, const native_handle_type& native_descriptor) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_descriptor, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_descriptor from another. /** * This constructor moves a descriptor from one object to another. * * @param other The other basic_descriptor object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_descriptor(io_context&) constructor. */ basic_descriptor(basic_descriptor&& other) : basic_io_object( ASIO_MOVE_CAST(basic_descriptor)(other)) { } /// Move-assign a basic_descriptor from another. /** * This assignment operator moves a descriptor from one object to another. * * @param other The other basic_descriptor object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_descriptor(io_context&) constructor. */ basic_descriptor& operator=(basic_descriptor&& other) { basic_io_object::operator=( ASIO_MOVE_CAST(basic_descriptor)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since a basic_descriptor cannot contain any further layers, it * simply returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since a basic_descriptor cannot contain any further layers, it * simply returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Assign an existing native descriptor to the descriptor. /* * This function opens the descriptor to hold an existing native descriptor. * * @param native_descriptor A native descriptor. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& native_descriptor) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_descriptor, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native descriptor to the descriptor. /* * This function opens the descriptor to hold an existing native descriptor. * * @param native_descriptor A native descriptor. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_descriptor, asio::error_code& ec) { this->get_service().assign( this->get_implementation(), native_descriptor, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the descriptor is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the descriptor. /** * This function is used to close the descriptor. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. Note that, even if * the function indicates an error, the underlying descriptor is closed. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the descriptor. /** * This function is used to close the descriptor. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. Note that, even if * the function indicates an error, the underlying descriptor is closed. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native descriptor representation. /** * This function may be used to obtain the underlying representation of the * descriptor. This is intended to allow access to native descriptor * functionality that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Release ownership of the native descriptor implementation. /** * This function may be used to obtain the underlying representation of the * descriptor. After calling this function, @c is_open() returns false. The * caller is responsible for closing the descriptor. * * All outstanding asynchronous read or write operations will finish * immediately, and the handlers for cancelled operations will be passed the * asio::error::operation_aborted error. */ native_handle_type release() { return this->get_service().release(this->get_implementation()); } /// Cancel all asynchronous operations associated with the descriptor. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the descriptor. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the descriptor. /** * This function is used to execute an IO control command on the descriptor. * * @param command The IO control command to be performed on the descriptor. * * @throws asio::system_error Thrown on failure. * * @sa IoControlCommand @n * asio::posix::descriptor_base::bytes_readable @n * asio::posix::descriptor_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::posix::stream_descriptor::bytes_readable command; * descriptor.io_control(command); * std::size_t bytes_readable = command.get(); * @endcode */ template void io_control(IoControlCommand& command) { asio::error_code ec; this->get_service().io_control(this->get_implementation(), command, ec); asio::detail::throw_error(ec, "io_control"); } /// Perform an IO control command on the descriptor. /** * This function is used to execute an IO control command on the descriptor. * * @param command The IO control command to be performed on the descriptor. * * @param ec Set to indicate what error occurred, if any. * * @sa IoControlCommand @n * asio::posix::descriptor_base::bytes_readable @n * asio::posix::descriptor_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::posix::stream_descriptor::bytes_readable command; * asio::error_code ec; * descriptor.io_control(command, ec); * if (ec) * { * // An error occurred. * } * std::size_t bytes_readable = command.get(); * @endcode */ template ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, asio::error_code& ec) { this->get_service().io_control(this->get_implementation(), command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the descriptor. /** * @returns @c true if the descriptor's synchronous operations will fail with * asio::error::would_block if they are unable to perform the requested * operation immediately. If @c false, synchronous operations will block * until complete. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ bool non_blocking() const { return this->get_service().non_blocking(this->get_implementation()); } /// Sets the non-blocking mode of the descriptor. /** * @param mode If @c true, the descriptor's synchronous operations will fail * with asio::error::would_block if they are unable to perform the * requested operation immediately. If @c false, synchronous operations will * block until complete. * * @throws asio::system_error Thrown on failure. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ void non_blocking(bool mode) { asio::error_code ec; this->get_service().non_blocking(this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "non_blocking"); } /// Sets the non-blocking mode of the descriptor. /** * @param mode If @c true, the descriptor's synchronous operations will fail * with asio::error::would_block if they are unable to perform the * requested operation immediately. If @c false, synchronous operations will * block until complete. * * @param ec Set to indicate what error occurred, if any. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ ASIO_SYNC_OP_VOID non_blocking( bool mode, asio::error_code& ec) { this->get_service().non_blocking(this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native descriptor implementation. /** * This function is used to retrieve the non-blocking mode of the underlying * native descriptor. This mode has no effect on the behaviour of the * descriptor object's synchronous operations. * * @returns @c true if the underlying descriptor is in non-blocking mode and * direct system calls may fail with asio::error::would_block (or the * equivalent system error). * * @note The current non-blocking mode is cached by the descriptor object. * Consequently, the return value may be incorrect if the non-blocking mode * was set directly on the native descriptor. */ bool native_non_blocking() const { return this->get_service().native_non_blocking( this->get_implementation()); } /// Sets the non-blocking mode of the native descriptor implementation. /** * This function is used to modify the non-blocking mode of the underlying * native descriptor. It has no effect on the behaviour of the descriptor * object's synchronous operations. * * @param mode If @c true, the underlying descriptor is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @throws asio::system_error Thrown on failure. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. */ void native_non_blocking(bool mode) { asio::error_code ec; this->get_service().native_non_blocking( this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "native_non_blocking"); } /// Sets the non-blocking mode of the native descriptor implementation. /** * This function is used to modify the non-blocking mode of the underlying * native descriptor. It has no effect on the behaviour of the descriptor * object's synchronous operations. * * @param mode If @c true, the underlying descriptor is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @param ec Set to indicate what error occurred, if any. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. */ ASIO_SYNC_OP_VOID native_non_blocking( bool mode, asio::error_code& ec) { this->get_service().native_non_blocking( this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the descriptor to become ready to read, ready to write, or to /// have pending error conditions. /** * This function is used to perform a blocking wait for a descriptor to enter * a ready to read, write or error condition state. * * @param w Specifies the desired descriptor state. * * @par Example * Waiting for a descriptor to become readable. * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * descriptor.wait(asio::posix::stream_descriptor::wait_read); * @endcode */ void wait(wait_type w) { asio::error_code ec; this->get_service().wait(this->get_implementation(), w, ec); asio::detail::throw_error(ec, "wait"); } /// Wait for the descriptor to become ready to read, ready to write, or to /// have pending error conditions. /** * This function is used to perform a blocking wait for a descriptor to enter * a ready to read, write or error condition state. * * @param w Specifies the desired descriptor state. * * @param ec Set to indicate what error occurred, if any. * * @par Example * Waiting for a descriptor to become readable. * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::error_code ec; * descriptor.wait(asio::posix::stream_descriptor::wait_read, ec); * @endcode */ ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) { this->get_service().wait(this->get_implementation(), w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the descriptor to become ready to read, ready to /// write, or to have pending error conditions. /** * This function is used to perform an asynchronous wait for a descriptor to * enter a ready to read, write or error condition state. * * @param w Specifies the desired descriptor state. * * @param handler The handler to be called when the wait operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error // Result of operation * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void wait_handler(const asio::error_code& error) * { * if (!error) * { * // Wait succeeded. * } * } * * ... * * asio::posix::stream_descriptor descriptor(io_context); * ... * descriptor.async_wait( * asio::posix::stream_descriptor::wait_read, * wait_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WaitHandler. ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; return this->get_service().async_wait(this->get_implementation(), w, ASIO_MOVE_CAST(WaitHandler)(handler)); } protected: /// Protected destructor to prevent deletion through this type. ~basic_descriptor() { } }; } // namespace posix } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_POSIX_BASIC_DESCRIPTOR_HPP asio-1.12.2/include/asio/posix/basic_stream_descriptor.hpp000066400000000000000000000331541340672067200236700ustar00rootroot00000000000000// // posix/basic_stream_descriptor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP #define ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/posix/basic_descriptor.hpp" #include "asio/posix/stream_descriptor_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace posix { /// Provides stream-oriented descriptor functionality. /** * The posix::basic_stream_descriptor class template provides asynchronous and * blocking stream-oriented descriptor functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template class basic_stream_descriptor : public basic_descriptor { public: /// The native representation of a descriptor. typedef typename StreamDescriptorService::native_handle_type native_handle_type; /// Construct a basic_stream_descriptor without opening it. /** * This constructor creates a stream descriptor without opening it. The * descriptor needs to be opened and then connected or accepted before data * can be sent or received on it. * * @param io_context The io_context object that the stream descriptor will * use to dispatch handlers for any asynchronous operations performed on the * descriptor. */ explicit basic_stream_descriptor(asio::io_context& io_context) : basic_descriptor(io_context) { } /// Construct a basic_stream_descriptor on an existing native descriptor. /** * This constructor creates a stream descriptor object to hold an existing * native descriptor. * * @param io_context The io_context object that the stream descriptor will * use to dispatch handlers for any asynchronous operations performed on the * descriptor. * * @param native_descriptor The new underlying descriptor implementation. * * @throws asio::system_error Thrown on failure. */ basic_stream_descriptor(asio::io_context& io_context, const native_handle_type& native_descriptor) : basic_descriptor(io_context, native_descriptor) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_stream_descriptor from another. /** * This constructor moves a stream descriptor from one object to another. * * @param other The other basic_stream_descriptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_descriptor(io_context&) constructor. */ basic_stream_descriptor(basic_stream_descriptor&& other) : basic_descriptor( ASIO_MOVE_CAST(basic_stream_descriptor)(other)) { } /// Move-assign a basic_stream_descriptor from another. /** * This assignment operator moves a stream descriptor from one object to * another. * * @param other The other basic_stream_descriptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_descriptor(io_context&) constructor. */ basic_stream_descriptor& operator=(basic_stream_descriptor&& other) { basic_descriptor::operator=( ASIO_MOVE_CAST(basic_stream_descriptor)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Write some data to the descriptor. /** * This function is used to write data to the stream descriptor. The function * call will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the descriptor. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * descriptor.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the descriptor. /** * This function is used to write data to the stream descriptor. The function * call will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the descriptor. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the stream * descriptor. The function call always returns immediately. * * @param buffers One or more data buffers to be written to the descriptor. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * descriptor.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; return this->get_service().async_write_some(this->get_implementation(), buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Read some data from the descriptor. /** * This function is used to read data from the stream descriptor. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * descriptor.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the descriptor. /** * This function is used to read data from the stream descriptor. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the stream * descriptor. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * descriptor.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; return this->get_service().async_read_some(this->get_implementation(), buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); } }; } // namespace posix } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP asio-1.12.2/include/asio/posix/descriptor.hpp000066400000000000000000000516721340672067200211610ustar00rootroot00000000000000// // posix/descriptor.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POSIX_DESCRIPTOR_HPP #define ASIO_POSIX_DESCRIPTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ || defined(GENERATING_DOCUMENTATION) #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/reactive_descriptor_service.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/posix/descriptor_base.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #define ASIO_SVC_T asio::detail::reactive_descriptor_service #include "asio/detail/push_options.hpp" namespace asio { namespace posix { /// Provides POSIX descriptor functionality. /** * The posix::descriptor class template provides the ability to wrap a * POSIX descriptor. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class descriptor : ASIO_SVC_ACCESS basic_io_object, public descriptor_base { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The native representation of a descriptor. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef ASIO_SVC_T::native_handle_type native_handle_type; #endif /// A descriptor is always the lowest layer. typedef descriptor lowest_layer_type; /// Construct a descriptor without opening it. /** * This constructor creates a descriptor without opening it. * * @param io_context The io_context object that the descriptor will use to * dispatch handlers for any asynchronous operations performed on the * descriptor. */ explicit descriptor(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct a descriptor on an existing native descriptor. /** * This constructor creates a descriptor object to hold an existing native * descriptor. * * @param io_context The io_context object that the descriptor will use to * dispatch handlers for any asynchronous operations performed on the * descriptor. * * @param native_descriptor A native descriptor. * * @throws asio::system_error Thrown on failure. */ descriptor(asio::io_context& io_context, const native_handle_type& native_descriptor) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_descriptor, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a descriptor from another. /** * This constructor moves a descriptor from one object to another. * * @param other The other descriptor object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c descriptor(io_context&) constructor. */ descriptor(descriptor&& other) : basic_io_object(std::move(other)) { } /// Move-assign a descriptor from another. /** * This assignment operator moves a descriptor from one object to another. * * @param other The other descriptor object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c descriptor(io_context&) constructor. */ descriptor& operator=(descriptor&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since a descriptor cannot contain any further layers, it * simply returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since a descriptor cannot contain any further layers, it * simply returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Assign an existing native descriptor to the descriptor. /* * This function opens the descriptor to hold an existing native descriptor. * * @param native_descriptor A native descriptor. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& native_descriptor) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_descriptor, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native descriptor to the descriptor. /* * This function opens the descriptor to hold an existing native descriptor. * * @param native_descriptor A native descriptor. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_descriptor, asio::error_code& ec) { this->get_service().assign( this->get_implementation(), native_descriptor, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the descriptor is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the descriptor. /** * This function is used to close the descriptor. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. Note that, even if * the function indicates an error, the underlying descriptor is closed. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the descriptor. /** * This function is used to close the descriptor. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. Note that, even if * the function indicates an error, the underlying descriptor is closed. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native descriptor representation. /** * This function may be used to obtain the underlying representation of the * descriptor. This is intended to allow access to native descriptor * functionality that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Release ownership of the native descriptor implementation. /** * This function may be used to obtain the underlying representation of the * descriptor. After calling this function, @c is_open() returns false. The * caller is responsible for closing the descriptor. * * All outstanding asynchronous read or write operations will finish * immediately, and the handlers for cancelled operations will be passed the * asio::error::operation_aborted error. */ native_handle_type release() { return this->get_service().release(this->get_implementation()); } /// Cancel all asynchronous operations associated with the descriptor. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the descriptor. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the descriptor. /** * This function is used to execute an IO control command on the descriptor. * * @param command The IO control command to be performed on the descriptor. * * @throws asio::system_error Thrown on failure. * * @sa IoControlCommand @n * asio::posix::descriptor_base::bytes_readable @n * asio::posix::descriptor_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::posix::stream_descriptor::bytes_readable command; * descriptor.io_control(command); * std::size_t bytes_readable = command.get(); * @endcode */ template void io_control(IoControlCommand& command) { asio::error_code ec; this->get_service().io_control(this->get_implementation(), command, ec); asio::detail::throw_error(ec, "io_control"); } /// Perform an IO control command on the descriptor. /** * This function is used to execute an IO control command on the descriptor. * * @param command The IO control command to be performed on the descriptor. * * @param ec Set to indicate what error occurred, if any. * * @sa IoControlCommand @n * asio::posix::descriptor_base::bytes_readable @n * asio::posix::descriptor_base::non_blocking_io * * @par Example * Getting the number of bytes ready to read: * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::posix::stream_descriptor::bytes_readable command; * asio::error_code ec; * descriptor.io_control(command, ec); * if (ec) * { * // An error occurred. * } * std::size_t bytes_readable = command.get(); * @endcode */ template ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, asio::error_code& ec) { this->get_service().io_control(this->get_implementation(), command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the descriptor. /** * @returns @c true if the descriptor's synchronous operations will fail with * asio::error::would_block if they are unable to perform the requested * operation immediately. If @c false, synchronous operations will block * until complete. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ bool non_blocking() const { return this->get_service().non_blocking(this->get_implementation()); } /// Sets the non-blocking mode of the descriptor. /** * @param mode If @c true, the descriptor's synchronous operations will fail * with asio::error::would_block if they are unable to perform the * requested operation immediately. If @c false, synchronous operations will * block until complete. * * @throws asio::system_error Thrown on failure. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ void non_blocking(bool mode) { asio::error_code ec; this->get_service().non_blocking(this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "non_blocking"); } /// Sets the non-blocking mode of the descriptor. /** * @param mode If @c true, the descriptor's synchronous operations will fail * with asio::error::would_block if they are unable to perform the * requested operation immediately. If @c false, synchronous operations will * block until complete. * * @param ec Set to indicate what error occurred, if any. * * @note The non-blocking mode has no effect on the behaviour of asynchronous * operations. Asynchronous operations will never fail with the error * asio::error::would_block. */ ASIO_SYNC_OP_VOID non_blocking( bool mode, asio::error_code& ec) { this->get_service().non_blocking(this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native descriptor implementation. /** * This function is used to retrieve the non-blocking mode of the underlying * native descriptor. This mode has no effect on the behaviour of the * descriptor object's synchronous operations. * * @returns @c true if the underlying descriptor is in non-blocking mode and * direct system calls may fail with asio::error::would_block (or the * equivalent system error). * * @note The current non-blocking mode is cached by the descriptor object. * Consequently, the return value may be incorrect if the non-blocking mode * was set directly on the native descriptor. */ bool native_non_blocking() const { return this->get_service().native_non_blocking( this->get_implementation()); } /// Sets the non-blocking mode of the native descriptor implementation. /** * This function is used to modify the non-blocking mode of the underlying * native descriptor. It has no effect on the behaviour of the descriptor * object's synchronous operations. * * @param mode If @c true, the underlying descriptor is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @throws asio::system_error Thrown on failure. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. */ void native_non_blocking(bool mode) { asio::error_code ec; this->get_service().native_non_blocking( this->get_implementation(), mode, ec); asio::detail::throw_error(ec, "native_non_blocking"); } /// Sets the non-blocking mode of the native descriptor implementation. /** * This function is used to modify the non-blocking mode of the underlying * native descriptor. It has no effect on the behaviour of the descriptor * object's synchronous operations. * * @param mode If @c true, the underlying descriptor is put into non-blocking * mode and direct system calls may fail with asio::error::would_block * (or the equivalent system error). * * @param ec Set to indicate what error occurred, if any. If the @c mode is * @c false, but the current value of @c non_blocking() is @c true, this * function fails with asio::error::invalid_argument, as the * combination does not make sense. */ ASIO_SYNC_OP_VOID native_non_blocking( bool mode, asio::error_code& ec) { this->get_service().native_non_blocking( this->get_implementation(), mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the descriptor to become ready to read, ready to write, or to /// have pending error conditions. /** * This function is used to perform a blocking wait for a descriptor to enter * a ready to read, write or error condition state. * * @param w Specifies the desired descriptor state. * * @par Example * Waiting for a descriptor to become readable. * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * descriptor.wait(asio::posix::stream_descriptor::wait_read); * @endcode */ void wait(wait_type w) { asio::error_code ec; this->get_service().wait(this->get_implementation(), w, ec); asio::detail::throw_error(ec, "wait"); } /// Wait for the descriptor to become ready to read, ready to write, or to /// have pending error conditions. /** * This function is used to perform a blocking wait for a descriptor to enter * a ready to read, write or error condition state. * * @param w Specifies the desired descriptor state. * * @param ec Set to indicate what error occurred, if any. * * @par Example * Waiting for a descriptor to become readable. * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::error_code ec; * descriptor.wait(asio::posix::stream_descriptor::wait_read, ec); * @endcode */ ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) { this->get_service().wait(this->get_implementation(), w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the descriptor to become ready to read, ready to /// write, or to have pending error conditions. /** * This function is used to perform an asynchronous wait for a descriptor to * enter a ready to read, write or error condition state. * * @param w Specifies the desired descriptor state. * * @param handler The handler to be called when the wait operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error // Result of operation * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * @code * void wait_handler(const asio::error_code& error) * { * if (!error) * { * // Wait succeeded. * } * } * * ... * * asio::posix::stream_descriptor descriptor(io_context); * ... * descriptor.async_wait( * asio::posix::stream_descriptor::wait_read, * wait_handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WaitHandler. ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; async_completion init(handler); this->get_service().async_wait( this->get_implementation(), w, init.completion_handler); return init.result.get(); } protected: /// Protected destructor to prevent deletion through this type. /** * This function destroys the descriptor, cancelling any outstanding * asynchronous wait operations associated with the descriptor as if by * calling @c cancel. */ ~descriptor() { } }; } // namespace posix } // namespace asio #include "asio/detail/pop_options.hpp" #undef ASIO_SVC_T #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // || defined(GENERATING_DOCUMENTATION) #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_POSIX_DESCRIPTOR_HPP asio-1.12.2/include/asio/posix/descriptor_base.hpp000066400000000000000000000043121340672067200221400ustar00rootroot00000000000000// // posix/descriptor_base.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POSIX_DESCRIPTOR_BASE_HPP #define ASIO_POSIX_DESCRIPTOR_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ || defined(GENERATING_DOCUMENTATION) #include "asio/detail/io_control.hpp" #include "asio/detail/socket_option.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace posix { /// The descriptor_base class is used as a base for the descriptor class as a /// place to define the associated IO control commands. class descriptor_base { public: /// Wait types. /** * For use with descriptor::wait() and descriptor::async_wait(). */ enum wait_type { /// Wait for a descriptor to become ready to read. wait_read, /// Wait for a descriptor to become ready to write. wait_write, /// Wait for a descriptor to have error conditions pending. wait_error }; /// IO control command to get the amount of data that can be read without /// blocking. /** * Implements the FIONREAD IO control command. * * @par Example * @code * asio::posix::stream_descriptor descriptor(io_context); * ... * asio::descriptor_base::bytes_readable command(true); * descriptor.io_control(command); * std::size_t bytes_readable = command.get(); * @endcode * * @par Concepts: * IoControlCommand. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined bytes_readable; #else typedef asio::detail::io_control::bytes_readable bytes_readable; #endif protected: /// Protected destructor to prevent deletion through this type. ~descriptor_base() { } }; } // namespace posix } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_POSIX_DESCRIPTOR_BASE_HPP asio-1.12.2/include/asio/posix/stream_descriptor.hpp000066400000000000000000000324451340672067200225310ustar00rootroot00000000000000// // posix/stream_descriptor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POSIX_STREAM_DESCRIPTOR_HPP #define ASIO_POSIX_STREAM_DESCRIPTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/posix/descriptor.hpp" #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ || defined(GENERATING_DOCUMENTATION) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/posix/basic_stream_descriptor.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) namespace asio { namespace posix { #if defined(ASIO_ENABLE_OLD_SERVICES) // Typedef for the typical usage of a stream-oriented descriptor. typedef basic_stream_descriptor<> stream_descriptor; #else // defined(ASIO_ENABLE_OLD_SERVICES) /// Provides stream-oriented descriptor functionality. /** * The posix::stream_descriptor class template provides asynchronous and * blocking stream-oriented descriptor functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ class stream_descriptor : public descriptor { public: /// Construct a stream_descriptor without opening it. /** * This constructor creates a stream descriptor without opening it. The * descriptor needs to be opened and then connected or accepted before data * can be sent or received on it. * * @param io_context The io_context object that the stream descriptor will * use to dispatch handlers for any asynchronous operations performed on the * descriptor. */ explicit stream_descriptor(asio::io_context& io_context) : descriptor(io_context) { } /// Construct a stream_descriptor on an existing native descriptor. /** * This constructor creates a stream descriptor object to hold an existing * native descriptor. * * @param io_context The io_context object that the stream descriptor will * use to dispatch handlers for any asynchronous operations performed on the * descriptor. * * @param native_descriptor The new underlying descriptor implementation. * * @throws asio::system_error Thrown on failure. */ stream_descriptor(asio::io_context& io_context, const native_handle_type& native_descriptor) : descriptor(io_context, native_descriptor) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a stream_descriptor from another. /** * This constructor moves a stream descriptor from one object to another. * * @param other The other stream_descriptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c stream_descriptor(io_context&) constructor. */ stream_descriptor(stream_descriptor&& other) : descriptor(std::move(other)) { } /// Move-assign a stream_descriptor from another. /** * This assignment operator moves a stream descriptor from one object to * another. * * @param other The other stream_descriptor object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c stream_descriptor(io_context&) constructor. */ stream_descriptor& operator=(stream_descriptor&& other) { descriptor::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Write some data to the descriptor. /** * This function is used to write data to the stream descriptor. The function * call will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the descriptor. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * descriptor.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the descriptor. /** * This function is used to write data to the stream descriptor. The function * call will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the descriptor. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the stream * descriptor. The function call always returns immediately. * * @param buffers One or more data buffers to be written to the descriptor. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * descriptor.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; asio::async_completion init(handler); this->get_service().async_write_some( this->get_implementation(), buffers, init.completion_handler); return init.result.get(); } /// Read some data from the descriptor. /** * This function is used to read data from the stream descriptor. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * descriptor.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the descriptor. /** * This function is used to read data from the stream descriptor. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the stream * descriptor. The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * descriptor.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; asio::async_completion init(handler); this->get_service().async_read_some( this->get_implementation(), buffers, init.completion_handler); return init.result.get(); } }; #endif // defined(ASIO_ENABLE_OLD_SERVICES) } // namespace posix } // namespace asio #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_POSIX_STREAM_DESCRIPTOR_HPP asio-1.12.2/include/asio/posix/stream_descriptor_service.hpp000066400000000000000000000202711340672067200242430ustar00rootroot00000000000000// // posix/stream_descriptor_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP #define ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/async_result.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/reactive_descriptor_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace posix { /// Default service implementation for a stream descriptor. class stream_descriptor_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif private: // The type of the platform-specific implementation. typedef detail::reactive_descriptor_service service_impl_type; public: /// The type of a stream descriptor implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef service_impl_type::implementation_type implementation_type; #endif /// The native descriptor type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new stream descriptor service for the specified io_context. explicit stream_descriptor_service(asio::io_context& io_context) : asio::detail::service_base(io_context), service_impl_(io_context) { } /// Construct a new stream descriptor implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new stream descriptor implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another stream descriptor implementation. void move_assign(implementation_type& impl, stream_descriptor_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a stream descriptor implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Assign an existing native descriptor to a stream descriptor. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const native_handle_type& native_descriptor, asio::error_code& ec) { service_impl_.assign(impl, native_descriptor, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the descriptor is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a stream descriptor implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native descriptor implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Release ownership of the native descriptor implementation. native_handle_type release(implementation_type& impl) { return service_impl_.release(impl); } /// Cancel all asynchronous operations associated with the descriptor. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the descriptor. template ASIO_SYNC_OP_VOID io_control(implementation_type& impl, IoControlCommand& command, asio::error_code& ec) { service_impl_.io_control(impl, command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the descriptor. bool non_blocking(const implementation_type& impl) const { return service_impl_.non_blocking(impl); } /// Sets the non-blocking mode of the descriptor. ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native descriptor implementation. bool native_non_blocking(const implementation_type& impl) const { return service_impl_.native_non_blocking(impl); } /// Sets the non-blocking mode of the native descriptor implementation. ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.native_non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the descriptor to become ready to read, ready to write, or to /// have pending error conditions. ASIO_SYNC_OP_VOID wait(implementation_type& impl, descriptor_base::wait_type w, asio::error_code& ec) { service_impl_.wait(impl, w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the descriptor to become ready to read, ready to /// write, or to have pending error conditions. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, descriptor_base::wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, w, init.completion_handler); return init.result.get(); } /// Write the given data to the stream. template std::size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { return service_impl_.write_some(impl, buffers, ec); } /// Start an asynchronous write. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { asio::async_completion init(handler); service_impl_.async_write_some(impl, buffers, init.completion_handler); return init.result.get(); } /// Read some data from the stream. template std::size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { return service_impl_.read_some(impl, buffers, ec); } /// Start an asynchronous read. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { asio::async_completion init(handler); service_impl_.async_read_some(impl, buffers, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace posix } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP asio-1.12.2/include/asio/post.hpp000066400000000000000000000073251340672067200166220ustar00rootroot00000000000000// // post.hpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_POST_HPP #define ASIO_POST_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/execution_context.hpp" #include "asio/is_executor.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the object's associated * executor. The function object is queued for execution, and is never called * from the current thread prior to returning from post(). * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with handler(forward(token)). * * @li Constructs an object @c result of type async_result, * initializing the object as result(handler). * * @li Obtains the handler's associated executor object @c ex by performing * get_associated_executor(handler). * * @li Obtains the handler's associated allocator object @c alloc by performing * get_associated_allocator(handler). * * @li Performs ex.post(std::move(handler), alloc). * * @li Returns result.get(). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( ASIO_MOVE_ARG(CompletionToken) token); /// Submits a completion token or function object for execution. /** * This function submits an object for execution using the specified executor. * The function object is queued for execution, and is never called from the * current thread prior to returning from post(). * * This function has the following effects: * * @li Constructs a function object handler of type @c Handler, initialized * with handler(forward(token)). * * @li Constructs an object @c result of type async_result, * initializing the object as result(handler). * * @li Obtains the handler's associated executor object @c ex1 by performing * get_associated_executor(handler). * * @li Creates a work object @c w by performing make_work(ex1). * * @li Obtains the handler's associated allocator object @c alloc by performing * get_associated_allocator(handler). * * @li Constructs a function object @c f with a function call operator that * performs ex1.dispatch(std::move(handler), alloc) followed by * w.reset(). * * @li Performs Executor(ex).post(std::move(f), alloc). * * @li Returns result.get(). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type* = 0); /// Submits a completion token or function object for execution. /** * @returns post(ctx.get_executor(), forward(token)). */ template ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, typename enable_if::value>::type* = 0); } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/post.hpp" #endif // ASIO_POST_HPP asio-1.12.2/include/asio/raw_socket_service.hpp000066400000000000000000000341421340672067200215130ustar00rootroot00000000000000// // raw_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_RAW_SOCKET_SERVICE_HPP #define ASIO_RAW_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/null_socket_service.hpp" #elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" #else # include "asio/detail/reactive_socket_service.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a raw socket. template class raw_socket_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; private: // The type of the platform-specific implementation. #if defined(ASIO_WINDOWS_RUNTIME) typedef detail::null_socket_service service_impl_type; #elif defined(ASIO_HAS_IOCP) typedef detail::win_iocp_socket_service service_impl_type; #else typedef detail::reactive_socket_service service_impl_type; #endif public: /// The type of a raw socket. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// The native socket type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new raw socket service for the specified io_context. explicit raw_socket_service(asio::io_context& io_context) : asio::detail::service_base< raw_socket_service >(io_context), service_impl_(io_context) { } /// Construct a new raw socket implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new raw socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another raw socket implementation. void move_assign(implementation_type& impl, raw_socket_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } // All socket services have access to each other's implementations. template friend class raw_socket_service; /// Move-construct a new raw socket implementation from another protocol /// type. template void converting_move_construct(implementation_type& impl, raw_socket_service& other_service, typename raw_socket_service< Protocol1>::implementation_type& other_impl, typename enable_if::value>::type* = 0) { service_impl_.template converting_move_construct( impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a raw socket implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } // Open a new raw socket implementation. ASIO_SYNC_OP_VOID open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (protocol.type() == ASIO_OS_DEF(SOCK_RAW)) service_impl_.open(impl, protocol, ec); else ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native socket to a raw socket. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { service_impl_.assign(impl, protocol, native_socket, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a raw socket implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying socket. native_handle_type release(implementation_type& impl, asio::error_code& ec) { return service_impl_.release(impl, ec); } /// Get the native socket implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the socket. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is at the out-of-band data mark. bool at_mark(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.at_mark(impl, ec); } /// Determine the number of bytes available for reading. std::size_t available(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.available(impl, ec); } // Bind the raw socket to the specified local endpoint. ASIO_SYNC_OP_VOID bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { service_impl_.bind(impl, endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Connect the raw socket to the specified endpoint. ASIO_SYNC_OP_VOID connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { service_impl_.connect(impl, peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous connect. template ASIO_INITFN_RESULT_TYPE(ConnectHandler, void (asio::error_code)) async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, ASIO_MOVE_ARG(ConnectHandler) handler) { async_completion init(handler); service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); return init.result.get(); } /// Set a socket option. template ASIO_SYNC_OP_VOID set_option(implementation_type& impl, const SettableSocketOption& option, asio::error_code& ec) { service_impl_.set_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get a socket option. template ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, GettableSocketOption& option, asio::error_code& ec) const { service_impl_.get_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the socket. template ASIO_SYNC_OP_VOID io_control(implementation_type& impl, IoControlCommand& command, asio::error_code& ec) { service_impl_.io_control(impl, command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the socket. bool non_blocking(const implementation_type& impl) const { return service_impl_.non_blocking(impl); } /// Sets the non-blocking mode of the socket. ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const implementation_type& impl) const { return service_impl_.native_non_blocking(impl); } /// Sets the non-blocking mode of the native socket implementation. ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.native_non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.local_endpoint(impl, ec); } /// Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.remote_endpoint(impl, ec); } /// Disable sends or receives on the socket. ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, socket_base::shutdown_type what, asio::error_code& ec) { service_impl_.shutdown(impl, what, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the socket to become ready to read, ready to write, or to have /// pending error conditions. ASIO_SYNC_OP_VOID wait(implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { service_impl_.wait(impl, w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the socket to become ready to read, ready to /// write, or to have pending error conditions. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, socket_base::wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, w, init.completion_handler); return init.result.get(); } /// Send the given data to the peer. template std::size_t send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.send(impl, buffers, flags, ec); } /// Start an asynchronous send. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_send(impl, buffers, flags, init.completion_handler); return init.result.get(); } /// Send raw data to the specified endpoint. template std::size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.send_to(impl, buffers, destination, flags, ec); } /// Start an asynchronous send. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send_to(implementation_type& impl, const ConstBufferSequence& buffers, const endpoint_type& destination, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_send_to(impl, buffers, destination, flags, init.completion_handler); return init.result.get(); } /// Receive some data from the peer. template std::size_t receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.receive(impl, buffers, flags, ec); } /// Start an asynchronous receive. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_receive(impl, buffers, flags, init.completion_handler); return init.result.get(); } /// Receive raw data with the endpoint of the sender. template std::size_t receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.receive_from(impl, buffers, sender_endpoint, flags, ec); } /// Start an asynchronous receive that will get the endpoint of the sender. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive_from(implementation_type& impl, const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_receive_from(impl, buffers, sender_endpoint, flags, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_RAW_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/read.hpp000066400000000000000000001123231340672067200165430ustar00rootroot00000000000000// // read.hpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_READ_HPP #define ASIO_READ_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/buffer.hpp" #include "asio/error.hpp" #if !defined(ASIO_NO_EXTENSIONS) # include "asio/basic_streambuf_fwd.hpp" #endif // !defined(ASIO_NO_EXTENSIONS) #include "asio/detail/push_options.hpp" namespace asio { /** * @defgroup read asio::read * * @brief The @c read function is a composed operation that reads a certain * amount of data from a stream before returning. */ /*@{*/ /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * stream. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::read(s, asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::read( * s, buffers, * asio::transfer_all()); @endcode */ template std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, typename enable_if< is_mutable_buffer_sequence::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * stream. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::read(s, asio::buffer(data, size), ec); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::read( * s, buffers, * asio::transfer_all(), ec); @endcode */ template std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, asio::error_code& ec, typename enable_if< is_mutable_buffer_sequence::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * stream. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's read_some function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::read(s, asio::buffer(data, size), * asio::transfer_at_least(32)); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, typename enable_if< is_mutable_buffer_sequence::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * stream. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's read_some function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_mutable_buffer_sequence::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The specified dynamic buffer sequence is full (that is, it has reached * maximum size). * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @note This overload is equivalent to calling: * @code asio::read( * s, buffers, * asio::transfer_all()); @endcode */ template std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @note This overload is equivalent to calling: * @code asio::read( * s, buffers, * asio::transfer_all(), ec); @endcode */ template std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The specified dynamic buffer sequence is full (that is, it has reached * maximum size). * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's read_some function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. */ template std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The specified dynamic buffer sequence is full (that is, it has reached * maximum size). * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's read_some function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t read(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b The basic_streambuf object into which the data will be read. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @note This overload is equivalent to calling: * @code asio::read( * s, b, * asio::transfer_all()); @endcode */ template std::size_t read(SyncReadStream& s, basic_streambuf& b); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b The basic_streambuf object into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @note This overload is equivalent to calling: * @code asio::read( * s, b, * asio::transfer_all(), ec); @endcode */ template std::size_t read(SyncReadStream& s, basic_streambuf& b, asio::error_code& ec); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b The basic_streambuf object into which the data will be read. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's read_some function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. */ template std::size_t read(SyncReadStream& s, basic_streambuf& b, CompletionCondition completion_condition); /// Attempt to read a certain amount of data from a stream before returning. /** * This function is used to read a certain number of bytes of data from a * stream. The call will block until one of the following conditions is true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b The basic_streambuf object into which the data will be read. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's read_some function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t read(SyncReadStream& s, basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ /** * @defgroup async_read asio::async_read * * @brief The @c async_read function is a composed asynchronous operation that * reads a certain amount of data from a stream before completion. */ /*@{*/ /// Start an asynchronous operation to read a certain amount of data from a /// stream. /** * This function is used to asynchronously read a certain number of bytes of * data from a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions is * true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. The * program must ensure that the stream performs no other read operations (such * as async_read, the stream's async_read_some function, or any other composed * operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * stream. Although the buffers object may be copied as necessary, ownership of * the underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes copied into the * // buffers. If an error occurred, * // this will be the number of * // bytes successfully transferred * // prior to the error. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * asio::async_read(s, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::async_read( * s, buffers, * asio::transfer_all(), * handler); @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_mutable_buffer_sequence::value >::type* = 0); /// Start an asynchronous operation to read a certain amount of data from a /// stream. /** * This function is used to asynchronously read a certain number of bytes of * data from a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions is * true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * stream. Although the buffers object may be copied as necessary, ownership of * the underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's async_read_some function. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes copied into the * // buffers. If an error occurred, * // this will be the number of * // bytes successfully transferred * // prior to the error. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::async_read(s, * asio::buffer(data, size), * asio::transfer_at_least(32), * handler); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_mutable_buffer_sequence::value >::type* = 0); /// Start an asynchronous operation to read a certain amount of data from a /// stream. /** * This function is used to asynchronously read a certain number of bytes of * data from a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions is * true: * * @li The specified dynamic buffer sequence is full (that is, it has reached * maximum size). * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. The * program must ensure that the stream performs no other read operations (such * as async_read, the stream's async_read_some function, or any other composed * operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes copied into the * // buffers. If an error occurred, * // this will be the number of * // bytes successfully transferred * // prior to the error. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note This overload is equivalent to calling: * @code asio::async_read( * s, buffers, * asio::transfer_all(), * handler); @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Start an asynchronous operation to read a certain amount of data from a /// stream. /** * This function is used to asynchronously read a certain number of bytes of * data from a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions is * true: * * @li The specified dynamic buffer sequence is full (that is, it has reached * maximum size). * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. The * program must ensure that the stream performs no other read operations (such * as async_read, the stream's async_read_some function, or any other composed * operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's async_read_some function. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes copied into the * // buffers. If an error occurred, * // this will be the number of * // bytes successfully transferred * // prior to the error. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Start an asynchronous operation to read a certain amount of data from a /// stream. /** * This function is used to asynchronously read a certain number of bytes of * data from a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions is * true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. The * program must ensure that the stream performs no other read operations (such * as async_read, the stream's async_read_some function, or any other composed * operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param b A basic_streambuf object into which the data will be read. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes copied into the * // buffers. If an error occurred, * // this will be the number of * // bytes successfully transferred * // prior to the error. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note This overload is equivalent to calling: * @code asio::async_read( * s, b, * asio::transfer_all(), * handler); @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, basic_streambuf& b, ASIO_MOVE_ARG(ReadHandler) handler); /// Start an asynchronous operation to read a certain amount of data from a /// stream. /** * This function is used to asynchronously read a certain number of bytes of * data from a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions is * true: * * @li The supplied buffer is full (that is, it has reached maximum size). * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. The * program must ensure that the stream performs no other read operations (such * as async_read, the stream's async_read_some function, or any other composed * operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param b A basic_streambuf object into which the data will be read. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_read_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the stream's async_read_some function. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes copied into the * // buffers. If an error occurred, * // this will be the number of * // bytes successfully transferred * // prior to the error. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read(AsyncReadStream& s, basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/read.hpp" #endif // ASIO_READ_HPP asio-1.12.2/include/asio/read_at.hpp000066400000000000000000000624411340672067200172340ustar00rootroot00000000000000// // read_at.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_READ_AT_HPP #define ASIO_READ_AT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/detail/cstdint.hpp" #include "asio/error.hpp" #if !defined(ASIO_NO_EXTENSIONS) # include "asio/basic_streambuf_fwd.hpp" #endif // !defined(ASIO_NO_EXTENSIONS) #include "asio/detail/push_options.hpp" namespace asio { /** * @defgroup read_at asio::read_at * * @brief The @c read_at function is a composed operation that reads a certain * amount of data at the specified offset before returning. */ /*@{*/ /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * device. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::read_at(d, 42, asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::read_at( * d, 42, buffers, * asio::transfer_all()); @endcode */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers); /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * device. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::read_at(d, 42, * asio::buffer(data, size), ec); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::read_at( * d, 42, buffers, * asio::transfer_all(), ec); @endcode */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, asio::error_code& ec); /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * device. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the device's read_some_at function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::read_at(d, 42, asio::buffer(data, size), * asio::transfer_at_least(32)); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition); /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * device. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the device's read_some_at function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param b The basic_streambuf object into which the data will be read. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @note This overload is equivalent to calling: * @code asio::read_at( * d, 42, b, * asio::transfer_all()); @endcode */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, basic_streambuf& b); /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param b The basic_streambuf object into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @note This overload is equivalent to calling: * @code asio::read_at( * d, 42, b, * asio::transfer_all(), ec); @endcode */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, basic_streambuf& b, asio::error_code& ec); /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param b The basic_streambuf object into which the data will be read. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the device's read_some_at function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, basic_streambuf& b, CompletionCondition completion_condition); /// Attempt to read a certain amount of data at the specified offset before /// returning. /** * This function is used to read a certain number of bytes of data from a * random access device at the specified offset. The call will block until one * of the following conditions is true: * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * read_some_at function. * * @param d The device from which the data is to be read. The type must support * the SyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param b The basic_streambuf object into which the data will be read. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest read_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the device's read_some_at function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t read_at(SyncRandomAccessReadDevice& d, uint64_t offset, basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ /** * @defgroup async_read_at asio::async_read_at * * @brief The @c async_read_at function is a composed asynchronous operation * that reads a certain amount of data at the specified offset. */ /*@{*/ /// Start an asynchronous operation to read a certain amount of data at the /// specified offset. /** * This function is used to asynchronously read a certain number of bytes of * data from a random access device at the specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * async_read_some_at function. * * @param d The device from which the data is to be read. The type must support * the AsyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * device. Although the buffers object may be copied as necessary, ownership of * the underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes copied into the buffers. If an error * // occurred, this will be the number of bytes successfully * // transferred prior to the error. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * asio::async_read_at(d, 42, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::async_read_at( * d, 42, buffers, * asio::transfer_all(), * handler); @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler); /// Start an asynchronous operation to read a certain amount of data at the /// specified offset. /** * This function is used to asynchronously read a certain number of bytes of * data from a random access device at the specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li The supplied buffers are full. That is, the bytes transferred is equal to * the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * @param d The device from which the data is to be read. The type must support * the AsyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. The sum * of the buffer sizes indicates the maximum number of bytes to read from the * device. Although the buffers object may be copied as necessary, ownership of * the underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_read_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the device's async_read_some_at function. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes copied into the buffers. If an error * // occurred, this will be the number of bytes successfully * // transferred prior to the error. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code asio::async_read_at(d, 42, * asio::buffer(data, size), * asio::transfer_at_least(32), * handler); @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, const MutableBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Start an asynchronous operation to read a certain amount of data at the /// specified offset. /** * This function is used to asynchronously read a certain number of bytes of * data from a random access device at the specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * async_read_some_at function. * * @param d The device from which the data is to be read. The type must support * the AsyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param b A basic_streambuf object into which the data will be read. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes copied into the buffers. If an error * // occurred, this will be the number of bytes successfully * // transferred prior to the error. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note This overload is equivalent to calling: * @code asio::async_read_at( * d, 42, b, * asio::transfer_all(), * handler); @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, basic_streambuf& b, ASIO_MOVE_ARG(ReadHandler) handler); /// Start an asynchronous operation to read a certain amount of data at the /// specified offset. /** * This function is used to asynchronously read a certain number of bytes of * data from a random access device at the specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * async_read_some_at function. * * @param d The device from which the data is to be read. The type must support * the AsyncRandomAccessReadDevice concept. * * @param offset The offset at which the data will be read. * * @param b A basic_streambuf object into which the data will be read. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the read operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_read_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the read operation is complete. A non-zero * return value indicates the maximum number of bytes to be read on the next * call to the device's async_read_some_at function. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes copied into the buffers. If an error * // occurred, this will be the number of bytes successfully * // transferred prior to the error. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(ReadHandler) handler); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/read_at.hpp" #endif // ASIO_READ_AT_HPP asio-1.12.2/include/asio/read_until.hpp000066400000000000000000002203441340672067200177610ustar00rootroot00000000000000// // read_until.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_READ_UNTIL_HPP #define ASIO_READ_UNTIL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/async_result.hpp" #include "asio/detail/regex_fwd.hpp" #include "asio/detail/string_view.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #if !defined(ASIO_NO_EXTENSIONS) # include "asio/basic_streambuf_fwd.hpp" #endif // !defined(ASIO_NO_EXTENSIONS) #include "asio/detail/push_options.hpp" namespace asio { namespace detail { char (&has_result_type_helper(...))[2]; template char has_result_type_helper(T*, typename T::result_type* = 0); template struct has_result_type { enum { value = (sizeof((has_result_type_helper)((T*)(0))) == 1) }; }; } // namespace detail /// Type trait used to determine whether a type can be used as a match condition /// function with read_until and async_read_until. template struct is_match_condition { #if defined(GENERATING_DOCUMENTATION) /// The value member is true if the type may be used as a match condition. static const bool value; #else enum { value = asio::is_function< typename asio::remove_pointer::type>::value || detail::has_result_type::value }; #endif }; /** * @defgroup read_until asio::read_until * * @brief The @c read_until function is a composed operation that reads data * into a dynamic buffer sequence, or into a streambuf, until it contains a * delimiter, matches a regular expression, or a function object indicates a * match. */ /*@{*/ /// Read data into a dynamic buffer sequence until it contains a specified /// delimiter. /** * This function is used to read data into the specified dynamic buffer * sequence until the dynamic buffer sequence's get area contains the specified * delimiter. The call will block until one of the following conditions is * true: * * @li The get area of the dynamic buffer sequence contains the specified * delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the dynamic buffer sequence's get area already * contains the delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param delim The delimiter character. * * @returns The number of bytes in the dynamic buffer sequence's get area up to * and including the delimiter. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond the delimiter. An application will * typically leave that data in the dynamic buffer sequence for a subsequent * read_until operation to examine. * * @par Example * To read data into a @c std::string until a newline is encountered: * @code std::string data; * std::string n = asio::read_until(s, * asio::dynamic_buffer(data), '\n'); * std::string line = data.substr(0, n); * data.erase(0, n); @endcode * After the @c read_until operation completes successfully, the string @c data * contains the delimiter: * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode * The call to @c substr then extracts the data up to and including the * delimiter, so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\n' } @endcode * After the call to @c erase, the remaining data is left in the buffer @c b as * follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c read_until operation. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim); /// Read data into a dynamic buffer sequence until it contains a specified /// delimiter. /** * This function is used to read data into the specified dynamic buffer * sequence until the dynamic buffer sequence's get area contains the specified * delimiter. The call will block until one of the following conditions is * true: * * @li The get area of the dynamic buffer sequence contains the specified * delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the dynamic buffer sequence's get area already * contains the delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param delim The delimiter character. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the dynamic buffer sequence's get area up to * and including the delimiter. Returns 0 if an error occurred. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond the delimiter. An application will * typically leave that data in the dynamic buffer sequence for a subsequent * read_until operation to examine. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim, asio::error_code& ec); /// Read data into a dynamic buffer sequence until it contains a specified /// delimiter. /** * This function is used to read data into the specified dynamic buffer * sequence until the dynamic buffer sequence's get area contains the specified * delimiter. The call will block until one of the following conditions is * true: * * @li The get area of the dynamic buffer sequence contains the specified * delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the dynamic buffer sequence's get area already * contains the delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param delim The delimiter string. * * @returns The number of bytes in the dynamic buffer sequence's get area up to * and including the delimiter. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond the delimiter. An application will * typically leave that data in the dynamic buffer sequence for a subsequent * read_until operation to examine. * * @par Example * To read data into a @c std::string until a CR-LF sequence is encountered: * @code std::string data; * std::string n = asio::read_until(s, * asio::dynamic_buffer(data), "\r\n"); * std::string line = data.substr(0, n); * data.erase(0, n); @endcode * After the @c read_until operation completes successfully, the string @c data * contains the delimiter: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c substr then extracts the data up to and including the * delimiter, so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode * After the call to @c erase, the remaining data is left in the buffer @c b as * follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c read_until operation. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_STRING_VIEW_PARAM delim); /// Read data into a dynamic buffer sequence until it contains a specified /// delimiter. /** * This function is used to read data into the specified dynamic buffer * sequence until the dynamic buffer sequence's get area contains the specified * delimiter. The call will block until one of the following conditions is * true: * * @li The get area of the dynamic buffer sequence contains the specified * delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the dynamic buffer sequence's get area already * contains the delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * * @param delim The delimiter string. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the dynamic buffer sequence's get area up to * and including the delimiter. Returns 0 if an error occurred. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond the delimiter. An application will * typically leave that data in the dynamic buffer sequence for a subsequent * read_until operation to examine. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec); #if !defined(ASIO_NO_EXTENSIONS) #if defined(ASIO_HAS_BOOST_REGEX) \ || defined(GENERATING_DOCUMENTATION) /// Read data into a dynamic buffer sequence until some part of the data it /// contains matches a regular expression. /** * This function is used to read data into the specified dynamic buffer * sequence until the dynamic buffer sequence's get area contains some data * that matches a regular expression. The call will block until one of the * following conditions is true: * * @li A substring of the dynamic buffer sequence's get area matches the * regular expression. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the dynamic buffer sequence's get area already * contains data that matches the regular expression, the function returns * immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers A dynamic buffer sequence into which the data will be read. * * @param expr The regular expression. * * @returns The number of bytes in the dynamic buffer sequence's get area up to * and including the substring that matches the regular expression. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond that which matched the regular * expression. An application will typically leave that data in the dynamic * buffer sequence for a subsequent read_until operation to examine. * * @par Example * To read data into a @c std::string until a CR-LF sequence is encountered: * @code std::string data; * std::string n = asio::read_until(s, * asio::dynamic_buffer(data), boost::regex("\r\n")); * std::string line = data.substr(0, n); * data.erase(0, n); @endcode * After the @c read_until operation completes successfully, the string @c data * contains the delimiter: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c substr then extracts the data up to and including the * delimiter, so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode * After the call to @c erase, the remaining data is left in the buffer @c b as * follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c read_until operation. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, const boost::regex& expr); /// Read data into a dynamic buffer sequence until some part of the data it /// contains matches a regular expression. /** * This function is used to read data into the specified dynamic buffer * sequence until the dynamic buffer sequence's get area contains some data * that matches a regular expression. The call will block until one of the * following conditions is true: * * @li A substring of the dynamic buffer sequence's get area matches the * regular expression. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the dynamic buffer sequence's get area already * contains data that matches the regular expression, the function returns * immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers A dynamic buffer sequence into which the data will be read. * * @param expr The regular expression. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the dynamic buffer sequence's get area up to * and including the substring that matches the regular expression. Returns 0 * if an error occurred. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond that which matched the regular * expression. An application will typically leave that data in the dynamic * buffer sequence for a subsequent read_until operation to examine. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, const boost::regex& expr, asio::error_code& ec); #endif // defined(ASIO_HAS_BOOST_REGEX) // || defined(GENERATING_DOCUMENTATION) /// Read data into a dynamic buffer sequence until a function object indicates a /// match. /** * This function is used to read data into the specified dynamic buffer * sequence until a user-defined match condition function object, when applied * to the data contained in the dynamic buffer sequence, indicates a successful * match. The call will block until one of the following conditions is true: * * @li The match condition function object returns a std::pair where the second * element evaluates to true. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the match condition function object already indicates * a match, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers A dynamic buffer sequence into which the data will be read. * * @param match_condition The function object to be called to determine whether * a match exists. The signature of the function object must be: * @code pair match_condition(iterator begin, iterator end); * @endcode * where @c iterator represents the type: * @code buffers_iterator * @endcode * The iterator parameters @c begin and @c end define the range of bytes to be * scanned to determine whether there is a match. The @c first member of the * return value is an iterator marking one-past-the-end of the bytes that have * been consumed by the match function. This iterator is used to calculate the * @c begin parameter for any subsequent invocation of the match condition. The * @c second member of the return value is true if a match has been found, false * otherwise. * * @returns The number of bytes in the dynamic_buffer's get area that * have been fully consumed by the match function. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond that which matched the function object. * An application will typically leave that data in the dynamic buffer sequence * for a subsequent read_until operation to examine. * @note The default implementation of the @c is_match_condition type trait * evaluates to true for function pointers and function objects with a * @c result_type typedef. It must be specialised for other user-defined * function objects. * * @par Examples * To read data into a dynamic buffer sequence until whitespace is encountered: * @code typedef asio::buffers_iterator< * asio::const_buffers_1> iterator; * * std::pair * match_whitespace(iterator begin, iterator end) * { * iterator i = begin; * while (i != end) * if (std::isspace(*i++)) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * ... * std::string data; * asio::read_until(s, data, match_whitespace); * @endcode * * To read data into a @c std::string until a matching character is found: * @code class match_char * { * public: * explicit match_char(char c) : c_(c) {} * * template * std::pair operator()( * Iterator begin, Iterator end) const * { * Iterator i = begin; * while (i != end) * if (c_ == *i++) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * * private: * char c_; * }; * * namespace asio { * template <> struct is_match_condition * : public boost::true_type {}; * } // namespace asio * ... * std::string data; * asio::read_until(s, data, match_char('a')); * @endcode */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, MatchCondition match_condition, typename enable_if::value>::type* = 0); /// Read data into a dynamic buffer sequence until a function object indicates a /// match. /** * This function is used to read data into the specified dynamic buffer * sequence until a user-defined match condition function object, when applied * to the data contained in the dynamic buffer sequence, indicates a successful * match. The call will block until one of the following conditions is true: * * @li The match condition function object returns a std::pair where the second * element evaluates to true. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the match condition function object already indicates * a match, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param buffers A dynamic buffer sequence into which the data will be read. * * @param match_condition The function object to be called to determine whether * a match exists. The signature of the function object must be: * @code pair match_condition(iterator begin, iterator end); * @endcode * where @c iterator represents the type: * @code buffers_iterator * @endcode * The iterator parameters @c begin and @c end define the range of bytes to be * scanned to determine whether there is a match. The @c first member of the * return value is an iterator marking one-past-the-end of the bytes that have * been consumed by the match function. This iterator is used to calculate the * @c begin parameter for any subsequent invocation of the match condition. The * @c second member of the return value is true if a match has been found, false * otherwise. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the dynamic buffer sequence's get area that * have been fully consumed by the match function. Returns 0 if an error * occurred. * * @note After a successful read_until operation, the dynamic buffer sequence * may contain additional data beyond that which matched the function object. * An application will typically leave that data in the dynamic buffer sequence * for a subsequent read_until operation to examine. * * @note The default implementation of the @c is_match_condition type trait * evaluates to true for function pointers and function objects with a * @c result_type typedef. It must be specialised for other user-defined * function objects. */ template std::size_t read_until(SyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, MatchCondition match_condition, asio::error_code& ec, typename enable_if::value>::type* = 0); #if !defined(ASIO_NO_IOSTREAM) /// Read data into a streambuf until it contains a specified delimiter. /** * This function is used to read data into the specified streambuf until the * streambuf's get area contains the specified delimiter. The call will block * until one of the following conditions is true: * * @li The get area of the streambuf contains the specified delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the streambuf's get area already contains the * delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param delim The delimiter character. * * @returns The number of bytes in the streambuf's get area up to and including * the delimiter. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond the delimiter. An application will typically leave * that data in the streambuf for a subsequent read_until operation to examine. * * @par Example * To read data into a streambuf until a newline is encountered: * @code asio::streambuf b; * asio::read_until(s, b, '\n'); * std::istream is(&b); * std::string line; * std::getline(is, line); @endcode * After the @c read_until operation completes successfully, the buffer @c b * contains the delimiter: * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode * The call to @c std::getline then extracts the data up to and including the * newline (which is discarded), so that the string @c line contains: * @code { 'a', 'b', ..., 'c' } @endcode * The remaining data is left in the buffer @c b as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c read_until operation. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, char delim); /// Read data into a streambuf until it contains a specified delimiter. /** * This function is used to read data into the specified streambuf until the * streambuf's get area contains the specified delimiter. The call will block * until one of the following conditions is true: * * @li The get area of the streambuf contains the specified delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the streambuf's get area already contains the * delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param delim The delimiter character. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the streambuf's get area up to and including * the delimiter. Returns 0 if an error occurred. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond the delimiter. An application will typically leave * that data in the streambuf for a subsequent read_until operation to examine. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, char delim, asio::error_code& ec); /// Read data into a streambuf until it contains a specified delimiter. /** * This function is used to read data into the specified streambuf until the * streambuf's get area contains the specified delimiter. The call will block * until one of the following conditions is true: * * @li The get area of the streambuf contains the specified delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the streambuf's get area already contains the * delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param delim The delimiter string. * * @returns The number of bytes in the streambuf's get area up to and including * the delimiter. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond the delimiter. An application will typically leave * that data in the streambuf for a subsequent read_until operation to examine. * * @par Example * To read data into a streambuf until a newline is encountered: * @code asio::streambuf b; * asio::read_until(s, b, "\r\n"); * std::istream is(&b); * std::string line; * std::getline(is, line); @endcode * After the @c read_until operation completes successfully, the buffer @c b * contains the delimiter: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c std::getline then extracts the data up to and including the * newline (which is discarded), so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r' } @endcode * The remaining data is left in the buffer @c b as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c read_until operation. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, ASIO_STRING_VIEW_PARAM delim); /// Read data into a streambuf until it contains a specified delimiter. /** * This function is used to read data into the specified streambuf until the * streambuf's get area contains the specified delimiter. The call will block * until one of the following conditions is true: * * @li The get area of the streambuf contains the specified delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the streambuf's get area already contains the * delimiter, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param delim The delimiter string. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the streambuf's get area up to and including * the delimiter. Returns 0 if an error occurred. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond the delimiter. An application will typically leave * that data in the streambuf for a subsequent read_until operation to examine. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec); #if defined(ASIO_HAS_BOOST_REGEX) \ || defined(GENERATING_DOCUMENTATION) /// Read data into a streambuf until some part of the data it contains matches /// a regular expression. /** * This function is used to read data into the specified streambuf until the * streambuf's get area contains some data that matches a regular expression. * The call will block until one of the following conditions is true: * * @li A substring of the streambuf's get area matches the regular expression. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the streambuf's get area already contains data that * matches the regular expression, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param expr The regular expression. * * @returns The number of bytes in the streambuf's get area up to and including * the substring that matches the regular expression. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond that which matched the regular expression. An * application will typically leave that data in the streambuf for a subsequent * read_until operation to examine. * * @par Example * To read data into a streambuf until a CR-LF sequence is encountered: * @code asio::streambuf b; * asio::read_until(s, b, boost::regex("\r\n")); * std::istream is(&b); * std::string line; * std::getline(is, line); @endcode * After the @c read_until operation completes successfully, the buffer @c b * contains the data which matched the regular expression: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c std::getline then extracts the data up to and including the * newline (which is discarded), so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r' } @endcode * The remaining data is left in the buffer @c b as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c read_until operation. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, const boost::regex& expr); /// Read data into a streambuf until some part of the data it contains matches /// a regular expression. /** * This function is used to read data into the specified streambuf until the * streambuf's get area contains some data that matches a regular expression. * The call will block until one of the following conditions is true: * * @li A substring of the streambuf's get area matches the regular expression. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the streambuf's get area already contains data that * matches the regular expression, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param expr The regular expression. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the streambuf's get area up to and including * the substring that matches the regular expression. Returns 0 if an error * occurred. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond that which matched the regular expression. An * application will typically leave that data in the streambuf for a subsequent * read_until operation to examine. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, const boost::regex& expr, asio::error_code& ec); #endif // defined(ASIO_HAS_BOOST_REGEX) // || defined(GENERATING_DOCUMENTATION) /// Read data into a streambuf until a function object indicates a match. /** * This function is used to read data into the specified streambuf until a * user-defined match condition function object, when applied to the data * contained in the streambuf, indicates a successful match. The call will * block until one of the following conditions is true: * * @li The match condition function object returns a std::pair where the second * element evaluates to true. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the match condition function object already indicates * a match, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param match_condition The function object to be called to determine whether * a match exists. The signature of the function object must be: * @code pair match_condition(iterator begin, iterator end); * @endcode * where @c iterator represents the type: * @code buffers_iterator::const_buffers_type> * @endcode * The iterator parameters @c begin and @c end define the range of bytes to be * scanned to determine whether there is a match. The @c first member of the * return value is an iterator marking one-past-the-end of the bytes that have * been consumed by the match function. This iterator is used to calculate the * @c begin parameter for any subsequent invocation of the match condition. The * @c second member of the return value is true if a match has been found, false * otherwise. * * @returns The number of bytes in the streambuf's get area that have been fully * consumed by the match function. * * @throws asio::system_error Thrown on failure. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond that which matched the function object. An application * will typically leave that data in the streambuf for a subsequent read_until * operation to examine. * * @note The default implementation of the @c is_match_condition type trait * evaluates to true for function pointers and function objects with a * @c result_type typedef. It must be specialised for other user-defined * function objects. * * @par Examples * To read data into a streambuf until whitespace is encountered: * @code typedef asio::buffers_iterator< * asio::streambuf::const_buffers_type> iterator; * * std::pair * match_whitespace(iterator begin, iterator end) * { * iterator i = begin; * while (i != end) * if (std::isspace(*i++)) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * ... * asio::streambuf b; * asio::read_until(s, b, match_whitespace); * @endcode * * To read data into a streambuf until a matching character is found: * @code class match_char * { * public: * explicit match_char(char c) : c_(c) {} * * template * std::pair operator()( * Iterator begin, Iterator end) const * { * Iterator i = begin; * while (i != end) * if (c_ == *i++) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * * private: * char c_; * }; * * namespace asio { * template <> struct is_match_condition * : public boost::true_type {}; * } // namespace asio * ... * asio::streambuf b; * asio::read_until(s, b, match_char('a')); * @endcode */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, MatchCondition match_condition, typename enable_if::value>::type* = 0); /// Read data into a streambuf until a function object indicates a match. /** * This function is used to read data into the specified streambuf until a * user-defined match condition function object, when applied to the data * contained in the streambuf, indicates a successful match. The call will * block until one of the following conditions is true: * * @li The match condition function object returns a std::pair where the second * element evaluates to true. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * read_some function. If the match condition function object already indicates * a match, the function returns immediately. * * @param s The stream from which the data is to be read. The type must support * the SyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param match_condition The function object to be called to determine whether * a match exists. The signature of the function object must be: * @code pair match_condition(iterator begin, iterator end); * @endcode * where @c iterator represents the type: * @code buffers_iterator::const_buffers_type> * @endcode * The iterator parameters @c begin and @c end define the range of bytes to be * scanned to determine whether there is a match. The @c first member of the * return value is an iterator marking one-past-the-end of the bytes that have * been consumed by the match function. This iterator is used to calculate the * @c begin parameter for any subsequent invocation of the match condition. The * @c second member of the return value is true if a match has been found, false * otherwise. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes in the streambuf's get area that have been fully * consumed by the match function. Returns 0 if an error occurred. * * @note After a successful read_until operation, the streambuf may contain * additional data beyond that which matched the function object. An application * will typically leave that data in the streambuf for a subsequent read_until * operation to examine. * * @note The default implementation of the @c is_match_condition type trait * evaluates to true for function pointers and function objects with a * @c result_type typedef. It must be specialised for other user-defined * function objects. */ template std::size_t read_until(SyncReadStream& s, asio::basic_streambuf& b, MatchCondition match_condition, asio::error_code& ec, typename enable_if::value>::type* = 0); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ /** * @defgroup async_read_until asio::async_read_until * * @brief The @c async_read_until function is a composed asynchronous operation * that reads data into a dynamic buffer sequence, or into a streambuf, until * it contains a delimiter, matches a regular expression, or a function object * indicates a match. */ /*@{*/ /// Start an asynchronous operation to read data into a dynamic buffer sequence /// until it contains a specified delimiter. /** * This function is used to asynchronously read data into the specified dynamic * buffer sequence until the dynamic buffer sequence's get area contains the * specified delimiter. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li The get area of the dynamic buffer sequence contains the specified * delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the dynamic buffer sequence's get area already contains the delimiter, this * asynchronous operation completes immediately. The program must ensure that * the stream performs no other read operations (such as async_read, * async_read_until, the stream's async_read_some function, or any other * composed operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param delim The delimiter character. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the dynamic buffer sequence's * // get area up to and including the delimiter. * // 0 if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the dynamic buffer * sequence may contain additional data beyond the delimiter. An application * will typically leave that data in the dynamic buffer sequence for a * subsequent async_read_until operation to examine. * * @par Example * To asynchronously read data into a @c std::string until a newline is * encountered: * @code std::string data; * ... * void handler(const asio::error_code& e, std::size_t size) * { * if (!e) * { * std::string line = data.substr(0, n); * data.erase(0, n); * ... * } * } * ... * asio::async_read_until(s, data, '\n', handler); @endcode * After the @c async_read_until operation completes successfully, the buffer * @c data contains the delimiter: * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode * The call to @c substr then extracts the data up to and including the * delimiter, so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\n' } @endcode * After the call to @c erase, the remaining data is left in the buffer @c data * as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c async_read_until operation. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim, ASIO_MOVE_ARG(ReadHandler) handler); /// Start an asynchronous operation to read data into a dynamic buffer sequence /// until it contains a specified delimiter. /** * This function is used to asynchronously read data into the specified dynamic * buffer sequence until the dynamic buffer sequence's get area contains the * specified delimiter. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li The get area of the dynamic buffer sequence contains the specified * delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the dynamic buffer sequence's get area already contains the delimiter, this * asynchronous operation completes immediately. The program must ensure that * the stream performs no other read operations (such as async_read, * async_read_until, the stream's async_read_some function, or any other * composed operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param delim The delimiter string. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the dynamic buffer sequence's * // get area up to and including the delimiter. * // 0 if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the dynamic buffer * sequence may contain additional data beyond the delimiter. An application * will typically leave that data in the dynamic buffer sequence for a * subsequent async_read_until operation to examine. * * @par Example * To asynchronously read data into a @c std::string until a CR-LF sequence is * encountered: * @code std::string data; * ... * void handler(const asio::error_code& e, std::size_t size) * { * if (!e) * { * std::string line = data.substr(0, n); * data.erase(0, n); * ... * } * } * ... * asio::async_read_until(s, data, "\r\n", handler); @endcode * After the @c async_read_until operation completes successfully, the string * @c data contains the delimiter: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c substr then extracts the data up to and including the * delimiter, so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode * After the call to @c erase, the remaining data is left in the string @c data * as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c async_read_until operation. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_STRING_VIEW_PARAM delim, ASIO_MOVE_ARG(ReadHandler) handler); #if !defined(ASIO_NO_EXTENSIONS) #if defined(ASIO_HAS_BOOST_REGEX) \ || defined(GENERATING_DOCUMENTATION) /// Start an asynchronous operation to read data into a dynamic buffer sequence /// until some part of its data matches a regular expression. /** * This function is used to asynchronously read data into the specified dynamic * buffer sequence until the dynamic buffer sequence's get area contains some * data that matches a regular expression. The function call always returns * immediately. The asynchronous operation will continue until one of the * following conditions is true: * * @li A substring of the dynamic buffer sequence's get area matches the regular * expression. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the dynamic buffer sequence's get area already contains data that matches * the regular expression, this asynchronous operation completes immediately. * The program must ensure that the stream performs no other read operations * (such as async_read, async_read_until, the stream's async_read_some * function, or any other composed operations that perform reads) until this * operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param expr The regular expression. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the dynamic buffer * // sequence's get area up to and including the * // substring that matches the regular expression. * // 0 if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the dynamic buffer * sequence may contain additional data beyond that which matched the regular * expression. An application will typically leave that data in the dynamic * buffer sequence for a subsequent async_read_until operation to examine. * * @par Example * To asynchronously read data into a @c std::string until a CR-LF sequence is * encountered: * @code std::string data; * ... * void handler(const asio::error_code& e, std::size_t size) * { * if (!e) * { * std::string line = data.substr(0, n); * data.erase(0, n); * ... * } * } * ... * asio::async_read_until(s, data, * boost::regex("\r\n"), handler); @endcode * After the @c async_read_until operation completes successfully, the string * @c data contains the data which matched the regular expression: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c substr then extracts the data up to and including the match, * so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode * After the call to @c erase, the remaining data is left in the string @c data * as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c async_read_until operation. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, const boost::regex& expr, ASIO_MOVE_ARG(ReadHandler) handler); #endif // defined(ASIO_HAS_BOOST_REGEX) // || defined(GENERATING_DOCUMENTATION) /// Start an asynchronous operation to read data into a dynamic buffer sequence /// until a function object indicates a match. /** * This function is used to asynchronously read data into the specified dynamic * buffer sequence until a user-defined match condition function object, when * applied to the data contained in the dynamic buffer sequence, indicates a * successful match. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li The match condition function object returns a std::pair where the second * element evaluates to true. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the match condition function object already indicates a match, this * asynchronous operation completes immediately. The program must ensure that * the stream performs no other read operations (such as async_read, * async_read_until, the stream's async_read_some function, or any other * composed operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param buffers The dynamic buffer sequence into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param match_condition The function object to be called to determine whether * a match exists. The signature of the function object must be: * @code pair match_condition(iterator begin, iterator end); * @endcode * where @c iterator represents the type: * @code buffers_iterator * @endcode * The iterator parameters @c begin and @c end define the range of bytes to be * scanned to determine whether there is a match. The @c first member of the * return value is an iterator marking one-past-the-end of the bytes that have * been consumed by the match function. This iterator is used to calculate the * @c begin parameter for any subsequent invocation of the match condition. The * @c second member of the return value is true if a match has been found, false * otherwise. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the dynamic buffer sequence's * // get area that have been fully consumed by the match * // function. O if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the dynamic buffer * sequence may contain additional data beyond that which matched the function * object. An application will typically leave that data in the dynamic buffer * sequence for a subsequent async_read_until operation to examine. * * @note The default implementation of the @c is_match_condition type trait * evaluates to true for function pointers and function objects with a * @c result_type typedef. It must be specialised for other user-defined * function objects. * * @par Examples * To asynchronously read data into a @c std::string until whitespace is * encountered: * @code typedef asio::buffers_iterator< * asio::const_buffers_1> iterator; * * std::pair * match_whitespace(iterator begin, iterator end) * { * iterator i = begin; * while (i != end) * if (std::isspace(*i++)) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * ... * void handler(const asio::error_code& e, std::size_t size); * ... * std::string data; * asio::async_read_until(s, data, match_whitespace, handler); * @endcode * * To asynchronously read data into a @c std::string until a matching character * is found: * @code class match_char * { * public: * explicit match_char(char c) : c_(c) {} * * template * std::pair operator()( * Iterator begin, Iterator end) const * { * Iterator i = begin; * while (i != end) * if (c_ == *i++) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * * private: * char c_; * }; * * namespace asio { * template <> struct is_match_condition * : public boost::true_type {}; * } // namespace asio * ... * void handler(const asio::error_code& e, std::size_t size); * ... * std::string data; * asio::async_read_until(s, data, match_char('a'), handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if::value>::type* = 0); #if !defined(ASIO_NO_IOSTREAM) /// Start an asynchronous operation to read data into a streambuf until it /// contains a specified delimiter. /** * This function is used to asynchronously read data into the specified * streambuf until the streambuf's get area contains the specified delimiter. * The function call always returns immediately. The asynchronous operation * will continue until one of the following conditions is true: * * @li The get area of the streambuf contains the specified delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the streambuf's get area already contains the delimiter, this asynchronous * operation completes immediately. The program must ensure that the stream * performs no other read operations (such as async_read, async_read_until, the * stream's async_read_some function, or any other composed operations that * perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param b A streambuf object into which the data will be read. Ownership of * the streambuf is retained by the caller, which must guarantee that it remains * valid until the handler is called. * * @param delim The delimiter character. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the streambuf's get * // area up to and including the delimiter. * // 0 if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the streambuf may * contain additional data beyond the delimiter. An application will typically * leave that data in the streambuf for a subsequent async_read_until operation * to examine. * * @par Example * To asynchronously read data into a streambuf until a newline is encountered: * @code asio::streambuf b; * ... * void handler(const asio::error_code& e, std::size_t size) * { * if (!e) * { * std::istream is(&b); * std::string line; * std::getline(is, line); * ... * } * } * ... * asio::async_read_until(s, b, '\n', handler); @endcode * After the @c async_read_until operation completes successfully, the buffer * @c b contains the delimiter: * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode * The call to @c std::getline then extracts the data up to and including the * newline (which is discarded), so that the string @c line contains: * @code { 'a', 'b', ..., 'c' } @endcode * The remaining data is left in the buffer @c b as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c async_read_until operation. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, char delim, ASIO_MOVE_ARG(ReadHandler) handler); /// Start an asynchronous operation to read data into a streambuf until it /// contains a specified delimiter. /** * This function is used to asynchronously read data into the specified * streambuf until the streambuf's get area contains the specified delimiter. * The function call always returns immediately. The asynchronous operation * will continue until one of the following conditions is true: * * @li The get area of the streambuf contains the specified delimiter. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the streambuf's get area already contains the delimiter, this asynchronous * operation completes immediately. The program must ensure that the stream * performs no other read operations (such as async_read, async_read_until, the * stream's async_read_some function, or any other composed operations that * perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param b A streambuf object into which the data will be read. Ownership of * the streambuf is retained by the caller, which must guarantee that it remains * valid until the handler is called. * * @param delim The delimiter string. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the streambuf's get * // area up to and including the delimiter. * // 0 if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the streambuf may * contain additional data beyond the delimiter. An application will typically * leave that data in the streambuf for a subsequent async_read_until operation * to examine. * * @par Example * To asynchronously read data into a streambuf until a newline is encountered: * @code asio::streambuf b; * ... * void handler(const asio::error_code& e, std::size_t size) * { * if (!e) * { * std::istream is(&b); * std::string line; * std::getline(is, line); * ... * } * } * ... * asio::async_read_until(s, b, "\r\n", handler); @endcode * After the @c async_read_until operation completes successfully, the buffer * @c b contains the delimiter: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c std::getline then extracts the data up to and including the * newline (which is discarded), so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r' } @endcode * The remaining data is left in the buffer @c b as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c async_read_until operation. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, ASIO_STRING_VIEW_PARAM delim, ASIO_MOVE_ARG(ReadHandler) handler); #if defined(ASIO_HAS_BOOST_REGEX) \ || defined(GENERATING_DOCUMENTATION) /// Start an asynchronous operation to read data into a streambuf until some /// part of its data matches a regular expression. /** * This function is used to asynchronously read data into the specified * streambuf until the streambuf's get area contains some data that matches a * regular expression. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li A substring of the streambuf's get area matches the regular expression. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the streambuf's get area already contains data that matches the regular * expression, this asynchronous operation completes immediately. The program * must ensure that the stream performs no other read operations (such as * async_read, async_read_until, the stream's async_read_some function, or any * other composed operations that perform reads) until this operation * completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param b A streambuf object into which the data will be read. Ownership of * the streambuf is retained by the caller, which must guarantee that it remains * valid until the handler is called. * * @param expr The regular expression. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the streambuf's get * // area up to and including the substring * // that matches the regular. expression. * // 0 if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the streambuf may * contain additional data beyond that which matched the regular expression. An * application will typically leave that data in the streambuf for a subsequent * async_read_until operation to examine. * * @par Example * To asynchronously read data into a streambuf until a CR-LF sequence is * encountered: * @code asio::streambuf b; * ... * void handler(const asio::error_code& e, std::size_t size) * { * if (!e) * { * std::istream is(&b); * std::string line; * std::getline(is, line); * ... * } * } * ... * asio::async_read_until(s, b, boost::regex("\r\n"), handler); @endcode * After the @c async_read_until operation completes successfully, the buffer * @c b contains the data which matched the regular expression: * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode * The call to @c std::getline then extracts the data up to and including the * newline (which is discarded), so that the string @c line contains: * @code { 'a', 'b', ..., 'c', '\r' } @endcode * The remaining data is left in the buffer @c b as follows: * @code { 'd', 'e', ... } @endcode * This data may be the start of a new line, to be extracted by a subsequent * @c async_read_until operation. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, const boost::regex& expr, ASIO_MOVE_ARG(ReadHandler) handler); #endif // defined(ASIO_HAS_BOOST_REGEX) // || defined(GENERATING_DOCUMENTATION) /// Start an asynchronous operation to read data into a streambuf until a /// function object indicates a match. /** * This function is used to asynchronously read data into the specified * streambuf until a user-defined match condition function object, when applied * to the data contained in the streambuf, indicates a successful match. The * function call always returns immediately. The asynchronous operation will * continue until one of the following conditions is true: * * @li The match condition function object returns a std::pair where the second * element evaluates to true. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_read_some function, and is known as a composed operation. If * the match condition function object already indicates a match, this * asynchronous operation completes immediately. The program must ensure that * the stream performs no other read operations (such as async_read, * async_read_until, the stream's async_read_some function, or any other * composed operations that perform reads) until this operation completes. * * @param s The stream from which the data is to be read. The type must support * the AsyncReadStream concept. * * @param b A streambuf object into which the data will be read. * * @param match_condition The function object to be called to determine whether * a match exists. The signature of the function object must be: * @code pair match_condition(iterator begin, iterator end); * @endcode * where @c iterator represents the type: * @code buffers_iterator::const_buffers_type> * @endcode * The iterator parameters @c begin and @c end define the range of bytes to be * scanned to determine whether there is a match. The @c first member of the * return value is an iterator marking one-past-the-end of the bytes that have * been consumed by the match function. This iterator is used to calculate the * @c begin parameter for any subsequent invocation of the match condition. The * @c second member of the return value is true if a match has been found, false * otherwise. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // The number of bytes in the streambuf's get * // area that have been fully consumed by the * // match function. O if an error occurred. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note After a successful async_read_until operation, the streambuf may * contain additional data beyond that which matched the function object. An * application will typically leave that data in the streambuf for a subsequent * async_read_until operation to examine. * * @note The default implementation of the @c is_match_condition type trait * evaluates to true for function pointers and function objects with a * @c result_type typedef. It must be specialised for other user-defined * function objects. * * @par Examples * To asynchronously read data into a streambuf until whitespace is encountered: * @code typedef asio::buffers_iterator< * asio::streambuf::const_buffers_type> iterator; * * std::pair * match_whitespace(iterator begin, iterator end) * { * iterator i = begin; * while (i != end) * if (std::isspace(*i++)) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * ... * void handler(const asio::error_code& e, std::size_t size); * ... * asio::streambuf b; * asio::async_read_until(s, b, match_whitespace, handler); * @endcode * * To asynchronously read data into a streambuf until a matching character is * found: * @code class match_char * { * public: * explicit match_char(char c) : c_(c) {} * * template * std::pair operator()( * Iterator begin, Iterator end) const * { * Iterator i = begin; * while (i != end) * if (c_ == *i++) * return std::make_pair(i, true); * return std::make_pair(i, false); * } * * private: * char c_; * }; * * namespace asio { * template <> struct is_match_condition * : public boost::true_type {}; * } // namespace asio * ... * void handler(const asio::error_code& e, std::size_t size); * ... * asio::streambuf b; * asio::async_read_until(s, b, match_char('a'), handler); * @endcode */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_until(AsyncReadStream& s, asio::basic_streambuf& b, MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, typename enable_if::value>::type* = 0); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/read_until.hpp" #endif // ASIO_READ_UNTIL_HPP asio-1.12.2/include/asio/seq_packet_socket_service.hpp000066400000000000000000000310241340672067200230350ustar00rootroot00000000000000// // seq_packet_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP #define ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/null_socket_service.hpp" #elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" #else # include "asio/detail/reactive_socket_service.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a sequenced packet socket. template class seq_packet_socket_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base< seq_packet_socket_service > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; private: // The type of the platform-specific implementation. #if defined(ASIO_WINDOWS_RUNTIME) typedef detail::null_socket_service service_impl_type; #elif defined(ASIO_HAS_IOCP) typedef detail::win_iocp_socket_service service_impl_type; #else typedef detail::reactive_socket_service service_impl_type; #endif public: /// The type of a sequenced packet socket implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// The native socket type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new sequenced packet socket service for the specified /// io_context. explicit seq_packet_socket_service(asio::io_context& io_context) : asio::detail::service_base< seq_packet_socket_service >(io_context), service_impl_(io_context) { } /// Construct a new sequenced packet socket implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new sequenced packet socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another sequenced packet socket implementation. void move_assign(implementation_type& impl, seq_packet_socket_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } // All socket services have access to each other's implementations. template friend class seq_packet_socket_service; /// Move-construct a new sequenced packet socket implementation from another /// protocol type. template void converting_move_construct(implementation_type& impl, seq_packet_socket_service& other_service, typename seq_packet_socket_service< Protocol1>::implementation_type& other_impl, typename enable_if::value>::type* = 0) { service_impl_.template converting_move_construct( impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a sequenced packet socket implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Open a sequenced packet socket. ASIO_SYNC_OP_VOID open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (protocol.type() == ASIO_OS_DEF(SOCK_SEQPACKET)) service_impl_.open(impl, protocol, ec); else ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native socket to a sequenced packet socket. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { service_impl_.assign(impl, protocol, native_socket, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a sequenced packet socket implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying socket. native_handle_type release(implementation_type& impl, asio::error_code& ec) { return service_impl_.release(impl, ec); } /// Get the native socket implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the socket. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is at the out-of-band data mark. bool at_mark(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.at_mark(impl, ec); } /// Determine the number of bytes available for reading. std::size_t available(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.available(impl, ec); } /// Bind the sequenced packet socket to the specified local endpoint. ASIO_SYNC_OP_VOID bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { service_impl_.bind(impl, endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Connect the sequenced packet socket to the specified endpoint. ASIO_SYNC_OP_VOID connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { service_impl_.connect(impl, peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous connect. template ASIO_INITFN_RESULT_TYPE(ConnectHandler, void (asio::error_code)) async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, ASIO_MOVE_ARG(ConnectHandler) handler) { async_completion init(handler); service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); return init.result.get(); } /// Set a socket option. template ASIO_SYNC_OP_VOID set_option(implementation_type& impl, const SettableSocketOption& option, asio::error_code& ec) { service_impl_.set_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get a socket option. template ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, GettableSocketOption& option, asio::error_code& ec) const { service_impl_.get_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the socket. template ASIO_SYNC_OP_VOID io_control(implementation_type& impl, IoControlCommand& command, asio::error_code& ec) { service_impl_.io_control(impl, command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the socket. bool non_blocking(const implementation_type& impl) const { return service_impl_.non_blocking(impl); } /// Sets the non-blocking mode of the socket. ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const implementation_type& impl) const { return service_impl_.native_non_blocking(impl); } /// Sets the non-blocking mode of the native socket implementation. ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.native_non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.local_endpoint(impl, ec); } /// Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.remote_endpoint(impl, ec); } /// Disable sends or receives on the socket. ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, socket_base::shutdown_type what, asio::error_code& ec) { service_impl_.shutdown(impl, what, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the socket to become ready to read, ready to write, or to have /// pending error conditions. ASIO_SYNC_OP_VOID wait(implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { service_impl_.wait(impl, w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the socket to become ready to read, ready to /// write, or to have pending error conditions. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, socket_base::wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, w, init.completion_handler); return init.result.get(); } /// Send the given data to the peer. template std::size_t send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.send(impl, buffers, flags, ec); } /// Start an asynchronous send. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_send(impl, buffers, flags, init.completion_handler); return init.result.get(); } /// Receive some data from the peer. template std::size_t receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, asio::error_code& ec) { return service_impl_.receive_with_flags(impl, buffers, in_flags, out_flags, ec); } /// Start an asynchronous receive. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags in_flags, socket_base::message_flags& out_flags, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_receive_with_flags(impl, buffers, in_flags, out_flags, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/serial_port.hpp000066400000000000000000000637171340672067200201670ustar00rootroot00000000000000// // serial_port.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SERIAL_PORT_HPP #define ASIO_SERIAL_PORT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_SERIAL_PORT) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/serial_port_base.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/basic_serial_port.hpp" #else // defined(ASIO_ENABLE_OLD_SERVICES) # if defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_serial_port_service.hpp" # define ASIO_SVC_T detail::win_iocp_serial_port_service # else # include "asio/detail/reactive_serial_port_service.hpp" # define ASIO_SVC_T detail::reactive_serial_port_service # endif #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { #if defined(ASIO_ENABLE_OLD_SERVICES) // Typedef for the typical usage of a serial port. typedef basic_serial_port<> serial_port; #else // defined(ASIO_ENABLE_OLD_SERVICES) /// Provides serial port functionality. /** * The serial_port class provides a wrapper over serial port functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class serial_port : ASIO_SVC_ACCESS basic_io_object, public serial_port_base { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The native representation of a serial port. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef ASIO_SVC_T::native_handle_type native_handle_type; #endif /// A basic_serial_port is always the lowest layer. typedef serial_port lowest_layer_type; /// Construct a serial_port without opening it. /** * This constructor creates a serial port without opening it. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. */ explicit serial_port(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct and open a serial_port. /** * This constructor creates and opens a serial port for the specified device * name. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. * * @param device The platform-specific device name for this serial * port. */ explicit serial_port(asio::io_context& io_context, const char* device) : basic_io_object(io_context) { asio::error_code ec; this->get_service().open(this->get_implementation(), device, ec); asio::detail::throw_error(ec, "open"); } /// Construct and open a serial_port. /** * This constructor creates and opens a serial port for the specified device * name. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. * * @param device The platform-specific device name for this serial * port. */ explicit serial_port(asio::io_context& io_context, const std::string& device) : basic_io_object(io_context) { asio::error_code ec; this->get_service().open(this->get_implementation(), device, ec); asio::detail::throw_error(ec, "open"); } /// Construct a serial_port on an existing native serial port. /** * This constructor creates a serial port object to hold an existing native * serial port. * * @param io_context The io_context object that the serial port will use to * dispatch handlers for any asynchronous operations performed on the port. * * @param native_serial_port A native serial port. * * @throws asio::system_error Thrown on failure. */ serial_port(asio::io_context& io_context, const native_handle_type& native_serial_port) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_serial_port, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a serial_port from another. /** * This constructor moves a serial port from one object to another. * * @param other The other serial_port object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c serial_port(io_context&) constructor. */ serial_port(serial_port&& other) : basic_io_object(std::move(other)) { } /// Move-assign a serial_port from another. /** * This assignment operator moves a serial port from one object to another. * * @param other The other serial_port object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c serial_port(io_context&) constructor. */ serial_port& operator=(serial_port&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroys the serial port. /** * This function destroys the serial port, cancelling any outstanding * asynchronous wait operations associated with the serial port as if by * calling @c cancel. */ ~serial_port() { } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since a serial_port cannot contain any further layers, it simply * returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since a serial_port cannot contain any further layers, it simply * returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Open the serial port using the specified device name. /** * This function opens the serial port for the specified device name. * * @param device The platform-specific device name. * * @throws asio::system_error Thrown on failure. */ void open(const std::string& device) { asio::error_code ec; this->get_service().open(this->get_implementation(), device, ec); asio::detail::throw_error(ec, "open"); } /// Open the serial port using the specified device name. /** * This function opens the serial port using the given platform-specific * device name. * * @param device The platform-specific device name. * * @param ec Set the indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID open(const std::string& device, asio::error_code& ec) { this->get_service().open(this->get_implementation(), device, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native serial port to the serial port. /* * This function opens the serial port to hold an existing native serial port. * * @param native_serial_port A native serial port. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& native_serial_port) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_serial_port, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native serial port to the serial port. /* * This function opens the serial port to hold an existing native serial port. * * @param native_serial_port A native serial port. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_serial_port, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), native_serial_port, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the serial port is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the serial port. /** * This function is used to close the serial port. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the serial port. /** * This function is used to close the serial port. Any asynchronous read or * write operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native serial port representation. /** * This function may be used to obtain the underlying representation of the * serial port. This is intended to allow access to native serial port * functionality that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the serial port. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the serial port. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Send a break sequence to the serial port. /** * This function causes a break sequence of platform-specific duration to be * sent out the serial port. * * @throws asio::system_error Thrown on failure. */ void send_break() { asio::error_code ec; this->get_service().send_break(this->get_implementation(), ec); asio::detail::throw_error(ec, "send_break"); } /// Send a break sequence to the serial port. /** * This function causes a break sequence of platform-specific duration to be * sent out the serial port. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID send_break(asio::error_code& ec) { this->get_service().send_break(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Set an option on the serial port. /** * This function is used to set an option on the serial port. * * @param option The option value to be set on the serial port. * * @throws asio::system_error Thrown on failure. * * @sa SettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template void set_option(const SettableSerialPortOption& option) { asio::error_code ec; this->get_service().set_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "set_option"); } /// Set an option on the serial port. /** * This function is used to set an option on the serial port. * * @param option The option value to be set on the serial port. * * @param ec Set to indicate what error occurred, if any. * * @sa SettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template ASIO_SYNC_OP_VOID set_option(const SettableSerialPortOption& option, asio::error_code& ec) { this->get_service().set_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get an option from the serial port. /** * This function is used to get the current value of an option on the serial * port. * * @param option The option value to be obtained from the serial port. * * @throws asio::system_error Thrown on failure. * * @sa GettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template void get_option(GettableSerialPortOption& option) { asio::error_code ec; this->get_service().get_option(this->get_implementation(), option, ec); asio::detail::throw_error(ec, "get_option"); } /// Get an option from the serial port. /** * This function is used to get the current value of an option on the serial * port. * * @param option The option value to be obtained from the serial port. * * @param ec Set to indicate what error occurred, if any. * * @sa GettableSerialPortOption @n * asio::serial_port_base::baud_rate @n * asio::serial_port_base::flow_control @n * asio::serial_port_base::parity @n * asio::serial_port_base::stop_bits @n * asio::serial_port_base::character_size */ template ASIO_SYNC_OP_VOID get_option(GettableSerialPortOption& option, asio::error_code& ec) { this->get_service().get_option(this->get_implementation(), option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Write some data to the serial port. /** * This function is used to write data to the serial port. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the serial port. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * serial_port.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the serial port. /** * This function is used to write data to the serial port. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the serial port. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the serial port. * The function call always returns immediately. * * @param buffers One or more data buffers to be written to the serial port. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * serial_port.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; async_completion init(handler); this->get_service().async_write_some( this->get_implementation(), buffers, init.completion_handler); return init.result.get(); } /// Read some data from the serial port. /** * This function is used to read data from the serial port. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * serial_port.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the serial port. /** * This function is used to read data from the serial port. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the serial port. * The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * serial_port.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; async_completion init(handler); this->get_service().async_read_some( this->get_implementation(), buffers, init.completion_handler); return init.result.get(); } }; #endif // defined(ASIO_ENABLE_OLD_SERVICES) } // namespace asio #include "asio/detail/pop_options.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) # undef ASIO_SVC_T #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // defined(ASIO_HAS_SERIAL_PORT) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_SERIAL_PORT_HPP asio-1.12.2/include/asio/serial_port_base.hpp000066400000000000000000000106421340672067200211460ustar00rootroot00000000000000// // serial_port_base.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SERIAL_PORT_BASE_HPP #define ASIO_SERIAL_PORT_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_SERIAL_PORT) \ || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) # include #endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) #include "asio/detail/socket_types.hpp" #include "asio/error_code.hpp" #if defined(GENERATING_DOCUMENTATION) # define ASIO_OPTION_STORAGE implementation_defined #elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) # define ASIO_OPTION_STORAGE DCB #else # define ASIO_OPTION_STORAGE termios #endif #include "asio/detail/push_options.hpp" namespace asio { /// The serial_port_base class is used as a base for the basic_serial_port class /// template so that we have a common place to define the serial port options. class serial_port_base { public: /// Serial port option to permit changing the baud rate. /** * Implements changing the baud rate for a given serial port. */ class baud_rate { public: explicit baud_rate(unsigned int rate = 0); unsigned int value() const; ASIO_DECL ASIO_SYNC_OP_VOID store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const; ASIO_DECL ASIO_SYNC_OP_VOID load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec); private: unsigned int value_; }; /// Serial port option to permit changing the flow control. /** * Implements changing the flow control for a given serial port. */ class flow_control { public: enum type { none, software, hardware }; ASIO_DECL explicit flow_control(type t = none); type value() const; ASIO_DECL ASIO_SYNC_OP_VOID store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const; ASIO_DECL ASIO_SYNC_OP_VOID load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec); private: type value_; }; /// Serial port option to permit changing the parity. /** * Implements changing the parity for a given serial port. */ class parity { public: enum type { none, odd, even }; ASIO_DECL explicit parity(type t = none); type value() const; ASIO_DECL ASIO_SYNC_OP_VOID store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const; ASIO_DECL ASIO_SYNC_OP_VOID load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec); private: type value_; }; /// Serial port option to permit changing the number of stop bits. /** * Implements changing the number of stop bits for a given serial port. */ class stop_bits { public: enum type { one, onepointfive, two }; ASIO_DECL explicit stop_bits(type t = one); type value() const; ASIO_DECL ASIO_SYNC_OP_VOID store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const; ASIO_DECL ASIO_SYNC_OP_VOID load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec); private: type value_; }; /// Serial port option to permit changing the character size. /** * Implements changing the character size for a given serial port. */ class character_size { public: ASIO_DECL explicit character_size(unsigned int t = 8); unsigned int value() const; ASIO_DECL ASIO_SYNC_OP_VOID store( ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const; ASIO_DECL ASIO_SYNC_OP_VOID load( const ASIO_OPTION_STORAGE& storage, asio::error_code& ec); private: unsigned int value_; }; protected: /// Protected destructor to prevent deletion through this type. ~serial_port_base() { } }; } // namespace asio #include "asio/detail/pop_options.hpp" #undef ASIO_OPTION_STORAGE #include "asio/impl/serial_port_base.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/serial_port_base.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // defined(ASIO_HAS_SERIAL_PORT) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_SERIAL_PORT_BASE_HPP asio-1.12.2/include/asio/serial_port_service.hpp000066400000000000000000000160051340672067200216730ustar00rootroot00000000000000// // serial_port_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SERIAL_PORT_SERVICE_HPP #define ASIO_SERIAL_PORT_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_SERIAL_PORT) \ || defined(GENERATING_DOCUMENTATION) #include #include #include "asio/async_result.hpp" #include "asio/detail/reactive_serial_port_service.hpp" #include "asio/detail/win_iocp_serial_port_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/serial_port_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a serial port. class serial_port_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif private: // The type of the platform-specific implementation. #if defined(ASIO_HAS_IOCP) typedef detail::win_iocp_serial_port_service service_impl_type; #else typedef detail::reactive_serial_port_service service_impl_type; #endif public: /// The type of a serial port implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef service_impl_type::implementation_type implementation_type; #endif /// The native handle type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new serial port service for the specified io_context. explicit serial_port_service(asio::io_context& io_context) : asio::detail::service_base(io_context), service_impl_(io_context) { } /// Construct a new serial port implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new serial port implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another serial port implementation. void move_assign(implementation_type& impl, serial_port_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a serial port implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Open a serial port. ASIO_SYNC_OP_VOID open(implementation_type& impl, const std::string& device, asio::error_code& ec) { service_impl_.open(impl, device, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native handle to a serial port. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { service_impl_.assign(impl, handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a serial port implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the handle. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Set a serial port option. template ASIO_SYNC_OP_VOID set_option(implementation_type& impl, const SettableSerialPortOption& option, asio::error_code& ec) { service_impl_.set_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get a serial port option. template ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, GettableSerialPortOption& option, asio::error_code& ec) const { service_impl_.get_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Send a break sequence to the serial port. ASIO_SYNC_OP_VOID send_break(implementation_type& impl, asio::error_code& ec) { service_impl_.send_break(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Write the given data to the stream. template std::size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { return service_impl_.write_some(impl, buffers, ec); } /// Start an asynchronous write. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_write_some(impl, buffers, init.completion_handler); return init.result.get(); } /// Read some data from the stream. template std::size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { return service_impl_.read_some(impl, buffers, ec); } /// Start an asynchronous read. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_read_some(impl, buffers, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_SERIAL_PORT) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_SERIAL_PORT_SERVICE_HPP asio-1.12.2/include/asio/signal_set.hpp000066400000000000000000000357341340672067200177720ustar00rootroot00000000000000// // signal_set.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SIGNAL_SET_HPP #define ASIO_SIGNAL_SET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/basic_signal_set.hpp" #else // defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/detail/signal_set_service.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) namespace asio { #if defined(ASIO_ENABLE_OLD_SERVICES) // Typedef for the typical usage of a signal set. typedef basic_signal_set<> signal_set; #else // defined(ASIO_ENABLE_OLD_SERVICES) /// Provides signal functionality. /** * The signal_set class provides the ability to perform an asynchronous wait * for one or more signals to occur. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Example * Performing an asynchronous wait: * @code * void handler( * const asio::error_code& error, * int signal_number) * { * if (!error) * { * // A signal occurred. * } * } * * ... * * // Construct a signal set registered for process termination. * asio::signal_set signals(io_context, SIGINT, SIGTERM); * * // Start an asynchronous wait for one of the signals to occur. * signals.async_wait(handler); * @endcode * * @par Queueing of signal notifications * * If a signal is registered with a signal_set, and the signal occurs when * there are no waiting handlers, then the signal notification is queued. The * next async_wait operation on that signal_set will dequeue the notification. * If multiple notifications are queued, subsequent async_wait operations * dequeue them one at a time. Signal notifications are dequeued in order of * ascending signal number. * * If a signal number is removed from a signal_set (using the @c remove or @c * erase member functions) then any queued notifications for that signal are * discarded. * * @par Multiple registration of signals * * The same signal number may be registered with different signal_set objects. * When the signal occurs, one handler is called for each signal_set object. * * Note that multiple registration only works for signals that are registered * using Asio. The application must not also register a signal handler using * functions such as @c signal() or @c sigaction(). * * @par Signal masking on POSIX platforms * * POSIX allows signals to be blocked using functions such as @c sigprocmask() * and @c pthread_sigmask(). For signals to be delivered, programs must ensure * that any signals registered using signal_set objects are unblocked in at * least one thread. */ class signal_set : ASIO_SVC_ACCESS basic_io_object { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// Construct a signal set without adding any signals. /** * This constructor creates a signal set without registering for any signals. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. */ explicit signal_set(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct a signal set and add one signal. /** * This constructor creates a signal set and registers for one signal. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. * * @param signal_number_1 The signal number to be added. * * @note This constructor is equivalent to performing: * @code asio::signal_set signals(io_context); * signals.add(signal_number_1); @endcode */ signal_set(asio::io_context& io_context, int signal_number_1) : basic_io_object(io_context) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number_1, ec); asio::detail::throw_error(ec, "add"); } /// Construct a signal set and add two signals. /** * This constructor creates a signal set and registers for two signals. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. * * @param signal_number_1 The first signal number to be added. * * @param signal_number_2 The second signal number to be added. * * @note This constructor is equivalent to performing: * @code asio::signal_set signals(io_context); * signals.add(signal_number_1); * signals.add(signal_number_2); @endcode */ signal_set(asio::io_context& io_context, int signal_number_1, int signal_number_2) : basic_io_object(io_context) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number_1, ec); asio::detail::throw_error(ec, "add"); this->get_service().add(this->get_implementation(), signal_number_2, ec); asio::detail::throw_error(ec, "add"); } /// Construct a signal set and add three signals. /** * This constructor creates a signal set and registers for three signals. * * @param io_context The io_context object that the signal set will use to * dispatch handlers for any asynchronous operations performed on the set. * * @param signal_number_1 The first signal number to be added. * * @param signal_number_2 The second signal number to be added. * * @param signal_number_3 The third signal number to be added. * * @note This constructor is equivalent to performing: * @code asio::signal_set signals(io_context); * signals.add(signal_number_1); * signals.add(signal_number_2); * signals.add(signal_number_3); @endcode */ signal_set(asio::io_context& io_context, int signal_number_1, int signal_number_2, int signal_number_3) : basic_io_object(io_context) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number_1, ec); asio::detail::throw_error(ec, "add"); this->get_service().add(this->get_implementation(), signal_number_2, ec); asio::detail::throw_error(ec, "add"); this->get_service().add(this->get_implementation(), signal_number_3, ec); asio::detail::throw_error(ec, "add"); } /// Destroys the signal set. /** * This function destroys the signal set, cancelling any outstanding * asynchronous wait operations associated with the signal set as if by * calling @c cancel. */ ~signal_set() { } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } /// Add a signal to a signal_set. /** * This function adds the specified signal to the set. It has no effect if the * signal is already in the set. * * @param signal_number The signal to be added to the set. * * @throws asio::system_error Thrown on failure. */ void add(int signal_number) { asio::error_code ec; this->get_service().add(this->get_implementation(), signal_number, ec); asio::detail::throw_error(ec, "add"); } /// Add a signal to a signal_set. /** * This function adds the specified signal to the set. It has no effect if the * signal is already in the set. * * @param signal_number The signal to be added to the set. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID add(int signal_number, asio::error_code& ec) { this->get_service().add(this->get_implementation(), signal_number, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Remove a signal from a signal_set. /** * This function removes the specified signal from the set. It has no effect * if the signal is not in the set. * * @param signal_number The signal to be removed from the set. * * @throws asio::system_error Thrown on failure. * * @note Removes any notifications that have been queued for the specified * signal number. */ void remove(int signal_number) { asio::error_code ec; this->get_service().remove(this->get_implementation(), signal_number, ec); asio::detail::throw_error(ec, "remove"); } /// Remove a signal from a signal_set. /** * This function removes the specified signal from the set. It has no effect * if the signal is not in the set. * * @param signal_number The signal to be removed from the set. * * @param ec Set to indicate what error occurred, if any. * * @note Removes any notifications that have been queued for the specified * signal number. */ ASIO_SYNC_OP_VOID remove(int signal_number, asio::error_code& ec) { this->get_service().remove(this->get_implementation(), signal_number, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Remove all signals from a signal_set. /** * This function removes all signals from the set. It has no effect if the set * is already empty. * * @throws asio::system_error Thrown on failure. * * @note Removes all queued notifications. */ void clear() { asio::error_code ec; this->get_service().clear(this->get_implementation(), ec); asio::detail::throw_error(ec, "clear"); } /// Remove all signals from a signal_set. /** * This function removes all signals from the set. It has no effect if the set * is already empty. * * @param ec Set to indicate what error occurred, if any. * * @note Removes all queued notifications. */ ASIO_SYNC_OP_VOID clear(asio::error_code& ec) { this->get_service().clear(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Cancel all operations associated with the signal set. /** * This function forces the completion of any pending asynchronous wait * operations against the signal set. The handler for each cancelled * operation will be invoked with the asio::error::operation_aborted * error code. * * Cancellation does not alter the set of registered signals. * * @throws asio::system_error Thrown on failure. * * @note If a registered signal occurred before cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all operations associated with the signal set. /** * This function forces the completion of any pending asynchronous wait * operations against the signal set. The handler for each cancelled * operation will be invoked with the asio::error::operation_aborted * error code. * * Cancellation does not alter the set of registered signals. * * @param ec Set to indicate what error occurred, if any. * * @note If a registered signal occurred before cancel() is called, then the * handlers for asynchronous wait operations will: * * @li have already been invoked; or * * @li have been queued for invocation in the near future. * * These handlers can no longer be cancelled, and therefore are passed an * error code that indicates the successful completion of the wait operation. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous operation to wait for a signal to be delivered. /** * This function may be used to initiate an asynchronous wait against the * signal set. It always returns immediately. * * For each call to async_wait(), the supplied handler will be called exactly * once. The handler will be called when: * * @li One of the registered signals in the signal set occurs; or * * @li The signal set was cancelled, in which case the handler is passed the * error code asio::error::operation_aborted. * * @param handler The handler to be called when the signal occurs. Copies * will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * int signal_number // Indicates which signal occurred. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(SignalHandler, void (asio::error_code, int)) async_wait(ASIO_MOVE_ARG(SignalHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a SignalHandler. ASIO_SIGNAL_HANDLER_CHECK(SignalHandler, handler) type_check; async_completion init(handler); this->get_service().async_wait(this->get_implementation(), init.completion_handler); return init.result.get(); } }; #endif // defined(ASIO_ENABLE_OLD_SERVICES) } // namespace asio #endif // ASIO_SIGNAL_SET_HPP asio-1.12.2/include/asio/signal_set_service.hpp000066400000000000000000000071651340672067200215070ustar00rootroot00000000000000// // signal_set_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SIGNAL_SET_SERVICE_HPP #define ASIO_SIGNAL_SET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/async_result.hpp" #include "asio/detail/signal_set_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a signal set. class signal_set_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif public: /// The type of a signal set implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef detail::signal_set_service::implementation_type implementation_type; #endif /// Construct a new signal set service for the specified io_context. explicit signal_set_service(asio::io_context& io_context) : asio::detail::service_base(io_context), service_impl_(io_context) { } /// Construct a new signal set implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } /// Destroy a signal set implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Add a signal to a signal_set. ASIO_SYNC_OP_VOID add(implementation_type& impl, int signal_number, asio::error_code& ec) { service_impl_.add(impl, signal_number, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Remove a signal to a signal_set. ASIO_SYNC_OP_VOID remove(implementation_type& impl, int signal_number, asio::error_code& ec) { service_impl_.remove(impl, signal_number, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Remove all signals from a signal_set. ASIO_SYNC_OP_VOID clear(implementation_type& impl, asio::error_code& ec) { service_impl_.clear(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Cancel all operations associated with the signal set. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } // Start an asynchronous operation to wait for a signal to be delivered. template ASIO_INITFN_RESULT_TYPE(SignalHandler, void (asio::error_code, int)) async_wait(implementation_type& impl, ASIO_MOVE_ARG(SignalHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // Perform any fork-related housekeeping. void notify_fork(asio::io_context::fork_event event) { service_impl_.notify_fork(event); } // The platform-specific implementation. detail::signal_set_service service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_SIGNAL_SET_SERVICE_HPP asio-1.12.2/include/asio/socket_acceptor_service.hpp000066400000000000000000000263201340672067200225210ustar00rootroot00000000000000// // socket_acceptor_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SOCKET_ACCEPTOR_SERVICE_HPP #define ASIO_SOCKET_ACCEPTOR_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/basic_socket.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/null_socket_service.hpp" #elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" #else # include "asio/detail/reactive_socket_service.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a socket acceptor. template class socket_acceptor_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename protocol_type::endpoint endpoint_type; private: // The type of the platform-specific implementation. #if defined(ASIO_WINDOWS_RUNTIME) typedef detail::null_socket_service service_impl_type; #elif defined(ASIO_HAS_IOCP) typedef detail::win_iocp_socket_service service_impl_type; #else typedef detail::reactive_socket_service service_impl_type; #endif public: /// The native type of the socket acceptor. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// The native acceptor type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new socket acceptor service for the specified io_context. explicit socket_acceptor_service(asio::io_context& io_context) : asio::detail::service_base< socket_acceptor_service >(io_context), service_impl_(io_context) { } /// Construct a new socket acceptor implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new socket acceptor implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another socket acceptor implementation. void move_assign(implementation_type& impl, socket_acceptor_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } // All acceptor services have access to each other's implementations. template friend class socket_acceptor_service; /// Move-construct a new socket acceptor implementation from another protocol /// type. template void converting_move_construct(implementation_type& impl, socket_acceptor_service& other_service, typename socket_acceptor_service< Protocol1>::implementation_type& other_impl, typename enable_if::value>::type* = 0) { service_impl_.template converting_move_construct( impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a socket acceptor implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Open a new socket acceptor implementation. ASIO_SYNC_OP_VOID open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { service_impl_.open(impl, protocol, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native acceptor to a socket acceptor. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_acceptor, asio::error_code& ec) { service_impl_.assign(impl, protocol, native_acceptor, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the acceptor is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Cancel all asynchronous operations associated with the acceptor. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Bind the socket acceptor to the specified local endpoint. ASIO_SYNC_OP_VOID bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { service_impl_.bind(impl, endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Place the socket acceptor into the state where it will listen for new /// connections. ASIO_SYNC_OP_VOID listen(implementation_type& impl, int backlog, asio::error_code& ec) { service_impl_.listen(impl, backlog, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Close a socket acceptor implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying acceptor. native_handle_type release(implementation_type& impl, asio::error_code& ec) { return service_impl_.release(impl, ec); } /// Get the native acceptor implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Set a socket option. template ASIO_SYNC_OP_VOID set_option(implementation_type& impl, const SettableSocketOption& option, asio::error_code& ec) { service_impl_.set_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get a socket option. template ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, GettableSocketOption& option, asio::error_code& ec) const { service_impl_.get_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the socket. template ASIO_SYNC_OP_VOID io_control(implementation_type& impl, IoControlCommand& command, asio::error_code& ec) { service_impl_.io_control(impl, command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the acceptor. bool non_blocking(const implementation_type& impl) const { return service_impl_.non_blocking(impl); } /// Sets the non-blocking mode of the acceptor. ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native acceptor implementation. bool native_non_blocking(const implementation_type& impl) const { return service_impl_.native_non_blocking(impl); } /// Sets the non-blocking mode of the native acceptor implementation. ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.native_non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.local_endpoint(impl, ec); } /// Wait for the acceptor to become ready to read, ready to write, or to have /// pending error conditions. ASIO_SYNC_OP_VOID wait(implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { service_impl_.wait(impl, w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the acceptor to become ready to read, ready to /// write, or to have pending error conditions. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, socket_base::wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, w, init.completion_handler); return init.result.get(); } /// Accept a new connection. template ASIO_SYNC_OP_VOID accept(implementation_type& impl, basic_socket& peer, endpoint_type* peer_endpoint, asio::error_code& ec, typename enable_if::value>::type* = 0) { service_impl_.accept(impl, peer, peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } #if defined(ASIO_HAS_MOVE) /// Accept a new connection. typename Protocol::socket accept(implementation_type& impl, io_context* peer_io_context, endpoint_type* peer_endpoint, asio::error_code& ec) { return service_impl_.accept(impl, peer_io_context, peer_endpoint, ec); } #endif // defined(ASIO_HAS_MOVE) /// Start an asynchronous accept. template ASIO_INITFN_RESULT_TYPE(AcceptHandler, void (asio::error_code)) async_accept(implementation_type& impl, basic_socket& peer, endpoint_type* peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler, typename enable_if::value>::type* = 0) { async_completion init(handler); service_impl_.async_accept(impl, peer, peer_endpoint, init.completion_handler); return init.result.get(); } #if defined(ASIO_HAS_MOVE) /// Start an asynchronous accept. template ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, void (asio::error_code, typename Protocol::socket)) async_accept(implementation_type& impl, asio::io_context* peer_io_context, endpoint_type* peer_endpoint, ASIO_MOVE_ARG(MoveAcceptHandler) handler) { async_completion init(handler); service_impl_.async_accept(impl, peer_io_context, peer_endpoint, init.completion_handler); return init.result.get(); } #endif // defined(ASIO_HAS_MOVE) private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_SOCKET_ACCEPTOR_SERVICE_HPP asio-1.12.2/include/asio/socket_base.hpp000066400000000000000000000355051340672067200201200ustar00rootroot00000000000000// // socket_base.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SOCKET_BASE_HPP #define ASIO_SOCKET_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/io_control.hpp" #include "asio/detail/socket_option.hpp" #include "asio/detail/socket_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// The socket_base class is used as a base for the basic_stream_socket and /// basic_datagram_socket class templates so that we have a common place to /// define the shutdown_type and enum. class socket_base { public: /// Different ways a socket may be shutdown. enum shutdown_type { #if defined(GENERATING_DOCUMENTATION) /// Shutdown the receive side of the socket. shutdown_receive = implementation_defined, /// Shutdown the send side of the socket. shutdown_send = implementation_defined, /// Shutdown both send and receive on the socket. shutdown_both = implementation_defined #else shutdown_receive = ASIO_OS_DEF(SHUT_RD), shutdown_send = ASIO_OS_DEF(SHUT_WR), shutdown_both = ASIO_OS_DEF(SHUT_RDWR) #endif }; /// Bitmask type for flags that can be passed to send and receive operations. typedef int message_flags; #if defined(GENERATING_DOCUMENTATION) /// Peek at incoming data without removing it from the input queue. static const int message_peek = implementation_defined; /// Process out-of-band data. static const int message_out_of_band = implementation_defined; /// Specify that the data should not be subject to routing. static const int message_do_not_route = implementation_defined; /// Specifies that the data marks the end of a record. static const int message_end_of_record = implementation_defined; #else ASIO_STATIC_CONSTANT(int, message_peek = ASIO_OS_DEF(MSG_PEEK)); ASIO_STATIC_CONSTANT(int, message_out_of_band = ASIO_OS_DEF(MSG_OOB)); ASIO_STATIC_CONSTANT(int, message_do_not_route = ASIO_OS_DEF(MSG_DONTROUTE)); ASIO_STATIC_CONSTANT(int, message_end_of_record = ASIO_OS_DEF(MSG_EOR)); #endif /// Wait types. /** * For use with basic_socket::wait() and basic_socket::async_wait(). */ enum wait_type { /// Wait for a socket to become ready to read. wait_read, /// Wait for a socket to become ready to write. wait_write, /// Wait for a socket to have error conditions pending. wait_error }; /// Socket option to permit sending of broadcast messages. /** * Implements the SOL_SOCKET/SO_BROADCAST socket option. * * @par Examples * Setting the option: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::socket_base::broadcast option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::socket_base::broadcast option; * socket.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined broadcast; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_BROADCAST)> broadcast; #endif /// Socket option to enable socket-level debugging. /** * Implements the SOL_SOCKET/SO_DEBUG socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::debug option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::debug option; * socket.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined debug; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DEBUG)> debug; #endif /// Socket option to prevent routing, use local interfaces only. /** * Implements the SOL_SOCKET/SO_DONTROUTE socket option. * * @par Examples * Setting the option: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::socket_base::do_not_route option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::udp::socket socket(io_context); * ... * asio::socket_base::do_not_route option; * socket.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined do_not_route; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DONTROUTE)> do_not_route; #endif /// Socket option to send keep-alives. /** * Implements the SOL_SOCKET/SO_KEEPALIVE socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::keep_alive option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::keep_alive option; * socket.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined keep_alive; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_KEEPALIVE)> keep_alive; #endif /// Socket option for the send buffer size of a socket. /** * Implements the SOL_SOCKET/SO_SNDBUF socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::send_buffer_size option(8192); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::send_buffer_size option; * socket.get_option(option); * int size = option.value(); * @endcode * * @par Concepts: * Socket_Option, Integer_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined send_buffer_size; #else typedef asio::detail::socket_option::integer< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDBUF)> send_buffer_size; #endif /// Socket option for the send low watermark. /** * Implements the SOL_SOCKET/SO_SNDLOWAT socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::send_low_watermark option(1024); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::send_low_watermark option; * socket.get_option(option); * int size = option.value(); * @endcode * * @par Concepts: * Socket_Option, Integer_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined send_low_watermark; #else typedef asio::detail::socket_option::integer< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDLOWAT)> send_low_watermark; #endif /// Socket option for the receive buffer size of a socket. /** * Implements the SOL_SOCKET/SO_RCVBUF socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::receive_buffer_size option(8192); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::receive_buffer_size option; * socket.get_option(option); * int size = option.value(); * @endcode * * @par Concepts: * Socket_Option, Integer_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined receive_buffer_size; #else typedef asio::detail::socket_option::integer< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVBUF)> receive_buffer_size; #endif /// Socket option for the receive low watermark. /** * Implements the SOL_SOCKET/SO_RCVLOWAT socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::receive_low_watermark option(1024); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::receive_low_watermark option; * socket.get_option(option); * int size = option.value(); * @endcode * * @par Concepts: * Socket_Option, Integer_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined receive_low_watermark; #else typedef asio::detail::socket_option::integer< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVLOWAT)> receive_low_watermark; #endif /// Socket option to allow the socket to be bound to an address that is /// already in use. /** * Implements the SOL_SOCKET/SO_REUSEADDR socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::socket_base::reuse_address option(true); * acceptor.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::socket_base::reuse_address option; * acceptor.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined reuse_address; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_REUSEADDR)> reuse_address; #endif /// Socket option to specify whether the socket lingers on close if unsent /// data is present. /** * Implements the SOL_SOCKET/SO_LINGER socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::linger option(true, 30); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::linger option; * socket.get_option(option); * bool is_set = option.enabled(); * unsigned short timeout = option.timeout(); * @endcode * * @par Concepts: * Socket_Option, Linger_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined linger; #else typedef asio::detail::socket_option::linger< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_LINGER)> linger; #endif /// Socket option for putting received out-of-band data inline. /** * Implements the SOL_SOCKET/SO_OOBINLINE socket option. * * @par Examples * Setting the option: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::out_of_band_inline option(true); * socket.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::out_of_band_inline option; * socket.get_option(option); * bool value = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined out_of_band_inline; #else typedef asio::detail::socket_option::boolean< ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_OOBINLINE)> out_of_band_inline; #endif /// Socket option to report aborted connections on accept. /** * Implements a custom socket option that determines whether or not an accept * operation is permitted to fail with asio::error::connection_aborted. * By default the option is false. * * @par Examples * Setting the option: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::socket_base::enable_connection_aborted option(true); * acceptor.set_option(option); * @endcode * * @par * Getting the current option value: * @code * asio::ip::tcp::acceptor acceptor(io_context); * ... * asio::socket_base::enable_connection_aborted option; * acceptor.get_option(option); * bool is_set = option.value(); * @endcode * * @par Concepts: * Socket_Option, Boolean_Socket_Option. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined enable_connection_aborted; #else typedef asio::detail::socket_option::boolean< asio::detail::custom_socket_option_level, asio::detail::enable_connection_aborted_option> enable_connection_aborted; #endif /// IO control command to get the amount of data that can be read without /// blocking. /** * Implements the FIONREAD IO control command. * * @par Example * @code * asio::ip::tcp::socket socket(io_context); * ... * asio::socket_base::bytes_readable command(true); * socket.io_control(command); * std::size_t bytes_readable = command.get(); * @endcode * * @par Concepts: * IO_Control_Command, Size_IO_Control_Command. */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined bytes_readable; #else typedef asio::detail::io_control::bytes_readable bytes_readable; #endif /// The maximum length of the queue of pending incoming connections. #if defined(GENERATING_DOCUMENTATION) static const int max_listen_connections = implementation_defined; #else ASIO_STATIC_CONSTANT(int, max_listen_connections = ASIO_OS_DEF(SOMAXCONN)); #endif #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use max_listen_connections.) The maximum length of the queue /// of pending incoming connections. #if defined(GENERATING_DOCUMENTATION) static const int max_connections = implementation_defined; #else ASIO_STATIC_CONSTANT(int, max_connections = ASIO_OS_DEF(SOMAXCONN)); #endif #endif // !defined(ASIO_NO_DEPRECATED) protected: /// Protected destructor to prevent deletion through this type. ~socket_base() { } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SOCKET_BASE_HPP asio-1.12.2/include/asio/spawn.hpp000066400000000000000000000260601340672067200167620ustar00rootroot00000000000000// // spawn.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SPAWN_HPP #define ASIO_SPAWN_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/bind_executor.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/wrapped_handler.hpp" #include "asio/executor.hpp" #include "asio/io_context.hpp" #include "asio/is_executor.hpp" #include "asio/strand.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Context object the represents the currently executing coroutine. /** * The basic_yield_context class is used to represent the currently executing * stackful coroutine. A basic_yield_context may be passed as a handler to an * asynchronous operation. For example: * * @code template * void my_coroutine(basic_yield_context yield) * { * ... * std::size_t n = my_socket.async_read_some(buffer, yield); * ... * } @endcode * * The initiating function (async_read_some in the above example) suspends the * current coroutine. The coroutine is resumed when the asynchronous operation * completes, and the result of the operation is returned. */ template class basic_yield_context { public: /// The coroutine callee type, used by the implementation. /** * When using Boost.Coroutine v1, this type is: * @code typename coroutine @endcode * When using Boost.Coroutine v2 (unidirectional coroutines), this type is: * @code push_coroutine @endcode */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined callee_type; #elif defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2) typedef boost::coroutines::push_coroutine callee_type; #else typedef boost::coroutines::coroutine callee_type; #endif /// The coroutine caller type, used by the implementation. /** * When using Boost.Coroutine v1, this type is: * @code typename coroutine::caller_type @endcode * When using Boost.Coroutine v2 (unidirectional coroutines), this type is: * @code pull_coroutine @endcode */ #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined caller_type; #elif defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2) typedef boost::coroutines::pull_coroutine caller_type; #else typedef boost::coroutines::coroutine::caller_type caller_type; #endif /// Construct a yield context to represent the specified coroutine. /** * Most applications do not need to use this constructor. Instead, the * spawn() function passes a yield context as an argument to the coroutine * function. */ basic_yield_context( const detail::weak_ptr& coro, caller_type& ca, Handler& handler) : coro_(coro), ca_(ca), handler_(handler), ec_(0) { } /// Construct a yield context from another yield context type. /** * Requires that OtherHandler be convertible to Handler. */ template basic_yield_context(const basic_yield_context& other) : coro_(other.coro_), ca_(other.ca_), handler_(other.handler_), ec_(other.ec_) { } /// Return a yield context that sets the specified error_code. /** * By default, when a yield context is used with an asynchronous operation, a * non-success error_code is converted to system_error and thrown. This * operator may be used to specify an error_code object that should instead be * set with the asynchronous operation's result. For example: * * @code template * void my_coroutine(basic_yield_context yield) * { * ... * std::size_t n = my_socket.async_read_some(buffer, yield[ec]); * if (ec) * { * // An error occurred. * } * ... * } @endcode */ basic_yield_context operator[](asio::error_code& ec) const { basic_yield_context tmp(*this); tmp.ec_ = &ec; return tmp; } #if defined(GENERATING_DOCUMENTATION) private: #endif // defined(GENERATING_DOCUMENTATION) detail::weak_ptr coro_; caller_type& ca_; Handler handler_; asio::error_code* ec_; }; #if defined(GENERATING_DOCUMENTATION) /// Context object that represents the currently executing coroutine. typedef basic_yield_context yield_context; #else // defined(GENERATING_DOCUMENTATION) typedef basic_yield_context< executor_binder > yield_context; #endif // defined(GENERATING_DOCUMENTATION) /** * @defgroup spawn asio::spawn * * @brief Start a new stackful coroutine. * * The spawn() function is a high-level wrapper over the Boost.Coroutine * library. This function enables programs to implement asynchronous logic in a * synchronous manner, as illustrated by the following example: * * @code asio::spawn(my_strand, do_echo); * * // ... * * void do_echo(asio::yield_context yield) * { * try * { * char data[128]; * for (;;) * { * std::size_t length = * my_socket.async_read_some( * asio::buffer(data), yield); * * asio::async_write(my_socket, * asio::buffer(data, length), yield); * } * } * catch (std::exception& e) * { * // ... * } * } @endcode */ /*@{*/ /// Start a new stackful coroutine, calling the specified handler when it /// completes. /** * This function is used to launch a new coroutine. * * @param function The coroutine function. The function must have the signature: * @code void function(basic_yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); /// Start a new stackful coroutine, calling the specified handler when it /// completes. /** * This function is used to launch a new coroutine. * * @param handler A handler to be called when the coroutine exits. More * importantly, the handler provides an execution context (via the the handler * invocation hook) for the coroutine. The handler must have the signature: * @code void handler(); @endcode * * @param function The coroutine function. The function must have the signature: * @code void function(basic_yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(ASIO_MOVE_ARG(Handler) handler, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes(), typename enable_if::type>::value && !is_convertible::value>::type* = 0); /// Start a new stackful coroutine, inheriting the execution context of another. /** * This function is used to launch a new coroutine. * * @param ctx Identifies the current coroutine as a parent of the new * coroutine. This specifies that the new coroutine should inherit the * execution context of the parent. For example, if the parent coroutine is * executing in a particular strand, then the new coroutine will execute in the * same strand. * * @param function The coroutine function. The function must have the signature: * @code void function(basic_yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(basic_yield_context ctx, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); /// Start a new stackful coroutine that executes on a given executor. /** * This function is used to launch a new coroutine. * * @param ex Identifies the executor that will run the coroutine. The new * coroutine is implicitly given its own strand within this executor. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(const Executor& ex, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes(), typename enable_if::value>::type* = 0); /// Start a new stackful coroutine that executes on a given strand. /** * This function is used to launch a new coroutine. * * @param ex Identifies the strand that will run the coroutine. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(const strand& ex, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); /// Start a new stackful coroutine that executes in the context of a strand. /** * This function is used to launch a new coroutine. * * @param s Identifies a strand. By starting multiple coroutines on the same * strand, the implementation ensures that none of those coroutines can execute * simultaneously. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(const asio::io_context::strand& s, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes()); /// Start a new stackful coroutine that executes on a given execution context. /** * This function is used to launch a new coroutine. * * @param ctx Identifies the execution context that will run the coroutine. The * new coroutine is implicitly given its own strand within this execution * context. * * @param function The coroutine function. The function must have the signature: * @code void function(yield_context yield); @endcode * * @param attributes Boost.Coroutine attributes used to customise the coroutine. */ template void spawn(ExecutionContext& ctx, ASIO_MOVE_ARG(Function) function, const boost::coroutines::attributes& attributes = boost::coroutines::attributes(), typename enable_if::value>::type* = 0); /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/spawn.hpp" #endif // ASIO_SPAWN_HPP asio-1.12.2/include/asio/ssl.hpp000066400000000000000000000013311340672067200164250ustar00rootroot00000000000000// // ssl.hpp // ~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_HPP #define ASIO_SSL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/ssl/context.hpp" #include "asio/ssl/context_base.hpp" #include "asio/ssl/error.hpp" #include "asio/ssl/rfc2818_verification.hpp" #include "asio/ssl/stream.hpp" #include "asio/ssl/stream_base.hpp" #include "asio/ssl/verify_context.hpp" #include "asio/ssl/verify_mode.hpp" #endif // ASIO_SSL_HPP asio-1.12.2/include/asio/ssl/000077500000000000000000000000001340672067200157165ustar00rootroot00000000000000asio-1.12.2/include/asio/ssl/context.hpp000066400000000000000000000620631340672067200201220ustar00rootroot00000000000000// // ssl/context.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_CONTEXT_HPP #define ASIO_SSL_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ssl/context_base.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/ssl/detail/openssl_init.hpp" #include "asio/ssl/detail/password_callback.hpp" #include "asio/ssl/detail/verify_callback.hpp" #include "asio/ssl/verify_mode.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { class context : public context_base, private noncopyable { public: /// The native handle type of the SSL context. typedef SSL_CTX* native_handle_type; /// Constructor. ASIO_DECL explicit context(method m); #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a context from another. /** * This constructor moves an SSL context from one object to another. * * @param other The other context object from which the move will occur. * * @note Following the move, the following operations only are valid for the * moved-from object: * @li Destruction. * @li As a target for move-assignment. */ ASIO_DECL context(context&& other); /// Move-assign a context from another. /** * This assignment operator moves an SSL context from one object to another. * * @param other The other context object from which the move will occur. * * @note Following the move, the following operations only are valid for the * moved-from object: * @li Destruction. * @li As a target for move-assignment. */ ASIO_DECL context& operator=(context&& other); #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destructor. ASIO_DECL ~context(); /// Get the underlying implementation in the native type. /** * This function may be used to obtain the underlying implementation of the * context. This is intended to allow access to context functionality that is * not otherwise provided. */ ASIO_DECL native_handle_type native_handle(); /// Clear options on the context. /** * This function may be used to configure the SSL options used by the context. * * @param o A bitmask of options. The available option values are defined in * the context_base class. The specified options, if currently enabled on the * context, are cleared. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_clear_options. */ ASIO_DECL void clear_options(options o); /// Clear options on the context. /** * This function may be used to configure the SSL options used by the context. * * @param o A bitmask of options. The available option values are defined in * the context_base class. The specified options, if currently enabled on the * context, are cleared. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_clear_options. */ ASIO_DECL ASIO_SYNC_OP_VOID clear_options(options o, asio::error_code& ec); /// Set options on the context. /** * This function may be used to configure the SSL options used by the context. * * @param o A bitmask of options. The available option values are defined in * the context_base class. The options are bitwise-ored with any existing * value for the options. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_options. */ ASIO_DECL void set_options(options o); /// Set options on the context. /** * This function may be used to configure the SSL options used by the context. * * @param o A bitmask of options. The available option values are defined in * the context_base class. The options are bitwise-ored with any existing * value for the options. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_options. */ ASIO_DECL ASIO_SYNC_OP_VOID set_options(options o, asio::error_code& ec); /// Set the peer verification mode. /** * This function may be used to configure the peer verification mode used by * the context. * * @param v A bitmask of peer verification modes. See @ref verify_mode for * available values. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_verify. */ ASIO_DECL void set_verify_mode(verify_mode v); /// Set the peer verification mode. /** * This function may be used to configure the peer verification mode used by * the context. * * @param v A bitmask of peer verification modes. See @ref verify_mode for * available values. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_verify. */ ASIO_DECL ASIO_SYNC_OP_VOID set_verify_mode( verify_mode v, asio::error_code& ec); /// Set the peer verification depth. /** * This function may be used to configure the maximum verification depth * allowed by the context. * * @param depth Maximum depth for the certificate chain verification that * shall be allowed. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_verify_depth. */ ASIO_DECL void set_verify_depth(int depth); /// Set the peer verification depth. /** * This function may be used to configure the maximum verification depth * allowed by the context. * * @param depth Maximum depth for the certificate chain verification that * shall be allowed. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_verify_depth. */ ASIO_DECL ASIO_SYNC_OP_VOID set_verify_depth( int depth, asio::error_code& ec); /// Set the callback used to verify peer certificates. /** * This function is used to specify a callback function that will be called * by the implementation when it needs to verify a peer certificate. * * @param callback The function object to be used for verifying a certificate. * The function signature of the handler must be: * @code bool verify_callback( * bool preverified, // True if the certificate passed pre-verification. * verify_context& ctx // The peer certificate and other context. * ); @endcode * The return value of the callback is true if the certificate has passed * verification, false otherwise. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_verify. */ template void set_verify_callback(VerifyCallback callback); /// Set the callback used to verify peer certificates. /** * This function is used to specify a callback function that will be called * by the implementation when it needs to verify a peer certificate. * * @param callback The function object to be used for verifying a certificate. * The function signature of the handler must be: * @code bool verify_callback( * bool preverified, // True if the certificate passed pre-verification. * verify_context& ctx // The peer certificate and other context. * ); @endcode * The return value of the callback is true if the certificate has passed * verification, false otherwise. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_verify. */ template ASIO_SYNC_OP_VOID set_verify_callback(VerifyCallback callback, asio::error_code& ec); /// Load a certification authority file for performing verification. /** * This function is used to load one or more trusted certification authorities * from a file. * * @param filename The name of a file containing certification authority * certificates in PEM format. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_load_verify_locations. */ ASIO_DECL void load_verify_file(const std::string& filename); /// Load a certification authority file for performing verification. /** * This function is used to load the certificates for one or more trusted * certification authorities from a file. * * @param filename The name of a file containing certification authority * certificates in PEM format. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_load_verify_locations. */ ASIO_DECL ASIO_SYNC_OP_VOID load_verify_file( const std::string& filename, asio::error_code& ec); /// Add certification authority for performing verification. /** * This function is used to add one trusted certification authority * from a memory buffer. * * @param ca The buffer containing the certification authority certificate. * The certificate must use the PEM format. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_get_cert_store and @c X509_STORE_add_cert. */ ASIO_DECL void add_certificate_authority(const const_buffer& ca); /// Add certification authority for performing verification. /** * This function is used to add one trusted certification authority * from a memory buffer. * * @param ca The buffer containing the certification authority certificate. * The certificate must use the PEM format. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_get_cert_store and @c X509_STORE_add_cert. */ ASIO_DECL ASIO_SYNC_OP_VOID add_certificate_authority( const const_buffer& ca, asio::error_code& ec); /// Configures the context to use the default directories for finding /// certification authority certificates. /** * This function specifies that the context should use the default, * system-dependent directories for locating certification authority * certificates. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_default_verify_paths. */ ASIO_DECL void set_default_verify_paths(); /// Configures the context to use the default directories for finding /// certification authority certificates. /** * This function specifies that the context should use the default, * system-dependent directories for locating certification authority * certificates. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_default_verify_paths. */ ASIO_DECL ASIO_SYNC_OP_VOID set_default_verify_paths( asio::error_code& ec); /// Add a directory containing certificate authority files to be used for /// performing verification. /** * This function is used to specify the name of a directory containing * certification authority certificates. Each file in the directory must * contain a single certificate. The files must be named using the subject * name's hash and an extension of ".0". * * @param path The name of a directory containing the certificates. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_load_verify_locations. */ ASIO_DECL void add_verify_path(const std::string& path); /// Add a directory containing certificate authority files to be used for /// performing verification. /** * This function is used to specify the name of a directory containing * certification authority certificates. Each file in the directory must * contain a single certificate. The files must be named using the subject * name's hash and an extension of ".0". * * @param path The name of a directory containing the certificates. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_load_verify_locations. */ ASIO_DECL ASIO_SYNC_OP_VOID add_verify_path( const std::string& path, asio::error_code& ec); /// Use a certificate from a memory buffer. /** * This function is used to load a certificate into the context from a buffer. * * @param certificate The buffer containing the certificate. * * @param format The certificate format (ASN.1 or PEM). * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_certificate or SSL_CTX_use_certificate_ASN1. */ ASIO_DECL void use_certificate( const const_buffer& certificate, file_format format); /// Use a certificate from a memory buffer. /** * This function is used to load a certificate into the context from a buffer. * * @param certificate The buffer containing the certificate. * * @param format The certificate format (ASN.1 or PEM). * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_certificate or SSL_CTX_use_certificate_ASN1. */ ASIO_DECL ASIO_SYNC_OP_VOID use_certificate( const const_buffer& certificate, file_format format, asio::error_code& ec); /// Use a certificate from a file. /** * This function is used to load a certificate into the context from a file. * * @param filename The name of the file containing the certificate. * * @param format The file format (ASN.1 or PEM). * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_certificate_file. */ ASIO_DECL void use_certificate_file( const std::string& filename, file_format format); /// Use a certificate from a file. /** * This function is used to load a certificate into the context from a file. * * @param filename The name of the file containing the certificate. * * @param format The file format (ASN.1 or PEM). * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_certificate_file. */ ASIO_DECL ASIO_SYNC_OP_VOID use_certificate_file( const std::string& filename, file_format format, asio::error_code& ec); /// Use a certificate chain from a memory buffer. /** * This function is used to load a certificate chain into the context from a * buffer. * * @param chain The buffer containing the certificate chain. The certificate * chain must use the PEM format. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_certificate and SSL_CTX_add_extra_chain_cert. */ ASIO_DECL void use_certificate_chain(const const_buffer& chain); /// Use a certificate chain from a memory buffer. /** * This function is used to load a certificate chain into the context from a * buffer. * * @param chain The buffer containing the certificate chain. The certificate * chain must use the PEM format. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_certificate and SSL_CTX_add_extra_chain_cert. */ ASIO_DECL ASIO_SYNC_OP_VOID use_certificate_chain( const const_buffer& chain, asio::error_code& ec); /// Use a certificate chain from a file. /** * This function is used to load a certificate chain into the context from a * file. * * @param filename The name of the file containing the certificate. The file * must use the PEM format. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_certificate_chain_file. */ ASIO_DECL void use_certificate_chain_file(const std::string& filename); /// Use a certificate chain from a file. /** * This function is used to load a certificate chain into the context from a * file. * * @param filename The name of the file containing the certificate. The file * must use the PEM format. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_certificate_chain_file. */ ASIO_DECL ASIO_SYNC_OP_VOID use_certificate_chain_file( const std::string& filename, asio::error_code& ec); /// Use a private key from a memory buffer. /** * This function is used to load a private key into the context from a buffer. * * @param private_key The buffer containing the private key. * * @param format The private key format (ASN.1 or PEM). * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_PrivateKey or SSL_CTX_use_PrivateKey_ASN1. */ ASIO_DECL void use_private_key( const const_buffer& private_key, file_format format); /// Use a private key from a memory buffer. /** * This function is used to load a private key into the context from a buffer. * * @param private_key The buffer containing the private key. * * @param format The private key format (ASN.1 or PEM). * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_PrivateKey or SSL_CTX_use_PrivateKey_ASN1. */ ASIO_DECL ASIO_SYNC_OP_VOID use_private_key( const const_buffer& private_key, file_format format, asio::error_code& ec); /// Use a private key from a file. /** * This function is used to load a private key into the context from a file. * * @param filename The name of the file containing the private key. * * @param format The file format (ASN.1 or PEM). * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_PrivateKey_file. */ ASIO_DECL void use_private_key_file( const std::string& filename, file_format format); /// Use a private key from a file. /** * This function is used to load a private key into the context from a file. * * @param filename The name of the file containing the private key. * * @param format The file format (ASN.1 or PEM). * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_PrivateKey_file. */ ASIO_DECL ASIO_SYNC_OP_VOID use_private_key_file( const std::string& filename, file_format format, asio::error_code& ec); /// Use an RSA private key from a memory buffer. /** * This function is used to load an RSA private key into the context from a * buffer. * * @param private_key The buffer containing the RSA private key. * * @param format The private key format (ASN.1 or PEM). * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_RSAPrivateKey or SSL_CTX_use_RSAPrivateKey_ASN1. */ ASIO_DECL void use_rsa_private_key( const const_buffer& private_key, file_format format); /// Use an RSA private key from a memory buffer. /** * This function is used to load an RSA private key into the context from a * buffer. * * @param private_key The buffer containing the RSA private key. * * @param format The private key format (ASN.1 or PEM). * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_RSAPrivateKey or SSL_CTX_use_RSAPrivateKey_ASN1. */ ASIO_DECL ASIO_SYNC_OP_VOID use_rsa_private_key( const const_buffer& private_key, file_format format, asio::error_code& ec); /// Use an RSA private key from a file. /** * This function is used to load an RSA private key into the context from a * file. * * @param filename The name of the file containing the RSA private key. * * @param format The file format (ASN.1 or PEM). * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_use_RSAPrivateKey_file. */ ASIO_DECL void use_rsa_private_key_file( const std::string& filename, file_format format); /// Use an RSA private key from a file. /** * This function is used to load an RSA private key into the context from a * file. * * @param filename The name of the file containing the RSA private key. * * @param format The file format (ASN.1 or PEM). * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_use_RSAPrivateKey_file. */ ASIO_DECL ASIO_SYNC_OP_VOID use_rsa_private_key_file( const std::string& filename, file_format format, asio::error_code& ec); /// Use the specified memory buffer to obtain the temporary Diffie-Hellman /// parameters. /** * This function is used to load Diffie-Hellman parameters into the context * from a buffer. * * @param dh The memory buffer containing the Diffie-Hellman parameters. The * buffer must use the PEM format. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_tmp_dh. */ ASIO_DECL void use_tmp_dh(const const_buffer& dh); /// Use the specified memory buffer to obtain the temporary Diffie-Hellman /// parameters. /** * This function is used to load Diffie-Hellman parameters into the context * from a buffer. * * @param dh The memory buffer containing the Diffie-Hellman parameters. The * buffer must use the PEM format. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_tmp_dh. */ ASIO_DECL ASIO_SYNC_OP_VOID use_tmp_dh( const const_buffer& dh, asio::error_code& ec); /// Use the specified file to obtain the temporary Diffie-Hellman parameters. /** * This function is used to load Diffie-Hellman parameters into the context * from a file. * * @param filename The name of the file containing the Diffie-Hellman * parameters. The file must use the PEM format. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_tmp_dh. */ ASIO_DECL void use_tmp_dh_file(const std::string& filename); /// Use the specified file to obtain the temporary Diffie-Hellman parameters. /** * This function is used to load Diffie-Hellman parameters into the context * from a file. * * @param filename The name of the file containing the Diffie-Hellman * parameters. The file must use the PEM format. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_tmp_dh. */ ASIO_DECL ASIO_SYNC_OP_VOID use_tmp_dh_file( const std::string& filename, asio::error_code& ec); /// Set the password callback. /** * This function is used to specify a callback function to obtain password * information about an encrypted key in PEM format. * * @param callback The function object to be used for obtaining the password. * The function signature of the handler must be: * @code std::string password_callback( * std::size_t max_length, // The maximum size for a password. * password_purpose purpose // Whether password is for reading or writing. * ); @endcode * The return value of the callback is a string containing the password. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_CTX_set_default_passwd_cb. */ template void set_password_callback(PasswordCallback callback); /// Set the password callback. /** * This function is used to specify a callback function to obtain password * information about an encrypted key in PEM format. * * @param callback The function object to be used for obtaining the password. * The function signature of the handler must be: * @code std::string password_callback( * std::size_t max_length, // The maximum size for a password. * password_purpose purpose // Whether password is for reading or writing. * ); @endcode * The return value of the callback is a string containing the password. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_CTX_set_default_passwd_cb. */ template ASIO_SYNC_OP_VOID set_password_callback(PasswordCallback callback, asio::error_code& ec); private: struct bio_cleanup; struct x509_cleanup; struct evp_pkey_cleanup; struct rsa_cleanup; struct dh_cleanup; // Helper function used to set a peer certificate verification callback. ASIO_DECL ASIO_SYNC_OP_VOID do_set_verify_callback( detail::verify_callback_base* callback, asio::error_code& ec); // Callback used when the SSL implementation wants to verify a certificate. ASIO_DECL static int verify_callback_function( int preverified, X509_STORE_CTX* ctx); // Helper function used to set a password callback. ASIO_DECL ASIO_SYNC_OP_VOID do_set_password_callback( detail::password_callback_base* callback, asio::error_code& ec); // Callback used when the SSL implementation wants a password. ASIO_DECL static int password_callback_function( char* buf, int size, int purpose, void* data); // Helper function to set the temporary Diffie-Hellman parameters from a BIO. ASIO_DECL ASIO_SYNC_OP_VOID do_use_tmp_dh( BIO* bio, asio::error_code& ec); // Helper function to make a BIO from a memory buffer. ASIO_DECL BIO* make_buffer_bio(const const_buffer& b); // The underlying native implementation. native_handle_type handle_; // Ensure openssl is initialised. asio::ssl::detail::openssl_init<> init_; }; } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/ssl/impl/context.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ssl/impl/context.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_SSL_CONTEXT_HPP asio-1.12.2/include/asio/ssl/context_base.hpp000066400000000000000000000121771340672067200211150ustar00rootroot00000000000000// // ssl/context_base.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_CONTEXT_BASE_HPP #define ASIO_SSL_CONTEXT_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { /// The context_base class is used as a base for the basic_context class /// template so that we have a common place to define various enums. class context_base { public: /// Different methods supported by a context. enum method { /// Generic SSL version 2. sslv2, /// SSL version 2 client. sslv2_client, /// SSL version 2 server. sslv2_server, /// Generic SSL version 3. sslv3, /// SSL version 3 client. sslv3_client, /// SSL version 3 server. sslv3_server, /// Generic TLS version 1. tlsv1, /// TLS version 1 client. tlsv1_client, /// TLS version 1 server. tlsv1_server, /// Generic SSL/TLS. sslv23, /// SSL/TLS client. sslv23_client, /// SSL/TLS server. sslv23_server, /// Generic TLS version 1.1. tlsv11, /// TLS version 1.1 client. tlsv11_client, /// TLS version 1.1 server. tlsv11_server, /// Generic TLS version 1.2. tlsv12, /// TLS version 1.2 client. tlsv12_client, /// TLS version 1.2 server. tlsv12_server, /// Generic TLS version 1.3. tlsv13, /// TLS version 1.3 client. tlsv13_client, /// TLS version 1.3 server. tlsv13_server, /// Generic TLS. tls, /// TLS client. tls_client, /// TLS server. tls_server }; /// Bitmask type for SSL options. typedef long options; #if defined(GENERATING_DOCUMENTATION) /// Implement various bug workarounds. static const long default_workarounds = implementation_defined; /// Always create a new key when using tmp_dh parameters. static const long single_dh_use = implementation_defined; /// Disable SSL v2. static const long no_sslv2 = implementation_defined; /// Disable SSL v3. static const long no_sslv3 = implementation_defined; /// Disable TLS v1. static const long no_tlsv1 = implementation_defined; /// Disable TLS v1.1. static const long no_tlsv1_1 = implementation_defined; /// Disable TLS v1.2. static const long no_tlsv1_2 = implementation_defined; /// Disable TLS v1.3. static const long no_tlsv1_3 = implementation_defined; /// Disable compression. Compression is disabled by default. static const long no_compression = implementation_defined; #else ASIO_STATIC_CONSTANT(long, default_workarounds = SSL_OP_ALL); ASIO_STATIC_CONSTANT(long, single_dh_use = SSL_OP_SINGLE_DH_USE); ASIO_STATIC_CONSTANT(long, no_sslv2 = SSL_OP_NO_SSLv2); ASIO_STATIC_CONSTANT(long, no_sslv3 = SSL_OP_NO_SSLv3); ASIO_STATIC_CONSTANT(long, no_tlsv1 = SSL_OP_NO_TLSv1); # if defined(SSL_OP_NO_TLSv1_1) ASIO_STATIC_CONSTANT(long, no_tlsv1_1 = SSL_OP_NO_TLSv1_1); # else // defined(SSL_OP_NO_TLSv1_1) ASIO_STATIC_CONSTANT(long, no_tlsv1_1 = 0x10000000L); # endif // defined(SSL_OP_NO_TLSv1_1) # if defined(SSL_OP_NO_TLSv1_2) ASIO_STATIC_CONSTANT(long, no_tlsv1_2 = SSL_OP_NO_TLSv1_2); # else // defined(SSL_OP_NO_TLSv1_2) ASIO_STATIC_CONSTANT(long, no_tlsv1_2 = 0x08000000L); # endif // defined(SSL_OP_NO_TLSv1_2) # if defined(SSL_OP_NO_TLSv1_3) ASIO_STATIC_CONSTANT(long, no_tlsv1_3 = SSL_OP_NO_TLSv1_3); # else // defined(SSL_OP_NO_TLSv1_3) ASIO_STATIC_CONSTANT(long, no_tlsv1_3 = 0x20000000L); # endif // defined(SSL_OP_NO_TLSv1_3) # if defined(SSL_OP_NO_COMPRESSION) ASIO_STATIC_CONSTANT(long, no_compression = SSL_OP_NO_COMPRESSION); # else // defined(SSL_OP_NO_COMPRESSION) ASIO_STATIC_CONSTANT(long, no_compression = 0x20000L); # endif // defined(SSL_OP_NO_COMPRESSION) #endif /// File format types. enum file_format { /// ASN.1 file. asn1, /// PEM file. pem }; #if !defined(GENERATING_DOCUMENTATION) // The following types and constants are preserved for backward compatibility. // New programs should use the equivalents of the same names that are defined // in the asio::ssl namespace. typedef int verify_mode; ASIO_STATIC_CONSTANT(int, verify_none = SSL_VERIFY_NONE); ASIO_STATIC_CONSTANT(int, verify_peer = SSL_VERIFY_PEER); ASIO_STATIC_CONSTANT(int, verify_fail_if_no_peer_cert = SSL_VERIFY_FAIL_IF_NO_PEER_CERT); ASIO_STATIC_CONSTANT(int, verify_client_once = SSL_VERIFY_CLIENT_ONCE); #endif /// Purpose of PEM password. enum password_purpose { /// The password is needed for reading/decryption. for_reading, /// The password is needed for writing/encryption. for_writing }; protected: /// Protected destructor to prevent deletion through this type. ~context_base() { } }; } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_CONTEXT_BASE_HPP asio-1.12.2/include/asio/ssl/detail/000077500000000000000000000000001340672067200171605ustar00rootroot00000000000000asio-1.12.2/include/asio/ssl/detail/buffered_handshake_op.hpp000066400000000000000000000061121340672067200241570ustar00rootroot00000000000000// // ssl/detail/buffered_handshake_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_BUFFERED_HANDSHAKE_OP_HPP #define ASIO_SSL_DETAIL_BUFFERED_HANDSHAKE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { template class buffered_handshake_op { public: buffered_handshake_op(stream_base::handshake_type type, const ConstBufferSequence& buffers) : type_(type), buffers_(buffers), total_buffer_size_(asio::buffer_size(buffers_)) { } engine::want operator()(engine& eng, asio::error_code& ec, std::size_t& bytes_transferred) const { return this->process(eng, ec, bytes_transferred, asio::buffer_sequence_begin(buffers_), asio::buffer_sequence_end(buffers_)); } template void call_handler(Handler& handler, const asio::error_code& ec, const std::size_t& bytes_transferred) const { handler(ec, bytes_transferred); } private: template engine::want process(engine& eng, asio::error_code& ec, std::size_t& bytes_transferred, Iterator begin, Iterator end) const { Iterator iter = begin; std::size_t accumulated_size = 0; for (;;) { engine::want want = eng.handshake(type_, ec); if (want != engine::want_input_and_retry || bytes_transferred == total_buffer_size_) return want; // Find the next buffer piece to be fed to the engine. while (iter != end) { const_buffer buffer(*iter); // Skip over any buffers which have already been consumed by the engine. if (bytes_transferred >= accumulated_size + buffer.size()) { accumulated_size += buffer.size(); ++iter; continue; } // The current buffer may have been partially consumed by the engine on // a previous iteration. If so, adjust the buffer to point to the // unused portion. if (bytes_transferred > accumulated_size) buffer = buffer + (bytes_transferred - accumulated_size); // Pass the buffer to the engine, and update the bytes transferred to // reflect the total number of bytes consumed so far. bytes_transferred += buffer.size(); buffer = eng.put_input(buffer); bytes_transferred -= buffer.size(); break; } } } stream_base::handshake_type type_; ConstBufferSequence buffers_; std::size_t total_buffer_size_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_BUFFERED_HANDSHAKE_OP_HPP asio-1.12.2/include/asio/ssl/detail/engine.hpp000066400000000000000000000124671340672067200211500ustar00rootroot00000000000000// // ssl/detail/engine.hpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_ENGINE_HPP #define ASIO_SSL_DETAIL_ENGINE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/buffer.hpp" #include "asio/detail/static_mutex.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/ssl/detail/verify_callback.hpp" #include "asio/ssl/stream_base.hpp" #include "asio/ssl/verify_mode.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class engine { public: enum want { // Returned by functions to indicate that the engine wants input. The input // buffer should be updated to point to the data. The engine then needs to // be called again to retry the operation. want_input_and_retry = -2, // Returned by functions to indicate that the engine wants to write output. // The output buffer points to the data to be written. The engine then // needs to be called again to retry the operation. want_output_and_retry = -1, // Returned by functions to indicate that the engine doesn't need input or // output. want_nothing = 0, // Returned by functions to indicate that the engine wants to write output. // The output buffer points to the data to be written. After that the // operation is complete, and the engine does not need to be called again. want_output = 1 }; // Construct a new engine for the specified context. ASIO_DECL explicit engine(SSL_CTX* context); // Destructor. ASIO_DECL ~engine(); // Get the underlying implementation in the native type. ASIO_DECL SSL* native_handle(); // Set the peer verification mode. ASIO_DECL asio::error_code set_verify_mode( verify_mode v, asio::error_code& ec); // Set the peer verification depth. ASIO_DECL asio::error_code set_verify_depth( int depth, asio::error_code& ec); // Set a peer certificate verification callback. ASIO_DECL asio::error_code set_verify_callback( verify_callback_base* callback, asio::error_code& ec); // Perform an SSL handshake using either SSL_connect (client-side) or // SSL_accept (server-side). ASIO_DECL want handshake( stream_base::handshake_type type, asio::error_code& ec); // Perform a graceful shutdown of the SSL session. ASIO_DECL want shutdown(asio::error_code& ec); // Write bytes to the SSL session. ASIO_DECL want write(const asio::const_buffer& data, asio::error_code& ec, std::size_t& bytes_transferred); // Read bytes from the SSL session. ASIO_DECL want read(const asio::mutable_buffer& data, asio::error_code& ec, std::size_t& bytes_transferred); // Get output data to be written to the transport. ASIO_DECL asio::mutable_buffer get_output( const asio::mutable_buffer& data); // Put input data that was read from the transport. ASIO_DECL asio::const_buffer put_input( const asio::const_buffer& data); // Map an error::eof code returned by the underlying transport according to // the type and state of the SSL session. Returns a const reference to the // error code object, suitable for passing to a completion handler. ASIO_DECL const asio::error_code& map_error_code( asio::error_code& ec) const; private: // Disallow copying and assignment. engine(const engine&); engine& operator=(const engine&); // Callback used when the SSL implementation wants to verify a certificate. ASIO_DECL static int verify_callback_function( int preverified, X509_STORE_CTX* ctx); #if (OPENSSL_VERSION_NUMBER < 0x10000000L) // The SSL_accept function may not be thread safe. This mutex is used to // protect all calls to the SSL_accept function. ASIO_DECL static asio::detail::static_mutex& accept_mutex(); #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) // Perform one operation. Returns >= 0 on success or error, want_read if the // operation needs more input, or want_write if it needs to write some output // before the operation can complete. ASIO_DECL want perform(int (engine::* op)(void*, std::size_t), void* data, std::size_t length, asio::error_code& ec, std::size_t* bytes_transferred); // Adapt the SSL_accept function to the signature needed for perform(). ASIO_DECL int do_accept(void*, std::size_t); // Adapt the SSL_connect function to the signature needed for perform(). ASIO_DECL int do_connect(void*, std::size_t); // Adapt the SSL_shutdown function to the signature needed for perform(). ASIO_DECL int do_shutdown(void*, std::size_t); // Adapt the SSL_read function to the signature needed for perform(). ASIO_DECL int do_read(void* data, std::size_t length); // Adapt the SSL_write function to the signature needed for perform(). ASIO_DECL int do_write(void* data, std::size_t length); SSL* ssl_; BIO* ext_bio_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ssl/detail/impl/engine.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_SSL_DETAIL_ENGINE_HPP asio-1.12.2/include/asio/ssl/detail/handshake_op.hpp000066400000000000000000000024371340672067200223230ustar00rootroot00000000000000// // ssl/detail/handshake_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_HANDSHAKE_OP_HPP #define ASIO_SSL_DETAIL_HANDSHAKE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class handshake_op { public: handshake_op(stream_base::handshake_type type) : type_(type) { } engine::want operator()(engine& eng, asio::error_code& ec, std::size_t& bytes_transferred) const { bytes_transferred = 0; return eng.handshake(type_, ec); } template void call_handler(Handler& handler, const asio::error_code& ec, const std::size_t&) const { handler(ec); } private: stream_base::handshake_type type_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_HANDSHAKE_OP_HPP asio-1.12.2/include/asio/ssl/detail/impl/000077500000000000000000000000001340672067200201215ustar00rootroot00000000000000asio-1.12.2/include/asio/ssl/detail/impl/engine.ipp000066400000000000000000000174011340672067200221030ustar00rootroot00000000000000// // ssl/detail/impl/engine.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_IMPL_ENGINE_IPP #define ASIO_SSL_DETAIL_IMPL_ENGINE_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/ssl/error.hpp" #include "asio/ssl/verify_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { engine::engine(SSL_CTX* context) : ssl_(::SSL_new(context)) { if (!ssl_) { asio::error_code ec( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); asio::detail::throw_error(ec, "engine"); } #if (OPENSSL_VERSION_NUMBER < 0x10000000L) accept_mutex().init(); #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) ::SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE); ::SSL_set_mode(ssl_, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); #if defined(SSL_MODE_RELEASE_BUFFERS) ::SSL_set_mode(ssl_, SSL_MODE_RELEASE_BUFFERS); #endif // defined(SSL_MODE_RELEASE_BUFFERS) ::BIO* int_bio = 0; ::BIO_new_bio_pair(&int_bio, 0, &ext_bio_, 0); ::SSL_set_bio(ssl_, int_bio, int_bio); } engine::~engine() { if (SSL_get_app_data(ssl_)) { delete static_cast(SSL_get_app_data(ssl_)); SSL_set_app_data(ssl_, 0); } ::BIO_free(ext_bio_); ::SSL_free(ssl_); } SSL* engine::native_handle() { return ssl_; } asio::error_code engine::set_verify_mode( verify_mode v, asio::error_code& ec) { ::SSL_set_verify(ssl_, v, ::SSL_get_verify_callback(ssl_)); ec = asio::error_code(); return ec; } asio::error_code engine::set_verify_depth( int depth, asio::error_code& ec) { ::SSL_set_verify_depth(ssl_, depth); ec = asio::error_code(); return ec; } asio::error_code engine::set_verify_callback( verify_callback_base* callback, asio::error_code& ec) { if (SSL_get_app_data(ssl_)) delete static_cast(SSL_get_app_data(ssl_)); SSL_set_app_data(ssl_, callback); ::SSL_set_verify(ssl_, ::SSL_get_verify_mode(ssl_), &engine::verify_callback_function); ec = asio::error_code(); return ec; } int engine::verify_callback_function(int preverified, X509_STORE_CTX* ctx) { if (ctx) { if (SSL* ssl = static_cast( ::X509_STORE_CTX_get_ex_data( ctx, ::SSL_get_ex_data_X509_STORE_CTX_idx()))) { if (SSL_get_app_data(ssl)) { verify_callback_base* callback = static_cast( SSL_get_app_data(ssl)); verify_context verify_ctx(ctx); return callback->call(preverified != 0, verify_ctx) ? 1 : 0; } } } return 0; } engine::want engine::handshake( stream_base::handshake_type type, asio::error_code& ec) { return perform((type == asio::ssl::stream_base::client) ? &engine::do_connect : &engine::do_accept, 0, 0, ec, 0); } engine::want engine::shutdown(asio::error_code& ec) { return perform(&engine::do_shutdown, 0, 0, ec, 0); } engine::want engine::write(const asio::const_buffer& data, asio::error_code& ec, std::size_t& bytes_transferred) { if (data.size() == 0) { ec = asio::error_code(); return engine::want_nothing; } return perform(&engine::do_write, const_cast(data.data()), data.size(), ec, &bytes_transferred); } engine::want engine::read(const asio::mutable_buffer& data, asio::error_code& ec, std::size_t& bytes_transferred) { if (data.size() == 0) { ec = asio::error_code(); return engine::want_nothing; } return perform(&engine::do_read, data.data(), data.size(), ec, &bytes_transferred); } asio::mutable_buffer engine::get_output( const asio::mutable_buffer& data) { int length = ::BIO_read(ext_bio_, data.data(), static_cast(data.size())); return asio::buffer(data, length > 0 ? static_cast(length) : 0); } asio::const_buffer engine::put_input( const asio::const_buffer& data) { int length = ::BIO_write(ext_bio_, data.data(), static_cast(data.size())); return asio::buffer(data + (length > 0 ? static_cast(length) : 0)); } const asio::error_code& engine::map_error_code( asio::error_code& ec) const { // We only want to map the error::eof code. if (ec != asio::error::eof) return ec; // If there's data yet to be read, it's an error. if (BIO_wpending(ext_bio_)) { ec = asio::ssl::error::stream_truncated; return ec; } // SSL v2 doesn't provide a protocol-level shutdown, so an eof on the // underlying transport is passed through. #if (OPENSSL_VERSION_NUMBER < 0x10100000L) if (SSL_version(ssl_) == SSL2_VERSION) return ec; #endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) // Otherwise, the peer should have negotiated a proper shutdown. if ((::SSL_get_shutdown(ssl_) & SSL_RECEIVED_SHUTDOWN) == 0) { ec = asio::ssl::error::stream_truncated; } return ec; } #if (OPENSSL_VERSION_NUMBER < 0x10000000L) asio::detail::static_mutex& engine::accept_mutex() { static asio::detail::static_mutex mutex = ASIO_STATIC_MUTEX_INIT; return mutex; } #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) engine::want engine::perform(int (engine::* op)(void*, std::size_t), void* data, std::size_t length, asio::error_code& ec, std::size_t* bytes_transferred) { std::size_t pending_output_before = ::BIO_ctrl_pending(ext_bio_); ::ERR_clear_error(); int result = (this->*op)(data, length); int ssl_error = ::SSL_get_error(ssl_, result); int sys_error = static_cast(::ERR_get_error()); std::size_t pending_output_after = ::BIO_ctrl_pending(ext_bio_); if (ssl_error == SSL_ERROR_SSL) { ec = asio::error_code(sys_error, asio::error::get_ssl_category()); return want_nothing; } if (ssl_error == SSL_ERROR_SYSCALL) { ec = asio::error_code(sys_error, asio::error::get_system_category()); return want_nothing; } if (result > 0 && bytes_transferred) *bytes_transferred = static_cast(result); if (ssl_error == SSL_ERROR_WANT_WRITE) { ec = asio::error_code(); return want_output_and_retry; } else if (pending_output_after > pending_output_before) { ec = asio::error_code(); return result > 0 ? want_output : want_output_and_retry; } else if (ssl_error == SSL_ERROR_WANT_READ) { ec = asio::error_code(); return want_input_and_retry; } else if (::SSL_get_shutdown(ssl_) & SSL_RECEIVED_SHUTDOWN) { ec = asio::error::eof; return want_nothing; } else { ec = asio::error_code(); return want_nothing; } } int engine::do_accept(void*, std::size_t) { #if (OPENSSL_VERSION_NUMBER < 0x10000000L) asio::detail::static_mutex::scoped_lock lock(accept_mutex()); #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) return ::SSL_accept(ssl_); } int engine::do_connect(void*, std::size_t) { return ::SSL_connect(ssl_); } int engine::do_shutdown(void*, std::size_t) { int result = ::SSL_shutdown(ssl_); if (result == 0) result = ::SSL_shutdown(ssl_); return result; } int engine::do_read(void* data, std::size_t length) { return ::SSL_read(ssl_, data, length < INT_MAX ? static_cast(length) : INT_MAX); } int engine::do_write(void* data, std::size_t length) { return ::SSL_write(ssl_, data, length < INT_MAX ? static_cast(length) : INT_MAX); } } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_IMPL_ENGINE_IPP asio-1.12.2/include/asio/ssl/detail/impl/openssl_init.ipp000066400000000000000000000121651340672067200233460ustar00rootroot00000000000000// // ssl/detail/impl/openssl_init.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com // Copyright (c) 2005-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP #define ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/assert.hpp" #include "asio/detail/mutex.hpp" #include "asio/detail/tss_ptr.hpp" #include "asio/ssl/detail/openssl_init.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class openssl_init_base::do_init { public: do_init() { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) ::SSL_library_init(); ::SSL_load_error_strings(); ::OpenSSL_add_all_algorithms(); mutexes_.resize(::CRYPTO_num_locks()); for (size_t i = 0; i < mutexes_.size(); ++i) mutexes_[i].reset(new asio::detail::mutex); ::CRYPTO_set_locking_callback(&do_init::openssl_locking_func); #endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) #if (OPENSSL_VERSION_NUMBER < 0x10000000L) ::CRYPTO_set_id_callback(&do_init::openssl_id_func); #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) null_compression_methods_ = sk_SSL_COMP_new_null(); #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) } ~do_init() { #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) sk_SSL_COMP_free(null_compression_methods_); #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) #if (OPENSSL_VERSION_NUMBER < 0x10000000L) ::CRYPTO_set_id_callback(0); #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) #if (OPENSSL_VERSION_NUMBER < 0x10100000L) ::CRYPTO_set_locking_callback(0); ::ERR_free_strings(); ::EVP_cleanup(); ::CRYPTO_cleanup_all_ex_data(); #endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) #if (OPENSSL_VERSION_NUMBER < 0x10000000L) ::ERR_remove_state(0); #elif (OPENSSL_VERSION_NUMBER < 0x10100000L) ::ERR_remove_thread_state(NULL); #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) \ && (OPENSSL_VERSION_NUMBER < 0x10100000L) \ && !defined(SSL_OP_NO_COMPRESSION) ::SSL_COMP_free_compression_methods(); #endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L) // && (OPENSSL_VERSION_NUMBER < 0x10100000L) // && !defined(SSL_OP_NO_COMPRESSION) #if !defined(OPENSSL_IS_BORINGSSL) ::CONF_modules_unload(1); #endif // !defined(OPENSSL_IS_BORINGSSL) #if !defined(OPENSSL_NO_ENGINE) \ && (OPENSSL_VERSION_NUMBER < 0x10100000L) ::ENGINE_cleanup(); #endif // !defined(OPENSSL_NO_ENGINE) // && (OPENSSL_VERSION_NUMBER < 0x10100000L) } #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) STACK_OF(SSL_COMP)* get_null_compression_methods() const { return null_compression_methods_; } #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) private: #if (OPENSSL_VERSION_NUMBER < 0x10000000L) static unsigned long openssl_id_func() { #if defined(ASIO_WINDOWS) || defined(__CYGWIN__) return ::GetCurrentThreadId(); #else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) void* id = &errno; ASIO_ASSERT(sizeof(unsigned long) >= sizeof(void*)); return reinterpret_cast(id); #endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) } #endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) #if (OPENSSL_VERSION_NUMBER < 0x10100000L) static void openssl_locking_func(int mode, int n, const char* /*file*/, int /*line*/) { if (mode & CRYPTO_LOCK) instance()->mutexes_[n]->lock(); else instance()->mutexes_[n]->unlock(); } // Mutexes to be used in locking callbacks. std::vector > mutexes_; #endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) STACK_OF(SSL_COMP)* null_compression_methods_; #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) }; asio::detail::shared_ptr openssl_init_base::instance() { static asio::detail::shared_ptr init(new do_init); return init; } #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) STACK_OF(SSL_COMP)* openssl_init_base::get_null_compression_methods() { return instance()->get_null_compression_methods(); } #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP asio-1.12.2/include/asio/ssl/detail/io.hpp000066400000000000000000000262241340672067200203060ustar00rootroot00000000000000// // ssl/detail/io.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_IO_HPP #define ASIO_SSL_DETAIL_IO_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/ssl/detail/stream_core.hpp" #include "asio/write.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { template std::size_t io(Stream& next_layer, stream_core& core, const Operation& op, asio::error_code& ec) { std::size_t bytes_transferred = 0; do switch (op(core.engine_, ec, bytes_transferred)) { case engine::want_input_and_retry: // If the input buffer is empty then we need to read some more data from // the underlying transport. if (core.input_.size() == 0) core.input_ = asio::buffer(core.input_buffer_, next_layer.read_some(core.input_buffer_, ec)); // Pass the new input data to the engine. core.input_ = core.engine_.put_input(core.input_); // Try the operation again. continue; case engine::want_output_and_retry: // Get output data from the engine and write it to the underlying // transport. asio::write(next_layer, core.engine_.get_output(core.output_buffer_), ec); // Try the operation again. continue; case engine::want_output: // Get output data from the engine and write it to the underlying // transport. asio::write(next_layer, core.engine_.get_output(core.output_buffer_), ec); // Operation is complete. Return result to caller. core.engine_.map_error_code(ec); return bytes_transferred; default: // Operation is complete. Return result to caller. core.engine_.map_error_code(ec); return bytes_transferred; } while (!ec); // Operation failed. Return result to caller. core.engine_.map_error_code(ec); return 0; } template class io_op { public: io_op(Stream& next_layer, stream_core& core, const Operation& op, Handler& handler) : next_layer_(next_layer), core_(core), op_(op), start_(0), want_(engine::want_nothing), bytes_transferred_(0), handler_(ASIO_MOVE_CAST(Handler)(handler)) { } #if defined(ASIO_HAS_MOVE) io_op(const io_op& other) : next_layer_(other.next_layer_), core_(other.core_), op_(other.op_), start_(other.start_), want_(other.want_), ec_(other.ec_), bytes_transferred_(other.bytes_transferred_), handler_(other.handler_) { } io_op(io_op&& other) : next_layer_(other.next_layer_), core_(other.core_), op_(ASIO_MOVE_CAST(Operation)(other.op_)), start_(other.start_), want_(other.want_), ec_(other.ec_), bytes_transferred_(other.bytes_transferred_), handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) { } #endif // defined(ASIO_HAS_MOVE) void operator()(asio::error_code ec, std::size_t bytes_transferred = ~std::size_t(0), int start = 0) { switch (start_ = start) { case 1: // Called after at least one async operation. do { switch (want_ = op_(core_.engine_, ec_, bytes_transferred_)) { case engine::want_input_and_retry: // If the input buffer already has data in it we can pass it to the // engine and then retry the operation immediately. if (core_.input_.size() != 0) { core_.input_ = core_.engine_.put_input(core_.input_); continue; } // The engine wants more data to be read from input. However, we // cannot allow more than one read operation at a time on the // underlying transport. The pending_read_ timer's expiry is set to // pos_infin if a read is in progress, and neg_infin otherwise. if (core_.expiry(core_.pending_read_) == core_.neg_infin()) { // Prevent other read operations from being started. core_.pending_read_.expires_at(core_.pos_infin()); // Start reading some data from the underlying transport. next_layer_.async_read_some( asio::buffer(core_.input_buffer_), ASIO_MOVE_CAST(io_op)(*this)); } else { // Wait until the current read operation completes. core_.pending_read_.async_wait(ASIO_MOVE_CAST(io_op)(*this)); } // Yield control until asynchronous operation completes. Control // resumes at the "default:" label below. return; case engine::want_output_and_retry: case engine::want_output: // The engine wants some data to be written to the output. However, we // cannot allow more than one write operation at a time on the // underlying transport. The pending_write_ timer's expiry is set to // pos_infin if a write is in progress, and neg_infin otherwise. if (core_.expiry(core_.pending_write_) == core_.neg_infin()) { // Prevent other write operations from being started. core_.pending_write_.expires_at(core_.pos_infin()); // Start writing all the data to the underlying transport. asio::async_write(next_layer_, core_.engine_.get_output(core_.output_buffer_), ASIO_MOVE_CAST(io_op)(*this)); } else { // Wait until the current write operation completes. core_.pending_write_.async_wait(ASIO_MOVE_CAST(io_op)(*this)); } // Yield control until asynchronous operation completes. Control // resumes at the "default:" label below. return; default: // The SSL operation is done and we can invoke the handler, but we // have to keep in mind that this function might be being called from // the async operation's initiating function. In this case we're not // allowed to call the handler directly. Instead, issue a zero-sized // read so the handler runs "as-if" posted using io_context::post(). if (start) { next_layer_.async_read_some( asio::buffer(core_.input_buffer_, 0), ASIO_MOVE_CAST(io_op)(*this)); // Yield control until asynchronous operation completes. Control // resumes at the "default:" label below. return; } else { // Continue on to run handler directly. break; } } default: if (bytes_transferred == ~std::size_t(0)) bytes_transferred = 0; // Timer cancellation, no data transferred. else if (!ec_) ec_ = ec; switch (want_) { case engine::want_input_and_retry: // Add received data to the engine's input. core_.input_ = asio::buffer( core_.input_buffer_, bytes_transferred); core_.input_ = core_.engine_.put_input(core_.input_); // Release any waiting read operations. core_.pending_read_.expires_at(core_.neg_infin()); // Try the operation again. continue; case engine::want_output_and_retry: // Release any waiting write operations. core_.pending_write_.expires_at(core_.neg_infin()); // Try the operation again. continue; case engine::want_output: // Release any waiting write operations. core_.pending_write_.expires_at(core_.neg_infin()); // Fall through to call handler. default: // Pass the result to the handler. op_.call_handler(handler_, core_.engine_.map_error_code(ec_), ec_ ? 0 : bytes_transferred_); // Our work here is done. return; } } while (!ec_); // Operation failed. Pass the result to the handler. op_.call_handler(handler_, core_.engine_.map_error_code(ec_), 0); } } //private: Stream& next_layer_; stream_core& core_; Operation op_; int start_; engine::want want_; asio::error_code ec_; std::size_t bytes_transferred_; Handler handler_; }; template inline void* asio_handler_allocate(std::size_t size, io_op* this_handler) { return asio_handler_alloc_helpers::allocate( size, this_handler->handler_); } template inline void asio_handler_deallocate(void* pointer, std::size_t size, io_op* this_handler) { asio_handler_alloc_helpers::deallocate( pointer, size, this_handler->handler_); } template inline bool asio_handler_is_continuation( io_op* this_handler) { return this_handler->start_ == 0 ? true : asio_handler_cont_helpers::is_continuation(this_handler->handler_); } template inline void asio_handler_invoke(Function& function, io_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void asio_handler_invoke(const Function& function, io_op* this_handler) { asio_handler_invoke_helpers::invoke( function, this_handler->handler_); } template inline void async_io(Stream& next_layer, stream_core& core, const Operation& op, Handler& handler) { io_op( next_layer, core, op, handler)( asio::error_code(), 0, 1); } } // namespace detail } // namespace ssl template struct associated_allocator< ssl::detail::io_op, Allocator> { typedef typename associated_allocator::type type; static type get(const ssl::detail::io_op& h, const Allocator& a = Allocator()) ASIO_NOEXCEPT { return associated_allocator::get(h.handler_, a); } }; template struct associated_executor< ssl::detail::io_op, Executor> { typedef typename associated_executor::type type; static type get(const ssl::detail::io_op& h, const Executor& ex = Executor()) ASIO_NOEXCEPT { return associated_executor::get(h.handler_, ex); } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_IO_HPP asio-1.12.2/include/asio/ssl/detail/openssl_init.hpp000066400000000000000000000055521340672067200224060ustar00rootroot00000000000000// // ssl/detail/openssl_init.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_OPENSSL_INIT_HPP #define ASIO_SSL_DETAIL_OPENSSL_INIT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/memory.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class openssl_init_base : private noncopyable { protected: // Class that performs the actual initialisation. class do_init; // Helper function to manage a do_init singleton. The static instance of the // openssl_init object ensures that this function is always called before // main, and therefore before any other threads can get started. The do_init // instance must be static in this function to ensure that it gets // initialised before any other global objects try to use it. ASIO_DECL static asio::detail::shared_ptr instance(); #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) // Get an empty stack of compression methods, to be used when disabling // compression. ASIO_DECL static STACK_OF(SSL_COMP)* get_null_compression_methods(); #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) }; template class openssl_init : private openssl_init_base { public: // Constructor. openssl_init() : ref_(instance()) { using namespace std; // For memmove. // Ensure openssl_init::instance_ is linked in. openssl_init* tmp = &instance_; memmove(&tmp, &tmp, sizeof(openssl_init*)); } // Destructor. ~openssl_init() { } #if !defined(SSL_OP_NO_COMPRESSION) \ && (OPENSSL_VERSION_NUMBER >= 0x00908000L) using openssl_init_base::get_null_compression_methods; #endif // !defined(SSL_OP_NO_COMPRESSION) // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) private: // Instance to force initialisation of openssl at global scope. static openssl_init instance_; // Reference to singleton do_init object to ensure that openssl does not get // cleaned up until the last user has finished with it. asio::detail::shared_ptr ref_; }; template openssl_init openssl_init::instance_; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ssl/detail/impl/openssl_init.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_SSL_DETAIL_OPENSSL_INIT_HPP asio-1.12.2/include/asio/ssl/detail/openssl_types.hpp000066400000000000000000000015521340672067200226030ustar00rootroot00000000000000// // ssl/detail/openssl_types.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP #define ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/socket_types.hpp" #include #include #if !defined(OPENSSL_NO_ENGINE) # include #endif // !defined(OPENSSL_NO_ENGINE) #include #include #include #include #endif // ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP asio-1.12.2/include/asio/ssl/detail/password_callback.hpp000066400000000000000000000026271340672067200233560ustar00rootroot00000000000000// // ssl/detail/password_callback.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_PASSWORD_CALLBACK_HPP #define ASIO_SSL_DETAIL_PASSWORD_CALLBACK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/ssl/context_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class password_callback_base { public: virtual ~password_callback_base() { } virtual std::string call(std::size_t size, context_base::password_purpose purpose) = 0; }; template class password_callback : public password_callback_base { public: explicit password_callback(PasswordCallback callback) : callback_(callback) { } virtual std::string call(std::size_t size, context_base::password_purpose purpose) { return callback_(size, purpose); } private: PasswordCallback callback_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_PASSWORD_CALLBACK_HPP asio-1.12.2/include/asio/ssl/detail/read_op.hpp000066400000000000000000000030171340672067200213030ustar00rootroot00000000000000// // ssl/detail/read_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_READ_OP_HPP #define ASIO_SSL_DETAIL_READ_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { template class read_op { public: read_op(const MutableBufferSequence& buffers) : buffers_(buffers) { } engine::want operator()(engine& eng, asio::error_code& ec, std::size_t& bytes_transferred) const { asio::mutable_buffer buffer = asio::detail::buffer_sequence_adapter::first(buffers_); return eng.read(buffer, ec, bytes_transferred); } template void call_handler(Handler& handler, const asio::error_code& ec, const std::size_t& bytes_transferred) const { handler(ec, bytes_transferred); } private: MutableBufferSequence buffers_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_READ_OP_HPP asio-1.12.2/include/asio/ssl/detail/shutdown_op.hpp000066400000000000000000000022261340672067200222440ustar00rootroot00000000000000// // ssl/detail/shutdown_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP #define ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class shutdown_op { public: engine::want operator()(engine& eng, asio::error_code& ec, std::size_t& bytes_transferred) const { bytes_transferred = 0; return eng.shutdown(ec); } template void call_handler(Handler& handler, const asio::error_code& ec, const std::size_t&) const { handler(ec); } }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP asio-1.12.2/include/asio/ssl/detail/stream_core.hpp000066400000000000000000000074231340672067200222020ustar00rootroot00000000000000// // ssl/detail/stream_core.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_STREAM_CORE_HPP #define ASIO_SSL_DETAIL_STREAM_CORE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_BOOST_DATE_TIME) # include "asio/deadline_timer.hpp" #else // defined(ASIO_HAS_BOOST_DATE_TIME) # include "asio/steady_timer.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #include "asio/ssl/detail/engine.hpp" #include "asio/buffer.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { struct stream_core { // According to the OpenSSL documentation, this is the buffer size that is // sufficient to hold the largest possible TLS record. enum { max_tls_record_size = 17 * 1024 }; stream_core(SSL_CTX* context, asio::io_context& io_context) : engine_(context), pending_read_(io_context), pending_write_(io_context), output_buffer_space_(max_tls_record_size), output_buffer_(asio::buffer(output_buffer_space_)), input_buffer_space_(max_tls_record_size), input_buffer_(asio::buffer(input_buffer_space_)) { pending_read_.expires_at(neg_infin()); pending_write_.expires_at(neg_infin()); } ~stream_core() { } // The SSL engine. engine engine_; #if defined(ASIO_HAS_BOOST_DATE_TIME) // Timer used for storing queued read operations. asio::deadline_timer pending_read_; // Timer used for storing queued write operations. asio::deadline_timer pending_write_; // Helper function for obtaining a time value that always fires. static asio::deadline_timer::time_type neg_infin() { return boost::posix_time::neg_infin; } // Helper function for obtaining a time value that never fires. static asio::deadline_timer::time_type pos_infin() { return boost::posix_time::pos_infin; } // Helper function to get a timer's expiry time. static asio::deadline_timer::time_type expiry( const asio::deadline_timer& timer) { return timer.expires_at(); } #else // defined(ASIO_HAS_BOOST_DATE_TIME) // Timer used for storing queued read operations. asio::steady_timer pending_read_; // Timer used for storing queued write operations. asio::steady_timer pending_write_; // Helper function for obtaining a time value that always fires. static asio::steady_timer::time_point neg_infin() { return (asio::steady_timer::time_point::min)(); } // Helper function for obtaining a time value that never fires. static asio::steady_timer::time_point pos_infin() { return (asio::steady_timer::time_point::max)(); } // Helper function to get a timer's expiry time. static asio::steady_timer::time_point expiry( const asio::steady_timer& timer) { return timer.expiry(); } #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // Buffer space used to prepare output intended for the transport. std::vector output_buffer_space_; // A buffer that may be used to prepare output intended for the transport. const asio::mutable_buffer output_buffer_; // Buffer space used to read input intended for the engine. std::vector input_buffer_space_; // A buffer that may be used to read input intended for the engine. const asio::mutable_buffer input_buffer_; // The buffer pointing to the engine's unconsumed input. asio::const_buffer input_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_STREAM_CORE_HPP asio-1.12.2/include/asio/ssl/detail/verify_callback.hpp000066400000000000000000000024371340672067200230170ustar00rootroot00000000000000// // ssl/detail/verify_callback.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_VERIFY_CALLBACK_HPP #define ASIO_SSL_DETAIL_VERIFY_CALLBACK_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/verify_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { class verify_callback_base { public: virtual ~verify_callback_base() { } virtual bool call(bool preverified, verify_context& ctx) = 0; }; template class verify_callback : public verify_callback_base { public: explicit verify_callback(VerifyCallback callback) : callback_(callback) { } virtual bool call(bool preverified, verify_context& ctx) { return callback_(preverified, ctx); } private: VerifyCallback callback_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_VERIFY_CALLBACK_HPP asio-1.12.2/include/asio/ssl/detail/write_op.hpp000066400000000000000000000030131340672067200215160ustar00rootroot00000000000000// // ssl/detail/write_op.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_DETAIL_WRITE_OP_HPP #define ASIO_SSL_DETAIL_WRITE_OP_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/ssl/detail/engine.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { namespace detail { template class write_op { public: write_op(const ConstBufferSequence& buffers) : buffers_(buffers) { } engine::want operator()(engine& eng, asio::error_code& ec, std::size_t& bytes_transferred) const { asio::const_buffer buffer = asio::detail::buffer_sequence_adapter::first(buffers_); return eng.write(buffer, ec, bytes_transferred); } template void call_handler(Handler& handler, const asio::error_code& ec, const std::size_t& bytes_transferred) const { handler(ec, bytes_transferred); } private: ConstBufferSequence buffers_; }; } // namespace detail } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_DETAIL_WRITE_OP_HPP asio-1.12.2/include/asio/ssl/error.hpp000066400000000000000000000046301340672067200175630ustar00rootroot00000000000000// // ssl/error.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_ERROR_HPP #define ASIO_SSL_ERROR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/error_code.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace error { enum ssl_errors { // Error numbers are those produced by openssl. }; extern ASIO_DECL const asio::error_category& get_ssl_category(); static const asio::error_category& ssl_category ASIO_UNUSED_VARIABLE = asio::error::get_ssl_category(); } // namespace error namespace ssl { namespace error { enum stream_errors { #if defined(GENERATING_DOCUMENTATION) /// The underlying stream closed before the ssl stream gracefully shut down. stream_truncated #elif (OPENSSL_VERSION_NUMBER < 0x10100000L) && !defined(OPENSSL_IS_BORINGSSL) stream_truncated = ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ) #else stream_truncated = 1 #endif }; extern ASIO_DECL const asio::error_category& get_stream_category(); static const asio::error_category& stream_category ASIO_UNUSED_VARIABLE = asio::ssl::error::get_stream_category(); } // namespace error } // namespace ssl } // namespace asio #if defined(ASIO_HAS_STD_SYSTEM_ERROR) namespace std { template<> struct is_error_code_enum { static const bool value = true; }; template<> struct is_error_code_enum { static const bool value = true; }; } // namespace std #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) namespace asio { namespace error { inline asio::error_code make_error_code(ssl_errors e) { return asio::error_code( static_cast(e), get_ssl_category()); } } // namespace error namespace ssl { namespace error { inline asio::error_code make_error_code(stream_errors e) { return asio::error_code( static_cast(e), get_stream_category()); } } // namespace error } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ssl/impl/error.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_SSL_ERROR_HPP asio-1.12.2/include/asio/ssl/impl/000077500000000000000000000000001340672067200166575ustar00rootroot00000000000000asio-1.12.2/include/asio/ssl/impl/context.hpp000066400000000000000000000034061340672067200210570ustar00rootroot00000000000000// // ssl/impl/context.hpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com // Copyright (c) 2005-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_IMPL_CONTEXT_HPP #define ASIO_SSL_IMPL_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { template void context::set_verify_callback(VerifyCallback callback) { asio::error_code ec; this->set_verify_callback(callback, ec); asio::detail::throw_error(ec, "set_verify_callback"); } template ASIO_SYNC_OP_VOID context::set_verify_callback( VerifyCallback callback, asio::error_code& ec) { do_set_verify_callback( new detail::verify_callback(callback), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } template void context::set_password_callback(PasswordCallback callback) { asio::error_code ec; this->set_password_callback(callback, ec); asio::detail::throw_error(ec, "set_password_callback"); } template ASIO_SYNC_OP_VOID context::set_password_callback( PasswordCallback callback, asio::error_code& ec) { do_set_password_callback( new detail::password_callback(callback), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_IMPL_CONTEXT_HPP asio-1.12.2/include/asio/ssl/impl/context.ipp000066400000000000000000000772121340672067200210660ustar00rootroot00000000000000// // ssl/impl/context.ipp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com // Copyright (c) 2005-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_IMPL_CONTEXT_IPP #define ASIO_SSL_IMPL_CONTEXT_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/ssl/context.hpp" #include "asio/ssl/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { struct context::bio_cleanup { BIO* p; ~bio_cleanup() { if (p) ::BIO_free(p); } }; struct context::x509_cleanup { X509* p; ~x509_cleanup() { if (p) ::X509_free(p); } }; struct context::evp_pkey_cleanup { EVP_PKEY* p; ~evp_pkey_cleanup() { if (p) ::EVP_PKEY_free(p); } }; struct context::rsa_cleanup { RSA* p; ~rsa_cleanup() { if (p) ::RSA_free(p); } }; struct context::dh_cleanup { DH* p; ~dh_cleanup() { if (p) ::DH_free(p); } }; context::context(context::method m) : handle_(0) { ::ERR_clear_error(); switch (m) { // SSL v2. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2) case context::sslv2: case context::sslv2_client: case context::sslv2_server: asio::detail::throw_error( asio::error::invalid_argument, "context"); break; #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2) case context::sslv2: handle_ = ::SSL_CTX_new(::SSLv2_method()); break; case context::sslv2_client: handle_ = ::SSL_CTX_new(::SSLv2_client_method()); break; case context::sslv2_server: handle_ = ::SSL_CTX_new(::SSLv2_server_method()); break; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2) // SSL v3. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) case context::sslv3: handle_ = ::SSL_CTX_new(::TLS_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, SSL3_VERSION); SSL_CTX_set_max_proto_version(handle_, SSL3_VERSION); } break; case context::sslv3_client: handle_ = ::SSL_CTX_new(::TLS_client_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, SSL3_VERSION); SSL_CTX_set_max_proto_version(handle_, SSL3_VERSION); } break; case context::sslv3_server: handle_ = ::SSL_CTX_new(::TLS_server_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, SSL3_VERSION); SSL_CTX_set_max_proto_version(handle_, SSL3_VERSION); } break; #elif defined(OPENSSL_NO_SSL3) case context::sslv3: case context::sslv3_client: case context::sslv3_server: asio::detail::throw_error( asio::error::invalid_argument, "context"); break; #else // defined(OPENSSL_NO_SSL3) case context::sslv3: handle_ = ::SSL_CTX_new(::SSLv3_method()); break; case context::sslv3_client: handle_ = ::SSL_CTX_new(::SSLv3_client_method()); break; case context::sslv3_server: handle_ = ::SSL_CTX_new(::SSLv3_server_method()); break; #endif // defined(OPENSSL_NO_SSL3) // TLS v1.0. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) case context::tlsv1: handle_ = ::SSL_CTX_new(::TLS_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION); } break; case context::tlsv1_client: handle_ = ::SSL_CTX_new(::TLS_client_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION); } break; case context::tlsv1_server: handle_ = ::SSL_CTX_new(::TLS_server_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION); } break; #elif defined(SSL_TXT_TLSV1) case context::tlsv1: handle_ = ::SSL_CTX_new(::TLSv1_method()); break; case context::tlsv1_client: handle_ = ::SSL_CTX_new(::TLSv1_client_method()); break; case context::tlsv1_server: handle_ = ::SSL_CTX_new(::TLSv1_server_method()); break; #else // defined(SSL_TXT_TLSV1) case context::tlsv1: case context::tlsv1_client: case context::tlsv1_server: asio::detail::throw_error( asio::error::invalid_argument, "context"); break; #endif // defined(SSL_TXT_TLSV1) // TLS v1.1. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) case context::tlsv11: handle_ = ::SSL_CTX_new(::TLS_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_1_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_1_VERSION); } break; case context::tlsv11_client: handle_ = ::SSL_CTX_new(::TLS_client_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_1_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_1_VERSION); } break; case context::tlsv11_server: handle_ = ::SSL_CTX_new(::TLS_server_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_1_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_1_VERSION); } break; #elif defined(SSL_TXT_TLSV1_1) case context::tlsv11: handle_ = ::SSL_CTX_new(::TLSv1_1_method()); break; case context::tlsv11_client: handle_ = ::SSL_CTX_new(::TLSv1_1_client_method()); break; case context::tlsv11_server: handle_ = ::SSL_CTX_new(::TLSv1_1_server_method()); break; #else // defined(SSL_TXT_TLSV1_1) case context::tlsv11: case context::tlsv11_client: case context::tlsv11_server: asio::detail::throw_error( asio::error::invalid_argument, "context"); break; #endif // defined(SSL_TXT_TLSV1_1) // TLS v1.2. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) case context::tlsv12: handle_ = ::SSL_CTX_new(::TLS_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_2_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_2_VERSION); } break; case context::tlsv12_client: handle_ = ::SSL_CTX_new(::TLS_client_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_2_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_2_VERSION); } break; case context::tlsv12_server: handle_ = ::SSL_CTX_new(::TLS_server_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_2_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_2_VERSION); } break; #elif defined(SSL_TXT_TLSV1_2) case context::tlsv12: handle_ = ::SSL_CTX_new(::TLSv1_2_method()); break; case context::tlsv12_client: handle_ = ::SSL_CTX_new(::TLSv1_2_client_method()); break; case context::tlsv12_server: handle_ = ::SSL_CTX_new(::TLSv1_2_server_method()); break; #else // defined(SSL_TXT_TLSV1_2) case context::tlsv12: case context::tlsv12_client: case context::tlsv12_server: asio::detail::throw_error( asio::error::invalid_argument, "context"); break; #endif // defined(SSL_TXT_TLSV1_2) // TLS v1.3. #if (OPENSSL_VERSION_NUMBER >= 0x10101000L) \ && !defined(LIBRESSL_VERSION_NUMBER) case context::tlsv13: handle_ = ::SSL_CTX_new(::TLS_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_3_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_3_VERSION); } break; case context::tlsv13_client: handle_ = ::SSL_CTX_new(::TLS_client_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_3_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_3_VERSION); } break; case context::tlsv13_server: handle_ = ::SSL_CTX_new(::TLS_server_method()); if (handle_) { SSL_CTX_set_min_proto_version(handle_, TLS1_3_VERSION); SSL_CTX_set_max_proto_version(handle_, TLS1_3_VERSION); } break; #else // (OPENSSL_VERSION_NUMBER >= 0x10101000L) // && !defined(LIBRESSL_VERSION_NUMBER) case context::tlsv13: case context::tlsv13_client: case context::tlsv13_server: asio::detail::throw_error( asio::error::invalid_argument, "context"); break; #endif // (OPENSSL_VERSION_NUMBER >= 0x10101000L) // && !defined(LIBRESSL_VERSION_NUMBER) // Any supported SSL/TLS version. case context::sslv23: handle_ = ::SSL_CTX_new(::SSLv23_method()); break; case context::sslv23_client: handle_ = ::SSL_CTX_new(::SSLv23_client_method()); break; case context::sslv23_server: handle_ = ::SSL_CTX_new(::SSLv23_server_method()); break; // Any supported TLS version. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) case context::tls: handle_ = ::SSL_CTX_new(::TLS_method()); if (handle_) SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); break; case context::tls_client: handle_ = ::SSL_CTX_new(::TLS_client_method()); if (handle_) SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); break; case context::tls_server: handle_ = ::SSL_CTX_new(::TLS_server_method()); if (handle_) SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); break; #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) case context::tls: handle_ = ::SSL_CTX_new(::SSLv23_method()); if (handle_) SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); break; case context::tls_client: handle_ = ::SSL_CTX_new(::SSLv23_client_method()); if (handle_) SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); break; case context::tls_server: handle_ = ::SSL_CTX_new(::SSLv23_server_method()); if (handle_) SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); break; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) default: handle_ = ::SSL_CTX_new(0); break; } if (handle_ == 0) { asio::error_code ec( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); asio::detail::throw_error(ec, "context"); } set_options(no_compression); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) context::context(context&& other) { handle_ = other.handle_; other.handle_ = 0; } context& context::operator=(context&& other) { context tmp(ASIO_MOVE_CAST(context)(*this)); handle_ = other.handle_; other.handle_ = 0; return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) context::~context() { if (handle_) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) void* cb_userdata = handle_->default_passwd_callback_userdata; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) if (cb_userdata) { detail::password_callback_base* callback = static_cast( cb_userdata); delete callback; #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) ::SSL_CTX_set_default_passwd_cb_userdata(handle_, 0); #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) handle_->default_passwd_callback_userdata = 0; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) } if (SSL_CTX_get_app_data(handle_)) { detail::verify_callback_base* callback = static_cast( SSL_CTX_get_app_data(handle_)); delete callback; SSL_CTX_set_app_data(handle_, 0); } ::SSL_CTX_free(handle_); } } context::native_handle_type context::native_handle() { return handle_; } void context::clear_options(context::options o) { asio::error_code ec; clear_options(o, ec); asio::detail::throw_error(ec, "clear_options"); } ASIO_SYNC_OP_VOID context::clear_options( context::options o, asio::error_code& ec) { #if (OPENSSL_VERSION_NUMBER >= 0x009080DFL) \ && (OPENSSL_VERSION_NUMBER != 0x00909000L) # if !defined(SSL_OP_NO_COMPRESSION) if ((o & context::no_compression) != 0) { # if (OPENSSL_VERSION_NUMBER >= 0x00908000L) handle_->comp_methods = SSL_COMP_get_compression_methods(); # endif // (OPENSSL_VERSION_NUMBER >= 0x00908000L) o ^= context::no_compression; } # endif // !defined(SSL_OP_NO_COMPRESSION) ::SSL_CTX_clear_options(handle_, o); ec = asio::error_code(); #else // (OPENSSL_VERSION_NUMBER >= 0x009080DFL) // && (OPENSSL_VERSION_NUMBER != 0x00909000L) (void)o; ec = asio::error::operation_not_supported; #endif // (OPENSSL_VERSION_NUMBER >= 0x009080DFL) // && (OPENSSL_VERSION_NUMBER != 0x00909000L) ASIO_SYNC_OP_VOID_RETURN(ec); } void context::set_options(context::options o) { asio::error_code ec; set_options(o, ec); asio::detail::throw_error(ec, "set_options"); } ASIO_SYNC_OP_VOID context::set_options( context::options o, asio::error_code& ec) { #if !defined(SSL_OP_NO_COMPRESSION) if ((o & context::no_compression) != 0) { #if (OPENSSL_VERSION_NUMBER >= 0x00908000L) handle_->comp_methods = asio::ssl::detail::openssl_init<>::get_null_compression_methods(); #endif // (OPENSSL_VERSION_NUMBER >= 0x00908000L) o ^= context::no_compression; } #endif // !defined(SSL_OP_NO_COMPRESSION) ::SSL_CTX_set_options(handle_, o); ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::set_verify_mode(verify_mode v) { asio::error_code ec; set_verify_mode(v, ec); asio::detail::throw_error(ec, "set_verify_mode"); } ASIO_SYNC_OP_VOID context::set_verify_mode( verify_mode v, asio::error_code& ec) { ::SSL_CTX_set_verify(handle_, v, ::SSL_CTX_get_verify_callback(handle_)); ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::set_verify_depth(int depth) { asio::error_code ec; set_verify_depth(depth, ec); asio::detail::throw_error(ec, "set_verify_depth"); } ASIO_SYNC_OP_VOID context::set_verify_depth( int depth, asio::error_code& ec) { ::SSL_CTX_set_verify_depth(handle_, depth); ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::load_verify_file(const std::string& filename) { asio::error_code ec; load_verify_file(filename, ec); asio::detail::throw_error(ec, "load_verify_file"); } ASIO_SYNC_OP_VOID context::load_verify_file( const std::string& filename, asio::error_code& ec) { ::ERR_clear_error(); if (::SSL_CTX_load_verify_locations(handle_, filename.c_str(), 0) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::add_certificate_authority(const const_buffer& ca) { asio::error_code ec; add_certificate_authority(ca, ec); asio::detail::throw_error(ec, "add_certificate_authority"); } ASIO_SYNC_OP_VOID context::add_certificate_authority( const const_buffer& ca, asio::error_code& ec) { ::ERR_clear_error(); bio_cleanup bio = { make_buffer_bio(ca) }; if (bio.p) { if (X509_STORE* store = ::SSL_CTX_get_cert_store(handle_)) { for (;;) { x509_cleanup cert = { ::PEM_read_bio_X509(bio.p, 0, 0, 0) }; if (!cert.p) break; if (::X509_STORE_add_cert(store, cert.p) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } } } } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::set_default_verify_paths() { asio::error_code ec; set_default_verify_paths(ec); asio::detail::throw_error(ec, "set_default_verify_paths"); } ASIO_SYNC_OP_VOID context::set_default_verify_paths( asio::error_code& ec) { ::ERR_clear_error(); if (::SSL_CTX_set_default_verify_paths(handle_) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::add_verify_path(const std::string& path) { asio::error_code ec; add_verify_path(path, ec); asio::detail::throw_error(ec, "add_verify_path"); } ASIO_SYNC_OP_VOID context::add_verify_path( const std::string& path, asio::error_code& ec) { ::ERR_clear_error(); if (::SSL_CTX_load_verify_locations(handle_, 0, path.c_str()) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_certificate( const const_buffer& certificate, file_format format) { asio::error_code ec; use_certificate(certificate, format, ec); asio::detail::throw_error(ec, "use_certificate"); } ASIO_SYNC_OP_VOID context::use_certificate( const const_buffer& certificate, file_format format, asio::error_code& ec) { ::ERR_clear_error(); if (format == context_base::asn1) { if (::SSL_CTX_use_certificate_ASN1(handle_, static_cast(certificate.size()), static_cast(certificate.data())) == 1) { ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } else if (format == context_base::pem) { bio_cleanup bio = { make_buffer_bio(certificate) }; if (bio.p) { x509_cleanup cert = { ::PEM_read_bio_X509(bio.p, 0, 0, 0) }; if (cert.p) { if (::SSL_CTX_use_certificate(handle_, cert.p) == 1) { ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } } } else { ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_certificate_file( const std::string& filename, file_format format) { asio::error_code ec; use_certificate_file(filename, format, ec); asio::detail::throw_error(ec, "use_certificate_file"); } ASIO_SYNC_OP_VOID context::use_certificate_file( const std::string& filename, file_format format, asio::error_code& ec) { int file_type; switch (format) { case context_base::asn1: file_type = SSL_FILETYPE_ASN1; break; case context_base::pem: file_type = SSL_FILETYPE_PEM; break; default: { ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } } ::ERR_clear_error(); if (::SSL_CTX_use_certificate_file(handle_, filename.c_str(), file_type) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_certificate_chain(const const_buffer& chain) { asio::error_code ec; use_certificate_chain(chain, ec); asio::detail::throw_error(ec, "use_certificate_chain"); } ASIO_SYNC_OP_VOID context::use_certificate_chain( const const_buffer& chain, asio::error_code& ec) { ::ERR_clear_error(); bio_cleanup bio = { make_buffer_bio(chain) }; if (bio.p) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) pem_password_cb* callback = handle_->default_passwd_callback; void* cb_userdata = handle_->default_passwd_callback_userdata; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) x509_cleanup cert = { ::PEM_read_bio_X509_AUX(bio.p, 0, callback, cb_userdata) }; if (!cert.p) { ec = asio::error_code(ERR_R_PEM_LIB, asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } int result = ::SSL_CTX_use_certificate(handle_, cert.p); if (result == 0 || ::ERR_peek_error() != 0) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } #if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && !defined(LIBRESSL_VERSION_NUMBER) ::SSL_CTX_clear_chain_certs(handle_); #else if (handle_->extra_certs) { ::sk_X509_pop_free(handle_->extra_certs, X509_free); handle_->extra_certs = 0; } #endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L) while (X509* cacert = ::PEM_read_bio_X509(bio.p, 0, callback, cb_userdata)) { if (!::SSL_CTX_add_extra_chain_cert(handle_, cacert)) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } } result = ::ERR_peek_last_error(); if ((ERR_GET_LIB(result) == ERR_LIB_PEM) && (ERR_GET_REASON(result) == PEM_R_NO_START_LINE)) { ::ERR_clear_error(); ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_certificate_chain_file(const std::string& filename) { asio::error_code ec; use_certificate_chain_file(filename, ec); asio::detail::throw_error(ec, "use_certificate_chain_file"); } ASIO_SYNC_OP_VOID context::use_certificate_chain_file( const std::string& filename, asio::error_code& ec) { ::ERR_clear_error(); if (::SSL_CTX_use_certificate_chain_file(handle_, filename.c_str()) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_private_key( const const_buffer& private_key, context::file_format format) { asio::error_code ec; use_private_key(private_key, format, ec); asio::detail::throw_error(ec, "use_private_key"); } ASIO_SYNC_OP_VOID context::use_private_key( const const_buffer& private_key, context::file_format format, asio::error_code& ec) { ::ERR_clear_error(); #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) pem_password_cb* callback = handle_->default_passwd_callback; void* cb_userdata = handle_->default_passwd_callback_userdata; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) bio_cleanup bio = { make_buffer_bio(private_key) }; if (bio.p) { evp_pkey_cleanup evp_private_key = { 0 }; switch (format) { case context_base::asn1: evp_private_key.p = ::d2i_PrivateKey_bio(bio.p, 0); break; case context_base::pem: evp_private_key.p = ::PEM_read_bio_PrivateKey( bio.p, 0, callback, cb_userdata); break; default: { ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } } if (evp_private_key.p) { if (::SSL_CTX_use_PrivateKey(handle_, evp_private_key.p) == 1) { ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_private_key_file( const std::string& filename, context::file_format format) { asio::error_code ec; use_private_key_file(filename, format, ec); asio::detail::throw_error(ec, "use_private_key_file"); } void context::use_rsa_private_key( const const_buffer& private_key, context::file_format format) { asio::error_code ec; use_rsa_private_key(private_key, format, ec); asio::detail::throw_error(ec, "use_rsa_private_key"); } ASIO_SYNC_OP_VOID context::use_rsa_private_key( const const_buffer& private_key, context::file_format format, asio::error_code& ec) { ::ERR_clear_error(); #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) pem_password_cb* callback = handle_->default_passwd_callback; void* cb_userdata = handle_->default_passwd_callback_userdata; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) bio_cleanup bio = { make_buffer_bio(private_key) }; if (bio.p) { rsa_cleanup rsa_private_key = { 0 }; switch (format) { case context_base::asn1: rsa_private_key.p = ::d2i_RSAPrivateKey_bio(bio.p, 0); break; case context_base::pem: rsa_private_key.p = ::PEM_read_bio_RSAPrivateKey( bio.p, 0, callback, cb_userdata); break; default: { ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } } if (rsa_private_key.p) { if (::SSL_CTX_use_RSAPrivateKey(handle_, rsa_private_key.p) == 1) { ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID context::use_private_key_file( const std::string& filename, context::file_format format, asio::error_code& ec) { int file_type; switch (format) { case context_base::asn1: file_type = SSL_FILETYPE_ASN1; break; case context_base::pem: file_type = SSL_FILETYPE_PEM; break; default: { ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } } ::ERR_clear_error(); if (::SSL_CTX_use_PrivateKey_file(handle_, filename.c_str(), file_type) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_rsa_private_key_file( const std::string& filename, context::file_format format) { asio::error_code ec; use_rsa_private_key_file(filename, format, ec); asio::detail::throw_error(ec, "use_rsa_private_key_file"); } ASIO_SYNC_OP_VOID context::use_rsa_private_key_file( const std::string& filename, context::file_format format, asio::error_code& ec) { int file_type; switch (format) { case context_base::asn1: file_type = SSL_FILETYPE_ASN1; break; case context_base::pem: file_type = SSL_FILETYPE_PEM; break; default: { ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } } ::ERR_clear_error(); if (::SSL_CTX_use_RSAPrivateKey_file( handle_, filename.c_str(), file_type) != 1) { ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_tmp_dh(const const_buffer& dh) { asio::error_code ec; use_tmp_dh(dh, ec); asio::detail::throw_error(ec, "use_tmp_dh"); } ASIO_SYNC_OP_VOID context::use_tmp_dh( const const_buffer& dh, asio::error_code& ec) { ::ERR_clear_error(); bio_cleanup bio = { make_buffer_bio(dh) }; if (bio.p) { return do_use_tmp_dh(bio.p, ec); } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } void context::use_tmp_dh_file(const std::string& filename) { asio::error_code ec; use_tmp_dh_file(filename, ec); asio::detail::throw_error(ec, "use_tmp_dh_file"); } ASIO_SYNC_OP_VOID context::use_tmp_dh_file( const std::string& filename, asio::error_code& ec) { ::ERR_clear_error(); bio_cleanup bio = { ::BIO_new_file(filename.c_str(), "r") }; if (bio.p) { return do_use_tmp_dh(bio.p, ec); } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID context::do_use_tmp_dh( BIO* bio, asio::error_code& ec) { ::ERR_clear_error(); dh_cleanup dh = { ::PEM_read_bio_DHparams(bio, 0, 0, 0) }; if (dh.p) { if (::SSL_CTX_set_tmp_dh(handle_, dh.p) == 1) { ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } } ec = asio::error_code( static_cast(::ERR_get_error()), asio::error::get_ssl_category()); ASIO_SYNC_OP_VOID_RETURN(ec); } ASIO_SYNC_OP_VOID context::do_set_verify_callback( detail::verify_callback_base* callback, asio::error_code& ec) { if (SSL_CTX_get_app_data(handle_)) { delete static_cast( SSL_CTX_get_app_data(handle_)); } SSL_CTX_set_app_data(handle_, callback); ::SSL_CTX_set_verify(handle_, ::SSL_CTX_get_verify_mode(handle_), &context::verify_callback_function); ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } int context::verify_callback_function(int preverified, X509_STORE_CTX* ctx) { if (ctx) { if (SSL* ssl = static_cast( ::X509_STORE_CTX_get_ex_data( ctx, ::SSL_get_ex_data_X509_STORE_CTX_idx()))) { if (SSL_CTX* handle = ::SSL_get_SSL_CTX(ssl)) { if (SSL_CTX_get_app_data(handle)) { detail::verify_callback_base* callback = static_cast( SSL_CTX_get_app_data(handle)); verify_context verify_ctx(ctx); return callback->call(preverified != 0, verify_ctx) ? 1 : 0; } } } } return 0; } ASIO_SYNC_OP_VOID context::do_set_password_callback( detail::password_callback_base* callback, asio::error_code& ec) { #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) void* old_callback = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); ::SSL_CTX_set_default_passwd_cb_userdata(handle_, callback); #else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) void* old_callback = handle_->default_passwd_callback_userdata; handle_->default_passwd_callback_userdata = callback; #endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) if (old_callback) delete static_cast( old_callback); SSL_CTX_set_default_passwd_cb(handle_, &context::password_callback_function); ec = asio::error_code(); ASIO_SYNC_OP_VOID_RETURN(ec); } int context::password_callback_function( char* buf, int size, int purpose, void* data) { using namespace std; // For strncat and strlen. if (data) { detail::password_callback_base* callback = static_cast(data); std::string passwd = callback->call(static_cast(size), purpose ? context_base::for_writing : context_base::for_reading); #if defined(ASIO_HAS_SECURE_RTL) strcpy_s(buf, size, passwd.c_str()); #else // defined(ASIO_HAS_SECURE_RTL) *buf = '\0'; if (size > 0) strncat(buf, passwd.c_str(), size - 1); #endif // defined(ASIO_HAS_SECURE_RTL) return static_cast(strlen(buf)); } return 0; } BIO* context::make_buffer_bio(const const_buffer& b) { return ::BIO_new_mem_buf( const_cast(b.data()), static_cast(b.size())); } } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_IMPL_CONTEXT_IPP asio-1.12.2/include/asio/ssl/impl/error.ipp000066400000000000000000000036621340672067200205310ustar00rootroot00000000000000// // ssl/impl/error.ipp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_IMPL_ERROR_IPP #define ASIO_SSL_IMPL_ERROR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/error.hpp" #include "asio/ssl/detail/openssl_init.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace error { namespace detail { class ssl_category : public asio::error_category { public: const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.ssl"; } std::string message(int value) const { const char* s = ::ERR_reason_error_string(value); return s ? s : "asio.ssl error"; } }; } // namespace detail const asio::error_category& get_ssl_category() { static detail::ssl_category instance; return instance; } } // namespace error namespace ssl { namespace error { #if (OPENSSL_VERSION_NUMBER < 0x10100000L) && !defined(OPENSSL_IS_BORINGSSL) const asio::error_category& get_stream_category() { return asio::error::get_ssl_category(); } #else namespace detail { class stream_category : public asio::error_category { public: const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT { return "asio.ssl.stream"; } std::string message(int value) const { switch (value) { case stream_truncated: return "stream truncated"; default: return "asio.ssl.stream error"; } } }; } // namespace detail const asio::error_category& get_stream_category() { static detail::stream_category instance; return instance; } #endif } // namespace error } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_IMPL_ERROR_IPP asio-1.12.2/include/asio/ssl/impl/rfc2818_verification.ipp000066400000000000000000000110531340672067200232300ustar00rootroot00000000000000// // ssl/impl/rfc2818_verification.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP #define ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include #include "asio/ip/address.hpp" #include "asio/ssl/rfc2818_verification.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { bool rfc2818_verification::operator()( bool preverified, verify_context& ctx) const { using namespace std; // For memcmp. // Don't bother looking at certificates that have failed pre-verification. if (!preverified) return false; // We're only interested in checking the certificate at the end of the chain. int depth = X509_STORE_CTX_get_error_depth(ctx.native_handle()); if (depth > 0) return true; // Try converting the host name to an address. If it is an address then we // need to look for an IP address in the certificate rather than a host name. asio::error_code ec; ip::address address = ip::make_address(host_, ec); bool is_address = !ec; X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); // Go through the alternate names in the certificate looking for matching DNS // or IP address entries. GENERAL_NAMES* gens = static_cast( X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0)); for (int i = 0; i < sk_GENERAL_NAME_num(gens); ++i) { GENERAL_NAME* gen = sk_GENERAL_NAME_value(gens, i); if (gen->type == GEN_DNS && !is_address) { ASN1_IA5STRING* domain = gen->d.dNSName; if (domain->type == V_ASN1_IA5STRING && domain->data && domain->length) { const char* pattern = reinterpret_cast(domain->data); std::size_t pattern_length = domain->length; if (match_pattern(pattern, pattern_length, host_.c_str())) { GENERAL_NAMES_free(gens); return true; } } } else if (gen->type == GEN_IPADD && is_address) { ASN1_OCTET_STRING* ip_address = gen->d.iPAddress; if (ip_address->type == V_ASN1_OCTET_STRING && ip_address->data) { if (address.is_v4() && ip_address->length == 4) { ip::address_v4::bytes_type bytes = address.to_v4().to_bytes(); if (memcmp(bytes.data(), ip_address->data, 4) == 0) { GENERAL_NAMES_free(gens); return true; } } else if (address.is_v6() && ip_address->length == 16) { ip::address_v6::bytes_type bytes = address.to_v6().to_bytes(); if (memcmp(bytes.data(), ip_address->data, 16) == 0) { GENERAL_NAMES_free(gens); return true; } } } } } GENERAL_NAMES_free(gens); // No match in the alternate names, so try the common names. We should only // use the "most specific" common name, which is the last one in the list. X509_NAME* name = X509_get_subject_name(cert); int i = -1; ASN1_STRING* common_name = 0; while ((i = X509_NAME_get_index_by_NID(name, NID_commonName, i)) >= 0) { X509_NAME_ENTRY* name_entry = X509_NAME_get_entry(name, i); common_name = X509_NAME_ENTRY_get_data(name_entry); } if (common_name && common_name->data && common_name->length) { const char* pattern = reinterpret_cast(common_name->data); std::size_t pattern_length = common_name->length; if (match_pattern(pattern, pattern_length, host_.c_str())) return true; } return false; } bool rfc2818_verification::match_pattern(const char* pattern, std::size_t pattern_length, const char* host) { using namespace std; // For tolower. const char* p = pattern; const char* p_end = p + pattern_length; const char* h = host; while (p != p_end && *h) { if (*p == '*') { ++p; while (*h && *h != '.') if (match_pattern(p, p_end - p, h++)) return true; } else if (tolower(*p) == tolower(*h)) { ++p; ++h; } else { return false; } } return p == p_end && !*h; } } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP asio-1.12.2/include/asio/ssl/impl/src.hpp000066400000000000000000000013701340672067200201600ustar00rootroot00000000000000// // impl/ssl/src.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_IMPL_SRC_HPP #define ASIO_SSL_IMPL_SRC_HPP #define ASIO_SOURCE #include "asio/detail/config.hpp" #if defined(ASIO_HEADER_ONLY) # error Do not compile Asio library source with ASIO_HEADER_ONLY defined #endif #include "asio/ssl/impl/context.ipp" #include "asio/ssl/impl/error.ipp" #include "asio/ssl/detail/impl/engine.ipp" #include "asio/ssl/detail/impl/openssl_init.ipp" #include "asio/ssl/impl/rfc2818_verification.ipp" #endif // ASIO_SSL_IMPL_SRC_HPP asio-1.12.2/include/asio/ssl/rfc2818_verification.hpp000066400000000000000000000052251340672067200222720ustar00rootroot00000000000000// // ssl/rfc2818_verification.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_RFC2818_VERIFICATION_HPP #define ASIO_SSL_RFC2818_VERIFICATION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/ssl/detail/openssl_types.hpp" #include "asio/ssl/verify_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { /// Verifies a certificate against a hostname according to the rules described /// in RFC 2818. /** * @par Example * The following example shows how to synchronously open a secure connection to * a given host name: * @code * using asio::ip::tcp; * namespace ssl = asio::ssl; * typedef ssl::stream ssl_socket; * * // Create a context that uses the default paths for finding CA certificates. * ssl::context ctx(ssl::context::sslv23); * ctx.set_default_verify_paths(); * * // Open a socket and connect it to the remote host. * asio::io_context io_context; * ssl_socket sock(io_context, ctx); * tcp::resolver resolver(io_context); * tcp::resolver::query query("host.name", "https"); * asio::connect(sock.lowest_layer(), resolver.resolve(query)); * sock.lowest_layer().set_option(tcp::no_delay(true)); * * // Perform SSL handshake and verify the remote host's certificate. * sock.set_verify_mode(ssl::verify_peer); * sock.set_verify_callback(ssl::rfc2818_verification("host.name")); * sock.handshake(ssl_socket::client); * * // ... read and write as normal ... * @endcode */ class rfc2818_verification { public: /// The type of the function object's result. typedef bool result_type; /// Constructor. explicit rfc2818_verification(const std::string& host) : host_(host) { } /// Perform certificate verification. ASIO_DECL bool operator()(bool preverified, verify_context& ctx) const; private: // Helper function to check a host name against a pattern. ASIO_DECL static bool match_pattern(const char* pattern, std::size_t pattern_length, const char* host); // Helper function to check a host name against an IPv4 address // The host name to be checked. std::string host_; }; } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/ssl/impl/rfc2818_verification.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_SSL_RFC2818_VERIFICATION_HPP asio-1.12.2/include/asio/ssl/stream.hpp000066400000000000000000000624151340672067200177320ustar00rootroot00000000000000// // ssl/stream.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_STREAM_HPP #define ASIO_SSL_STREAM_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/async_result.hpp" #include "asio/detail/buffer_sequence_adapter.hpp" #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/type_traits.hpp" #include "asio/ssl/context.hpp" #include "asio/ssl/detail/buffered_handshake_op.hpp" #include "asio/ssl/detail/handshake_op.hpp" #include "asio/ssl/detail/io.hpp" #include "asio/ssl/detail/read_op.hpp" #include "asio/ssl/detail/shutdown_op.hpp" #include "asio/ssl/detail/stream_core.hpp" #include "asio/ssl/detail/write_op.hpp" #include "asio/ssl/stream_base.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { /// Provides stream-oriented functionality using SSL. /** * The stream class template provides asynchronous and blocking stream-oriented * functionality using SSL. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. The application must also ensure that all * asynchronous operations are performed within the same implicit or explicit * strand. * * @par Example * To use the SSL stream template with an ip::tcp::socket, you would write: * @code * asio::io_context io_context; * asio::ssl::context ctx(asio::ssl::context::sslv23); * asio::ssl::stream sock(io_context, ctx); * @endcode * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template class stream : public stream_base, private noncopyable { public: /// The native handle type of the SSL stream. typedef SSL* native_handle_type; /// Structure for use with deprecated impl_type. struct impl_struct { SSL* ssl; }; /// The type of the next layer. typedef typename remove_reference::type next_layer_type; /// The type of the lowest layer. typedef typename next_layer_type::lowest_layer_type lowest_layer_type; /// The type of the executor associated with the object. typedef typename lowest_layer_type::executor_type executor_type; #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Construct a stream. /** * This constructor creates a stream and initialises the underlying stream * object. * * @param arg The argument to be passed to initialise the underlying stream. * * @param ctx The SSL context to be used for the stream. */ template stream(Arg&& arg, context& ctx) : next_layer_(ASIO_MOVE_CAST(Arg)(arg)), core_(ctx.native_handle(), next_layer_.lowest_layer().get_executor().context()) { } #else // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) template stream(Arg& arg, context& ctx) : next_layer_(arg), core_(ctx.native_handle(), next_layer_.lowest_layer().get_executor().context()) { } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destructor. /** * @note A @c stream object must not be destroyed while there are pending * asynchronous operations associated with it. */ ~stream() { } /// Get the executor associated with the object. /** * This function may be used to obtain the executor object that the stream * uses to dispatch handlers for asynchronous operations. * * @return A copy of the executor that stream will use to dispatch handlers. */ executor_type get_executor() ASIO_NOEXCEPT { return next_layer_.lowest_layer().get_executor(); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_context() { return next_layer_.lowest_layer().get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. asio::io_context& get_io_service() { return next_layer_.lowest_layer().get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the underlying implementation in the native type. /** * This function may be used to obtain the underlying implementation of the * context. This is intended to allow access to context functionality that is * not otherwise provided. * * @par Example * The native_handle() function returns a pointer of type @c SSL* that is * suitable for passing to functions such as @c SSL_get_verify_result and * @c SSL_get_peer_certificate: * @code * asio::ssl::stream sock(io_context, ctx); * * // ... establish connection and perform handshake ... * * if (X509* cert = SSL_get_peer_certificate(sock.native_handle())) * { * if (SSL_get_verify_result(sock.native_handle()) == X509_V_OK) * { * // ... * } * } * @endcode */ native_handle_type native_handle() { return core_.engine_.native_handle(); } /// Get a reference to the next layer. /** * This function returns a reference to the next layer in a stack of stream * layers. * * @return A reference to the next layer in the stack of stream layers. * Ownership is not transferred to the caller. */ const next_layer_type& next_layer() const { return next_layer_; } /// Get a reference to the next layer. /** * This function returns a reference to the next layer in a stack of stream * layers. * * @return A reference to the next layer in the stack of stream layers. * Ownership is not transferred to the caller. */ next_layer_type& next_layer() { return next_layer_; } /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * stream layers. * * @return A reference to the lowest layer in the stack of stream layers. * Ownership is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return next_layer_.lowest_layer(); } /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * stream layers. * * @return A reference to the lowest layer in the stack of stream layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return next_layer_.lowest_layer(); } /// Set the peer verification mode. /** * This function may be used to configure the peer verification mode used by * the stream. The new mode will override the mode inherited from the context. * * @param v A bitmask of peer verification modes. See @ref verify_mode for * available values. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_set_verify. */ void set_verify_mode(verify_mode v) { asio::error_code ec; set_verify_mode(v, ec); asio::detail::throw_error(ec, "set_verify_mode"); } /// Set the peer verification mode. /** * This function may be used to configure the peer verification mode used by * the stream. The new mode will override the mode inherited from the context. * * @param v A bitmask of peer verification modes. See @ref verify_mode for * available values. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_set_verify. */ ASIO_SYNC_OP_VOID set_verify_mode( verify_mode v, asio::error_code& ec) { core_.engine_.set_verify_mode(v, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Set the peer verification depth. /** * This function may be used to configure the maximum verification depth * allowed by the stream. * * @param depth Maximum depth for the certificate chain verification that * shall be allowed. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_set_verify_depth. */ void set_verify_depth(int depth) { asio::error_code ec; set_verify_depth(depth, ec); asio::detail::throw_error(ec, "set_verify_depth"); } /// Set the peer verification depth. /** * This function may be used to configure the maximum verification depth * allowed by the stream. * * @param depth Maximum depth for the certificate chain verification that * shall be allowed. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_set_verify_depth. */ ASIO_SYNC_OP_VOID set_verify_depth( int depth, asio::error_code& ec) { core_.engine_.set_verify_depth(depth, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Set the callback used to verify peer certificates. /** * This function is used to specify a callback function that will be called * by the implementation when it needs to verify a peer certificate. * * @param callback The function object to be used for verifying a certificate. * The function signature of the handler must be: * @code bool verify_callback( * bool preverified, // True if the certificate passed pre-verification. * verify_context& ctx // The peer certificate and other context. * ); @endcode * The return value of the callback is true if the certificate has passed * verification, false otherwise. * * @throws asio::system_error Thrown on failure. * * @note Calls @c SSL_set_verify. */ template void set_verify_callback(VerifyCallback callback) { asio::error_code ec; this->set_verify_callback(callback, ec); asio::detail::throw_error(ec, "set_verify_callback"); } /// Set the callback used to verify peer certificates. /** * This function is used to specify a callback function that will be called * by the implementation when it needs to verify a peer certificate. * * @param callback The function object to be used for verifying a certificate. * The function signature of the handler must be: * @code bool verify_callback( * bool preverified, // True if the certificate passed pre-verification. * verify_context& ctx // The peer certificate and other context. * ); @endcode * The return value of the callback is true if the certificate has passed * verification, false otherwise. * * @param ec Set to indicate what error occurred, if any. * * @note Calls @c SSL_set_verify. */ template ASIO_SYNC_OP_VOID set_verify_callback(VerifyCallback callback, asio::error_code& ec) { core_.engine_.set_verify_callback( new detail::verify_callback(callback), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform SSL handshaking. /** * This function is used to perform SSL handshaking on the stream. The * function call will block until handshaking is complete or an error occurs. * * @param type The type of handshaking to be performed, i.e. as a client or as * a server. * * @throws asio::system_error Thrown on failure. */ void handshake(handshake_type type) { asio::error_code ec; handshake(type, ec); asio::detail::throw_error(ec, "handshake"); } /// Perform SSL handshaking. /** * This function is used to perform SSL handshaking on the stream. The * function call will block until handshaking is complete or an error occurs. * * @param type The type of handshaking to be performed, i.e. as a client or as * a server. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID handshake(handshake_type type, asio::error_code& ec) { detail::io(next_layer_, core_, detail::handshake_op(type), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform SSL handshaking. /** * This function is used to perform SSL handshaking on the stream. The * function call will block until handshaking is complete or an error occurs. * * @param type The type of handshaking to be performed, i.e. as a client or as * a server. * * @param buffers The buffered data to be reused for the handshake. * * @throws asio::system_error Thrown on failure. */ template void handshake(handshake_type type, const ConstBufferSequence& buffers) { asio::error_code ec; handshake(type, buffers, ec); asio::detail::throw_error(ec, "handshake"); } /// Perform SSL handshaking. /** * This function is used to perform SSL handshaking on the stream. The * function call will block until handshaking is complete or an error occurs. * * @param type The type of handshaking to be performed, i.e. as a client or as * a server. * * @param buffers The buffered data to be reused for the handshake. * * @param ec Set to indicate what error occurred, if any. */ template ASIO_SYNC_OP_VOID handshake(handshake_type type, const ConstBufferSequence& buffers, asio::error_code& ec) { detail::io(next_layer_, core_, detail::buffered_handshake_op(type, buffers), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous SSL handshake. /** * This function is used to asynchronously perform an SSL handshake on the * stream. This function call always returns immediately. * * @param type The type of handshaking to be performed, i.e. as a client or as * a server. * * @param handler The handler to be called when the handshake operation * completes. Copies will be made of the handler as required. The equivalent * function signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode */ template ASIO_INITFN_RESULT_TYPE(HandshakeHandler, void (asio::error_code)) async_handshake(handshake_type type, ASIO_MOVE_ARG(HandshakeHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a HandshakeHandler. ASIO_HANDSHAKE_HANDLER_CHECK(HandshakeHandler, handler) type_check; asio::async_completion init(handler); detail::async_io(next_layer_, core_, detail::handshake_op(type), init.completion_handler); return init.result.get(); } /// Start an asynchronous SSL handshake. /** * This function is used to asynchronously perform an SSL handshake on the * stream. This function call always returns immediately. * * @param type The type of handshaking to be performed, i.e. as a client or as * a server. * * @param buffers The buffered data to be reused for the handshake. Although * the buffers object may be copied as necessary, ownership of the underlying * buffers is retained by the caller, which must guarantee that they remain * valid until the handler is called. * * @param handler The handler to be called when the handshake operation * completes. Copies will be made of the handler as required. The equivalent * function signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Amount of buffers used in handshake. * ); @endcode */ template ASIO_INITFN_RESULT_TYPE(BufferedHandshakeHandler, void (asio::error_code, std::size_t)) async_handshake(handshake_type type, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(BufferedHandshakeHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a BufferedHandshakeHandler. ASIO_BUFFERED_HANDSHAKE_HANDLER_CHECK( BufferedHandshakeHandler, handler) type_check; asio::async_completion init(handler); detail::async_io(next_layer_, core_, detail::buffered_handshake_op(type, buffers), init.completion_handler); return init.result.get(); } /// Shut down SSL on the stream. /** * This function is used to shut down SSL on the stream. The function call * will block until SSL has been shut down or an error occurs. * * @throws asio::system_error Thrown on failure. */ void shutdown() { asio::error_code ec; shutdown(ec); asio::detail::throw_error(ec, "shutdown"); } /// Shut down SSL on the stream. /** * This function is used to shut down SSL on the stream. The function call * will block until SSL has been shut down or an error occurs. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID shutdown(asio::error_code& ec) { detail::io(next_layer_, core_, detail::shutdown_op(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously shut down SSL on the stream. /** * This function is used to asynchronously shut down SSL on the stream. This * function call always returns immediately. * * @param handler The handler to be called when the handshake operation * completes. Copies will be made of the handler as required. The equivalent * function signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode */ template ASIO_INITFN_RESULT_TYPE(ShutdownHandler, void (asio::error_code)) async_shutdown(ASIO_MOVE_ARG(ShutdownHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ShutdownHandler. ASIO_SHUTDOWN_HANDLER_CHECK(ShutdownHandler, handler) type_check; asio::async_completion init(handler); detail::async_io(next_layer_, core_, detail::shutdown_op(), init.completion_handler); return init.result.get(); } /// Write some data to the stream. /** * This function is used to write data on the stream. The function call will * block until one or more bytes of data has been written successfully, or * until an error occurs. * * @param buffers The data to be written. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that all * data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t n = write_some(buffers, ec); asio::detail::throw_error(ec, "write_some"); return n; } /// Write some data to the stream. /** * This function is used to write data on the stream. The function call will * block until one or more bytes of data has been written successfully, or * until an error occurs. * * @param buffers The data to be written to the stream. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that all * data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return detail::io(next_layer_, core_, detail::write_op(buffers), ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write one or more bytes of data to * the stream. The function call always returns immediately. * * @param buffers The data to be written to the stream. Although the buffers * object may be copied as necessary, ownership of the underlying buffers is * retained by the caller, which must guarantee that they remain valid until * the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The equivalent function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * * @note The async_write_some operation may not transmit all of the data to * the peer. Consider using the @ref async_write function if you need to * ensure that all data is written before the asynchronous operation * completes. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; asio::async_completion init(handler); detail::async_io(next_layer_, core_, detail::write_op(buffers), init.completion_handler); return init.result.get(); } /// Read some data from the stream. /** * This function is used to read data from the stream. The function call will * block until one or more bytes of data has been read successfully, or until * an error occurs. * * @param buffers The buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t n = read_some(buffers, ec); asio::detail::throw_error(ec, "read_some"); return n; } /// Read some data from the stream. /** * This function is used to read data from the stream. The function call will * block until one or more bytes of data has been read successfully, or until * an error occurs. * * @param buffers The buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that the * requested amount of data is read before the blocking operation completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return detail::io(next_layer_, core_, detail::read_op(buffers), ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read one or more bytes of data from * the stream. The function call always returns immediately. * * @param buffers The buffers into which the data will be read. Although the * buffers object may be copied as necessary, ownership of the underlying * buffers is retained by the caller, which must guarantee that they remain * valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The equivalent function * signature of the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * * @note The async_read_some operation may not read all of the requested * number of bytes. Consider using the @ref async_read function if you need to * ensure that the requested amount of data is read before the asynchronous * operation completes. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; asio::async_completion init(handler); detail::async_io(next_layer_, core_, detail::read_op(buffers), init.completion_handler); return init.result.get(); } private: Stream next_layer_; detail::stream_core core_; }; } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_STREAM_HPP asio-1.12.2/include/asio/ssl/stream_base.hpp000066400000000000000000000021661340672067200207210ustar00rootroot00000000000000// // ssl/stream_base.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_STREAM_BASE_HPP #define ASIO_SSL_STREAM_BASE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { /// The stream_base class is used as a base for the asio::ssl::stream /// class template so that we have a common place to define various enums. class stream_base { public: /// Different handshake types. enum handshake_type { /// Perform handshaking as a client. client, /// Perform handshaking as a server. server }; protected: /// Protected destructor to prevent deletion through this type. ~stream_base() { } }; } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_STREAM_BASE_HPP asio-1.12.2/include/asio/ssl/verify_context.hpp000066400000000000000000000031721340672067200215020ustar00rootroot00000000000000// // ssl/verify_context.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_VERIFY_CONTEXT_HPP #define ASIO_SSL_VERIFY_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { /// A simple wrapper around the X509_STORE_CTX type, used during verification of /// a peer certificate. /** * @note The verify_context does not own the underlying X509_STORE_CTX object. */ class verify_context : private noncopyable { public: /// The native handle type of the verification context. typedef X509_STORE_CTX* native_handle_type; /// Constructor. explicit verify_context(native_handle_type handle) : handle_(handle) { } /// Get the underlying implementation in the native type. /** * This function may be used to obtain the underlying implementation of the * context. This is intended to allow access to context functionality that is * not otherwise provided. */ native_handle_type native_handle() { return handle_; } private: // The underlying native implementation. native_handle_type handle_; }; } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_VERIFY_CONTEXT_HPP asio-1.12.2/include/asio/ssl/verify_mode.hpp000066400000000000000000000032151340672067200207400ustar00rootroot00000000000000// // ssl/verify_mode.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SSL_VERIFY_MODE_HPP #define ASIO_SSL_VERIFY_MODE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/ssl/detail/openssl_types.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace ssl { /// Bitmask type for peer verification. /** * Possible values are: * * @li @ref verify_none * @li @ref verify_peer * @li @ref verify_fail_if_no_peer_cert * @li @ref verify_client_once */ typedef int verify_mode; #if defined(GENERATING_DOCUMENTATION) /// No verification. const int verify_none = implementation_defined; /// Verify the peer. const int verify_peer = implementation_defined; /// Fail verification if the peer has no certificate. Ignored unless /// @ref verify_peer is set. const int verify_fail_if_no_peer_cert = implementation_defined; /// Do not request client certificate on renegotiation. Ignored unless /// @ref verify_peer is set. const int verify_client_once = implementation_defined; #else const int verify_none = SSL_VERIFY_NONE; const int verify_peer = SSL_VERIFY_PEER; const int verify_fail_if_no_peer_cert = SSL_VERIFY_FAIL_IF_NO_PEER_CERT; const int verify_client_once = SSL_VERIFY_CLIENT_ONCE; #endif } // namespace ssl } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SSL_VERIFY_MODE_HPP asio-1.12.2/include/asio/steady_timer.hpp000066400000000000000000000023031340672067200203150ustar00rootroot00000000000000// // steady_timer.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_STEADY_TIMER_HPP #define ASIO_STEADY_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) #include "asio/basic_waitable_timer.hpp" #include "asio/detail/chrono.hpp" namespace asio { /// Typedef for a timer based on the steady clock. /** * This typedef uses the C++11 @c <chrono> standard library facility, if * available. Otherwise, it may use the Boost.Chrono library. To explicitly * utilise Boost.Chrono, use the basic_waitable_timer template directly: * @code * typedef basic_waitable_timer timer; * @endcode */ typedef basic_waitable_timer steady_timer; } // namespace asio #endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) #endif // ASIO_STEADY_TIMER_HPP asio-1.12.2/include/asio/strand.hpp000066400000000000000000000207041340672067200171240ustar00rootroot00000000000000// // strand.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_STRAND_HPP #define ASIO_STRAND_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/strand_executor_service.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Provides serialised function invocation for any executor type. template class strand { public: /// The type of the underlying executor. typedef Executor inner_executor_type; /// Default constructor. /** * This constructor is only valid if the underlying executor type is default * constructible. */ strand() : executor_(), impl_(use_service( executor_.context()).create_implementation()) { } /// Construct a strand for the specified executor. explicit strand(const Executor& e) : executor_(e), impl_(use_service( executor_.context()).create_implementation()) { } /// Copy constructor. strand(const strand& other) ASIO_NOEXCEPT : executor_(other.executor_), impl_(other.impl_) { } /// Converting constructor. /** * This constructor is only valid if the @c OtherExecutor type is convertible * to @c Executor. */ template strand( const strand& other) ASIO_NOEXCEPT : executor_(other.executor_), impl_(other.impl_) { } /// Assignment operator. strand& operator=(const strand& other) ASIO_NOEXCEPT { executor_ = other.executor_; impl_ = other.impl_; return *this; } /// Converting assignment operator. /** * This assignment operator is only valid if the @c OtherExecutor type is * convertible to @c Executor. */ template strand& operator=( const strand& other) ASIO_NOEXCEPT { executor_ = other.executor_; impl_ = other.impl_; return *this; } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move constructor. strand(strand&& other) ASIO_NOEXCEPT : executor_(ASIO_MOVE_CAST(Executor)(other.executor_)), impl_(ASIO_MOVE_CAST(implementation_type)(other.impl_)) { } /// Converting move constructor. /** * This constructor is only valid if the @c OtherExecutor type is convertible * to @c Executor. */ template strand(strand&& other) ASIO_NOEXCEPT : executor_(ASIO_MOVE_CAST(OtherExecutor)(other)), impl_(ASIO_MOVE_CAST(implementation_type)(other.impl_)) { } /// Move assignment operator. strand& operator=(strand&& other) ASIO_NOEXCEPT { executor_ = ASIO_MOVE_CAST(Executor)(other); impl_ = ASIO_MOVE_CAST(implementation_type)(other.impl_); return *this; } /// Converting move assignment operator. /** * This assignment operator is only valid if the @c OtherExecutor type is * convertible to @c Executor. */ template strand& operator=( const strand&& other) ASIO_NOEXCEPT { executor_ = ASIO_MOVE_CAST(OtherExecutor)(other); impl_ = ASIO_MOVE_CAST(implementation_type)(other.impl_); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destructor. ~strand() { } /// Obtain the underlying executor. inner_executor_type get_inner_executor() const ASIO_NOEXCEPT { return executor_; } /// Obtain the underlying execution context. execution_context& context() const ASIO_NOEXCEPT { return executor_.context(); } /// Inform the strand that it has some outstanding work to do. /** * The strand delegates this call to its underlying executor. */ void on_work_started() const ASIO_NOEXCEPT { executor_.on_work_started(); } /// Inform the strand that some work is no longer outstanding. /** * The strand delegates this call to its underlying executor. */ void on_work_finished() const ASIO_NOEXCEPT { executor_.on_work_finished(); } /// Request the strand to invoke the given function object. /** * This function is used to ask the strand to execute the given function * object on its underlying executor. The function object will be executed * inside this function if the strand is not otherwise busy and if the * underlying executor's @c dispatch() function is also able to execute the * function before returning. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { detail::strand_executor_service::dispatch(impl_, executor_, ASIO_MOVE_CAST(Function)(f), a); } /// Request the strand to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will never be executed inside this function. * Instead, it will be scheduled by the underlying executor's defer function. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { detail::strand_executor_service::post(impl_, executor_, ASIO_MOVE_CAST(Function)(f), a); } /// Request the strand to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will never be executed inside this function. * Instead, it will be scheduled by the underlying executor's defer function. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const { detail::strand_executor_service::defer(impl_, executor_, ASIO_MOVE_CAST(Function)(f), a); } /// Determine whether the strand is running in the current thread. /** * @return @c true if the current thread is executing a function that was * submitted to the strand using post(), dispatch() or defer(). Otherwise * returns @c false. */ bool running_in_this_thread() const ASIO_NOEXCEPT { return detail::strand_executor_service::running_in_this_thread(impl_); } /// Compare two strands for equality. /** * Two strands are equal if they refer to the same ordered, non-concurrent * state. */ friend bool operator==(const strand& a, const strand& b) ASIO_NOEXCEPT { return a.impl_ == b.impl_; } /// Compare two strands for inequality. /** * Two strands are equal if they refer to the same ordered, non-concurrent * state. */ friend bool operator!=(const strand& a, const strand& b) ASIO_NOEXCEPT { return a.impl_ != b.impl_; } private: Executor executor_; typedef detail::strand_executor_service::implementation_type implementation_type; implementation_type impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" // If both io_context.hpp and strand.hpp have been included, automatically // include the header file needed for the io_context::strand class. #if !defined(ASIO_NO_EXTENSIONS) # if defined(ASIO_IO_CONTEXT_HPP) # include "asio/io_context_strand.hpp" # endif // defined(ASIO_IO_CONTEXT_HPP) #endif // !defined(ASIO_NO_EXTENSIONS) #endif // ASIO_STRAND_HPP asio-1.12.2/include/asio/stream_socket_service.hpp000066400000000000000000000302741340672067200222170ustar00rootroot00000000000000// // stream_socket_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_STREAM_SOCKET_SERVICE_HPP #define ASIO_STREAM_SOCKET_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include #include "asio/async_result.hpp" #include "asio/detail/type_traits.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_WINDOWS_RUNTIME) # include "asio/detail/winrt_ssocket_service.hpp" #elif defined(ASIO_HAS_IOCP) # include "asio/detail/win_iocp_socket_service.hpp" #else # include "asio/detail/reactive_socket_service.hpp" #endif #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a stream socket. template class stream_socket_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The protocol type. typedef Protocol protocol_type; /// The endpoint type. typedef typename Protocol::endpoint endpoint_type; private: // The type of the platform-specific implementation. #if defined(ASIO_WINDOWS_RUNTIME) typedef detail::winrt_ssocket_service service_impl_type; #elif defined(ASIO_HAS_IOCP) typedef detail::win_iocp_socket_service service_impl_type; #else typedef detail::reactive_socket_service service_impl_type; #endif public: /// The type of a stream socket implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// The native socket type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef typename service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new stream socket service for the specified io_context. explicit stream_socket_service(asio::io_context& io_context) : asio::detail::service_base< stream_socket_service >(io_context), service_impl_(io_context) { } /// Construct a new stream socket implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new stream socket implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another stream socket implementation. void move_assign(implementation_type& impl, stream_socket_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } // All socket services have access to each other's implementations. template friend class stream_socket_service; /// Move-construct a new stream socket implementation from another protocol /// type. template void converting_move_construct(implementation_type& impl, stream_socket_service& other_service, typename stream_socket_service< Protocol1>::implementation_type& other_impl, typename enable_if::value>::type* = 0) { service_impl_.template converting_move_construct( impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a stream socket implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Open a stream socket. ASIO_SYNC_OP_VOID open(implementation_type& impl, const protocol_type& protocol, asio::error_code& ec) { if (protocol.type() == ASIO_OS_DEF(SOCK_STREAM)) service_impl_.open(impl, protocol, ec); else ec = asio::error::invalid_argument; ASIO_SYNC_OP_VOID_RETURN(ec); } /// Assign an existing native socket to a stream socket. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const protocol_type& protocol, const native_handle_type& native_socket, asio::error_code& ec) { service_impl_.assign(impl, protocol, native_socket, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a stream socket implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Release ownership of the underlying socket. native_handle_type release(implementation_type& impl, asio::error_code& ec) { return service_impl_.release(impl, ec); } /// Get the native socket implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the socket. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the socket is at the out-of-band data mark. bool at_mark(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.at_mark(impl, ec); } /// Determine the number of bytes available for reading. std::size_t available(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.available(impl, ec); } /// Bind the stream socket to the specified local endpoint. ASIO_SYNC_OP_VOID bind(implementation_type& impl, const endpoint_type& endpoint, asio::error_code& ec) { service_impl_.bind(impl, endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Connect the stream socket to the specified endpoint. ASIO_SYNC_OP_VOID connect(implementation_type& impl, const endpoint_type& peer_endpoint, asio::error_code& ec) { service_impl_.connect(impl, peer_endpoint, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Start an asynchronous connect. template ASIO_INITFN_RESULT_TYPE(ConnectHandler, void (asio::error_code)) async_connect(implementation_type& impl, const endpoint_type& peer_endpoint, ASIO_MOVE_ARG(ConnectHandler) handler) { async_completion init(handler); service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); return init.result.get(); } /// Set a socket option. template ASIO_SYNC_OP_VOID set_option(implementation_type& impl, const SettableSocketOption& option, asio::error_code& ec) { service_impl_.set_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get a socket option. template ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, GettableSocketOption& option, asio::error_code& ec) const { service_impl_.get_option(impl, option, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform an IO control command on the socket. template ASIO_SYNC_OP_VOID io_control(implementation_type& impl, IoControlCommand& command, asio::error_code& ec) { service_impl_.io_control(impl, command, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the socket. bool non_blocking(const implementation_type& impl) const { return service_impl_.non_blocking(impl); } /// Sets the non-blocking mode of the socket. ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Gets the non-blocking mode of the native socket implementation. bool native_non_blocking(const implementation_type& impl) const { return service_impl_.native_non_blocking(impl); } /// Sets the non-blocking mode of the native socket implementation. ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, bool mode, asio::error_code& ec) { service_impl_.native_non_blocking(impl, mode, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the local endpoint. endpoint_type local_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.local_endpoint(impl, ec); } /// Get the remote endpoint. endpoint_type remote_endpoint(const implementation_type& impl, asio::error_code& ec) const { return service_impl_.remote_endpoint(impl, ec); } /// Disable sends or receives on the socket. ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, socket_base::shutdown_type what, asio::error_code& ec) { service_impl_.shutdown(impl, what, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Wait for the socket to become ready to read, ready to write, or to have /// pending error conditions. ASIO_SYNC_OP_VOID wait(implementation_type& impl, socket_base::wait_type w, asio::error_code& ec) { service_impl_.wait(impl, w, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Asynchronously wait for the socket to become ready to read, ready to /// write, or to have pending error conditions. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, socket_base::wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, w, init.completion_handler); return init.result.get(); } /// Send the given data to the peer. template std::size_t send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.send(impl, buffers, flags, ec); } /// Start an asynchronous send. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_send(implementation_type& impl, const ConstBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(WriteHandler) handler) { async_completion init(handler); service_impl_.async_send(impl, buffers, flags, init.completion_handler); return init.result.get(); } /// Receive some data from the peer. template std::size_t receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, asio::error_code& ec) { return service_impl_.receive(impl, buffers, flags, ec); } /// Start an asynchronous receive. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_receive(implementation_type& impl, const MutableBufferSequence& buffers, socket_base::message_flags flags, ASIO_MOVE_ARG(ReadHandler) handler) { async_completion init(handler); service_impl_.async_receive(impl, buffers, flags, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_STREAM_SOCKET_SERVICE_HPP asio-1.12.2/include/asio/streambuf.hpp000066400000000000000000000013511340672067200176160ustar00rootroot00000000000000// // streambuf.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_STREAMBUF_HPP #define ASIO_STREAMBUF_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_NO_IOSTREAM) #include "asio/basic_streambuf.hpp" namespace asio { /// Typedef for the typical usage of basic_streambuf. typedef basic_streambuf<> streambuf; } // namespace asio #endif // !defined(ASIO_NO_IOSTREAM) #endif // ASIO_STREAMBUF_HPP asio-1.12.2/include/asio/system_context.hpp000066400000000000000000000037271340672067200207270ustar00rootroot00000000000000// // system_context.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SYSTEM_CONTEXT_HPP #define ASIO_SYSTEM_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/scheduler.hpp" #include "asio/detail/thread_group.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { class system_executor; /// The executor context for the system executor. class system_context : public execution_context { public: /// The executor type associated with the context. typedef system_executor executor_type; /// Destructor shuts down all threads in the system thread pool. ASIO_DECL ~system_context(); /// Obtain an executor for the context. executor_type get_executor() ASIO_NOEXCEPT; /// Signal all threads in the system thread pool to stop. ASIO_DECL void stop(); /// Determine whether the system thread pool has been stopped. ASIO_DECL bool stopped() const ASIO_NOEXCEPT; /// Join all threads in the system thread pool. ASIO_DECL void join(); #if defined(GENERATING_DOCUMENTATION) private: #endif // defined(GENERATING_DOCUMENTATION) // Constructor creates all threads in the system thread pool. ASIO_DECL system_context(); private: friend class system_executor; struct thread_function; // The underlying scheduler. detail::scheduler& scheduler_; // The threads in the system thread pool. detail::thread_group threads_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/system_context.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/system_context.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_SYSTEM_CONTEXT_HPP asio-1.12.2/include/asio/system_error.hpp000066400000000000000000000055011340672067200203640ustar00rootroot00000000000000// // system_error.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SYSTEM_ERROR_HPP #define ASIO_SYSTEM_ERROR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_STD_SYSTEM_ERROR) # include #else // defined(ASIO_HAS_STD_SYSTEM_ERROR) # include # include # include # include "asio/error_code.hpp" # include "asio/detail/scoped_ptr.hpp" #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) #include "asio/detail/push_options.hpp" namespace asio { #if defined(ASIO_HAS_STD_SYSTEM_ERROR) typedef std::system_error system_error; #else // defined(ASIO_HAS_STD_SYSTEM_ERROR) /// The system_error class is used to represent system conditions that /// prevent the library from operating correctly. class system_error : public std::exception { public: /// Construct with an error code. system_error(const error_code& ec) : code_(ec), context_() { } /// Construct with an error code and context. system_error(const error_code& ec, const std::string& context) : code_(ec), context_(context) { } /// Copy constructor. system_error(const system_error& other) : std::exception(other), code_(other.code_), context_(other.context_), what_() { } /// Destructor. virtual ~system_error() throw () { } /// Assignment operator. system_error& operator=(const system_error& e) { context_ = e.context_; code_ = e.code_; what_.reset(); return *this; } /// Get a string representation of the exception. virtual const char* what() const throw () { #if !defined(ASIO_NO_EXCEPTIONS) try #endif // !defined(ASIO_NO_EXCEPTIONS) { if (!what_.get()) { std::string tmp(context_); if (tmp.length()) tmp += ": "; tmp += code_.message(); what_.reset(new std::string(tmp)); } return what_->c_str(); } #if !defined(ASIO_NO_EXCEPTIONS) catch (std::exception&) { return "system_error"; } #endif // !defined(ASIO_NO_EXCEPTIONS) } /// Get the error code associated with the exception. error_code code() const { return code_; } private: // The code associated with the error. error_code code_; // The context associated with the error. std::string context_; // The string representation of the error. mutable asio::detail::scoped_ptr what_; }; #endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_SYSTEM_ERROR_HPP asio-1.12.2/include/asio/system_executor.hpp000066400000000000000000000102451340672067200210720ustar00rootroot00000000000000// // system_executor.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SYSTEM_EXECUTOR_HPP #define ASIO_SYSTEM_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/push_options.hpp" namespace asio { class system_context; /// An executor that uses arbitrary threads. /** * The system executor represents an execution context where functions are * permitted to run on arbitrary threads. The post() and defer() functions * schedule the function to run on an unspecified system thread pool, and * dispatch() invokes the function immediately. */ class system_executor { public: /// Obtain the underlying execution context. system_context& context() const ASIO_NOEXCEPT; /// Inform the executor that it has some outstanding work to do. /** * For the system executor, this is a no-op. */ void on_work_started() const ASIO_NOEXCEPT { } /// Inform the executor that some work is no longer outstanding. /** * For the system executor, this is a no-op. */ void on_work_finished() const ASIO_NOEXCEPT { } /// Request the system executor to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will always be executed inside this function. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the system executor to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will never be executed inside this function. * Instead, it will be scheduled to run on an unspecified system thread pool. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the system executor to invoke the given function object. /** * This function is used to ask the executor to execute the given function * object. The function object will never be executed inside this function. * Instead, it will be scheduled to run on an unspecified system thread pool. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Compare two executors for equality. /** * System executors always compare equal. */ friend bool operator==(const system_executor&, const system_executor&) ASIO_NOEXCEPT { return true; } /// Compare two executors for inequality. /** * System executors always compare equal. */ friend bool operator!=(const system_executor&, const system_executor&) ASIO_NOEXCEPT { return false; } }; } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/system_executor.hpp" #endif // ASIO_SYSTEM_EXECUTOR_HPP asio-1.12.2/include/asio/system_timer.hpp000066400000000000000000000023031340672067200203500ustar00rootroot00000000000000// // system_timer.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_SYSTEM_TIMER_HPP #define ASIO_SYSTEM_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) #include "asio/basic_waitable_timer.hpp" #include "asio/detail/chrono.hpp" namespace asio { /// Typedef for a timer based on the system clock. /** * This typedef uses the C++11 @c <chrono> standard library facility, if * available. Otherwise, it may use the Boost.Chrono library. To explicitly * utilise Boost.Chrono, use the basic_waitable_timer template directly: * @code * typedef basic_waitable_timer timer; * @endcode */ typedef basic_waitable_timer system_timer; } // namespace asio #endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) #endif // ASIO_SYSTEM_TIMER_HPP asio-1.12.2/include/asio/thread.hpp000066400000000000000000000044051340672067200171000ustar00rootroot00000000000000// // thread.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_THREAD_HPP #define ASIO_THREAD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/thread.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// A simple abstraction for starting threads. /** * The asio::thread class implements the smallest possible subset of the * functionality of boost::thread. It is intended to be used only for starting * a thread and waiting for it to exit. If more extensive threading * capabilities are required, you are strongly advised to use something else. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Example * A typical use of asio::thread would be to launch a thread to run an * io_context's event processing loop: * * @par * @code asio::io_context io_context; * // ... * asio::thread t(boost::bind(&asio::io_context::run, &io_context)); * // ... * t.join(); @endcode */ class thread : private noncopyable { public: /// Start a new thread that executes the supplied function. /** * This constructor creates a new thread that will execute the given function * or function object. * * @param f The function or function object to be run in the thread. The * function signature must be: @code void f(); @endcode */ template explicit thread(Function f) : impl_(f) { } /// Destructor. ~thread() { } /// Wait for the thread to exit. /** * This function will block until the thread has exited. * * If this function is not called before the thread object is destroyed, the * thread itself will continue to run until completion. You will, however, * no longer have the ability to wait for it to exit. */ void join() { impl_.join(); } private: detail::thread impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_THREAD_HPP asio-1.12.2/include/asio/thread_pool.hpp000066400000000000000000000160321340672067200201300ustar00rootroot00000000000000// // thread_pool.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_THREAD_POOL_HPP #define ASIO_THREAD_POOL_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/noncopyable.hpp" #include "asio/detail/scheduler.hpp" #include "asio/detail/thread_group.hpp" #include "asio/execution_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// A simple fixed-size thread pool. /** * The thread pool class is an execution context where functions are permitted * to run on one of a fixed number of threads. * * @par Submitting tasks to the pool * * To submit functions to the thread_pool, use the @ref asio::dispatch, * @ref asio::post or @ref asio::defer free functions. * * For example: * * @code void my_task() * { * ... * } * * ... * * // Launch the pool with four threads. * asio::thread_pool pool(4); * * // Submit a function to the pool. * asio::post(pool, my_task); * * // Submit a lambda object to the pool. * asio::post(pool, * []() * { * ... * }); * * // Wait for all tasks in the pool to complete. * pool.join(); @endcode */ class thread_pool : public execution_context { public: class executor_type; /// Constructs a pool with an automatically determined number of threads. ASIO_DECL thread_pool(); /// Constructs a pool with a specified number of threads. ASIO_DECL thread_pool(std::size_t num_threads); /// Destructor. /** * Automatically stops and joins the pool, if not explicitly done beforehand. */ ASIO_DECL ~thread_pool(); /// Obtains the executor associated with the pool. executor_type get_executor() ASIO_NOEXCEPT; /// Stops the threads. /** * This function stops the threads as soon as possible. As a result of calling * @c stop(), pending function objects may be never be invoked. */ ASIO_DECL void stop(); /// Joins the threads. /** * This function blocks until the threads in the pool have completed. If @c * stop() is not called prior to @c join(), the @c join() call will wait * until the pool has no more outstanding work. */ ASIO_DECL void join(); private: friend class executor_type; struct thread_function; // The underlying scheduler. detail::scheduler& scheduler_; // The threads in the pool. detail::thread_group threads_; }; /// Executor used to submit functions to a thread pool. class thread_pool::executor_type { public: /// Obtain the underlying execution context. thread_pool& context() const ASIO_NOEXCEPT; /// Inform the thread pool that it has some outstanding work to do. /** * This function is used to inform the thread pool that some work has begun. * This ensures that the thread pool's join() function will not return while * the work is underway. */ void on_work_started() const ASIO_NOEXCEPT; /// Inform the thread pool that some work is no longer outstanding. /** * This function is used to inform the thread pool that some work has * finished. Once the count of unfinished work reaches zero, the thread * pool's join() function is permitted to exit. */ void on_work_finished() const ASIO_NOEXCEPT; /// Request the thread pool to invoke the given function object. /** * This function is used to ask the thread pool to execute the given function * object. If the current thread belongs to the pool, @c dispatch() executes * the function before returning. Otherwise, the function will be scheduled * to run on the thread pool. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the thread pool to invoke the given function object. /** * This function is used to ask the thread pool to execute the given function * object. The function object will never be executed inside @c post(). * Instead, it will be scheduled to run on the thread pool. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Request the thread pool to invoke the given function object. /** * This function is used to ask the thread pool to execute the given function * object. The function object will never be executed inside @c defer(). * Instead, it will be scheduled to run on the thread pool. * * If the current thread belongs to the thread pool, @c defer() will delay * scheduling the function object until the current thread returns control to * the pool. * * @param f The function object to be called. The executor will make * a copy of the handler object as required. The function signature of the * function object must be: @code void function(); @endcode * * @param a An allocator that may be used by the executor to allocate the * internal storage needed for function invocation. */ template void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; /// Determine whether the thread pool is running in the current thread. /** * @return @c true if the current thread belongs to the pool. Otherwise * returns @c false. */ bool running_in_this_thread() const ASIO_NOEXCEPT; /// Compare two executors for equality. /** * Two executors are equal if they refer to the same underlying thread pool. */ friend bool operator==(const executor_type& a, const executor_type& b) ASIO_NOEXCEPT { return &a.pool_ == &b.pool_; } /// Compare two executors for inequality. /** * Two executors are equal if they refer to the same underlying thread pool. */ friend bool operator!=(const executor_type& a, const executor_type& b) ASIO_NOEXCEPT { return &a.pool_ != &b.pool_; } private: friend class thread_pool; // Constructor. explicit executor_type(thread_pool& p) : pool_(p) {} // The underlying thread pool. thread_pool& pool_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/thread_pool.hpp" #if defined(ASIO_HEADER_ONLY) # include "asio/impl/thread_pool.ipp" #endif // defined(ASIO_HEADER_ONLY) #endif // ASIO_THREAD_POOL_HPP asio-1.12.2/include/asio/time_traits.hpp000066400000000000000000000042221340672067200201520ustar00rootroot00000000000000// // time_traits.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TIME_TRAITS_HPP #define ASIO_TIME_TRAITS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/socket_types.hpp" // Must come before posix_time. #if defined(ASIO_HAS_BOOST_DATE_TIME) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/detail/push_options.hpp" namespace asio { /// Time traits suitable for use with the deadline timer. template struct time_traits; /// Time traits specialised for posix_time. template <> struct time_traits { /// The time type. typedef boost::posix_time::ptime time_type; /// The duration type. typedef boost::posix_time::time_duration duration_type; /// Get the current time. static time_type now() { #if defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK) return boost::posix_time::microsec_clock::universal_time(); #else // defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK) return boost::posix_time::second_clock::universal_time(); #endif // defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK) } /// Add a duration to a time. static time_type add(const time_type& t, const duration_type& d) { return t + d; } /// Subtract one time from another. static duration_type subtract(const time_type& t1, const time_type& t2) { return t1 - t2; } /// Test whether one time is less than another. static bool less_than(const time_type& t1, const time_type& t2) { return t1 < t2; } /// Convert to POSIX duration type. static boost::posix_time::time_duration to_posix_duration( const duration_type& d) { return d; } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_TIME_TRAITS_HPP asio-1.12.2/include/asio/ts/000077500000000000000000000000001340672067200155435ustar00rootroot00000000000000asio-1.12.2/include/asio/ts/buffer.hpp000066400000000000000000000011571340672067200175310ustar00rootroot00000000000000// // ts/buffer.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_BUFFER_HPP #define ASIO_TS_BUFFER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/buffer.hpp" #include "asio/completion_condition.hpp" #include "asio/read.hpp" #include "asio/write.hpp" #include "asio/read_until.hpp" #endif // ASIO_TS_BUFFER_HPP asio-1.12.2/include/asio/ts/executor.hpp000066400000000000000000000017631340672067200201210ustar00rootroot00000000000000// // ts/executor.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_EXECUTOR_HPP #define ASIO_TS_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/handler_type.hpp" #include "asio/async_result.hpp" #include "asio/associated_allocator.hpp" #include "asio/execution_context.hpp" #include "asio/is_executor.hpp" #include "asio/associated_executor.hpp" #include "asio/bind_executor.hpp" #include "asio/executor_work_guard.hpp" #include "asio/system_executor.hpp" #include "asio/executor.hpp" #include "asio/dispatch.hpp" #include "asio/post.hpp" #include "asio/defer.hpp" #include "asio/strand.hpp" #include "asio/packaged_task.hpp" #include "asio/use_future.hpp" #endif // ASIO_TS_EXECUTOR_HPP asio-1.12.2/include/asio/ts/internet.hpp000066400000000000000000000023411340672067200201040ustar00rootroot00000000000000// // ts/internet.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_INTERNET_HPP #define ASIO_TS_INTERNET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/ip/address.hpp" #include "asio/ip/address_v4.hpp" #include "asio/ip/address_v4_iterator.hpp" #include "asio/ip/address_v4_range.hpp" #include "asio/ip/address_v6.hpp" #include "asio/ip/address_v6_iterator.hpp" #include "asio/ip/address_v6_range.hpp" #include "asio/ip/bad_address_cast.hpp" #include "asio/ip/basic_endpoint.hpp" #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_entry.hpp" #include "asio/ip/basic_resolver_iterator.hpp" #include "asio/ip/basic_resolver.hpp" #include "asio/ip/host_name.hpp" #include "asio/ip/network_v4.hpp" #include "asio/ip/network_v6.hpp" #include "asio/ip/tcp.hpp" #include "asio/ip/udp.hpp" #include "asio/ip/v6_only.hpp" #include "asio/ip/unicast.hpp" #include "asio/ip/multicast.hpp" #endif // ASIO_TS_INTERNET_HPP asio-1.12.2/include/asio/ts/io_context.hpp000066400000000000000000000010141340672067200204230ustar00rootroot00000000000000// // ts/io_context.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_IO_CONTEXT_HPP #define ASIO_TS_IO_CONTEXT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/io_context.hpp" #endif // ASIO_TS_IO_CONTEXT_HPP asio-1.12.2/include/asio/ts/net.hpp000066400000000000000000000012431340672067200170420ustar00rootroot00000000000000// // ts/net.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_NET_HPP #define ASIO_TS_NET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/ts/netfwd.hpp" #include "asio/ts/executor.hpp" #include "asio/ts/io_context.hpp" #include "asio/ts/timer.hpp" #include "asio/ts/buffer.hpp" #include "asio/ts/socket.hpp" #include "asio/ts/internet.hpp" #endif // ASIO_TS_NET_HPP asio-1.12.2/include/asio/ts/netfwd.hpp000066400000000000000000000113231340672067200175430ustar00rootroot00000000000000// // ts/netfwd.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_NETFWD_HPP #define ASIO_TS_NETFWD_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_CHRONO) # include "asio/detail/chrono.hpp" #endif // defined(ASIO_HAS_CHRONO) #if defined(ASIO_HAS_BOOST_DATE_TIME) # include "asio/detail/date_time_fwd.hpp" #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #if !defined(GENERATING_DOCUMENTATION) #include "asio/detail/push_options.hpp" namespace asio { class execution_context; template class executor_binder; template class executor_work_guard; class system_executor; class executor; template class strand; class io_context; template struct wait_traits; #if defined(ASIO_HAS_BOOST_DATE_TIME) template struct time_traits; #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #if defined(ASIO_ENABLE_OLD_SERVICES) template class waitable_timer_service; #if defined(ASIO_HAS_BOOST_DATE_TIME) template class deadline_timer_service; #endif // defined(ASIO_HAS_BOOST_DATE_TIME) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) #define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL template ASIO_SVC_TPARAM_DEF2(= waitable_timer_service)> class basic_waitable_timer; #endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) #if defined(ASIO_HAS_CHRONO) typedef basic_waitable_timer system_timer; typedef basic_waitable_timer steady_timer; typedef basic_waitable_timer high_resolution_timer; #endif // defined(ASIO_HAS_CHRONO) template class basic_socket; template class basic_datagram_socket; template class basic_stream_socket; template class basic_socket_acceptor; #if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) #define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL // Forward declaration with defaulted arguments. template ), #if defined(ASIO_HAS_BOOST_DATE_TIME) \ || defined(GENERATING_DOCUMENTATION) typename Clock = boost::posix_time::ptime, typename WaitTraits = time_traits ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> #else typename Clock = chrono::steady_clock, typename WaitTraits = wait_traits ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> #endif class basic_socket_streambuf; #endif // !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) #if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) #define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL // Forward declaration with defaulted arguments. template ), #if defined(ASIO_HAS_BOOST_DATE_TIME) \ || defined(GENERATING_DOCUMENTATION) typename Clock = boost::posix_time::ptime, typename WaitTraits = time_traits ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> #else typename Clock = chrono::steady_clock, typename WaitTraits = wait_traits ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> #endif class basic_socket_iostream; #endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) namespace ip { class address; class address_v4; class address_v6; template class basic_address_iterator; typedef basic_address_iterator address_v4_iterator; typedef basic_address_iterator address_v6_iterator; template class basic_address_range; typedef basic_address_range address_v4_range; typedef basic_address_range address_v6_range; class network_v4; class network_v6; template class basic_endpoint; template class basic_resolver_entry; template class basic_resolver_results; template class basic_resolver; class tcp; class udp; } // namespace ip } // namespace asio #include "asio/detail/pop_options.hpp" #endif // !defined(GENERATING_DOCUMENTATION) #endif // ASIO_TS_NETFWD_HPP asio-1.12.2/include/asio/ts/socket.hpp000066400000000000000000000014071340672067200175460ustar00rootroot00000000000000// // ts/socket.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_SOCKET_HPP #define ASIO_TS_SOCKET_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/socket_base.hpp" #include "asio/basic_socket.hpp" #include "asio/basic_datagram_socket.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/basic_socket_acceptor.hpp" #include "asio/basic_socket_streambuf.hpp" #include "asio/basic_socket_iostream.hpp" #include "asio/connect.hpp" #endif // ASIO_TS_SOCKET_HPP asio-1.12.2/include/asio/ts/timer.hpp000066400000000000000000000012541340672067200173760ustar00rootroot00000000000000// // ts/timer.hpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_TS_TIMER_HPP #define ASIO_TS_TIMER_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/chrono.hpp" #include "asio/wait_traits.hpp" #include "asio/basic_waitable_timer.hpp" #include "asio/system_timer.hpp" #include "asio/steady_timer.hpp" #include "asio/high_resolution_timer.hpp" #endif // ASIO_TS_TIMER_HPP asio-1.12.2/include/asio/unyield.hpp000066400000000000000000000005751340672067200173060ustar00rootroot00000000000000// // unyield.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifdef reenter # undef reenter #endif #ifdef yield # undef yield #endif #ifdef fork # undef fork #endif asio-1.12.2/include/asio/use_future.hpp000066400000000000000000000110431340672067200200130ustar00rootroot00000000000000// // use_future.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_USE_FUTURE_HPP #define ASIO_USE_FUTURE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/future.hpp" #if defined(ASIO_HAS_STD_FUTURE_CLASS) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace detail { template class packaged_token; template class packaged_handler; } // namespace detail /// Class used to specify that an asynchronous operation should return a future. /** * The use_future_t class is used to indicate that an asynchronous operation * should return a std::future object. A use_future_t object may be passed as a * handler to an asynchronous operation, typically using the special value @c * asio::use_future. For example: * * @code std::future my_future * = my_socket.async_read_some(my_buffer, asio::use_future); @endcode * * The initiating function (async_read_some in the above example) returns a * future that will receive the result of the operation. If the operation * completes with an error_code indicating failure, it is converted into a * system_error and passed back to the caller via the future. */ template > class use_future_t { public: /// The allocator type. The allocator is used when constructing the /// @c std::promise object for a given asynchronous operation. typedef Allocator allocator_type; /// Construct using default-constructed allocator. ASIO_CONSTEXPR use_future_t() { } /// Construct using specified allocator. explicit use_future_t(const Allocator& allocator) : allocator_(allocator) { } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use rebind().) Specify an alternate allocator. template use_future_t operator[](const OtherAllocator& allocator) const { return use_future_t(allocator); } #endif // !defined(ASIO_NO_DEPRECATED) /// Specify an alternate allocator. template use_future_t rebind(const OtherAllocator& allocator) const { return use_future_t(allocator); } /// Obtain allocator. allocator_type get_allocator() const { return allocator_; } /// Wrap a function object in a packaged task. /** * The @c package function is used to adapt a function object as a packaged * task. When this adapter is passed as a completion token to an asynchronous * operation, the result of the function object is retuned via a std::future. * * @par Example * * @code std::future fut = * my_socket.async_read_some(buffer, * use_future([](asio::error_code ec, std::size_t n) * { * return ec ? 0 : n; * })); * ... * std::size_t n = fut.get(); @endcode */ template #if defined(GENERATING_DOCUMENTATION) unspecified #else // defined(GENERATING_DOCUMENTATION) detail::packaged_token::type, Allocator> #endif // defined(GENERATING_DOCUMENTATION) operator()(ASIO_MOVE_ARG(Function) f) const; private: // Helper type to ensure that use_future can be constexpr default-constructed // even when std::allocator can't be. struct std_allocator_void { ASIO_CONSTEXPR std_allocator_void() { } operator std::allocator() const { return std::allocator(); } }; typename conditional< is_same, Allocator>::value, std_allocator_void, Allocator>::type allocator_; }; /// A special value, similar to std::nothrow. /** * See the documentation for asio::use_future_t for a usage example. */ #if defined(ASIO_HAS_CONSTEXPR) || defined(GENERATING_DOCUMENTATION) constexpr use_future_t<> use_future; #elif defined(ASIO_MSVC) __declspec(selectany) use_future_t<> use_future; #endif } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/use_future.hpp" #endif // defined(ASIO_HAS_STD_FUTURE_CLASS) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_USE_FUTURE_HPP asio-1.12.2/include/asio/uses_executor.hpp000066400000000000000000000042651340672067200205320ustar00rootroot00000000000000// // uses_executor.hpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_USES_EXECUTOR_HPP #define ASIO_USES_EXECUTOR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// A special type, similar to std::nothrow_t, used to disambiguate /// constructors that accept executor arguments. /** * The executor_arg_t struct is an empty structure type used as a unique type * to disambiguate constructor and function overloading. Specifically, some * types have constructors with executor_arg_t as the first argument, * immediately followed by an argument of a type that satisfies the Executor * type requirements. */ struct executor_arg_t { /// Constructor. ASIO_CONSTEXPR executor_arg_t() ASIO_NOEXCEPT { } }; /// A special value, similar to std::nothrow, used to disambiguate constructors /// that accept executor arguments. /** * See asio::executor_arg_t and asio::uses_executor * for more information. */ #if defined(ASIO_HAS_CONSTEXPR) || defined(GENERATING_DOCUMENTATION) constexpr executor_arg_t executor_arg; #elif defined(ASIO_MSVC) __declspec(selectany) executor_arg_t executor_arg; #endif /// The uses_executor trait detects whether a type T has an associated executor /// that is convertible from type Executor. /** * Meets the BinaryTypeTrait requirements. The Asio library provides a * definition that is derived from false_type. A program may specialize this * template to derive from true_type for a user-defined type T that can be * constructed with an executor, where the first argument of a constructor has * type executor_arg_t and the second argument is convertible from type * Executor. */ template struct uses_executor : false_type {}; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_USES_EXECUTOR_HPP asio-1.12.2/include/asio/version.hpp000066400000000000000000000012041340672067200173100ustar00rootroot00000000000000// // version.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_VERSION_HPP #define ASIO_VERSION_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) // ASIO_VERSION % 100 is the sub-minor version // ASIO_VERSION / 100 % 1000 is the minor version // ASIO_VERSION / 100000 is the major version #define ASIO_VERSION 101202 // 1.12.2 #endif // ASIO_VERSION_HPP asio-1.12.2/include/asio/wait_traits.hpp000066400000000000000000000025461340672067200201670ustar00rootroot00000000000000// // wait_traits.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WAIT_TRAITS_HPP #define ASIO_WAIT_TRAITS_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/push_options.hpp" namespace asio { /// Wait traits suitable for use with the basic_waitable_timer class template. template struct wait_traits { /// Convert a clock duration into a duration used for waiting. /** * @returns @c d. */ static typename Clock::duration to_wait_duration( const typename Clock::duration& d) { return d; } /// Convert a clock duration into a duration used for waiting. /** * @returns @c d. */ static typename Clock::duration to_wait_duration( const typename Clock::time_point& t) { typename Clock::time_point now = Clock::now(); if (now + (Clock::duration::max)() < t) return (Clock::duration::max)(); if (now + (Clock::duration::min)() > t) return (Clock::duration::min)(); return t - now; } }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_WAIT_TRAITS_HPP asio-1.12.2/include/asio/waitable_timer_service.hpp000066400000000000000000000136631340672067200223470ustar00rootroot00000000000000// // waitable_timer_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WAITABLE_TIMER_SERVICE_HPP #define ASIO_WAITABLE_TIMER_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #include #include "asio/async_result.hpp" #include "asio/detail/chrono_time_traits.hpp" #include "asio/detail/deadline_timer_service.hpp" #include "asio/io_context.hpp" #include "asio/wait_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { /// Default service implementation for a timer. template > class waitable_timer_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base< waitable_timer_service > #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif /// The clock type. typedef Clock clock_type; /// The duration type of the clock. typedef typename clock_type::duration duration; /// The time point type of the clock. typedef typename clock_type::time_point time_point; /// The wait traits type. typedef WaitTraits traits_type; private: // The type of the platform-specific implementation. typedef detail::deadline_timer_service< detail::chrono_time_traits > service_impl_type; public: /// The implementation type of the waitable timer. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef typename service_impl_type::implementation_type implementation_type; #endif /// Construct a new timer service for the specified io_context. explicit waitable_timer_service(asio::io_context& io_context) : asio::detail::service_base< waitable_timer_service >(io_context), service_impl_(io_context) { } /// Construct a new timer implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } /// Destroy a timer implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new timer implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another timer implementation. void move_assign(implementation_type& impl, waitable_timer_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Cancel any asynchronous wait operations associated with the timer. std::size_t cancel(implementation_type& impl, asio::error_code& ec) { return service_impl_.cancel(impl, ec); } /// Cancels one asynchronous wait operation associated with the timer. std::size_t cancel_one(implementation_type& impl, asio::error_code& ec) { return service_impl_.cancel_one(impl, ec); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use expiry().) Get the expiry time for the timer as an /// absolute time. time_point expires_at(const implementation_type& impl) const { return service_impl_.expiry(impl); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the expiry time for the timer as an absolute time. time_point expiry(const implementation_type& impl) const { return service_impl_.expiry(impl); } /// Set the expiry time for the timer as an absolute time. std::size_t expires_at(implementation_type& impl, const time_point& expiry_time, asio::error_code& ec) { return service_impl_.expires_at(impl, expiry_time, ec); } /// Set the expiry time for the timer relative to now. std::size_t expires_after(implementation_type& impl, const duration& expiry_time, asio::error_code& ec) { return service_impl_.expires_after(impl, expiry_time, ec); } #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use expiry().) Get the expiry time for the timer relative to /// now. duration expires_from_now(const implementation_type& impl) const { typedef detail::chrono_time_traits traits; return traits::subtract(service_impl_.expiry(impl), traits::now()); } /// (Deprecated: Use expires_after().) Set the expiry time for the timer /// relative to now. std::size_t expires_from_now(implementation_type& impl, const duration& expiry_time, asio::error_code& ec) { return service_impl_.expires_after(impl, expiry_time, ec); } #endif // !defined(ASIO_NO_DEPRECATED) // Perform a blocking wait on the timer. void wait(implementation_type& impl, asio::error_code& ec) { service_impl_.wait(impl, ec); } // Start an asynchronous wait on the timer. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, ASIO_MOVE_ARG(WaitHandler) handler) { async_completion init(handler); service_impl_.async_wait(impl, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WAITABLE_TIMER_SERVICE_HPP asio-1.12.2/include/asio/windows/000077500000000000000000000000001340672067200166075ustar00rootroot00000000000000asio-1.12.2/include/asio/windows/basic_handle.hpp000066400000000000000000000203701340672067200217160ustar00rootroot00000000000000// // windows/basic_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_BASIC_HANDLE_HPP #define ASIO_WINDOWS_BASIC_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ || defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include "asio/basic_io_object.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Provides Windows handle functionality. /** * The windows::basic_handle class template provides the ability to wrap a * Windows handle. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_handle : public basic_io_object { public: /// The native representation of a handle. typedef typename HandleService::native_handle_type native_handle_type; /// A basic_handle is always the lowest layer. typedef basic_handle lowest_layer_type; /// Construct a basic_handle without opening it. /** * This constructor creates a handle without opening it. * * @param io_context The io_context object that the handle will use to * dispatch handlers for any asynchronous operations performed on the handle. */ explicit basic_handle(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct a basic_handle on an existing native handle. /** * This constructor creates a handle object to hold an existing native handle. * * @param io_context The io_context object that the handle will use to * dispatch handlers for any asynchronous operations performed on the handle. * * @param handle A native handle. * * @throws asio::system_error Thrown on failure. */ basic_handle(asio::io_context& io_context, const native_handle_type& handle) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), handle, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_handle from another. /** * This constructor moves a handle from one object to another. * * @param other The other basic_handle object from which the move will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_handle(io_context&) constructor. */ basic_handle(basic_handle&& other) : basic_io_object( ASIO_MOVE_CAST(basic_handle)(other)) { } /// Move-assign a basic_handle from another. /** * This assignment operator moves a handle from one object to another. * * @param other The other basic_handle object from which the move will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_handle(io_context&) constructor. */ basic_handle& operator=(basic_handle&& other) { basic_io_object::operator=( ASIO_MOVE_CAST(basic_handle)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since a basic_handle cannot contain any further layers, it simply * returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since a basic_handle cannot contain any further layers, it simply * returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Assign an existing native handle to the handle. /* * This function opens the handle to hold an existing native handle. * * @param handle A native handle. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& handle) { asio::error_code ec; this->get_service().assign(this->get_implementation(), handle, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native handle to the handle. /* * This function opens the handle to hold an existing native handle. * * @param handle A native handle. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& handle, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the handle. /** * This function is used to close the handle. Any asynchronous read or write * operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the handle. /** * This function is used to close the handle. Any asynchronous read or write * operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle representation. /** * This function may be used to obtain the underlying representation of the * handle. This is intended to allow access to native handle functionality * that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the handle. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the handle. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } protected: /// Protected destructor to prevent deletion through this type. ~basic_handle() { } }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) // || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) // || defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_BASIC_HANDLE_HPP asio-1.12.2/include/asio/windows/basic_object_handle.hpp000066400000000000000000000137321340672067200232500ustar00rootroot00000000000000// // windows/basic_object_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2011 Boris Schaeling (boris@highscore.de) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP #define ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/windows/basic_handle.hpp" #include "asio/windows/object_handle_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Provides object-oriented handle functionality. /** * The windows::basic_object_handle class template provides asynchronous and * blocking object-oriented handle functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_object_handle : public basic_handle { public: /// The native representation of a handle. typedef typename ObjectHandleService::native_handle_type native_handle_type; /// Construct a basic_object_handle without opening it. /** * This constructor creates an object handle without opening it. * * @param io_context The io_context object that the object handle will use to * dispatch handlers for any asynchronous operations performed on the handle. */ explicit basic_object_handle(asio::io_context& io_context) : basic_handle(io_context) { } /// Construct a basic_object_handle on an existing native handle. /** * This constructor creates an object handle object to hold an existing native * handle. * * @param io_context The io_context object that the object handle will use to * dispatch handlers for any asynchronous operations performed on the handle. * * @param native_handle The new underlying handle implementation. * * @throws asio::system_error Thrown on failure. */ basic_object_handle(asio::io_context& io_context, const native_handle_type& native_handle) : basic_handle(io_context, native_handle) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_object_handle from another. /** * This constructor moves an object handle from one object to another. * * @param other The other basic_object_handle object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_object_handle(io_context&) constructor. */ basic_object_handle(basic_object_handle&& other) : basic_handle( ASIO_MOVE_CAST(basic_object_handle)(other)) { } /// Move-assign a basic_object_handle from another. /** * This assignment operator moves an object handle from one object to another. * * @param other The other basic_object_handle object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_object_handle(io_context&) constructor. */ basic_object_handle& operator=(basic_object_handle&& other) { basic_handle::operator=( ASIO_MOVE_CAST(basic_object_handle)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Perform a blocking wait on the object handle. /** * This function is used to wait for the object handle to be set to the * signalled state. This function blocks and does not return until the object * handle has been set to the signalled state. * * @throws asio::system_error Thrown on failure. */ void wait() { asio::error_code ec; this->get_service().wait(this->get_implementation(), ec); asio::detail::throw_error(ec, "wait"); } /// Perform a blocking wait on the object handle. /** * This function is used to wait for the object handle to be set to the * signalled state. This function blocks and does not return until the object * handle has been set to the signalled state. * * @param ec Set to indicate what error occurred, if any. */ void wait(asio::error_code& ec) { this->get_service().wait(this->get_implementation(), ec); } /// Start an asynchronous wait on the object handle. /** * This function is be used to initiate an asynchronous wait against the * object handle. It always returns immediately. * * @param handler The handler to be called when the object handle is set to * the signalled state. Copies will be made of the handler as required. The * function signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(ASIO_MOVE_ARG(WaitHandler) handler) { return this->get_service().async_wait(this->get_implementation(), ASIO_MOVE_CAST(WaitHandler)(handler)); } }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP asio-1.12.2/include/asio/windows/basic_random_access_handle.hpp000066400000000000000000000344451340672067200246070ustar00rootroot00000000000000// // windows/basic_random_access_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP #define ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/windows/basic_handle.hpp" #include "asio/windows/random_access_handle_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Provides random-access handle functionality. /** * The windows::basic_random_access_handle class template provides asynchronous * and blocking random-access handle functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ template class basic_random_access_handle : public basic_handle { public: /// The native representation of a handle. typedef typename RandomAccessHandleService::native_handle_type native_handle_type; /// Construct a basic_random_access_handle without opening it. /** * This constructor creates a random-access handle without opening it. The * handle needs to be opened before data can be written to or read from it. * * @param io_context The io_context object that the random-access handle will * use to dispatch handlers for any asynchronous operations performed on the * handle. */ explicit basic_random_access_handle(asio::io_context& io_context) : basic_handle(io_context) { } /// Construct a basic_random_access_handle on an existing native handle. /** * This constructor creates a random-access handle object to hold an existing * native handle. * * @param io_context The io_context object that the random-access handle will * use to dispatch handlers for any asynchronous operations performed on the * handle. * * @param handle The new underlying handle implementation. * * @throws asio::system_error Thrown on failure. */ basic_random_access_handle(asio::io_context& io_context, const native_handle_type& handle) : basic_handle(io_context, handle) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_random_access_handle from another. /** * This constructor moves a random-access handle from one object to another. * * @param other The other basic_random_access_handle object from which the * move will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_random_access_handle(io_context&) * constructor. */ basic_random_access_handle(basic_random_access_handle&& other) : basic_handle( ASIO_MOVE_CAST(basic_random_access_handle)(other)) { } /// Move-assign a basic_random_access_handle from another. /** * This assignment operator moves a random-access handle from one object to * another. * * @param other The other basic_random_access_handle object from which the * move will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_random_access_handle(io_context&) * constructor. */ basic_random_access_handle& operator=(basic_random_access_handle&& other) { basic_handle::operator=( ASIO_MOVE_CAST(basic_random_access_handle)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Write some data to the handle at the specified offset. /** * This function is used to write data to the random-access handle. The * function call will block until one or more bytes of the data has been * written successfully, or until an error occurs. * * @param offset The offset at which the data will be written. * * @param buffers One or more data buffers to be written to the handle. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some_at operation may not write all of the data. Consider * using the @ref write_at function if you need to ensure that all data is * written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.write_some_at(42, asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some_at(uint64_t offset, const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some_at( this->get_implementation(), offset, buffers, ec); asio::detail::throw_error(ec, "write_some_at"); return s; } /// Write some data to the handle at the specified offset. /** * This function is used to write data to the random-access handle. The * function call will block until one or more bytes of the data has been * written successfully, or until an error occurs. * * @param offset The offset at which the data will be written. * * @param buffers One or more data buffers to be written to the handle. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write_at function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some_at(uint64_t offset, const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some_at( this->get_implementation(), offset, buffers, ec); } /// Start an asynchronous write at the specified offset. /** * This function is used to asynchronously write data to the random-access * handle. The function call always returns immediately. * * @param offset The offset at which the data will be written. * * @param buffers One or more data buffers to be written to the handle. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write_at function if you need to ensure that * all data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.async_write_some_at(42, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some_at(uint64_t offset, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; return this->get_service().async_write_some_at(this->get_implementation(), offset, buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Read some data from the handle at the specified offset. /** * This function is used to read data from the random-access handle. The * function call will block until one or more bytes of data has been read * successfully, or until an error occurs. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read_at function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.read_some_at(42, asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some_at(uint64_t offset, const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some_at( this->get_implementation(), offset, buffers, ec); asio::detail::throw_error(ec, "read_some_at"); return s; } /// Read some data from the handle at the specified offset. /** * This function is used to read data from the random-access handle. The * function call will block until one or more bytes of data has been read * successfully, or until an error occurs. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read_at function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some_at(uint64_t offset, const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some_at( this->get_implementation(), offset, buffers, ec); } /// Start an asynchronous read at the specified offset. /** * This function is used to asynchronously read data from the random-access * handle. The function call always returns immediately. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read_at function if you need to ensure that * the requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.async_read_some_at(42, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some_at(uint64_t offset, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; return this->get_service().async_read_some_at(this->get_implementation(), offset, buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); } }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP asio-1.12.2/include/asio/windows/basic_stream_handle.hpp000066400000000000000000000324651340672067200233010ustar00rootroot00000000000000// // windows/basic_stream_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP #define ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/detail/handler_type_requirements.hpp" #include "asio/detail/throw_error.hpp" #include "asio/error.hpp" #include "asio/windows/basic_handle.hpp" #include "asio/windows/stream_handle_service.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Provides stream-oriented handle functionality. /** * The windows::basic_stream_handle class template provides asynchronous and * blocking stream-oriented handle functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ template class basic_stream_handle : public basic_handle { public: /// The native representation of a handle. typedef typename StreamHandleService::native_handle_type native_handle_type; /// Construct a basic_stream_handle without opening it. /** * This constructor creates a stream handle without opening it. The handle * needs to be opened and then connected or accepted before data can be sent * or received on it. * * @param io_context The io_context object that the stream handle will use to * dispatch handlers for any asynchronous operations performed on the handle. */ explicit basic_stream_handle(asio::io_context& io_context) : basic_handle(io_context) { } /// Construct a basic_stream_handle on an existing native handle. /** * This constructor creates a stream handle object to hold an existing native * handle. * * @param io_context The io_context object that the stream handle will use to * dispatch handlers for any asynchronous operations performed on the handle. * * @param handle The new underlying handle implementation. * * @throws asio::system_error Thrown on failure. */ basic_stream_handle(asio::io_context& io_context, const native_handle_type& handle) : basic_handle(io_context, handle) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a basic_stream_handle from another. /** * This constructor moves a stream handle from one object to another. * * @param other The other basic_stream_handle object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_handle(io_context&) constructor. */ basic_stream_handle(basic_stream_handle&& other) : basic_handle( ASIO_MOVE_CAST(basic_stream_handle)(other)) { } /// Move-assign a basic_stream_handle from another. /** * This assignment operator moves a stream handle from one object to * another. * * @param other The other basic_stream_handle object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c basic_stream_handle(io_context&) constructor. */ basic_stream_handle& operator=(basic_stream_handle&& other) { basic_handle::operator=( ASIO_MOVE_CAST(basic_stream_handle)(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Write some data to the handle. /** * This function is used to write data to the stream handle. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the handle. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the handle. /** * This function is used to write data to the stream handle. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the handle. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the stream handle. * The function call always returns immediately. * * @param buffers One or more data buffers to be written to the handle. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; return this->get_service().async_write_some(this->get_implementation(), buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); } /// Read some data from the handle. /** * This function is used to read data from the stream handle. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the handle. /** * This function is used to read data from the stream handle. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the stream handle. * The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; return this->get_service().async_read_some(this->get_implementation(), buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); } }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP asio-1.12.2/include/asio/windows/object_handle.hpp000066400000000000000000000277741340672067200221220ustar00rootroot00000000000000// // windows/object_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2011 Boris Schaeling (boris@highscore.de) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_OBJECT_HANDLE_HPP #define ASIO_WINDOWS_OBJECT_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/win_object_handle_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/windows/basic_object_handle.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #define ASIO_SVC_T asio::detail::win_object_handle_service #include "asio/detail/push_options.hpp" namespace asio { namespace windows { #if defined(ASIO_ENABLE_OLD_SERVICES) // Typedef for the typical usage of an object handle. typedef basic_object_handle<> object_handle; #else // defined(ASIO_ENABLE_OLD_SERVICES) /// Provides object-oriented handle functionality. /** * The windows::object_handle class provides asynchronous and blocking * object-oriented handle functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class object_handle : ASIO_SVC_ACCESS basic_io_object { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The native representation of a handle. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef ASIO_SVC_T::native_handle_type native_handle_type; #endif /// An object_handle is always the lowest layer. typedef object_handle lowest_layer_type; /// Construct an object_handle without opening it. /** * This constructor creates an object handle without opening it. * * @param io_context The io_context object that the object handle will use to * dispatch handlers for any asynchronous operations performed on the handle. */ explicit object_handle(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct an object_handle on an existing native handle. /** * This constructor creates an object handle object to hold an existing native * handle. * * @param io_context The io_context object that the object handle will use to * dispatch handlers for any asynchronous operations performed on the handle. * * @param native_handle The new underlying handle implementation. * * @throws asio::system_error Thrown on failure. */ object_handle(asio::io_context& io_context, const native_handle_type& native_handle) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), native_handle, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct an object_handle from another. /** * This constructor moves an object handle from one object to another. * * @param other The other object_handle object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c object_handle(io_context&) constructor. */ object_handle(object_handle&& other) : basic_io_object(std::move(other)) { } /// Move-assign an object_handle from another. /** * This assignment operator moves an object handle from one object to another. * * @param other The other object_handle object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c object_handle(io_context&) constructor. */ object_handle& operator=(object_handle&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since an object_handle cannot contain any further layers, it simply * returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since an object_handle cannot contain any further layers, it simply * returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Assign an existing native handle to the handle. /* * This function opens the handle to hold an existing native handle. * * @param handle A native handle. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& handle) { asio::error_code ec; this->get_service().assign(this->get_implementation(), handle, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native handle to the handle. /* * This function opens the handle to hold an existing native handle. * * @param handle A native handle. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& handle, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the handle. /** * This function is used to close the handle. Any asynchronous read or write * operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the handle. /** * This function is used to close the handle. Any asynchronous read or write * operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle representation. /** * This function may be used to obtain the underlying representation of the * handle. This is intended to allow access to native handle functionality * that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the handle. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the handle. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Perform a blocking wait on the object handle. /** * This function is used to wait for the object handle to be set to the * signalled state. This function blocks and does not return until the object * handle has been set to the signalled state. * * @throws asio::system_error Thrown on failure. */ void wait() { asio::error_code ec; this->get_service().wait(this->get_implementation(), ec); asio::detail::throw_error(ec, "wait"); } /// Perform a blocking wait on the object handle. /** * This function is used to wait for the object handle to be set to the * signalled state. This function blocks and does not return until the object * handle has been set to the signalled state. * * @param ec Set to indicate what error occurred, if any. */ void wait(asio::error_code& ec) { this->get_service().wait(this->get_implementation(), ec); } /// Start an asynchronous wait on the object handle. /** * This function is be used to initiate an asynchronous wait against the * object handle. It always returns immediately. * * @param handler The handler to be called when the object handle is set to * the signalled state. Copies will be made of the handler as required. The * function signature of the handler must be: * @code void handler( * const asio::error_code& error // Result of operation. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(ASIO_MOVE_ARG(WaitHandler) handler) { asio::async_completion init(handler); this->get_service().async_wait(this->get_implementation(), init.completion_handler); return init.result.get(); } }; #endif // defined(ASIO_ENABLE_OLD_SERVICES) } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #undef ASIO_SVC_T #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_WINDOWS_OBJECT_HANDLE_HPP asio-1.12.2/include/asio/windows/object_handle_service.hpp000066400000000000000000000117161340672067200236270ustar00rootroot00000000000000// // windows/object_handle_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // Copyright (c) 2011 Boris Schaeling (boris@highscore.de) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP #define ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include "asio/async_result.hpp" #include "asio/detail/win_object_handle_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Default service implementation for an object handle. class object_handle_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif private: // The type of the platform-specific implementation. typedef detail::win_object_handle_service service_impl_type; public: /// The type of an object handle implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef service_impl_type::implementation_type implementation_type; #endif /// The native handle type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new object handle service for the specified io_context. explicit object_handle_service(asio::io_context& io_context) : asio::detail::service_base(io_context), service_impl_(io_context) { } /// Construct a new object handle implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new object handle implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another object handle implementation. void move_assign(implementation_type& impl, object_handle_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy an object handle implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Assign an existing native handle to an object handle. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { service_impl_.assign(impl, handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close an object handle implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the handle. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } // Wait for a signaled state. void wait(implementation_type& impl, asio::error_code& ec) { service_impl_.wait(impl, ec); } /// Start an asynchronous wait. template ASIO_INITFN_RESULT_TYPE(WaitHandler, void (asio::error_code)) async_wait(implementation_type& impl, ASIO_MOVE_ARG(WaitHandler) handler) { asio::async_completion init(handler); service_impl_.async_wait(impl, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP asio-1.12.2/include/asio/windows/overlapped_handle.hpp000066400000000000000000000242411340672067200227770ustar00rootroot00000000000000// // windows/overlapped_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP #define ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if !defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/async_result.hpp" #include "asio/basic_io_object.hpp" #include "asio/detail/throw_error.hpp" #include "asio/detail/win_iocp_handle_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #if defined(ASIO_HAS_MOVE) # include #endif // defined(ASIO_HAS_MOVE) #define ASIO_SVC_T asio::detail::win_iocp_handle_service #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Provides Windows handle functionality for objects that support /// overlapped I/O. /** * The windows::overlapped_handle class provides the ability to wrap a Windows * handle. The underlying object referred to by the handle must support * overlapped I/O. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class overlapped_handle : ASIO_SVC_ACCESS basic_io_object { public: /// The type of the executor associated with the object. typedef io_context::executor_type executor_type; /// The native representation of a handle. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef ASIO_SVC_T::native_handle_type native_handle_type; #endif /// An overlapped_handle is always the lowest layer. typedef overlapped_handle lowest_layer_type; /// Construct an overlapped_handle without opening it. /** * This constructor creates a handle without opening it. * * @param io_context The io_context object that the handle will use to * dispatch handlers for any asynchronous operations performed on the handle. */ explicit overlapped_handle(asio::io_context& io_context) : basic_io_object(io_context) { } /// Construct an overlapped_handle on an existing native handle. /** * This constructor creates a handle object to hold an existing native handle. * * @param io_context The io_context object that the handle will use to * dispatch handlers for any asynchronous operations performed on the handle. * * @param handle A native handle. * * @throws asio::system_error Thrown on failure. */ overlapped_handle(asio::io_context& io_context, const native_handle_type& handle) : basic_io_object(io_context) { asio::error_code ec; this->get_service().assign(this->get_implementation(), handle, ec); asio::detail::throw_error(ec, "assign"); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct an overlapped_handle from another. /** * This constructor moves a handle from one object to another. * * @param other The other overlapped_handle object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c overlapped_handle(io_context&) constructor. */ overlapped_handle(overlapped_handle&& other) : basic_io_object(std::move(other)) { } /// Move-assign an overlapped_handle from another. /** * This assignment operator moves a handle from one object to another. * * @param other The other overlapped_handle object from which the move will * occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c overlapped_handle(io_context&) constructor. */ overlapped_handle& operator=(overlapped_handle&& other) { basic_io_object::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) #if !defined(ASIO_NO_DEPRECATED) /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_context() { return basic_io_object::get_io_context(); } /// (Deprecated: Use get_executor().) Get the io_context associated with the /// object. /** * This function may be used to obtain the io_context object that the I/O * object uses to dispatch handlers for asynchronous operations. * * @return A reference to the io_context object that the I/O object will use * to dispatch handlers. Ownership is not transferred to the caller. */ asio::io_context& get_io_service() { return basic_io_object::get_io_service(); } #endif // !defined(ASIO_NO_DEPRECATED) /// Get the executor associated with the object. executor_type get_executor() ASIO_NOEXCEPT { return basic_io_object::get_executor(); } /// Get a reference to the lowest layer. /** * This function returns a reference to the lowest layer in a stack of * layers. Since an overlapped_handle cannot contain any further layers, it * simply returns a reference to itself. * * @return A reference to the lowest layer in the stack of layers. Ownership * is not transferred to the caller. */ lowest_layer_type& lowest_layer() { return *this; } /// Get a const reference to the lowest layer. /** * This function returns a const reference to the lowest layer in a stack of * layers. Since an overlapped_handle cannot contain any further layers, it * simply returns a reference to itself. * * @return A const reference to the lowest layer in the stack of layers. * Ownership is not transferred to the caller. */ const lowest_layer_type& lowest_layer() const { return *this; } /// Assign an existing native handle to the handle. /* * This function opens the handle to hold an existing native handle. * * @param handle A native handle. * * @throws asio::system_error Thrown on failure. */ void assign(const native_handle_type& handle) { asio::error_code ec; this->get_service().assign(this->get_implementation(), handle, ec); asio::detail::throw_error(ec, "assign"); } /// Assign an existing native handle to the handle. /* * This function opens the handle to hold an existing native handle. * * @param handle A native handle. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID assign(const native_handle_type& handle, asio::error_code& ec) { this->get_service().assign(this->get_implementation(), handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open() const { return this->get_service().is_open(this->get_implementation()); } /// Close the handle. /** * This function is used to close the handle. Any asynchronous read or write * operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void close() { asio::error_code ec; this->get_service().close(this->get_implementation(), ec); asio::detail::throw_error(ec, "close"); } /// Close the handle. /** * This function is used to close the handle. Any asynchronous read or write * operations will be cancelled immediately, and will complete with the * asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID close(asio::error_code& ec) { this->get_service().close(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle representation. /** * This function may be used to obtain the underlying representation of the * handle. This is intended to allow access to native handle functionality * that is not otherwise provided. */ native_handle_type native_handle() { return this->get_service().native_handle(this->get_implementation()); } /// Cancel all asynchronous operations associated with the handle. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @throws asio::system_error Thrown on failure. */ void cancel() { asio::error_code ec; this->get_service().cancel(this->get_implementation(), ec); asio::detail::throw_error(ec, "cancel"); } /// Cancel all asynchronous operations associated with the handle. /** * This function causes all outstanding asynchronous read or write operations * to finish immediately, and the handlers for cancelled operations will be * passed the asio::error::operation_aborted error. * * @param ec Set to indicate what error occurred, if any. */ ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) { this->get_service().cancel(this->get_implementation(), ec); ASIO_SYNC_OP_VOID_RETURN(ec); } protected: /// Protected destructor to prevent deletion through this type. /** * This function destroys the handle, cancelling any outstanding asynchronous * wait operations associated with the handle as if by calling @c cancel. */ ~overlapped_handle() { } }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #undef ASIO_SVC_T #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) // || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // !defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP asio-1.12.2/include/asio/windows/overlapped_ptr.hpp000066400000000000000000000053671340672067200223610ustar00rootroot00000000000000// // windows/overlapped_ptr.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_OVERLAPPED_PTR_HPP #define ASIO_WINDOWS_OVERLAPPED_PTR_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) \ || defined(GENERATING_DOCUMENTATION) #include "asio/detail/noncopyable.hpp" #include "asio/detail/win_iocp_overlapped_ptr.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Wraps a handler to create an OVERLAPPED object for use with overlapped I/O. /** * A special-purpose smart pointer used to wrap an application handler so that * it can be passed as the LPOVERLAPPED argument to overlapped I/O functions. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class overlapped_ptr : private noncopyable { public: /// Construct an empty overlapped_ptr. overlapped_ptr() : impl_() { } /// Construct an overlapped_ptr to contain the specified handler. template explicit overlapped_ptr(asio::io_context& io_context, ASIO_MOVE_ARG(Handler) handler) : impl_(io_context, ASIO_MOVE_CAST(Handler)(handler)) { } /// Destructor automatically frees the OVERLAPPED object unless released. ~overlapped_ptr() { } /// Reset to empty. void reset() { impl_.reset(); } /// Reset to contain the specified handler, freeing any current OVERLAPPED /// object. template void reset(asio::io_context& io_context, ASIO_MOVE_ARG(Handler) handler) { impl_.reset(io_context, ASIO_MOVE_CAST(Handler)(handler)); } /// Get the contained OVERLAPPED object. OVERLAPPED* get() { return impl_.get(); } /// Get the contained OVERLAPPED object. const OVERLAPPED* get() const { return impl_.get(); } /// Release ownership of the OVERLAPPED object. OVERLAPPED* release() { return impl_.release(); } /// Post completion notification for overlapped operation. Releases ownership. void complete(const asio::error_code& ec, std::size_t bytes_transferred) { impl_.complete(ec, bytes_transferred); } private: detail::win_iocp_overlapped_ptr impl_; }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_WINDOWS_OVERLAPPED_PTR_HPP asio-1.12.2/include/asio/windows/random_access_handle.hpp000066400000000000000000000341231340672067200234370ustar00rootroot00000000000000// // windows/random_access_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP #define ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/windows/overlapped_handle.hpp" #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/windows/basic_random_access_handle.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { namespace windows { #if defined(ASIO_ENABLE_OLD_SERVICES) // Typedef for the typical usage of a random-access handle. typedef basic_random_access_handle<> random_access_handle; #else // defined(ASIO_ENABLE_OLD_SERVICES) /// Provides random-access handle functionality. /** * The windows::random_access_handle class provides asynchronous and * blocking random-access handle functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. */ class random_access_handle : public overlapped_handle { public: /// Construct a random_access_handle without opening it. /** * This constructor creates a random-access handle without opening it. The * handle needs to be opened before data can be written to or read from it. * * @param io_context The io_context object that the random-access handle will * use to dispatch handlers for any asynchronous operations performed on the * handle. */ explicit random_access_handle(asio::io_context& io_context) : overlapped_handle(io_context) { } /// Construct a random_access_handle on an existing native handle. /** * This constructor creates a random-access handle object to hold an existing * native handle. * * @param io_context The io_context object that the random-access handle will * use to dispatch handlers for any asynchronous operations performed on the * handle. * * @param handle The new underlying handle implementation. * * @throws asio::system_error Thrown on failure. */ random_access_handle(asio::io_context& io_context, const native_handle_type& handle) : overlapped_handle(io_context, handle) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a random_access_handle from another. /** * This constructor moves a random-access handle from one object to another. * * @param other The other random_access_handle object from which the * move will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c random_access_handle(io_context&) * constructor. */ random_access_handle(random_access_handle&& other) : overlapped_handle(std::move(other)) { } /// Move-assign a random_access_handle from another. /** * This assignment operator moves a random-access handle from one object to * another. * * @param other The other random_access_handle object from which the * move will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c random_access_handle(io_context&) * constructor. */ random_access_handle& operator=(random_access_handle&& other) { overlapped_handle::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Write some data to the handle at the specified offset. /** * This function is used to write data to the random-access handle. The * function call will block until one or more bytes of the data has been * written successfully, or until an error occurs. * * @param offset The offset at which the data will be written. * * @param buffers One or more data buffers to be written to the handle. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some_at operation may not write all of the data. Consider * using the @ref write_at function if you need to ensure that all data is * written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.write_some_at(42, asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some_at(uint64_t offset, const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some_at( this->get_implementation(), offset, buffers, ec); asio::detail::throw_error(ec, "write_some_at"); return s; } /// Write some data to the handle at the specified offset. /** * This function is used to write data to the random-access handle. The * function call will block until one or more bytes of the data has been * written successfully, or until an error occurs. * * @param offset The offset at which the data will be written. * * @param buffers One or more data buffers to be written to the handle. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write_at function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some_at(uint64_t offset, const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some_at( this->get_implementation(), offset, buffers, ec); } /// Start an asynchronous write at the specified offset. /** * This function is used to asynchronously write data to the random-access * handle. The function call always returns immediately. * * @param offset The offset at which the data will be written. * * @param buffers One or more data buffers to be written to the handle. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write_at function if you need to ensure that * all data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.async_write_some_at(42, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some_at(uint64_t offset, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; asio::async_completion init(handler); this->get_service().async_write_some_at(this->get_implementation(), offset, buffers, init.completion_handler); return init.result.get(); } /// Read some data from the handle at the specified offset. /** * This function is used to read data from the random-access handle. The * function call will block until one or more bytes of data has been read * successfully, or until an error occurs. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read_at function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.read_some_at(42, asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some_at(uint64_t offset, const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some_at( this->get_implementation(), offset, buffers, ec); asio::detail::throw_error(ec, "read_some_at"); return s; } /// Read some data from the handle at the specified offset. /** * This function is used to read data from the random-access handle. The * function call will block until one or more bytes of data has been read * successfully, or until an error occurs. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read_at function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some_at(uint64_t offset, const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some_at( this->get_implementation(), offset, buffers, ec); } /// Start an asynchronous read at the specified offset. /** * This function is used to asynchronously read data from the random-access * handle. The function call always returns immediately. * * @param offset The offset at which the data will be read. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read_at function if you need to ensure that * the requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.async_read_some_at(42, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some_at(uint64_t offset, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; asio::async_completion init(handler); this->get_service().async_read_some_at(this->get_implementation(), offset, buffers, init.completion_handler); return init.result.get(); } }; #endif // defined(ASIO_ENABLE_OLD_SERVICES) } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP asio-1.12.2/include/asio/windows/random_access_handle_service.hpp000066400000000000000000000145011340672067200251550ustar00rootroot00000000000000// // windows/random_access_handle_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP #define ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/async_result.hpp" #include "asio/detail/cstdint.hpp" #include "asio/detail/win_iocp_handle_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Default service implementation for a random-access handle. class random_access_handle_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif private: // The type of the platform-specific implementation. typedef detail::win_iocp_handle_service service_impl_type; public: /// The type of a random-access handle implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef service_impl_type::implementation_type implementation_type; #endif /// The native handle type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new random-access handle service for the specified io_context. explicit random_access_handle_service(asio::io_context& io_context) : asio::detail::service_base< random_access_handle_service>(io_context), service_impl_(io_context) { } /// Construct a new random-access handle implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new random-access handle implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another random-access handle implementation. void move_assign(implementation_type& impl, random_access_handle_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a random-access handle implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Assign an existing native handle to a random-access handle. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { service_impl_.assign(impl, handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a random-access handle implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the handle. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Write the given data at the specified offset. template std::size_t write_some_at(implementation_type& impl, uint64_t offset, const ConstBufferSequence& buffers, asio::error_code& ec) { return service_impl_.write_some_at(impl, offset, buffers, ec); } /// Start an asynchronous write at the specified offset. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some_at(implementation_type& impl, uint64_t offset, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { asio::async_completion init(handler); service_impl_.async_write_some_at(impl, offset, buffers, init.completion_handler); return init.result.get(); } /// Read some data from the specified offset. template std::size_t read_some_at(implementation_type& impl, uint64_t offset, const MutableBufferSequence& buffers, asio::error_code& ec) { return service_impl_.read_some_at(impl, offset, buffers, ec); } /// Start an asynchronous read at the specified offset. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some_at(implementation_type& impl, uint64_t offset, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { asio::async_completion init(handler); service_impl_.async_read_some_at(impl, offset, buffers, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP asio-1.12.2/include/asio/windows/stream_handle.hpp000066400000000000000000000322341340672067200221320ustar00rootroot00000000000000// // windows/stream_handle.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_STREAM_HANDLE_HPP #define ASIO_WINDOWS_STREAM_HANDLE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include "asio/windows/overlapped_handle.hpp" #if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #if defined(ASIO_ENABLE_OLD_SERVICES) # include "asio/windows/basic_stream_handle.hpp" #endif // defined(ASIO_ENABLE_OLD_SERVICES) #include "asio/detail/push_options.hpp" namespace asio { namespace windows { #if defined(ASIO_ENABLE_OLD_SERVICES) // Typedef for the typical usage of a stream-oriented handle. typedef basic_stream_handle<> stream_handle; #else // defined(ASIO_ENABLE_OLD_SERVICES) /// Provides stream-oriented handle functionality. /** * The windows::stream_handle class provides asynchronous and blocking * stream-oriented handle functionality. * * @par Thread Safety * @e Distinct @e objects: Safe.@n * @e Shared @e objects: Unsafe. * * @par Concepts: * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. */ class stream_handle : public overlapped_handle { public: /// Construct a stream_handle without opening it. /** * This constructor creates a stream handle without opening it. The handle * needs to be opened and then connected or accepted before data can be sent * or received on it. * * @param io_context The io_context object that the stream handle will use to * dispatch handlers for any asynchronous operations performed on the handle. */ explicit stream_handle(asio::io_context& io_context) : overlapped_handle(io_context) { } /// Construct a stream_handle on an existing native handle. /** * This constructor creates a stream handle object to hold an existing native * handle. * * @param io_context The io_context object that the stream handle will use to * dispatch handlers for any asynchronous operations performed on the handle. * * @param handle The new underlying handle implementation. * * @throws asio::system_error Thrown on failure. */ stream_handle(asio::io_context& io_context, const native_handle_type& handle) : overlapped_handle(io_context, handle) { } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a stream_handle from another. /** * This constructor moves a stream handle from one object to another. * * @param other The other stream_handle object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c stream_handle(io_context&) constructor. */ stream_handle(stream_handle&& other) : overlapped_handle(std::move(other)) { } /// Move-assign a stream_handle from another. /** * This assignment operator moves a stream handle from one object to * another. * * @param other The other stream_handle object from which the move * will occur. * * @note Following the move, the moved-from object is in the same state as if * constructed using the @c stream_handle(io_context&) constructor. */ stream_handle& operator=(stream_handle&& other) { overlapped_handle::operator=(std::move(other)); return *this; } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Write some data to the handle. /** * This function is used to write data to the stream handle. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the handle. * * @returns The number of bytes written. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.write_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_some(const ConstBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().write_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "write_some"); return s; } /// Write some data to the handle. /** * This function is used to write data to the stream handle. The function call * will block until one or more bytes of the data has been written * successfully, or until an error occurs. * * @param buffers One or more data buffers to be written to the handle. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. Returns 0 if an error occurred. * * @note The write_some operation may not transmit all of the data to the * peer. Consider using the @ref write function if you need to ensure that * all data is written before the blocking operation completes. */ template std::size_t write_some(const ConstBufferSequence& buffers, asio::error_code& ec) { return this->get_service().write_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous write. /** * This function is used to asynchronously write data to the stream handle. * The function call always returns immediately. * * @param buffers One or more data buffers to be written to the handle. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes written. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The write operation may not transmit all of the data to the peer. * Consider using the @ref async_write function if you need to ensure that all * data is written before the asynchronous operation completes. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * handle.async_write_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a WriteHandler. ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; asio::async_completion init(handler); this->get_service().async_write_some( this->get_implementation(), buffers, init.completion_handler); return init.result.get(); } /// Read some data from the handle. /** * This function is used to read data from the stream handle. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @returns The number of bytes read. * * @throws asio::system_error Thrown on failure. An error code of * asio::error::eof indicates that the connection was closed by the * peer. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.read_some(asio::buffer(data, size)); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t read_some(const MutableBufferSequence& buffers) { asio::error_code ec; std::size_t s = this->get_service().read_some( this->get_implementation(), buffers, ec); asio::detail::throw_error(ec, "read_some"); return s; } /// Read some data from the handle. /** * This function is used to read data from the stream handle. The function * call will block until one or more bytes of data has been read successfully, * or until an error occurs. * * @param buffers One or more buffers into which the data will be read. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes read. Returns 0 if an error occurred. * * @note The read_some operation may not read all of the requested number of * bytes. Consider using the @ref read function if you need to ensure that * the requested amount of data is read before the blocking operation * completes. */ template std::size_t read_some(const MutableBufferSequence& buffers, asio::error_code& ec) { return this->get_service().read_some( this->get_implementation(), buffers, ec); } /// Start an asynchronous read. /** * This function is used to asynchronously read data from the stream handle. * The function call always returns immediately. * * @param buffers One or more buffers into which the data will be read. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the read operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * std::size_t bytes_transferred // Number of bytes read. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation * of the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @note The read operation may not read all of the requested number of bytes. * Consider using the @ref async_read function if you need to ensure that the * requested amount of data is read before the asynchronous operation * completes. * * @par Example * To read into a single data buffer use the @ref buffer function as follows: * @code * handle.async_read_some(asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on reading into multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { // If you get an error on the following line it means that your handler does // not meet the documented type requirements for a ReadHandler. ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; asio::async_completion init(handler); this->get_service().async_read_some( this->get_implementation(), buffers, init.completion_handler); return init.result.get(); } }; #endif // defined(ASIO_ENABLE_OLD_SERVICES) } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // ASIO_WINDOWS_STREAM_HANDLE_HPP asio-1.12.2/include/asio/windows/stream_handle_service.hpp000066400000000000000000000136621340672067200236560ustar00rootroot00000000000000// // windows/stream_handle_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP #define ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #if defined(ASIO_ENABLE_OLD_SERVICES) #if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ || defined(GENERATING_DOCUMENTATION) #include #include "asio/async_result.hpp" #include "asio/detail/win_iocp_handle_service.hpp" #include "asio/error.hpp" #include "asio/io_context.hpp" #include "asio/detail/push_options.hpp" namespace asio { namespace windows { /// Default service implementation for a stream handle. class stream_handle_service #if defined(GENERATING_DOCUMENTATION) : public asio::io_context::service #else : public asio::detail::service_base #endif { public: #if defined(GENERATING_DOCUMENTATION) /// The unique service identifier. static asio::io_context::id id; #endif private: // The type of the platform-specific implementation. typedef detail::win_iocp_handle_service service_impl_type; public: /// The type of a stream handle implementation. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined implementation_type; #else typedef service_impl_type::implementation_type implementation_type; #endif /// The native handle type. #if defined(GENERATING_DOCUMENTATION) typedef implementation_defined native_handle_type; #else typedef service_impl_type::native_handle_type native_handle_type; #endif /// Construct a new stream handle service for the specified io_context. explicit stream_handle_service(asio::io_context& io_context) : asio::detail::service_base(io_context), service_impl_(io_context) { } /// Construct a new stream handle implementation. void construct(implementation_type& impl) { service_impl_.construct(impl); } #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Move-construct a new stream handle implementation. void move_construct(implementation_type& impl, implementation_type& other_impl) { service_impl_.move_construct(impl, other_impl); } /// Move-assign from another stream handle implementation. void move_assign(implementation_type& impl, stream_handle_service& other_service, implementation_type& other_impl) { service_impl_.move_assign(impl, other_service.service_impl_, other_impl); } #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) /// Destroy a stream handle implementation. void destroy(implementation_type& impl) { service_impl_.destroy(impl); } /// Assign an existing native handle to a stream handle. ASIO_SYNC_OP_VOID assign(implementation_type& impl, const native_handle_type& handle, asio::error_code& ec) { service_impl_.assign(impl, handle, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Determine whether the handle is open. bool is_open(const implementation_type& impl) const { return service_impl_.is_open(impl); } /// Close a stream handle implementation. ASIO_SYNC_OP_VOID close(implementation_type& impl, asio::error_code& ec) { service_impl_.close(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Get the native handle implementation. native_handle_type native_handle(implementation_type& impl) { return service_impl_.native_handle(impl); } /// Cancel all asynchronous operations associated with the handle. ASIO_SYNC_OP_VOID cancel(implementation_type& impl, asio::error_code& ec) { service_impl_.cancel(impl, ec); ASIO_SYNC_OP_VOID_RETURN(ec); } /// Write the given data to the stream. template std::size_t write_some(implementation_type& impl, const ConstBufferSequence& buffers, asio::error_code& ec) { return service_impl_.write_some(impl, buffers, ec); } /// Start an asynchronous write. template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_some(implementation_type& impl, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler) { asio::async_completion init(handler); service_impl_.async_write_some(impl, buffers, init.completion_handler); return init.result.get(); } /// Read some data from the stream. template std::size_t read_some(implementation_type& impl, const MutableBufferSequence& buffers, asio::error_code& ec) { return service_impl_.read_some(impl, buffers, ec); } /// Start an asynchronous read. template ASIO_INITFN_RESULT_TYPE(ReadHandler, void (asio::error_code, std::size_t)) async_read_some(implementation_type& impl, const MutableBufferSequence& buffers, ASIO_MOVE_ARG(ReadHandler) handler) { asio::async_completion init(handler); service_impl_.async_read_some(impl, buffers, init.completion_handler); return init.result.get(); } private: // Destroy all user-defined handler objects owned by the service. void shutdown() { service_impl_.shutdown(); } // The platform-specific implementation. service_impl_type service_impl_; }; } // namespace windows } // namespace asio #include "asio/detail/pop_options.hpp" #endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) // || defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_ENABLE_OLD_SERVICES) #endif // ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP asio-1.12.2/include/asio/write.hpp000066400000000000000000001120141340672067200167570ustar00rootroot00000000000000// // write.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WRITE_HPP #define ASIO_WRITE_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/buffer.hpp" #include "asio/error.hpp" #if !defined(ASIO_NO_EXTENSIONS) # include "asio/basic_streambuf_fwd.hpp" #endif // !defined(ASIO_NO_EXTENSIONS) #include "asio/detail/push_options.hpp" namespace asio { /** * @defgroup write asio::write * * @brief The @c write function is a composed operation that writes a certain * amount of data to a stream before returning. */ /*@{*/ /// Write all of the supplied data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * stream. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::write(s, asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::write( * s, buffers, * asio::transfer_all()); @endcode */ template std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, typename enable_if< is_const_buffer_sequence::value >::type* = 0); /// Write all of the supplied data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * stream. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::write(s, asio::buffer(data, size), ec); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::write( * s, buffers, * asio::transfer_all(), ec); @endcode */ template std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, asio::error_code& ec, typename enable_if< is_const_buffer_sequence::value >::type* = 0); /// Write a certain amount of data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * stream. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's write_some function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::write(s, asio::buffer(data, size), * asio::transfer_at_least(32)); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, typename enable_if< is_const_buffer_sequence::value >::type* = 0); /// Write a certain amount of data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * stream. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's write_some function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_const_buffer_sequence::value >::type* = 0); /// Write all of the supplied data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied dynamic buffer sequence has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers The dynamic buffer sequence from which data will be written. * Successfully written data is automatically consumed from the buffers. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @note This overload is equivalent to calling: * @code asio::write( * s, buffers, * asio::transfer_all()); @endcode */ template std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Write all of the supplied data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied dynamic buffer sequence has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers The dynamic buffer sequence from which data will be written. * Successfully written data is automatically consumed from the buffers. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @note This overload is equivalent to calling: * @code asio::write( * s, buffers, * asio::transfer_all(), ec); @endcode */ template std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Write a certain amount of data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied dynamic buffer sequence has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers The dynamic buffer sequence from which data will be written. * Successfully written data is automatically consumed from the buffers. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's write_some function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. */ template std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Write a certain amount of data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied dynamic buffer sequence has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param buffers The dynamic buffer sequence from which data will be written. * Successfully written data is automatically consumed from the buffers. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's write_some function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t write(SyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, asio::error_code& ec, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Write all of the supplied data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param b The basic_streambuf object from which data will be written. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @note This overload is equivalent to calling: * @code asio::write( * s, b, * asio::transfer_all()); @endcode */ template std::size_t write(SyncWriteStream& s, basic_streambuf& b); /// Write all of the supplied data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param b The basic_streambuf object from which data will be written. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @note This overload is equivalent to calling: * @code asio::write( * s, b, * asio::transfer_all(), ec); @endcode */ template std::size_t write(SyncWriteStream& s, basic_streambuf& b, asio::error_code& ec); /// Write a certain amount of data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param b The basic_streambuf object from which data will be written. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's write_some function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. */ template std::size_t write(SyncWriteStream& s, basic_streambuf& b, CompletionCondition completion_condition); /// Write a certain amount of data to a stream before returning. /** * This function is used to write a certain number of bytes of data to a stream. * The call will block until one of the following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * write_some function. * * @param s The stream to which the data is to be written. The type must support * the SyncWriteStream concept. * * @param b The basic_streambuf object from which data will be written. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's write_some function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t write(SyncWriteStream& s, basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ /** * @defgroup async_write asio::async_write * * @brief The @c async_write function is a composed asynchronous operation that * writes a certain amount of data to a stream before completion. */ /*@{*/ /// Start an asynchronous operation to write all of the supplied data to a /// stream. /** * This function is used to asynchronously write a certain number of bytes of * data to a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_write_some function, and is known as a composed operation. The * program must ensure that the stream performs no other write operations (such * as async_write, the stream's async_write_some function, or any other composed * operations that perform writes) until this operation completes. * * @param s The stream to which the data is to be written. The type must support * the AsyncWriteStream concept. * * @param buffers One or more buffers containing the data to be written. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes written from the * // buffers. If an error occurred, * // this will be less than the sum * // of the buffer sizes. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * asio::async_write(s, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_const_buffer_sequence::value >::type* = 0); /// Start an asynchronous operation to write a certain amount of data to a /// stream. /** * This function is used to asynchronously write a certain number of bytes of * data to a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * async_write_some function, and is known as a composed operation. The * program must ensure that the stream performs no other write operations (such * as async_write, the stream's async_write_some function, or any other composed * operations that perform writes) until this operation completes. * * @param s The stream to which the data is to be written. The type must support * the AsyncWriteStream concept. * * @param buffers One or more buffers containing the data to be written. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's async_write_some function. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes written from the * // buffers. If an error occurred, * // this will be less than the sum * // of the buffer sizes. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::async_write(s, * asio::buffer(data, size), * asio::transfer_at_least(32), * handler); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_const_buffer_sequence::value >::type* = 0); /// Start an asynchronous operation to write all of the supplied data to a /// stream. /** * This function is used to asynchronously write a certain number of bytes of * data to a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li All of the data in the supplied dynamic buffer sequence has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_write_some function, and is known as a composed operation. The * program must ensure that the stream performs no other write operations (such * as async_write, the stream's async_write_some function, or any other composed * operations that perform writes) until this operation completes. * * @param s The stream to which the data is to be written. The type must support * the AsyncWriteStream concept. * * @param buffers The dynamic buffer sequence from which data will be written. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. Successfully written * data is automatically consumed from the buffers. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes written from the * // buffers. If an error occurred, * // this will be less than the sum * // of the buffer sizes. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); /// Start an asynchronous operation to write a certain amount of data to a /// stream. /** * This function is used to asynchronously write a certain number of bytes of * data to a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li All of the data in the supplied dynamic buffer sequence has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * async_write_some function, and is known as a composed operation. The * program must ensure that the stream performs no other write operations (such * as async_write, the stream's async_write_some function, or any other composed * operations that perform writes) until this operation completes. * * @param s The stream to which the data is to be written. The type must support * the AsyncWriteStream concept. * * @param buffers The dynamic buffer sequence from which data will be written. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. Successfully written * data is automatically consumed from the buffers. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's async_write_some function. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes written from the * // buffers. If an error occurred, * // this will be less than the sum * // of the buffer sizes. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, ASIO_MOVE_ARG(DynamicBuffer) buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler, typename enable_if< is_dynamic_buffer::type>::value >::type* = 0); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Start an asynchronous operation to write all of the supplied data to a /// stream. /** * This function is used to asynchronously write a certain number of bytes of * data to a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the stream's * async_write_some function, and is known as a composed operation. The * program must ensure that the stream performs no other write operations (such * as async_write, the stream's async_write_some function, or any other composed * operations that perform writes) until this operation completes. * * @param s The stream to which the data is to be written. The type must support * the AsyncWriteStream concept. * * @param b A basic_streambuf object from which data will be written. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes written from the * // buffers. If an error occurred, * // this will be less than the sum * // of the buffer sizes. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, basic_streambuf& b, ASIO_MOVE_ARG(WriteHandler) handler); /// Start an asynchronous operation to write a certain amount of data to a /// stream. /** * This function is used to asynchronously write a certain number of bytes of * data to a stream. The function call always returns immediately. The * asynchronous operation will continue until one of the following conditions * is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the stream's * async_write_some function, and is known as a composed operation. The * program must ensure that the stream performs no other write operations (such * as async_write, the stream's async_write_some function, or any other composed * operations that perform writes) until this operation completes. * * @param s The stream to which the data is to be written. The type must support * the AsyncWriteStream concept. * * @param b A basic_streambuf object from which data will be written. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_write_some operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the stream's async_write_some function. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * const asio::error_code& error, // Result of operation. * * std::size_t bytes_transferred // Number of bytes written from the * // buffers. If an error occurred, * // this will be less than the sum * // of the buffer sizes. * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write(AsyncWriteStream& s, basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/write.hpp" #endif // ASIO_WRITE_HPP asio-1.12.2/include/asio/write_at.hpp000066400000000000000000000660111340672067200174500ustar00rootroot00000000000000// // write_at.hpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_WRITE_AT_HPP #define ASIO_WRITE_AT_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" #include #include "asio/async_result.hpp" #include "asio/detail/cstdint.hpp" #include "asio/error.hpp" #if !defined(ASIO_NO_EXTENSIONS) # include "asio/basic_streambuf_fwd.hpp" #endif // !defined(ASIO_NO_EXTENSIONS) #include "asio/detail/push_options.hpp" namespace asio { /** * @defgroup write_at asio::write_at * * @brief The @c write_at function is a composed operation that writes a * certain amount of data at a specified offset before returning. */ /*@{*/ /// Write all of the supplied data at the specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * device. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::write_at(d, 42, asio::buffer(data, size)); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::write_at( * d, offset, buffers, * asio::transfer_all()); @endcode */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers); /// Write all of the supplied data at the specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * device. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::write_at(d, 42, * asio::buffer(data, size), ec); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. * * @note This overload is equivalent to calling: * @code asio::write_at( * d, offset, buffers, * asio::transfer_all(), ec); @endcode */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, asio::error_code& ec); /// Write a certain amount of data at a specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * device. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the device's write_some_at function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::write_at(d, 42, asio::buffer(data, size), * asio::transfer_at_least(32)); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition); /// Write a certain amount of data at a specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param buffers One or more buffers containing the data to be written. The sum * of the buffer sizes indicates the maximum number of bytes to write to the * device. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the device's write_some_at function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, asio::error_code& ec); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Write all of the supplied data at the specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param b The basic_streambuf object from which data will be written. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. * * @note This overload is equivalent to calling: * @code asio::write_at( * d, 42, b, * asio::transfer_all()); @endcode */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, basic_streambuf& b); /// Write all of the supplied data at the specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param b The basic_streambuf object from which data will be written. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes transferred. * * @note This overload is equivalent to calling: * @code asio::write_at( * d, 42, b, * asio::transfer_all(), ec); @endcode */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, basic_streambuf& b, asio::error_code& ec); /// Write a certain amount of data at a specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param b The basic_streambuf object from which data will be written. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the device's write_some_at function. * * @returns The number of bytes transferred. * * @throws asio::system_error Thrown on failure. */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, basic_streambuf& b, CompletionCondition completion_condition); /// Write a certain amount of data at a specified offset before returning. /** * This function is used to write a certain number of bytes of data to a random * access device at a specified offset. The call will block until one of the * following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * write_some_at function. * * @param d The device to which the data is to be written. The type must support * the SyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param b The basic_streambuf object from which data will be written. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest write_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the device's write_some_at function. * * @param ec Set to indicate what error occurred, if any. * * @returns The number of bytes written. If an error occurs, returns the total * number of bytes successfully transferred prior to the error. */ template std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, basic_streambuf& b, CompletionCondition completion_condition, asio::error_code& ec); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ /** * @defgroup async_write_at asio::async_write_at * * @brief The @c async_write_at function is a composed asynchronous operation * that writes a certain amount of data at the specified offset before * completion. */ /*@{*/ /// Start an asynchronous operation to write all of the supplied data at the /// specified offset. /** * This function is used to asynchronously write a certain number of bytes of * data to a random access device at a specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * async_write_some_at function, and is known as a composed operation. * The program must ensure that the device performs no overlapping * write operations (such as async_write_at, the device's async_write_some_at * function, or any other composed operations that perform writes) until this * operation completes. Operations are overlapping if the regions defined by * their offsets, and the numbers of bytes to write, intersect. * * @param d The device to which the data is to be written. The type must support * the AsyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param buffers One or more buffers containing the data to be written. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of * the handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes written from the buffers. If an error * // occurred, this will be less than the sum of the buffer sizes. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code * asio::async_write_at(d, 42, asio::buffer(data, size), handler); * @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, ASIO_MOVE_ARG(WriteHandler) handler); /// Start an asynchronous operation to write a certain amount of data at the /// specified offset. /** * This function is used to asynchronously write a certain number of bytes of * data to a random access device at a specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li All of the data in the supplied buffers has been written. That is, the * bytes transferred is equal to the sum of the buffer sizes. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * async_write_some_at function, and is known as a composed operation. * The program must ensure that the device performs no overlapping * write operations (such as async_write_at, the device's async_write_some_at * function, or any other composed operations that perform writes) until this * operation completes. Operations are overlapping if the regions defined by * their offsets, and the numbers of bytes to write, intersect. * * @param d The device to which the data is to be written. The type must support * the AsyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param buffers One or more buffers containing the data to be written. * Although the buffers object may be copied as necessary, ownership of the * underlying memory blocks is retained by the caller, which must guarantee * that they remain valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_write_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the device's async_write_some_at function. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes written from the buffers. If an error * // occurred, this will be less than the sum of the buffer sizes. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). * * @par Example * To write a single data buffer use the @ref buffer function as follows: * @code asio::async_write_at(d, 42, * asio::buffer(data, size), * asio::transfer_at_least(32), * handler); @endcode * See the @ref buffer documentation for information on writing multiple * buffers in one go, and how to use it with arrays, boost::array or * std::vector. */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, const ConstBufferSequence& buffers, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler); #if !defined(ASIO_NO_EXTENSIONS) #if !defined(ASIO_NO_IOSTREAM) /// Start an asynchronous operation to write all of the supplied data at the /// specified offset. /** * This function is used to asynchronously write a certain number of bytes of * data to a random access device at a specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li An error occurred. * * This operation is implemented in terms of zero or more calls to the device's * async_write_some_at function, and is known as a composed operation. * The program must ensure that the device performs no overlapping * write operations (such as async_write_at, the device's async_write_some_at * function, or any other composed operations that perform writes) until this * operation completes. Operations are overlapping if the regions defined by * their offsets, and the numbers of bytes to write, intersect. * * @param d The device to which the data is to be written. The type must support * the AsyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param b A basic_streambuf object from which data will be written. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes written from the buffers. If an error * // occurred, this will be less than the sum of the buffer sizes. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, basic_streambuf& b, ASIO_MOVE_ARG(WriteHandler) handler); /// Start an asynchronous operation to write a certain amount of data at the /// specified offset. /** * This function is used to asynchronously write a certain number of bytes of * data to a random access device at a specified offset. The function call * always returns immediately. The asynchronous operation will continue until * one of the following conditions is true: * * @li All of the data in the supplied basic_streambuf has been written. * * @li The completion_condition function object returns 0. * * This operation is implemented in terms of zero or more calls to the device's * async_write_some_at function, and is known as a composed operation. * The program must ensure that the device performs no overlapping * write operations (such as async_write_at, the device's async_write_some_at * function, or any other composed operations that perform writes) until this * operation completes. Operations are overlapping if the regions defined by * their offsets, and the numbers of bytes to write, intersect. * * @param d The device to which the data is to be written. The type must support * the AsyncRandomAccessWriteDevice concept. * * @param offset The offset at which the data will be written. * * @param b A basic_streambuf object from which data will be written. Ownership * of the streambuf is retained by the caller, which must guarantee that it * remains valid until the handler is called. * * @param completion_condition The function object to be called to determine * whether the write operation is complete. The signature of the function object * must be: * @code std::size_t completion_condition( * // Result of latest async_write_some_at operation. * const asio::error_code& error, * * // Number of bytes transferred so far. * std::size_t bytes_transferred * ); @endcode * A return value of 0 indicates that the write operation is complete. A * non-zero return value indicates the maximum number of bytes to be written on * the next call to the device's async_write_some_at function. * * @param handler The handler to be called when the write operation completes. * Copies will be made of the handler as required. The function signature of the * handler must be: * @code void handler( * // Result of operation. * const asio::error_code& error, * * // Number of bytes written from the buffers. If an error * // occurred, this will be less than the sum of the buffer sizes. * std::size_t bytes_transferred * ); @endcode * Regardless of whether the asynchronous operation completes immediately or * not, the handler will not be invoked from within this function. Invocation of * the handler will be performed in a manner equivalent to using * asio::io_context::post(). */ template ASIO_INITFN_RESULT_TYPE(WriteHandler, void (asio::error_code, std::size_t)) async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, basic_streambuf& b, CompletionCondition completion_condition, ASIO_MOVE_ARG(WriteHandler) handler); #endif // !defined(ASIO_NO_IOSTREAM) #endif // !defined(ASIO_NO_EXTENSIONS) /*@}*/ } // namespace asio #include "asio/detail/pop_options.hpp" #include "asio/impl/write_at.hpp" #endif // ASIO_WRITE_AT_HPP asio-1.12.2/include/asio/yield.hpp000066400000000000000000000007201340672067200167330ustar00rootroot00000000000000// // yield.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "coroutine.hpp" #ifndef reenter # define reenter(c) ASIO_CORO_REENTER(c) #endif #ifndef yield # define yield ASIO_CORO_YIELD #endif #ifndef fork # define fork ASIO_CORO_FORK #endif asio-1.12.2/install-sh000077500000000000000000000360101340672067200145430ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $RANDOM variable is not portable (e.g. dash); Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asio-1.12.2/missing000077500000000000000000000153361340672067200141460ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: asio-1.12.2/src/000077500000000000000000000000001340672067200133265ustar00rootroot00000000000000asio-1.12.2/src/Makefile.am000066400000000000000000000006561340672067200153710ustar00rootroot00000000000000if !STANDALONE EXAMPLES_CPP03 = examples/cpp03 endif if HAVE_CXX11 EXAMPLES_CPP11 = examples/cpp11 endif if HAVE_CXX14 EXAMPLES_CPP14 = examples/cpp14 endif SUBDIRS = $(EXAMPLES_CPP03) $(EXAMPLES_CPP11) $(EXAMPLES_CPP14) tests DIST_SUBDIRS = examples/cpp03 examples/cpp11 examples/cpp14 examples/cpp17 tests EXTRA_DIST = \ Makefile.mgw \ Makefile.msc \ tools/handlerviz.pl MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/src/Makefile.in000066400000000000000000000435211340672067200154000ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir distdir-am am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @STANDALONE_FALSE@EXAMPLES_CPP03 = examples/cpp03 @HAVE_CXX11_TRUE@EXAMPLES_CPP11 = examples/cpp11 @HAVE_CXX14_TRUE@EXAMPLES_CPP14 = examples/cpp14 SUBDIRS = $(EXAMPLES_CPP03) $(EXAMPLES_CPP11) $(EXAMPLES_CPP14) tests DIST_SUBDIRS = examples/cpp03 examples/cpp11 examples/cpp14 examples/cpp17 tests EXTRA_DIST = \ Makefile.mgw \ Makefile.msc \ tools/handlerviz.pl MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-tags distdir dvi dvi-am \ html html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/src/Makefile.mgw000066400000000000000000000170551340672067200155670ustar00rootroot00000000000000ifndef BOOSTDIR BOOSTDIR = ../../boost_1_34_1 endif CXXFLAGS = -g -O2 -Wall -mthreads -I../include -I$(BOOSTDIR) LDFLAGS = -g -O2 -mthreads LIBS = -lws2_32 -lmswsock DEFINES = -D_WIN32_WINNT=0x0501 PERFORMANCE_TEST_EXES = \ tests/performance/client.exe \ tests/performance/server.exe UNIT_TEST_EXES = \ tests/unit/basic_datagram_socket.exe \ tests/unit/basic_deadline_timer.exe \ tests/unit/basic_raw_socket.exe \ tests/unit/basic_seq_packet_socket.exe \ tests/unit/basic_serial_port.exe \ tests/unit/basic_signal_set.exe \ tests/unit/basic_socket_acceptor.exe \ tests/unit/basic_stream_socket.exe \ tests/unit/basic_streambuf.exe \ tests/unit/basic_waitable_timer.exe \ tests/unit/buffered_read_stream.exe \ tests/unit/buffered_stream.exe \ tests/unit/buffered_write_stream.exe \ tests/unit/buffer.exe \ tests/unit/buffers_iterator.exe \ tests/unit/completion_condition.exe \ tests/unit/connect.exe \ tests/unit/coroutine.exe \ tests/unit/datagram_socket_service.exe \ tests/unit/deadline_timer_service.exe \ tests/unit/deadline_timer.exe \ tests/unit/error.exe \ tests/unit/generic/basic_endpoint.exe \ tests/unit/generic/datagram_protocol.exe \ tests/unit/generic/raw_protocol.exe \ tests/unit/generic/seq_packet_protocol.exe \ tests/unit/generic/stream_protocol.exe \ tests/unit/high_resolution_timer.exe \ tests/unit/io_context.exe \ tests/unit/ip/address.exe \ tests/unit/ip/address_v4.exe \ tests/unit/ip/address_v6.exe \ tests/unit/ip/basic_endpoint.exe \ tests/unit/ip/basic_resolver.exe \ tests/unit/ip/basic_resolver_entry.exe \ tests/unit/ip/basic_resolver_iterator.exe \ tests/unit/ip/basic_resolver_query.exe \ tests/unit/ip/host_name.exe \ tests/unit/ip/icmp.exe \ tests/unit/ip/multicast.exe \ tests/unit/ip/resolver_query_base.exe \ tests/unit/ip/resolver_service.exe \ tests/unit/ip/tcp.exe \ tests/unit/ip/udp.exe \ tests/unit/ip/unicast.exe \ tests/unit/ip/v6_only.exe \ tests/unit/is_read_buffered.exe \ tests/unit/is_write_buffered.exe \ tests/unit/placeholders.exe \ tests/unit/raw_socket_service.exe \ tests/unit/read.exe \ tests/unit/read_at.exe \ tests/unit/read_until.exe \ tests/unit/seq_packet_socket_service.exe \ tests/unit/serial_port.exe \ tests/unit/serial_port_base.exe \ tests/unit/serial_port_service.exe \ tests/unit/signal_set.exe \ tests/unit/signal_set_service.exe \ tests/unit/socket_acceptor_service.exe \ tests/unit/socket_base.exe \ tests/unit/steady_timer.exe \ tests/unit/strand.exe \ tests/unit/stream_socket_service.exe \ tests/unit/streambuf.exe \ tests/unit/system_executor.exe \ tests/unit/system_context.exe \ tests/unit/system_timer.exe \ tests/unit/thread.exe \ tests/unit/time_traits.exe \ tests/unit/ts/buffer.exe \ tests/unit/ts/executor.exe \ tests/unit/ts/internet.exe \ tests/unit/ts/io_context.exe \ tests/unit/ts/net.exe \ tests/unit/ts/netfwd.exe \ tests/unit/ts/socket.exe \ tests/unit/ts/timer.exe \ tests/unit/waitable_timer_service.exe \ tests/unit/windows/basic_handle.exe \ tests/unit/windows/basic_object_handle.exe \ tests/unit/windows/basic_random_access_handle.exe \ tests/unit/windows/basic_stream_handle.exe \ tests/unit/windows/object_handle.exe \ tests/unit/windows/object_handle_service.exe \ tests/unit/windows/overlapped_ptr.exe \ tests/unit/windows/random_access_handle.exe \ tests/unit/windows/random_access_handle_service.exe \ tests/unit/windows/stream_handle.exe \ tests/unit/windows/stream_handle_service.exe \ tests/unit/write.exe \ tests/unit/write_at.exe EXAMPLE_EXES = \ examples/cpp03/allocation/server.exe \ examples/cpp03/buffers/reference_counted.exe \ examples/cpp03/chat/chat_client.exe \ examples/cpp03/chat/chat_server.exe \ examples/cpp03/echo/async_tcp_echo_server.exe \ examples/cpp03/echo/async_udp_echo_server.exe \ examples/cpp03/echo/blocking_tcp_echo_client.exe \ examples/cpp03/echo/blocking_tcp_echo_server.exe \ examples/cpp03/echo/blocking_udp_echo_client.exe \ examples/cpp03/echo/blocking_udp_echo_server.exe \ examples/cpp03/http/client/async_client.exe \ examples/cpp03/http/client/sync_client.exe \ examples/cpp03/icmp/ping.exe \ examples/cpp03/invocation/prioritised_handlers.exe \ examples/cpp03/iostreams/daytime_client.exe \ examples/cpp03/iostreams/daytime_server.exe \ examples/cpp03/iostreams/http_client.exe \ examples/cpp03/multicast/receiver.exe \ examples/cpp03/multicast/sender.exe \ examples/cpp03/socks4/sync_client.exe \ examples/cpp03/timeouts/async_tcp_client.exe \ examples/cpp03/timeouts/blocking_tcp_client.exe \ examples/cpp03/timeouts/blocking_token_tcp_client.exe \ examples/cpp03/timeouts/blocking_udp_client.exe \ examples/cpp03/timeouts/server.exe \ examples/cpp03/timers/time_t_timer.exe \ examples/cpp03/tutorial/timer1/timer.exe \ examples/cpp03/tutorial/timer2/timer.exe \ examples/cpp03/tutorial/timer3/timer.exe \ examples/cpp03/tutorial/timer4/timer.exe \ examples/cpp03/tutorial/timer5/timer.exe \ examples/cpp03/tutorial/daytime1/client.exe \ examples/cpp03/tutorial/daytime2/server.exe \ examples/cpp03/tutorial/daytime3/server.exe \ examples/cpp03/tutorial/daytime4/client.exe \ examples/cpp03/tutorial/daytime5/server.exe \ examples/cpp03/tutorial/daytime6/server.exe \ examples/cpp03/tutorial/daytime7/server.exe \ examples/cpp03/windows/transmit_file.exe OTHER_EXAMPLE_EXES = \ examples/cpp03/http/server/http_server.exe \ examples/cpp03/http/server2/http_server.exe \ examples/cpp03/http/server3/http_server.exe \ examples/cpp03/services/daytime_client.exe all: \ $(PERFORMANCE_TEST_EXES) \ $(UNIT_TEST_EXES) \ $(EXAMPLE_EXES) \ $(OTHER_EXAMPLE_EXES) check: $(UNIT_TEST_EXES) $(addprefix run.,$(UNIT_TEST_EXES)) $(addprefix run.,$(UNIT_TEST_EXES)):: @echo === Running $(@:run.%=%) === @$(@:run.%=%) @echo. clean: -rm -f $(PERFORMANCE_TEST_EXES) -rm -f $(PERFORMANCE_TEST_EXES:.exe=.o) -rm -f $(UNIT_TEST_OBJ) -rm -f $(UNIT_TEST_EXES) -rm -f $(UNIT_TEST_EXES:.exe=.o) -rm -f $(EXAMPLE_EXES) -rm -f $(EXAMPLE_EXES:.exe=.o) -rm -f $(OTHER_EXAMPLE_EXES) -rm -f $(OTHER_EXAMPLE_EXES:.exe=.o) $(UNIT_TEST_EXES): %.exe: %.o g++ -o$@ $(LDFLAGS) $< $(LIBS) $(PERFORMANCE_TEST_EXES) $(EXAMPLE_EXES): %.exe: %.o g++ -o$@ $(LDFLAGS) $< $(LIBS) examples/cpp03/http/server/http_server.exe: \ examples/cpp03/http/server/connection.o \ examples/cpp03/http/server/connection_manager.o \ examples/cpp03/http/server/main.o \ examples/cpp03/http/server/mime_types.o \ examples/cpp03/http/server/reply.o \ examples/cpp03/http/server/request_handler.o \ examples/cpp03/http/server/request_parser.o \ examples/cpp03/http/server/server.o g++ -o$@ $(LDFLAGS) $^ $(LIBS) examples/cpp03/http/server2/http_server.exe: \ examples/cpp03/http/server2/connection.o \ examples/cpp03/http/server2/io_context_pool.o \ examples/cpp03/http/server2/main.o \ examples/cpp03/http/server2/mime_types.o \ examples/cpp03/http/server2/reply.o \ examples/cpp03/http/server2/request_handler.o \ examples/cpp03/http/server2/request_parser.o \ examples/cpp03/http/server2/server.o g++ -o$@ $(LDFLAGS) $^ $(LIBS) examples/cpp03/http/server3/http_server.exe: \ examples/cpp03/http/server3/connection.o \ examples/cpp03/http/server3/main.o \ examples/cpp03/http/server3/mime_types.o \ examples/cpp03/http/server3/reply.o \ examples/cpp03/http/server3/request_handler.o \ examples/cpp03/http/server3/request_parser.o \ examples/cpp03/http/server3/server.o g++ -o$@ $(LDFLAGS) $^ $(LIBS) examples/cpp03/services/daytime_client.exe: \ examples/cpp03/services/daytime_client.o \ examples/cpp03/services/logger_service.o g++ -o$@ $(LDFLAGS) $^ $(LIBS) .cpp.o: g++ -o$@ -c $(CXXFLAGS) $(DEFINES) $< asio-1.12.2/src/Makefile.msc000066400000000000000000000376331340672067200155630ustar00rootroot00000000000000!ifndef BOOSTDIR BOOSTDIR = ../../boost_1_34_1 !endif COMMON_CXXFLAGS = -nologo -EHac -GR -I. -I../include !ifdef WARNINGS WARNINGS_CXXFLAGS = -W4 -wd4512 -wd4447 !endif !ifdef STATICRTL ! ifdef DEBUG DEBUG_CXXFLAGS = -Zi -MTd ! else DEBUG_CXXFLAGS = -O2 -MT ! endif !else ! ifdef DEBUG DEBUG_CXXFLAGS = -Zi -MDd ! else DEBUG_CXXFLAGS = -O2 -MD ! endif !endif !ifdef UNICODE UNICODE_CXXFLAGS = -DUNICODE -D_UNICODE !endif !ifdef TRACKING TRACKING_CXXFLAGS = -DASIO_ENABLE_HANDLER_TRACKING !endif !ifndef _WIN32_WINNT ! ifdef STORE _WIN32_WINNT=0x0603 ! else _WIN32_WINNT=0x0501 ! endif !endif !ifdef WIN9X DEFINES = \ -DASIO_DISABLE_IOCP \ -D_WIN32_WINNT=$(_WIN32_WINNT) \ -DBOOST_ALL_NO_LIB \ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING !else ! ifdef STORE DEFINES = \ -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP \ -DBOOST_ALL_NO_LIB -D_WIN32_WINNT=$(_WIN32_WINNT) \ -DUNICODE -D_UNICODE \ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING ! else ! ifdef WINRT DEFINES = \ -ZW -FI SDKDDKVer.h -FI winapifamily.h -DWINAPI_FAMILY=WINAPI_PARTITION_APP \ -DBOOST_ALL_NO_LIB \ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING ! else DEFINES = \ -D_WIN32_WINNT=$(_WIN32_WINNT) \ -DBOOST_ALL_NO_LIB \ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING ! endif ! endif !endif !ifdef SEPARATE_COMPILATION LIBS = asio.lib SEPARATE_COMPILATION_CXXFLAGS = \ -DASIO_SEPARATE_COMPILATION \ -DASIO_ENABLE_CANCELIO !endif !ifdef STANDALONE STANDALONE_CXXFLAGS = -DASIO_STANDALONE !else STANDALONE_CXXFLAGS = -I$(BOOSTDIR) !endif CXXFLAGS = \ $(COMMON_CXXFLAGS) \ $(WARNINGS_CXXFLAGS) \ $(DEBUG_CXXFLAGS) \ $(UNICODE_CXXFLAGS) \ $(TRACKING_CXXFLAGS) \ $(SEPARATE_COMPILATION_CXXFLAGS) \ $(STANDALONE_CXXFLAGS) !ifndef SSLDIR SSLDIR = ../../openssl-0.9.8g !endif SSL_CXXFLAGS = -I$(SSLDIR)/inc32 SSL_LIBS = \ $(SSLDIR)/out32/libeay32.lib \ $(SSLDIR)/out32/ssleay32.lib \ user32.lib advapi32.lib gdi32.lib LATENCY_TEST_EXES = \ tests\latency\tcp_client.exe \ tests\latency\tcp_server.exe \ tests\latency\udp_client.exe \ tests\latency\udp_server.exe PERFORMANCE_TEST_EXES = \ tests\performance\client.exe \ tests\performance\server.exe UNIT_TEST_EXES = \ tests\unit\basic_datagram_socket.exe \ tests\unit\basic_deadline_timer.exe \ tests\unit\basic_raw_socket.exe \ tests\unit\basic_seq_packet_socket.exe \ tests\unit\basic_serial_port.exe \ tests\unit\basic_signal_set.exe \ tests\unit\basic_socket_acceptor.exe \ tests\unit\basic_stream_socket.exe \ tests\unit\basic_streambuf.exe \ tests\unit\basic_waitable_timer.exe \ tests\unit\buffered_read_stream.exe \ tests\unit\buffered_stream.exe \ tests\unit\buffered_write_stream.exe \ tests\unit\buffer.exe \ tests\unit\buffers_iterator.exe \ tests\unit\completion_condition.exe \ tests\unit\connect.exe \ tests\unit\coroutine.exe \ tests\unit\datagram_socket_service.exe \ tests\unit\deadline_timer_service.exe \ tests\unit\deadline_timer.exe \ tests\unit\error.exe \ tests\unit\generic\basic_endpoint.exe \ tests\unit\generic\datagram_protocol.exe \ tests\unit\generic\raw_protocol.exe \ tests\unit\generic\seq_packet_protocol.exe \ tests\unit\generic\stream_protocol.exe \ tests\unit\high_resolution_timer.exe \ tests\unit\io_context.exe \ tests\unit\ip\address.exe \ tests\unit\ip\address_v4.exe \ tests\unit\ip\address_v6.exe \ tests\unit\ip\basic_endpoint.exe \ tests\unit\ip\basic_resolver.exe \ tests\unit\ip\basic_resolver_entry.exe \ tests\unit\ip\basic_resolver_iterator.exe \ tests\unit\ip\basic_resolver_query.exe \ tests\unit\ip\host_name.exe \ tests\unit\ip\icmp.exe \ tests\unit\ip\multicast.exe \ tests\unit\ip\resolver_query_base.exe \ tests\unit\ip\resolver_service.exe \ tests\unit\ip\tcp.exe \ tests\unit\ip\udp.exe \ tests\unit\ip\unicast.exe \ tests\unit\ip\v6_only.exe \ tests\unit\is_read_buffered.exe \ tests\unit\is_write_buffered.exe \ tests\unit\placeholders.exe \ tests\unit\raw_socket_service.exe \ tests\unit\read.exe \ tests\unit\read_at.exe \ tests\unit\read_until.exe \ tests\unit\seq_packet_socket_service.exe \ tests\unit\serial_port.exe \ tests\unit\serial_port_base.exe \ tests\unit\serial_port_service.exe \ tests\unit\signal_set.exe \ tests\unit\signal_set_service.exe \ tests\unit\socket_acceptor_service.exe \ tests\unit\socket_base.exe \ tests\unit\strand.exe \ tests\unit\steady_timer.exe \ tests\unit\stream_socket_service.exe \ tests\unit\streambuf.exe \ tests\unit\system_context.exe \ tests\unit\system_executor.exe \ tests\unit\system_timer.exe \ tests\unit\thread.exe \ tests\unit\time_traits.exe \ tests\unit\ts\buffer.exe \ tests\unit\ts\executor.exe \ tests\unit\ts\internet.exe \ tests\unit\ts\io_context.exe \ tests\unit\ts\net.exe \ tests\unit\ts\netfwd.exe \ tests\unit\ts\socket.exe \ tests\unit\ts\timer.exe \ tests\unit\waitable_timer_service.exe \ tests\unit\windows\basic_handle.exe \ tests\unit\windows\basic_object_handle.exe \ tests\unit\windows\basic_random_access_handle.exe \ tests\unit\windows\basic_stream_handle.exe \ tests\unit\windows\object_handle.exe \ tests\unit\windows\object_handle_service.exe \ tests\unit\windows\overlapped_ptr.exe \ tests\unit\windows\random_access_handle.exe \ tests\unit\windows\random_access_handle_service.exe \ tests\unit\windows\stream_handle.exe \ tests\unit\windows\stream_handle_service.exe \ tests\unit\write.exe \ tests\unit\write_at.exe CPP03_EXAMPLE_EXES = \ examples\cpp03\allocation\server.exe \ examples\cpp03\buffers\reference_counted.exe \ examples\cpp03\chat\chat_client.exe \ examples\cpp03\chat\chat_server.exe \ examples\cpp03\echo\async_tcp_echo_server.exe \ examples\cpp03\echo\async_udp_echo_server.exe \ examples\cpp03\echo\blocking_tcp_echo_client.exe \ examples\cpp03\echo\blocking_tcp_echo_server.exe \ examples\cpp03\echo\blocking_udp_echo_client.exe \ examples\cpp03\echo\blocking_udp_echo_server.exe \ examples\cpp03\http\client\async_client.exe \ examples\cpp03\http\client\sync_client.exe \ examples\cpp03\http\server\http_server.exe \ examples\cpp03\http\server2\http_server.exe \ examples\cpp03\http\server3\http_server.exe \ examples\cpp03\http\server4\http_server.exe \ examples\cpp03\icmp\ping.exe \ examples\cpp03\invocation\prioritised_handlers.exe \ examples\cpp03\iostreams\daytime_client.exe \ examples\cpp03\iostreams\daytime_server.exe \ examples\cpp03\iostreams\http_client.exe \ examples\cpp03\multicast\receiver.exe \ examples\cpp03\multicast\sender.exe \ examples\cpp03\nonblocking\third_party_lib.exe \ examples\cpp03\porthopper\client.exe \ examples\cpp03\porthopper\server.exe \ examples\cpp03\services\daytime_client.exe \ examples\cpp03\socks4\sync_client.exe \ examples\cpp03\timeouts\async_tcp_client.exe \ examples\cpp03\timeouts\blocking_tcp_client.exe \ examples\cpp03\timeouts\blocking_token_tcp_client.exe \ examples\cpp03\timeouts\blocking_udp_client.exe \ examples\cpp03\timeouts\server.exe \ examples\cpp03\timers\time_t_timer.exe \ examples\cpp03\tutorial\timer1\timer.exe \ examples\cpp03\tutorial\timer2\timer.exe \ examples\cpp03\tutorial\timer3\timer.exe \ examples\cpp03\tutorial\timer4\timer.exe \ examples\cpp03\tutorial\timer5\timer.exe \ examples\cpp03\tutorial\daytime1\client.exe \ examples\cpp03\tutorial\daytime2\server.exe \ examples\cpp03\tutorial\daytime3\server.exe \ examples\cpp03\tutorial\daytime4\client.exe \ examples\cpp03\tutorial\daytime5\server.exe \ examples\cpp03\tutorial\daytime6\server.exe \ examples\cpp03\tutorial\daytime7\server.exe \ examples\cpp03\windows\transmit_file.exe SSL_UNIT_TEST_EXES = \ tests\unit\ssl\basic_context.exe \ tests\unit\ssl\context.exe \ tests\unit\ssl\context_base.exe \ tests\unit\ssl\context_service.exe \ tests\unit\ssl\rfc2818_verification.exe \ tests\unit\ssl\stream.exe \ tests\unit\ssl\stream_base.exe \ tests\unit\ssl\stream_service.exe SSL_EXAMPLE_EXES = \ examples\cpp03\ssl\client.exe \ examples\cpp03\ssl\server.exe !ifdef SEPARATE_COMPILATION all: asio.lib asio.lib: asio.cpp cl -Fe$@ -Foasio.obj $(CXXFLAGS) $(DEFINES) -c asio.cpp lib -name:asio.lib asio.obj !endif !ifdef STANDALONE all: \ $(UNIT_TEST_EXES) !else all: \ $(LATENCY_TEST_EXES) \ $(PERFORMANCE_TEST_EXES) \ $(UNIT_TEST_EXES) \ $(CPP03_EXAMPLE_EXES) !endif ssl: \ $(SSL_UNIT_TEST_EXES) \ $(SSL_EXAMPLE_EXES) check: $(UNIT_TEST_EXES) !@echo === Running $** === && $** && echo. {tests\latency}.cpp{tests\latency}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {tests\performance}.cpp{tests\performance}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref tests\unit\unit_test.obj: tests\unit\unit_test.cpp cl -Fe$@ -Fotests\unit\unit_test.obj $(CXXFLAGS) $(DEFINES) -c tests\unit\unit_test.cpp {tests\unit}.cpp{tests\unit}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {tests\unit\generic}.cpp{tests\unit\generic}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {tests\unit\ip}.cpp{tests\unit\ip}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {tests\unit\ssl}.cpp{tests\unit\ssl}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(SSL_CXXFLAGS) $(DEFINES) $< $(SSL_LIBS) $(LIBS) -link -opt:ref {tests\unit\ts}.cpp{tests\unit\ts}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {tests\unit\windows}.cpp{tests\unit\windows}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\allocation}.cpp{examples\cpp03\allocation}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\buffers}.cpp{examples\cpp03\buffers}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\chat}.cpp{examples\cpp03\chat}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\echo}.cpp{examples\cpp03\echo}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\http\client}.cpp{examples\cpp03\http\client}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\icmp}.cpp{examples\cpp03\icmp}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\invocation}.cpp{examples\cpp03\invocation}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\iostreams}.cpp{examples\cpp03\iostreams}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\multicast}.cpp{examples\cpp03\multicast}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\nonblocking}.cpp{examples\cpp03\nonblocking}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\porthopper}.cpp{examples\cpp03\porthopper}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\socks4}.cpp{examples\cpp03\socks4}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\ssl}.cpp{examples\cpp03\ssl}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(SSL_CXXFLAGS) $(DEFINES) $< $(SSL_LIBS) $(LIBS) -link -opt:ref {examples\cpp03\timeouts}.cpp{examples\cpp03\timeouts}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\timers}.cpp{examples\cpp03\timers}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\timer1}.cpp{examples\cpp03\tutorial\timer1}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\timer2}.cpp{examples\cpp03\tutorial\timer2}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\timer3}.cpp{examples\cpp03\tutorial\timer3}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\timer4}.cpp{examples\cpp03\tutorial\timer4}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\timer5}.cpp{examples\cpp03\tutorial\timer5}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime1}.cpp{examples\cpp03\tutorial\daytime1}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime2}.cpp{examples\cpp03\tutorial\daytime2}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime3}.cpp{examples\cpp03\tutorial\daytime3}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime4}.cpp{examples\cpp03\tutorial\daytime4}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime5}.cpp{examples\cpp03\tutorial\daytime5}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime6}.cpp{examples\cpp03\tutorial\daytime6}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\tutorial\daytime7}.cpp{examples\cpp03\tutorial\daytime7}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp03\windows}.cpp{examples\cpp03\windows}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref {examples\cpp11\executors}.cpp{examples\cpp11\executors}.exe: cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref examples\cpp03\http\server\http_server.exe: \ examples\cpp03\http\server\connection.cpp \ examples\cpp03\http\server\connection_manager.cpp \ examples\cpp03\http\server\main.cpp \ examples\cpp03\http\server\mime_types.cpp \ examples\cpp03\http\server\reply.cpp \ examples\cpp03\http\server\request_handler.cpp \ examples\cpp03\http\server\request_parser.cpp \ examples\cpp03\http\server\server.cpp cl -Fe$@ -Foexamples\cpp03\http\server\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref examples\cpp03\http\server2\http_server.exe: \ examples\cpp03\http\server2\connection.cpp \ examples\cpp03\http\server2\io_context_pool.cpp \ examples\cpp03\http\server2\main.cpp \ examples\cpp03\http\server2\mime_types.cpp \ examples\cpp03\http\server2\reply.cpp \ examples\cpp03\http\server2\request_handler.cpp \ examples\cpp03\http\server2\request_parser.cpp \ examples\cpp03\http\server2\server.cpp cl -Fe$@ -Foexamples\cpp03\http\server2\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref examples\cpp03\http\server3\http_server.exe: \ examples\cpp03\http\server3\connection.cpp \ examples\cpp03\http\server3\main.cpp \ examples\cpp03\http\server3\mime_types.cpp \ examples\cpp03\http\server3\reply.cpp \ examples\cpp03\http\server3\request_handler.cpp \ examples\cpp03\http\server3\request_parser.cpp \ examples\cpp03\http\server3\server.cpp cl -Fe$@ -Foexamples\cpp03\http\server3\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref examples\cpp03\http\server4\http_server.exe: \ examples\cpp03\http\server4\file_handler.cpp \ examples\cpp03\http\server4\main.cpp \ examples\cpp03\http\server4\mime_types.cpp \ examples\cpp03\http\server4\reply.cpp \ examples\cpp03\http\server4\request_parser.cpp \ examples\cpp03\http\server4\server.cpp cl -Fe$@ -Foexamples\cpp03\http\server4\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref examples\cpp03\services\daytime_client.exe: \ examples\cpp03\services\daytime_client.cpp \ examples\cpp03\services\logger_service.cpp cl -Fe$@ -Foexamples\cpp03\services\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref clean: -del /q /s asio.lib -del /q /s asio.obj -del /q /s tests\*.exe -del /q /s tests\*.exe.manifest -del /q /s tests\*.exp -del /q /s tests\*.ilk -del /q /s tests\*.pdb -del /q /s tests\*.obj -del /q /s examples\*.exe -del /q /s examples\*.exe.manifest -del /q /s examples\*.exp -del /q /s examples\*.ilk -del /q /s examples\*.pdb -del /q /s examples\*.obj -del /q /s *.pdb asio-1.12.2/src/asio.cpp000066400000000000000000000004521340672067200147660ustar00rootroot00000000000000// // asio.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/impl/src.hpp" asio-1.12.2/src/asio_ssl.cpp000066400000000000000000000004661340672067200156540ustar00rootroot00000000000000// // asio_ssl.cpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/ssl/impl/src.hpp" asio-1.12.2/src/examples/000077500000000000000000000000001340672067200151445ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/000077500000000000000000000000001340672067200160715ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/Makefile.am000066400000000000000000000176251340672067200201400ustar00rootroot00000000000000AUTOMAKE_OPTIONS = subdir-objects if SEPARATE_COMPILATION noinst_LIBRARIES = libasio.a libasio_a_SOURCES = ../../asio.cpp if HAVE_OPENSSL libasio_a_SOURCES += ../../asio_ssl.cpp endif LDADD = libasio.a endif noinst_PROGRAMS = \ allocation/server \ buffers/reference_counted \ chat/chat_client \ chat/chat_server \ echo/async_tcp_echo_server \ echo/async_udp_echo_server \ echo/blocking_tcp_echo_client \ echo/blocking_tcp_echo_server \ echo/blocking_udp_echo_client \ echo/blocking_udp_echo_server \ http/client/async_client \ http/client/sync_client \ http/server/http_server \ http/server2/http_server \ http/server3/http_server \ http/server4/http_server \ icmp/ping \ invocation/prioritised_handlers \ iostreams/daytime_client \ iostreams/daytime_server \ iostreams/http_client \ multicast/receiver \ multicast/sender \ nonblocking/third_party_lib \ porthopper/client \ porthopper/server \ services/daytime_client \ socks4/sync_client \ timeouts/async_tcp_client \ timeouts/blocking_tcp_client \ timeouts/blocking_token_tcp_client \ timeouts/blocking_udp_client \ timeouts/server \ timers/time_t_timer \ tutorial/timer1/timer \ tutorial/timer2/timer \ tutorial/timer3/timer \ tutorial/timer4/timer \ tutorial/timer5/timer \ tutorial/daytime1/client \ tutorial/daytime2/server \ tutorial/daytime3/server \ tutorial/daytime4/client \ tutorial/daytime5/server \ tutorial/daytime6/server \ tutorial/daytime7/server if !WINDOWS_TARGET noinst_PROGRAMS += \ chat/posix_chat_client \ fork/daemon \ fork/process_per_connection \ local/connect_pair \ local/iostream_client \ local/stream_server \ local/stream_client endif if WINDOWS_TARGET noinst_PROGRAMS += \ windows/transmit_file endif if HAVE_OPENSSL noinst_PROGRAMS += \ ssl/client \ ssl/server endif if HAVE_BOOST_COROUTINE noinst_PROGRAMS += \ spawn/echo_server \ spawn/parallel_grep endif noinst_HEADERS = \ chat/chat_message.hpp \ services/basic_logger.hpp \ services/logger.hpp \ services/logger_service.hpp AM_CXXFLAGS = -I$(srcdir)/../../../include allocation_server_SOURCES = allocation/server.cpp buffers_reference_counted_SOURCES = buffers/reference_counted.cpp chat_chat_client_SOURCES = chat/chat_client.cpp chat_chat_server_SOURCES = chat/chat_server.cpp echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp http_client_async_client_SOURCES = http/client/async_client.cpp http_client_sync_client_SOURCES = http/client/sync_client.cpp http_server_http_server_SOURCES = \ http/server/connection.cpp \ http/server/connection_manager.cpp \ http/server/main.cpp \ http/server/mime_types.cpp \ http/server/reply.cpp \ http/server/request_handler.cpp \ http/server/request_parser.cpp \ http/server/server.cpp http_server2_http_server_SOURCES = \ http/server2/connection.cpp \ http/server2/io_context_pool.cpp \ http/server2/main.cpp \ http/server2/mime_types.cpp \ http/server2/reply.cpp \ http/server2/request_handler.cpp \ http/server2/request_parser.cpp \ http/server2/server.cpp http_server3_http_server_SOURCES = \ http/server3/connection.cpp \ http/server3/main.cpp \ http/server3/mime_types.cpp \ http/server3/reply.cpp \ http/server3/request_handler.cpp \ http/server3/request_parser.cpp \ http/server3/server.cpp http_server4_http_server_SOURCES = \ http/server4/file_handler.cpp \ http/server4/main.cpp \ http/server4/mime_types.cpp \ http/server4/reply.cpp \ http/server4/request_parser.cpp \ http/server4/server.cpp icmp_ping_SOURCES = icmp/ping.cpp invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp iostreams_daytime_client_SOURCES = iostreams/daytime_client.cpp iostreams_daytime_server_SOURCES = iostreams/daytime_server.cpp iostreams_http_client_SOURCES = iostreams/http_client.cpp multicast_receiver_SOURCES = multicast/receiver.cpp multicast_sender_SOURCES = multicast/sender.cpp nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp porthopper_client_SOURCES = porthopper/client.cpp porthopper_server_SOURCES = porthopper/server.cpp services_daytime_client_SOURCES = \ services/daytime_client.cpp \ services/logger_service.cpp socks4_sync_client_SOURCES = socks4/sync_client.cpp timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp timeouts_blocking_token_tcp_client_SOURCES = timeouts/blocking_token_tcp_client.cpp timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp timeouts_server_SOURCES = timeouts/server.cpp timers_time_t_timer_SOURCES = timers/time_t_timer.cpp tutorial_timer1_timer_SOURCES = tutorial/timer1/timer.cpp tutorial_timer2_timer_SOURCES = tutorial/timer2/timer.cpp tutorial_timer3_timer_SOURCES = tutorial/timer3/timer.cpp tutorial_timer4_timer_SOURCES = tutorial/timer4/timer.cpp tutorial_timer5_timer_SOURCES = tutorial/timer5/timer.cpp tutorial_daytime1_client_SOURCES = tutorial/daytime1/client.cpp tutorial_daytime2_server_SOURCES = tutorial/daytime2/server.cpp tutorial_daytime3_server_SOURCES = tutorial/daytime3/server.cpp tutorial_daytime4_client_SOURCES = tutorial/daytime4/client.cpp tutorial_daytime5_server_SOURCES = tutorial/daytime5/server.cpp tutorial_daytime6_server_SOURCES = tutorial/daytime6/server.cpp tutorial_daytime7_server_SOURCES = tutorial/daytime7/server.cpp if !WINDOWS_TARGET chat_posix_chat_client_SOURCES = chat/posix_chat_client.cpp fork_daemon_SOURCES = fork/daemon.cpp fork_process_per_connection_SOURCES = fork/process_per_connection.cpp local_connect_pair_SOURCES = local/connect_pair.cpp local_iostream_client_SOURCES = local/iostream_client.cpp local_stream_server_SOURCES = local/stream_server.cpp local_stream_client_SOURCES = local/stream_client.cpp endif if WINDOWS_TARGET windows_transmit_file_SOURCES = windows/transmit_file.cpp endif if HAVE_OPENSSL ssl_client_SOURCES = ssl/client.cpp ssl_server_SOURCES = ssl/server.cpp endif if HAVE_BOOST_COROUTINE spawn_echo_server_SOURCES = spawn/echo_server.cpp spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system endif EXTRA_DIST = \ http/server/connection.hpp \ http/server/connection_manager.hpp \ http/server/header.hpp \ http/server/mime_types.hpp \ http/server/reply.hpp \ http/server/request.hpp \ http/server/request_handler.hpp \ http/server/request_parser.hpp \ http/server/server.hpp \ http/server2/connection.hpp \ http/server2/io_context_pool.hpp \ http/server2/header.hpp \ http/server2/mime_types.hpp \ http/server2/reply.hpp \ http/server2/request.hpp \ http/server2/request_handler.hpp \ http/server2/request_parser.hpp \ http/server2/server.hpp \ http/server3/connection.hpp \ http/server3/header.hpp \ http/server3/mime_types.hpp \ http/server3/reply.hpp \ http/server3/request.hpp \ http/server3/request_handler.hpp \ http/server3/request_parser.hpp \ http/server3/server.hpp \ http/server4/file_handler.hpp \ http/server4/header.hpp \ http/server4/mime_types.hpp \ http/server4/reply.hpp \ http/server4/request.hpp \ http/server4/request_parser.hpp \ http/server4/server.hpp \ icmp/icmp_header.hpp \ icmp/ipv4_header.hpp \ porthopper/protocol.hpp \ serialization/client.cpp \ serialization/server.cpp \ serialization/connection.hpp \ serialization/stock.hpp \ services/basic_logger.hpp \ services/logger.hpp \ services/logger_service.hpp \ socks4/socks4.hpp \ ssl/README \ ssl/ca.pem \ ssl/server.pem \ ssl/dh2048.pem MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/src/examples/cpp03/Makefile.in000066400000000000000000003223421340672067200201440ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp noinst_PROGRAMS = allocation/server$(EXEEXT) \ buffers/reference_counted$(EXEEXT) chat/chat_client$(EXEEXT) \ chat/chat_server$(EXEEXT) echo/async_tcp_echo_server$(EXEEXT) \ echo/async_udp_echo_server$(EXEEXT) \ echo/blocking_tcp_echo_client$(EXEEXT) \ echo/blocking_tcp_echo_server$(EXEEXT) \ echo/blocking_udp_echo_client$(EXEEXT) \ echo/blocking_udp_echo_server$(EXEEXT) \ http/client/async_client$(EXEEXT) \ http/client/sync_client$(EXEEXT) \ http/server/http_server$(EXEEXT) \ http/server2/http_server$(EXEEXT) \ http/server3/http_server$(EXEEXT) \ http/server4/http_server$(EXEEXT) icmp/ping$(EXEEXT) \ invocation/prioritised_handlers$(EXEEXT) \ iostreams/daytime_client$(EXEEXT) \ iostreams/daytime_server$(EXEEXT) \ iostreams/http_client$(EXEEXT) multicast/receiver$(EXEEXT) \ multicast/sender$(EXEEXT) nonblocking/third_party_lib$(EXEEXT) \ porthopper/client$(EXEEXT) porthopper/server$(EXEEXT) \ services/daytime_client$(EXEEXT) socks4/sync_client$(EXEEXT) \ timeouts/async_tcp_client$(EXEEXT) \ timeouts/blocking_tcp_client$(EXEEXT) \ timeouts/blocking_token_tcp_client$(EXEEXT) \ timeouts/blocking_udp_client$(EXEEXT) timeouts/server$(EXEEXT) \ timers/time_t_timer$(EXEEXT) tutorial/timer1/timer$(EXEEXT) \ tutorial/timer2/timer$(EXEEXT) tutorial/timer3/timer$(EXEEXT) \ tutorial/timer4/timer$(EXEEXT) tutorial/timer5/timer$(EXEEXT) \ tutorial/daytime1/client$(EXEEXT) \ tutorial/daytime2/server$(EXEEXT) \ tutorial/daytime3/server$(EXEEXT) \ tutorial/daytime4/client$(EXEEXT) \ tutorial/daytime5/server$(EXEEXT) \ tutorial/daytime6/server$(EXEEXT) \ tutorial/daytime7/server$(EXEEXT) $(am__EXEEXT_1) \ $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) @WINDOWS_TARGET_FALSE@am__append_2 = \ @WINDOWS_TARGET_FALSE@ chat/posix_chat_client \ @WINDOWS_TARGET_FALSE@ fork/daemon \ @WINDOWS_TARGET_FALSE@ fork/process_per_connection \ @WINDOWS_TARGET_FALSE@ local/connect_pair \ @WINDOWS_TARGET_FALSE@ local/iostream_client \ @WINDOWS_TARGET_FALSE@ local/stream_server \ @WINDOWS_TARGET_FALSE@ local/stream_client @WINDOWS_TARGET_TRUE@am__append_3 = \ @WINDOWS_TARGET_TRUE@ windows/transmit_file @HAVE_OPENSSL_TRUE@am__append_4 = \ @HAVE_OPENSSL_TRUE@ ssl/client \ @HAVE_OPENSSL_TRUE@ ssl/server @HAVE_BOOST_COROUTINE_TRUE@am__append_5 = \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/echo_server \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep subdir = src/examples/cpp03 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @WINDOWS_TARGET_FALSE@am__EXEEXT_1 = chat/posix_chat_client$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ fork/daemon$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ fork/process_per_connection$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/connect_pair$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/iostream_client$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/stream_server$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/stream_client$(EXEEXT) @WINDOWS_TARGET_TRUE@am__EXEEXT_2 = windows/transmit_file$(EXEEXT) @HAVE_OPENSSL_TRUE@am__EXEEXT_3 = ssl/client$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ ssl/server$(EXEEXT) @HAVE_BOOST_COROUTINE_TRUE@am__EXEEXT_4 = spawn/echo_server$(EXEEXT) \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libasio_a_AR = $(AR) $(ARFLAGS) libasio_a_LIBADD = am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp am__dirstamp = $(am__leading_dot)dirstamp @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT) @SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \ @SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \ @SEPARATE_COMPILATION_TRUE@ $(am__objects_1) libasio_a_OBJECTS = $(am_libasio_a_OBJECTS) am_allocation_server_OBJECTS = allocation/server.$(OBJEXT) allocation_server_OBJECTS = $(am_allocation_server_OBJECTS) allocation_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@allocation_server_DEPENDENCIES = libasio.a am_buffers_reference_counted_OBJECTS = \ buffers/reference_counted.$(OBJEXT) buffers_reference_counted_OBJECTS = \ $(am_buffers_reference_counted_OBJECTS) buffers_reference_counted_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@buffers_reference_counted_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_chat_chat_client_OBJECTS = chat/chat_client.$(OBJEXT) chat_chat_client_OBJECTS = $(am_chat_chat_client_OBJECTS) chat_chat_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@chat_chat_client_DEPENDENCIES = libasio.a am_chat_chat_server_OBJECTS = chat/chat_server.$(OBJEXT) chat_chat_server_OBJECTS = $(am_chat_chat_server_OBJECTS) chat_chat_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@chat_chat_server_DEPENDENCIES = libasio.a am__chat_posix_chat_client_SOURCES_DIST = chat/posix_chat_client.cpp @WINDOWS_TARGET_FALSE@am_chat_posix_chat_client_OBJECTS = \ @WINDOWS_TARGET_FALSE@ chat/posix_chat_client.$(OBJEXT) chat_posix_chat_client_OBJECTS = $(am_chat_posix_chat_client_OBJECTS) chat_posix_chat_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@chat_posix_chat_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_async_tcp_echo_server_OBJECTS = \ echo/async_tcp_echo_server.$(OBJEXT) echo_async_tcp_echo_server_OBJECTS = \ $(am_echo_async_tcp_echo_server_OBJECTS) echo_async_tcp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_async_tcp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_async_udp_echo_server_OBJECTS = \ echo/async_udp_echo_server.$(OBJEXT) echo_async_udp_echo_server_OBJECTS = \ $(am_echo_async_udp_echo_server_OBJECTS) echo_async_udp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_async_udp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_tcp_echo_client_OBJECTS = \ echo/blocking_tcp_echo_client.$(OBJEXT) echo_blocking_tcp_echo_client_OBJECTS = \ $(am_echo_blocking_tcp_echo_client_OBJECTS) echo_blocking_tcp_echo_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_tcp_echo_server_OBJECTS = \ echo/blocking_tcp_echo_server.$(OBJEXT) echo_blocking_tcp_echo_server_OBJECTS = \ $(am_echo_blocking_tcp_echo_server_OBJECTS) echo_blocking_tcp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_udp_echo_client_OBJECTS = \ echo/blocking_udp_echo_client.$(OBJEXT) echo_blocking_udp_echo_client_OBJECTS = \ $(am_echo_blocking_udp_echo_client_OBJECTS) echo_blocking_udp_echo_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_udp_echo_server_OBJECTS = \ echo/blocking_udp_echo_server.$(OBJEXT) echo_blocking_udp_echo_server_OBJECTS = \ $(am_echo_blocking_udp_echo_server_OBJECTS) echo_blocking_udp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__fork_daemon_SOURCES_DIST = fork/daemon.cpp @WINDOWS_TARGET_FALSE@am_fork_daemon_OBJECTS = fork/daemon.$(OBJEXT) fork_daemon_OBJECTS = $(am_fork_daemon_OBJECTS) fork_daemon_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@fork_daemon_DEPENDENCIES = libasio.a am__fork_process_per_connection_SOURCES_DIST = \ fork/process_per_connection.cpp @WINDOWS_TARGET_FALSE@am_fork_process_per_connection_OBJECTS = \ @WINDOWS_TARGET_FALSE@ fork/process_per_connection.$(OBJEXT) fork_process_per_connection_OBJECTS = \ $(am_fork_process_per_connection_OBJECTS) fork_process_per_connection_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@fork_process_per_connection_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_client_async_client_OBJECTS = \ http/client/async_client.$(OBJEXT) http_client_async_client_OBJECTS = \ $(am_http_client_async_client_OBJECTS) http_client_async_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_client_async_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_client_sync_client_OBJECTS = \ http/client/sync_client.$(OBJEXT) http_client_sync_client_OBJECTS = \ $(am_http_client_sync_client_OBJECTS) http_client_sync_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_client_sync_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_server_http_server_OBJECTS = http/server/connection.$(OBJEXT) \ http/server/connection_manager.$(OBJEXT) \ http/server/main.$(OBJEXT) http/server/mime_types.$(OBJEXT) \ http/server/reply.$(OBJEXT) \ http/server/request_handler.$(OBJEXT) \ http/server/request_parser.$(OBJEXT) \ http/server/server.$(OBJEXT) http_server_http_server_OBJECTS = \ $(am_http_server_http_server_OBJECTS) http_server_http_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_server_http_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_server2_http_server_OBJECTS = \ http/server2/connection.$(OBJEXT) \ http/server2/io_context_pool.$(OBJEXT) \ http/server2/main.$(OBJEXT) http/server2/mime_types.$(OBJEXT) \ http/server2/reply.$(OBJEXT) \ http/server2/request_handler.$(OBJEXT) \ http/server2/request_parser.$(OBJEXT) \ http/server2/server.$(OBJEXT) http_server2_http_server_OBJECTS = \ $(am_http_server2_http_server_OBJECTS) http_server2_http_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_server2_http_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_server3_http_server_OBJECTS = \ http/server3/connection.$(OBJEXT) http/server3/main.$(OBJEXT) \ http/server3/mime_types.$(OBJEXT) http/server3/reply.$(OBJEXT) \ http/server3/request_handler.$(OBJEXT) \ http/server3/request_parser.$(OBJEXT) \ http/server3/server.$(OBJEXT) http_server3_http_server_OBJECTS = \ $(am_http_server3_http_server_OBJECTS) http_server3_http_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_server3_http_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_server4_http_server_OBJECTS = \ http/server4/file_handler.$(OBJEXT) \ http/server4/main.$(OBJEXT) http/server4/mime_types.$(OBJEXT) \ http/server4/reply.$(OBJEXT) \ http/server4/request_parser.$(OBJEXT) \ http/server4/server.$(OBJEXT) http_server4_http_server_OBJECTS = \ $(am_http_server4_http_server_OBJECTS) http_server4_http_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_server4_http_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_icmp_ping_OBJECTS = icmp/ping.$(OBJEXT) icmp_ping_OBJECTS = $(am_icmp_ping_OBJECTS) icmp_ping_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@icmp_ping_DEPENDENCIES = libasio.a am_invocation_prioritised_handlers_OBJECTS = \ invocation/prioritised_handlers.$(OBJEXT) invocation_prioritised_handlers_OBJECTS = \ $(am_invocation_prioritised_handlers_OBJECTS) invocation_prioritised_handlers_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@invocation_prioritised_handlers_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_iostreams_daytime_client_OBJECTS = \ iostreams/daytime_client.$(OBJEXT) iostreams_daytime_client_OBJECTS = \ $(am_iostreams_daytime_client_OBJECTS) iostreams_daytime_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@iostreams_daytime_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_iostreams_daytime_server_OBJECTS = \ iostreams/daytime_server.$(OBJEXT) iostreams_daytime_server_OBJECTS = \ $(am_iostreams_daytime_server_OBJECTS) iostreams_daytime_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@iostreams_daytime_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_iostreams_http_client_OBJECTS = iostreams/http_client.$(OBJEXT) iostreams_http_client_OBJECTS = $(am_iostreams_http_client_OBJECTS) iostreams_http_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@iostreams_http_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_connect_pair_SOURCES_DIST = local/connect_pair.cpp @WINDOWS_TARGET_FALSE@am_local_connect_pair_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/connect_pair.$(OBJEXT) local_connect_pair_OBJECTS = $(am_local_connect_pair_OBJECTS) local_connect_pair_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_connect_pair_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_iostream_client_SOURCES_DIST = local/iostream_client.cpp @WINDOWS_TARGET_FALSE@am_local_iostream_client_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/iostream_client.$(OBJEXT) local_iostream_client_OBJECTS = $(am_local_iostream_client_OBJECTS) local_iostream_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_iostream_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_stream_client_SOURCES_DIST = local/stream_client.cpp @WINDOWS_TARGET_FALSE@am_local_stream_client_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/stream_client.$(OBJEXT) local_stream_client_OBJECTS = $(am_local_stream_client_OBJECTS) local_stream_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_stream_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_stream_server_SOURCES_DIST = local/stream_server.cpp @WINDOWS_TARGET_FALSE@am_local_stream_server_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/stream_server.$(OBJEXT) local_stream_server_OBJECTS = $(am_local_stream_server_OBJECTS) local_stream_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_stream_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_multicast_receiver_OBJECTS = multicast/receiver.$(OBJEXT) multicast_receiver_OBJECTS = $(am_multicast_receiver_OBJECTS) multicast_receiver_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@multicast_receiver_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_multicast_sender_OBJECTS = multicast/sender.$(OBJEXT) multicast_sender_OBJECTS = $(am_multicast_sender_OBJECTS) multicast_sender_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@multicast_sender_DEPENDENCIES = libasio.a am_nonblocking_third_party_lib_OBJECTS = \ nonblocking/third_party_lib.$(OBJEXT) nonblocking_third_party_lib_OBJECTS = \ $(am_nonblocking_third_party_lib_OBJECTS) nonblocking_third_party_lib_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@nonblocking_third_party_lib_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_porthopper_client_OBJECTS = porthopper/client.$(OBJEXT) porthopper_client_OBJECTS = $(am_porthopper_client_OBJECTS) porthopper_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@porthopper_client_DEPENDENCIES = libasio.a am_porthopper_server_OBJECTS = porthopper/server.$(OBJEXT) porthopper_server_OBJECTS = $(am_porthopper_server_OBJECTS) porthopper_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@porthopper_server_DEPENDENCIES = libasio.a am_services_daytime_client_OBJECTS = \ services/daytime_client.$(OBJEXT) \ services/logger_service.$(OBJEXT) services_daytime_client_OBJECTS = \ $(am_services_daytime_client_OBJECTS) services_daytime_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@services_daytime_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_socks4_sync_client_OBJECTS = socks4/sync_client.$(OBJEXT) socks4_sync_client_OBJECTS = $(am_socks4_sync_client_OBJECTS) socks4_sync_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@socks4_sync_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__spawn_echo_server_SOURCES_DIST = spawn/echo_server.cpp @HAVE_BOOST_COROUTINE_TRUE@am_spawn_echo_server_OBJECTS = \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/echo_server.$(OBJEXT) spawn_echo_server_OBJECTS = $(am_spawn_echo_server_OBJECTS) @HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_DEPENDENCIES = $(LDADD) am__spawn_parallel_grep_SOURCES_DIST = spawn/parallel_grep.cpp @HAVE_BOOST_COROUTINE_TRUE@am_spawn_parallel_grep_OBJECTS = \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep.$(OBJEXT) spawn_parallel_grep_OBJECTS = $(am_spawn_parallel_grep_OBJECTS) @HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_DEPENDENCIES = \ @HAVE_BOOST_COROUTINE_TRUE@ $(LDADD) am__ssl_client_SOURCES_DIST = ssl/client.cpp @HAVE_OPENSSL_TRUE@am_ssl_client_OBJECTS = ssl/client.$(OBJEXT) ssl_client_OBJECTS = $(am_ssl_client_OBJECTS) ssl_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@ssl_client_DEPENDENCIES = libasio.a am__ssl_server_SOURCES_DIST = ssl/server.cpp @HAVE_OPENSSL_TRUE@am_ssl_server_OBJECTS = ssl/server.$(OBJEXT) ssl_server_OBJECTS = $(am_ssl_server_OBJECTS) ssl_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@ssl_server_DEPENDENCIES = libasio.a am_timeouts_async_tcp_client_OBJECTS = \ timeouts/async_tcp_client.$(OBJEXT) timeouts_async_tcp_client_OBJECTS = \ $(am_timeouts_async_tcp_client_OBJECTS) timeouts_async_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_async_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_blocking_tcp_client_OBJECTS = \ timeouts/blocking_tcp_client.$(OBJEXT) timeouts_blocking_tcp_client_OBJECTS = \ $(am_timeouts_blocking_tcp_client_OBJECTS) timeouts_blocking_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_blocking_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_blocking_token_tcp_client_OBJECTS = \ timeouts/blocking_token_tcp_client.$(OBJEXT) timeouts_blocking_token_tcp_client_OBJECTS = \ $(am_timeouts_blocking_token_tcp_client_OBJECTS) timeouts_blocking_token_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_blocking_token_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_blocking_udp_client_OBJECTS = \ timeouts/blocking_udp_client.$(OBJEXT) timeouts_blocking_udp_client_OBJECTS = \ $(am_timeouts_blocking_udp_client_OBJECTS) timeouts_blocking_udp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_blocking_udp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_server_OBJECTS = timeouts/server.$(OBJEXT) timeouts_server_OBJECTS = $(am_timeouts_server_OBJECTS) timeouts_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_server_DEPENDENCIES = libasio.a am_timers_time_t_timer_OBJECTS = timers/time_t_timer.$(OBJEXT) timers_time_t_timer_OBJECTS = $(am_timers_time_t_timer_OBJECTS) timers_time_t_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timers_time_t_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime1_client_OBJECTS = \ tutorial/daytime1/client.$(OBJEXT) tutorial_daytime1_client_OBJECTS = \ $(am_tutorial_daytime1_client_OBJECTS) tutorial_daytime1_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime1_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime2_server_OBJECTS = \ tutorial/daytime2/server.$(OBJEXT) tutorial_daytime2_server_OBJECTS = \ $(am_tutorial_daytime2_server_OBJECTS) tutorial_daytime2_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime2_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime3_server_OBJECTS = \ tutorial/daytime3/server.$(OBJEXT) tutorial_daytime3_server_OBJECTS = \ $(am_tutorial_daytime3_server_OBJECTS) tutorial_daytime3_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime3_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime4_client_OBJECTS = \ tutorial/daytime4/client.$(OBJEXT) tutorial_daytime4_client_OBJECTS = \ $(am_tutorial_daytime4_client_OBJECTS) tutorial_daytime4_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime4_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime5_server_OBJECTS = \ tutorial/daytime5/server.$(OBJEXT) tutorial_daytime5_server_OBJECTS = \ $(am_tutorial_daytime5_server_OBJECTS) tutorial_daytime5_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime5_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime6_server_OBJECTS = \ tutorial/daytime6/server.$(OBJEXT) tutorial_daytime6_server_OBJECTS = \ $(am_tutorial_daytime6_server_OBJECTS) tutorial_daytime6_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime6_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_daytime7_server_OBJECTS = \ tutorial/daytime7/server.$(OBJEXT) tutorial_daytime7_server_OBJECTS = \ $(am_tutorial_daytime7_server_OBJECTS) tutorial_daytime7_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_daytime7_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_timer1_timer_OBJECTS = tutorial/timer1/timer.$(OBJEXT) tutorial_timer1_timer_OBJECTS = $(am_tutorial_timer1_timer_OBJECTS) tutorial_timer1_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_timer1_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_timer2_timer_OBJECTS = tutorial/timer2/timer.$(OBJEXT) tutorial_timer2_timer_OBJECTS = $(am_tutorial_timer2_timer_OBJECTS) tutorial_timer2_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_timer2_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_timer3_timer_OBJECTS = tutorial/timer3/timer.$(OBJEXT) tutorial_timer3_timer_OBJECTS = $(am_tutorial_timer3_timer_OBJECTS) tutorial_timer3_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_timer3_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_timer4_timer_OBJECTS = tutorial/timer4/timer.$(OBJEXT) tutorial_timer4_timer_OBJECTS = $(am_tutorial_timer4_timer_OBJECTS) tutorial_timer4_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_timer4_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_tutorial_timer5_timer_OBJECTS = tutorial/timer5/timer.$(OBJEXT) tutorial_timer5_timer_OBJECTS = $(am_tutorial_timer5_timer_OBJECTS) tutorial_timer5_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@tutorial_timer5_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__windows_transmit_file_SOURCES_DIST = windows/transmit_file.cpp @WINDOWS_TARGET_TRUE@am_windows_transmit_file_OBJECTS = \ @WINDOWS_TARGET_TRUE@ windows/transmit_file.$(OBJEXT) windows_transmit_file_OBJECTS = $(am_windows_transmit_file_OBJECTS) windows_transmit_file_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@windows_transmit_file_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ../../$(DEPDIR)/asio.Po \ ../../$(DEPDIR)/asio_ssl.Po allocation/$(DEPDIR)/server.Po \ buffers/$(DEPDIR)/reference_counted.Po \ chat/$(DEPDIR)/chat_client.Po chat/$(DEPDIR)/chat_server.Po \ chat/$(DEPDIR)/posix_chat_client.Po \ echo/$(DEPDIR)/async_tcp_echo_server.Po \ echo/$(DEPDIR)/async_udp_echo_server.Po \ echo/$(DEPDIR)/blocking_tcp_echo_client.Po \ echo/$(DEPDIR)/blocking_tcp_echo_server.Po \ echo/$(DEPDIR)/blocking_udp_echo_client.Po \ echo/$(DEPDIR)/blocking_udp_echo_server.Po \ fork/$(DEPDIR)/daemon.Po \ fork/$(DEPDIR)/process_per_connection.Po \ http/client/$(DEPDIR)/async_client.Po \ http/client/$(DEPDIR)/sync_client.Po \ http/server/$(DEPDIR)/connection.Po \ http/server/$(DEPDIR)/connection_manager.Po \ http/server/$(DEPDIR)/main.Po \ http/server/$(DEPDIR)/mime_types.Po \ http/server/$(DEPDIR)/reply.Po \ http/server/$(DEPDIR)/request_handler.Po \ http/server/$(DEPDIR)/request_parser.Po \ http/server/$(DEPDIR)/server.Po \ http/server2/$(DEPDIR)/connection.Po \ http/server2/$(DEPDIR)/io_context_pool.Po \ http/server2/$(DEPDIR)/main.Po \ http/server2/$(DEPDIR)/mime_types.Po \ http/server2/$(DEPDIR)/reply.Po \ http/server2/$(DEPDIR)/request_handler.Po \ http/server2/$(DEPDIR)/request_parser.Po \ http/server2/$(DEPDIR)/server.Po \ http/server3/$(DEPDIR)/connection.Po \ http/server3/$(DEPDIR)/main.Po \ http/server3/$(DEPDIR)/mime_types.Po \ http/server3/$(DEPDIR)/reply.Po \ http/server3/$(DEPDIR)/request_handler.Po \ http/server3/$(DEPDIR)/request_parser.Po \ http/server3/$(DEPDIR)/server.Po \ http/server4/$(DEPDIR)/file_handler.Po \ http/server4/$(DEPDIR)/main.Po \ http/server4/$(DEPDIR)/mime_types.Po \ http/server4/$(DEPDIR)/reply.Po \ http/server4/$(DEPDIR)/request_parser.Po \ http/server4/$(DEPDIR)/server.Po icmp/$(DEPDIR)/ping.Po \ invocation/$(DEPDIR)/prioritised_handlers.Po \ iostreams/$(DEPDIR)/daytime_client.Po \ iostreams/$(DEPDIR)/daytime_server.Po \ iostreams/$(DEPDIR)/http_client.Po \ local/$(DEPDIR)/connect_pair.Po \ local/$(DEPDIR)/iostream_client.Po \ local/$(DEPDIR)/stream_client.Po \ local/$(DEPDIR)/stream_server.Po \ multicast/$(DEPDIR)/receiver.Po multicast/$(DEPDIR)/sender.Po \ nonblocking/$(DEPDIR)/third_party_lib.Po \ porthopper/$(DEPDIR)/client.Po porthopper/$(DEPDIR)/server.Po \ services/$(DEPDIR)/daytime_client.Po \ services/$(DEPDIR)/logger_service.Po \ socks4/$(DEPDIR)/sync_client.Po spawn/$(DEPDIR)/echo_server.Po \ spawn/$(DEPDIR)/parallel_grep.Po ssl/$(DEPDIR)/client.Po \ ssl/$(DEPDIR)/server.Po timeouts/$(DEPDIR)/async_tcp_client.Po \ timeouts/$(DEPDIR)/blocking_tcp_client.Po \ timeouts/$(DEPDIR)/blocking_token_tcp_client.Po \ timeouts/$(DEPDIR)/blocking_udp_client.Po \ timeouts/$(DEPDIR)/server.Po timers/$(DEPDIR)/time_t_timer.Po \ tutorial/daytime1/$(DEPDIR)/client.Po \ tutorial/daytime2/$(DEPDIR)/server.Po \ tutorial/daytime3/$(DEPDIR)/server.Po \ tutorial/daytime4/$(DEPDIR)/client.Po \ tutorial/daytime5/$(DEPDIR)/server.Po \ tutorial/daytime6/$(DEPDIR)/server.Po \ tutorial/daytime7/$(DEPDIR)/server.Po \ tutorial/timer1/$(DEPDIR)/timer.Po \ tutorial/timer2/$(DEPDIR)/timer.Po \ tutorial/timer3/$(DEPDIR)/timer.Po \ tutorial/timer4/$(DEPDIR)/timer.Po \ tutorial/timer5/$(DEPDIR)/timer.Po \ windows/$(DEPDIR)/transmit_file.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libasio_a_SOURCES) $(allocation_server_SOURCES) \ $(buffers_reference_counted_SOURCES) \ $(chat_chat_client_SOURCES) $(chat_chat_server_SOURCES) \ $(chat_posix_chat_client_SOURCES) \ $(echo_async_tcp_echo_server_SOURCES) \ $(echo_async_udp_echo_server_SOURCES) \ $(echo_blocking_tcp_echo_client_SOURCES) \ $(echo_blocking_tcp_echo_server_SOURCES) \ $(echo_blocking_udp_echo_client_SOURCES) \ $(echo_blocking_udp_echo_server_SOURCES) \ $(fork_daemon_SOURCES) $(fork_process_per_connection_SOURCES) \ $(http_client_async_client_SOURCES) \ $(http_client_sync_client_SOURCES) \ $(http_server_http_server_SOURCES) \ $(http_server2_http_server_SOURCES) \ $(http_server3_http_server_SOURCES) \ $(http_server4_http_server_SOURCES) $(icmp_ping_SOURCES) \ $(invocation_prioritised_handlers_SOURCES) \ $(iostreams_daytime_client_SOURCES) \ $(iostreams_daytime_server_SOURCES) \ $(iostreams_http_client_SOURCES) $(local_connect_pair_SOURCES) \ $(local_iostream_client_SOURCES) \ $(local_stream_client_SOURCES) $(local_stream_server_SOURCES) \ $(multicast_receiver_SOURCES) $(multicast_sender_SOURCES) \ $(nonblocking_third_party_lib_SOURCES) \ $(porthopper_client_SOURCES) $(porthopper_server_SOURCES) \ $(services_daytime_client_SOURCES) \ $(socks4_sync_client_SOURCES) $(spawn_echo_server_SOURCES) \ $(spawn_parallel_grep_SOURCES) $(ssl_client_SOURCES) \ $(ssl_server_SOURCES) $(timeouts_async_tcp_client_SOURCES) \ $(timeouts_blocking_tcp_client_SOURCES) \ $(timeouts_blocking_token_tcp_client_SOURCES) \ $(timeouts_blocking_udp_client_SOURCES) \ $(timeouts_server_SOURCES) $(timers_time_t_timer_SOURCES) \ $(tutorial_daytime1_client_SOURCES) \ $(tutorial_daytime2_server_SOURCES) \ $(tutorial_daytime3_server_SOURCES) \ $(tutorial_daytime4_client_SOURCES) \ $(tutorial_daytime5_server_SOURCES) \ $(tutorial_daytime6_server_SOURCES) \ $(tutorial_daytime7_server_SOURCES) \ $(tutorial_timer1_timer_SOURCES) \ $(tutorial_timer2_timer_SOURCES) \ $(tutorial_timer3_timer_SOURCES) \ $(tutorial_timer4_timer_SOURCES) \ $(tutorial_timer5_timer_SOURCES) \ $(windows_transmit_file_SOURCES) DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \ $(allocation_server_SOURCES) \ $(buffers_reference_counted_SOURCES) \ $(chat_chat_client_SOURCES) $(chat_chat_server_SOURCES) \ $(am__chat_posix_chat_client_SOURCES_DIST) \ $(echo_async_tcp_echo_server_SOURCES) \ $(echo_async_udp_echo_server_SOURCES) \ $(echo_blocking_tcp_echo_client_SOURCES) \ $(echo_blocking_tcp_echo_server_SOURCES) \ $(echo_blocking_udp_echo_client_SOURCES) \ $(echo_blocking_udp_echo_server_SOURCES) \ $(am__fork_daemon_SOURCES_DIST) \ $(am__fork_process_per_connection_SOURCES_DIST) \ $(http_client_async_client_SOURCES) \ $(http_client_sync_client_SOURCES) \ $(http_server_http_server_SOURCES) \ $(http_server2_http_server_SOURCES) \ $(http_server3_http_server_SOURCES) \ $(http_server4_http_server_SOURCES) $(icmp_ping_SOURCES) \ $(invocation_prioritised_handlers_SOURCES) \ $(iostreams_daytime_client_SOURCES) \ $(iostreams_daytime_server_SOURCES) \ $(iostreams_http_client_SOURCES) \ $(am__local_connect_pair_SOURCES_DIST) \ $(am__local_iostream_client_SOURCES_DIST) \ $(am__local_stream_client_SOURCES_DIST) \ $(am__local_stream_server_SOURCES_DIST) \ $(multicast_receiver_SOURCES) $(multicast_sender_SOURCES) \ $(nonblocking_third_party_lib_SOURCES) \ $(porthopper_client_SOURCES) $(porthopper_server_SOURCES) \ $(services_daytime_client_SOURCES) \ $(socks4_sync_client_SOURCES) \ $(am__spawn_echo_server_SOURCES_DIST) \ $(am__spawn_parallel_grep_SOURCES_DIST) \ $(am__ssl_client_SOURCES_DIST) $(am__ssl_server_SOURCES_DIST) \ $(timeouts_async_tcp_client_SOURCES) \ $(timeouts_blocking_tcp_client_SOURCES) \ $(timeouts_blocking_token_tcp_client_SOURCES) \ $(timeouts_blocking_udp_client_SOURCES) \ $(timeouts_server_SOURCES) $(timers_time_t_timer_SOURCES) \ $(tutorial_daytime1_client_SOURCES) \ $(tutorial_daytime2_server_SOURCES) \ $(tutorial_daytime3_server_SOURCES) \ $(tutorial_daytime4_client_SOURCES) \ $(tutorial_daytime5_server_SOURCES) \ $(tutorial_daytime6_server_SOURCES) \ $(tutorial_daytime7_server_SOURCES) \ $(tutorial_timer1_timer_SOURCES) \ $(tutorial_timer2_timer_SOURCES) \ $(tutorial_timer3_timer_SOURCES) \ $(tutorial_timer4_timer_SOURCES) \ $(tutorial_timer5_timer_SOURCES) \ $(am__windows_transmit_file_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects @SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a @SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \ @SEPARATE_COMPILATION_TRUE@ $(am__append_1) @SEPARATE_COMPILATION_TRUE@LDADD = libasio.a noinst_HEADERS = \ chat/chat_message.hpp \ services/basic_logger.hpp \ services/logger.hpp \ services/logger_service.hpp AM_CXXFLAGS = -I$(srcdir)/../../../include allocation_server_SOURCES = allocation/server.cpp buffers_reference_counted_SOURCES = buffers/reference_counted.cpp chat_chat_client_SOURCES = chat/chat_client.cpp chat_chat_server_SOURCES = chat/chat_server.cpp echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp http_client_async_client_SOURCES = http/client/async_client.cpp http_client_sync_client_SOURCES = http/client/sync_client.cpp http_server_http_server_SOURCES = \ http/server/connection.cpp \ http/server/connection_manager.cpp \ http/server/main.cpp \ http/server/mime_types.cpp \ http/server/reply.cpp \ http/server/request_handler.cpp \ http/server/request_parser.cpp \ http/server/server.cpp http_server2_http_server_SOURCES = \ http/server2/connection.cpp \ http/server2/io_context_pool.cpp \ http/server2/main.cpp \ http/server2/mime_types.cpp \ http/server2/reply.cpp \ http/server2/request_handler.cpp \ http/server2/request_parser.cpp \ http/server2/server.cpp http_server3_http_server_SOURCES = \ http/server3/connection.cpp \ http/server3/main.cpp \ http/server3/mime_types.cpp \ http/server3/reply.cpp \ http/server3/request_handler.cpp \ http/server3/request_parser.cpp \ http/server3/server.cpp http_server4_http_server_SOURCES = \ http/server4/file_handler.cpp \ http/server4/main.cpp \ http/server4/mime_types.cpp \ http/server4/reply.cpp \ http/server4/request_parser.cpp \ http/server4/server.cpp icmp_ping_SOURCES = icmp/ping.cpp invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp iostreams_daytime_client_SOURCES = iostreams/daytime_client.cpp iostreams_daytime_server_SOURCES = iostreams/daytime_server.cpp iostreams_http_client_SOURCES = iostreams/http_client.cpp multicast_receiver_SOURCES = multicast/receiver.cpp multicast_sender_SOURCES = multicast/sender.cpp nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp porthopper_client_SOURCES = porthopper/client.cpp porthopper_server_SOURCES = porthopper/server.cpp services_daytime_client_SOURCES = \ services/daytime_client.cpp \ services/logger_service.cpp socks4_sync_client_SOURCES = socks4/sync_client.cpp timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp timeouts_blocking_token_tcp_client_SOURCES = timeouts/blocking_token_tcp_client.cpp timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp timeouts_server_SOURCES = timeouts/server.cpp timers_time_t_timer_SOURCES = timers/time_t_timer.cpp tutorial_timer1_timer_SOURCES = tutorial/timer1/timer.cpp tutorial_timer2_timer_SOURCES = tutorial/timer2/timer.cpp tutorial_timer3_timer_SOURCES = tutorial/timer3/timer.cpp tutorial_timer4_timer_SOURCES = tutorial/timer4/timer.cpp tutorial_timer5_timer_SOURCES = tutorial/timer5/timer.cpp tutorial_daytime1_client_SOURCES = tutorial/daytime1/client.cpp tutorial_daytime2_server_SOURCES = tutorial/daytime2/server.cpp tutorial_daytime3_server_SOURCES = tutorial/daytime3/server.cpp tutorial_daytime4_client_SOURCES = tutorial/daytime4/client.cpp tutorial_daytime5_server_SOURCES = tutorial/daytime5/server.cpp tutorial_daytime6_server_SOURCES = tutorial/daytime6/server.cpp tutorial_daytime7_server_SOURCES = tutorial/daytime7/server.cpp @WINDOWS_TARGET_FALSE@chat_posix_chat_client_SOURCES = chat/posix_chat_client.cpp @WINDOWS_TARGET_FALSE@fork_daemon_SOURCES = fork/daemon.cpp @WINDOWS_TARGET_FALSE@fork_process_per_connection_SOURCES = fork/process_per_connection.cpp @WINDOWS_TARGET_FALSE@local_connect_pair_SOURCES = local/connect_pair.cpp @WINDOWS_TARGET_FALSE@local_iostream_client_SOURCES = local/iostream_client.cpp @WINDOWS_TARGET_FALSE@local_stream_server_SOURCES = local/stream_server.cpp @WINDOWS_TARGET_FALSE@local_stream_client_SOURCES = local/stream_client.cpp @WINDOWS_TARGET_TRUE@windows_transmit_file_SOURCES = windows/transmit_file.cpp @HAVE_OPENSSL_TRUE@ssl_client_SOURCES = ssl/client.cpp @HAVE_OPENSSL_TRUE@ssl_server_SOURCES = ssl/server.cpp @HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_SOURCES = spawn/echo_server.cpp @HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system @HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp @HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system EXTRA_DIST = \ http/server/connection.hpp \ http/server/connection_manager.hpp \ http/server/header.hpp \ http/server/mime_types.hpp \ http/server/reply.hpp \ http/server/request.hpp \ http/server/request_handler.hpp \ http/server/request_parser.hpp \ http/server/server.hpp \ http/server2/connection.hpp \ http/server2/io_context_pool.hpp \ http/server2/header.hpp \ http/server2/mime_types.hpp \ http/server2/reply.hpp \ http/server2/request.hpp \ http/server2/request_handler.hpp \ http/server2/request_parser.hpp \ http/server2/server.hpp \ http/server3/connection.hpp \ http/server3/header.hpp \ http/server3/mime_types.hpp \ http/server3/reply.hpp \ http/server3/request.hpp \ http/server3/request_handler.hpp \ http/server3/request_parser.hpp \ http/server3/server.hpp \ http/server4/file_handler.hpp \ http/server4/header.hpp \ http/server4/mime_types.hpp \ http/server4/reply.hpp \ http/server4/request.hpp \ http/server4/request_parser.hpp \ http/server4/server.hpp \ icmp/icmp_header.hpp \ icmp/ipv4_header.hpp \ porthopper/protocol.hpp \ serialization/client.cpp \ serialization/server.cpp \ serialization/connection.hpp \ serialization/stock.hpp \ services/basic_logger.hpp \ services/logger.hpp \ services/logger_service.hpp \ socks4/socks4.hpp \ ssl/README \ ssl/ca.pem \ ssl/server.pem \ ssl/dh2048.pem MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp03/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/examples/cpp03/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) ../../$(am__dirstamp): @$(MKDIR_P) ../.. @: > ../../$(am__dirstamp) ../../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../../$(DEPDIR) @: > ../../$(DEPDIR)/$(am__dirstamp) ../../asio.$(OBJEXT): ../../$(am__dirstamp) \ ../../$(DEPDIR)/$(am__dirstamp) ../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \ ../../$(DEPDIR)/$(am__dirstamp) libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES) $(AM_V_at)-rm -f libasio.a $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD) $(AM_V_at)$(RANLIB) libasio.a allocation/$(am__dirstamp): @$(MKDIR_P) allocation @: > allocation/$(am__dirstamp) allocation/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) allocation/$(DEPDIR) @: > allocation/$(DEPDIR)/$(am__dirstamp) allocation/server.$(OBJEXT): allocation/$(am__dirstamp) \ allocation/$(DEPDIR)/$(am__dirstamp) allocation/server$(EXEEXT): $(allocation_server_OBJECTS) $(allocation_server_DEPENDENCIES) $(EXTRA_allocation_server_DEPENDENCIES) allocation/$(am__dirstamp) @rm -f allocation/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(allocation_server_OBJECTS) $(allocation_server_LDADD) $(LIBS) buffers/$(am__dirstamp): @$(MKDIR_P) buffers @: > buffers/$(am__dirstamp) buffers/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) buffers/$(DEPDIR) @: > buffers/$(DEPDIR)/$(am__dirstamp) buffers/reference_counted.$(OBJEXT): buffers/$(am__dirstamp) \ buffers/$(DEPDIR)/$(am__dirstamp) buffers/reference_counted$(EXEEXT): $(buffers_reference_counted_OBJECTS) $(buffers_reference_counted_DEPENDENCIES) $(EXTRA_buffers_reference_counted_DEPENDENCIES) buffers/$(am__dirstamp) @rm -f buffers/reference_counted$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(buffers_reference_counted_OBJECTS) $(buffers_reference_counted_LDADD) $(LIBS) chat/$(am__dirstamp): @$(MKDIR_P) chat @: > chat/$(am__dirstamp) chat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) chat/$(DEPDIR) @: > chat/$(DEPDIR)/$(am__dirstamp) chat/chat_client.$(OBJEXT): chat/$(am__dirstamp) \ chat/$(DEPDIR)/$(am__dirstamp) chat/chat_client$(EXEEXT): $(chat_chat_client_OBJECTS) $(chat_chat_client_DEPENDENCIES) $(EXTRA_chat_chat_client_DEPENDENCIES) chat/$(am__dirstamp) @rm -f chat/chat_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chat_chat_client_OBJECTS) $(chat_chat_client_LDADD) $(LIBS) chat/chat_server.$(OBJEXT): chat/$(am__dirstamp) \ chat/$(DEPDIR)/$(am__dirstamp) chat/chat_server$(EXEEXT): $(chat_chat_server_OBJECTS) $(chat_chat_server_DEPENDENCIES) $(EXTRA_chat_chat_server_DEPENDENCIES) chat/$(am__dirstamp) @rm -f chat/chat_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chat_chat_server_OBJECTS) $(chat_chat_server_LDADD) $(LIBS) chat/posix_chat_client.$(OBJEXT): chat/$(am__dirstamp) \ chat/$(DEPDIR)/$(am__dirstamp) chat/posix_chat_client$(EXEEXT): $(chat_posix_chat_client_OBJECTS) $(chat_posix_chat_client_DEPENDENCIES) $(EXTRA_chat_posix_chat_client_DEPENDENCIES) chat/$(am__dirstamp) @rm -f chat/posix_chat_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chat_posix_chat_client_OBJECTS) $(chat_posix_chat_client_LDADD) $(LIBS) echo/$(am__dirstamp): @$(MKDIR_P) echo @: > echo/$(am__dirstamp) echo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) echo/$(DEPDIR) @: > echo/$(DEPDIR)/$(am__dirstamp) echo/async_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/async_tcp_echo_server$(EXEEXT): $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/async_tcp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_LDADD) $(LIBS) echo/async_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/async_udp_echo_server$(EXEEXT): $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/async_udp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_LDADD) $(LIBS) echo/blocking_tcp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_tcp_echo_client$(EXEEXT): $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_client_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_tcp_echo_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_LDADD) $(LIBS) echo/blocking_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_tcp_echo_server$(EXEEXT): $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_tcp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_LDADD) $(LIBS) echo/blocking_udp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_udp_echo_client$(EXEEXT): $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_client_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_udp_echo_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_LDADD) $(LIBS) echo/blocking_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_udp_echo_server$(EXEEXT): $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_udp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_LDADD) $(LIBS) fork/$(am__dirstamp): @$(MKDIR_P) fork @: > fork/$(am__dirstamp) fork/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fork/$(DEPDIR) @: > fork/$(DEPDIR)/$(am__dirstamp) fork/daemon.$(OBJEXT): fork/$(am__dirstamp) \ fork/$(DEPDIR)/$(am__dirstamp) fork/daemon$(EXEEXT): $(fork_daemon_OBJECTS) $(fork_daemon_DEPENDENCIES) $(EXTRA_fork_daemon_DEPENDENCIES) fork/$(am__dirstamp) @rm -f fork/daemon$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(fork_daemon_OBJECTS) $(fork_daemon_LDADD) $(LIBS) fork/process_per_connection.$(OBJEXT): fork/$(am__dirstamp) \ fork/$(DEPDIR)/$(am__dirstamp) fork/process_per_connection$(EXEEXT): $(fork_process_per_connection_OBJECTS) $(fork_process_per_connection_DEPENDENCIES) $(EXTRA_fork_process_per_connection_DEPENDENCIES) fork/$(am__dirstamp) @rm -f fork/process_per_connection$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(fork_process_per_connection_OBJECTS) $(fork_process_per_connection_LDADD) $(LIBS) http/client/$(am__dirstamp): @$(MKDIR_P) http/client @: > http/client/$(am__dirstamp) http/client/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) http/client/$(DEPDIR) @: > http/client/$(DEPDIR)/$(am__dirstamp) http/client/async_client.$(OBJEXT): http/client/$(am__dirstamp) \ http/client/$(DEPDIR)/$(am__dirstamp) http/client/async_client$(EXEEXT): $(http_client_async_client_OBJECTS) $(http_client_async_client_DEPENDENCIES) $(EXTRA_http_client_async_client_DEPENDENCIES) http/client/$(am__dirstamp) @rm -f http/client/async_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_client_async_client_OBJECTS) $(http_client_async_client_LDADD) $(LIBS) http/client/sync_client.$(OBJEXT): http/client/$(am__dirstamp) \ http/client/$(DEPDIR)/$(am__dirstamp) http/client/sync_client$(EXEEXT): $(http_client_sync_client_OBJECTS) $(http_client_sync_client_DEPENDENCIES) $(EXTRA_http_client_sync_client_DEPENDENCIES) http/client/$(am__dirstamp) @rm -f http/client/sync_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_client_sync_client_OBJECTS) $(http_client_sync_client_LDADD) $(LIBS) http/server/$(am__dirstamp): @$(MKDIR_P) http/server @: > http/server/$(am__dirstamp) http/server/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) http/server/$(DEPDIR) @: > http/server/$(DEPDIR)/$(am__dirstamp) http/server/connection.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/connection_manager.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/main.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/mime_types.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/reply.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/request_handler.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/request_parser.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/server.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/http_server$(EXEEXT): $(http_server_http_server_OBJECTS) $(http_server_http_server_DEPENDENCIES) $(EXTRA_http_server_http_server_DEPENDENCIES) http/server/$(am__dirstamp) @rm -f http/server/http_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_server_http_server_OBJECTS) $(http_server_http_server_LDADD) $(LIBS) http/server2/$(am__dirstamp): @$(MKDIR_P) http/server2 @: > http/server2/$(am__dirstamp) http/server2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) http/server2/$(DEPDIR) @: > http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/connection.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/io_context_pool.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/main.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/mime_types.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/reply.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/request_handler.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/request_parser.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/server.$(OBJEXT): http/server2/$(am__dirstamp) \ http/server2/$(DEPDIR)/$(am__dirstamp) http/server2/http_server$(EXEEXT): $(http_server2_http_server_OBJECTS) $(http_server2_http_server_DEPENDENCIES) $(EXTRA_http_server2_http_server_DEPENDENCIES) http/server2/$(am__dirstamp) @rm -f http/server2/http_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_server2_http_server_OBJECTS) $(http_server2_http_server_LDADD) $(LIBS) http/server3/$(am__dirstamp): @$(MKDIR_P) http/server3 @: > http/server3/$(am__dirstamp) http/server3/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) http/server3/$(DEPDIR) @: > http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/connection.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/main.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/mime_types.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/reply.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/request_handler.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/request_parser.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/server.$(OBJEXT): http/server3/$(am__dirstamp) \ http/server3/$(DEPDIR)/$(am__dirstamp) http/server3/http_server$(EXEEXT): $(http_server3_http_server_OBJECTS) $(http_server3_http_server_DEPENDENCIES) $(EXTRA_http_server3_http_server_DEPENDENCIES) http/server3/$(am__dirstamp) @rm -f http/server3/http_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_server3_http_server_OBJECTS) $(http_server3_http_server_LDADD) $(LIBS) http/server4/$(am__dirstamp): @$(MKDIR_P) http/server4 @: > http/server4/$(am__dirstamp) http/server4/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) http/server4/$(DEPDIR) @: > http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/file_handler.$(OBJEXT): http/server4/$(am__dirstamp) \ http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/main.$(OBJEXT): http/server4/$(am__dirstamp) \ http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/mime_types.$(OBJEXT): http/server4/$(am__dirstamp) \ http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/reply.$(OBJEXT): http/server4/$(am__dirstamp) \ http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/request_parser.$(OBJEXT): http/server4/$(am__dirstamp) \ http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/server.$(OBJEXT): http/server4/$(am__dirstamp) \ http/server4/$(DEPDIR)/$(am__dirstamp) http/server4/http_server$(EXEEXT): $(http_server4_http_server_OBJECTS) $(http_server4_http_server_DEPENDENCIES) $(EXTRA_http_server4_http_server_DEPENDENCIES) http/server4/$(am__dirstamp) @rm -f http/server4/http_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_server4_http_server_OBJECTS) $(http_server4_http_server_LDADD) $(LIBS) icmp/$(am__dirstamp): @$(MKDIR_P) icmp @: > icmp/$(am__dirstamp) icmp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) icmp/$(DEPDIR) @: > icmp/$(DEPDIR)/$(am__dirstamp) icmp/ping.$(OBJEXT): icmp/$(am__dirstamp) \ icmp/$(DEPDIR)/$(am__dirstamp) icmp/ping$(EXEEXT): $(icmp_ping_OBJECTS) $(icmp_ping_DEPENDENCIES) $(EXTRA_icmp_ping_DEPENDENCIES) icmp/$(am__dirstamp) @rm -f icmp/ping$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(icmp_ping_OBJECTS) $(icmp_ping_LDADD) $(LIBS) invocation/$(am__dirstamp): @$(MKDIR_P) invocation @: > invocation/$(am__dirstamp) invocation/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) invocation/$(DEPDIR) @: > invocation/$(DEPDIR)/$(am__dirstamp) invocation/prioritised_handlers.$(OBJEXT): invocation/$(am__dirstamp) \ invocation/$(DEPDIR)/$(am__dirstamp) invocation/prioritised_handlers$(EXEEXT): $(invocation_prioritised_handlers_OBJECTS) $(invocation_prioritised_handlers_DEPENDENCIES) $(EXTRA_invocation_prioritised_handlers_DEPENDENCIES) invocation/$(am__dirstamp) @rm -f invocation/prioritised_handlers$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(invocation_prioritised_handlers_OBJECTS) $(invocation_prioritised_handlers_LDADD) $(LIBS) iostreams/$(am__dirstamp): @$(MKDIR_P) iostreams @: > iostreams/$(am__dirstamp) iostreams/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) iostreams/$(DEPDIR) @: > iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/daytime_client.$(OBJEXT): iostreams/$(am__dirstamp) \ iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/daytime_client$(EXEEXT): $(iostreams_daytime_client_OBJECTS) $(iostreams_daytime_client_DEPENDENCIES) $(EXTRA_iostreams_daytime_client_DEPENDENCIES) iostreams/$(am__dirstamp) @rm -f iostreams/daytime_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(iostreams_daytime_client_OBJECTS) $(iostreams_daytime_client_LDADD) $(LIBS) iostreams/daytime_server.$(OBJEXT): iostreams/$(am__dirstamp) \ iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/daytime_server$(EXEEXT): $(iostreams_daytime_server_OBJECTS) $(iostreams_daytime_server_DEPENDENCIES) $(EXTRA_iostreams_daytime_server_DEPENDENCIES) iostreams/$(am__dirstamp) @rm -f iostreams/daytime_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(iostreams_daytime_server_OBJECTS) $(iostreams_daytime_server_LDADD) $(LIBS) iostreams/http_client.$(OBJEXT): iostreams/$(am__dirstamp) \ iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/http_client$(EXEEXT): $(iostreams_http_client_OBJECTS) $(iostreams_http_client_DEPENDENCIES) $(EXTRA_iostreams_http_client_DEPENDENCIES) iostreams/$(am__dirstamp) @rm -f iostreams/http_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(iostreams_http_client_OBJECTS) $(iostreams_http_client_LDADD) $(LIBS) local/$(am__dirstamp): @$(MKDIR_P) local @: > local/$(am__dirstamp) local/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) local/$(DEPDIR) @: > local/$(DEPDIR)/$(am__dirstamp) local/connect_pair.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/connect_pair$(EXEEXT): $(local_connect_pair_OBJECTS) $(local_connect_pair_DEPENDENCIES) $(EXTRA_local_connect_pair_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/connect_pair$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_connect_pair_OBJECTS) $(local_connect_pair_LDADD) $(LIBS) local/iostream_client.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/iostream_client$(EXEEXT): $(local_iostream_client_OBJECTS) $(local_iostream_client_DEPENDENCIES) $(EXTRA_local_iostream_client_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/iostream_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_iostream_client_OBJECTS) $(local_iostream_client_LDADD) $(LIBS) local/stream_client.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/stream_client$(EXEEXT): $(local_stream_client_OBJECTS) $(local_stream_client_DEPENDENCIES) $(EXTRA_local_stream_client_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/stream_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_stream_client_OBJECTS) $(local_stream_client_LDADD) $(LIBS) local/stream_server.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/stream_server$(EXEEXT): $(local_stream_server_OBJECTS) $(local_stream_server_DEPENDENCIES) $(EXTRA_local_stream_server_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/stream_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_stream_server_OBJECTS) $(local_stream_server_LDADD) $(LIBS) multicast/$(am__dirstamp): @$(MKDIR_P) multicast @: > multicast/$(am__dirstamp) multicast/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) multicast/$(DEPDIR) @: > multicast/$(DEPDIR)/$(am__dirstamp) multicast/receiver.$(OBJEXT): multicast/$(am__dirstamp) \ multicast/$(DEPDIR)/$(am__dirstamp) multicast/receiver$(EXEEXT): $(multicast_receiver_OBJECTS) $(multicast_receiver_DEPENDENCIES) $(EXTRA_multicast_receiver_DEPENDENCIES) multicast/$(am__dirstamp) @rm -f multicast/receiver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(multicast_receiver_OBJECTS) $(multicast_receiver_LDADD) $(LIBS) multicast/sender.$(OBJEXT): multicast/$(am__dirstamp) \ multicast/$(DEPDIR)/$(am__dirstamp) multicast/sender$(EXEEXT): $(multicast_sender_OBJECTS) $(multicast_sender_DEPENDENCIES) $(EXTRA_multicast_sender_DEPENDENCIES) multicast/$(am__dirstamp) @rm -f multicast/sender$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(multicast_sender_OBJECTS) $(multicast_sender_LDADD) $(LIBS) nonblocking/$(am__dirstamp): @$(MKDIR_P) nonblocking @: > nonblocking/$(am__dirstamp) nonblocking/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) nonblocking/$(DEPDIR) @: > nonblocking/$(DEPDIR)/$(am__dirstamp) nonblocking/third_party_lib.$(OBJEXT): nonblocking/$(am__dirstamp) \ nonblocking/$(DEPDIR)/$(am__dirstamp) nonblocking/third_party_lib$(EXEEXT): $(nonblocking_third_party_lib_OBJECTS) $(nonblocking_third_party_lib_DEPENDENCIES) $(EXTRA_nonblocking_third_party_lib_DEPENDENCIES) nonblocking/$(am__dirstamp) @rm -f nonblocking/third_party_lib$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(nonblocking_third_party_lib_OBJECTS) $(nonblocking_third_party_lib_LDADD) $(LIBS) porthopper/$(am__dirstamp): @$(MKDIR_P) porthopper @: > porthopper/$(am__dirstamp) porthopper/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) porthopper/$(DEPDIR) @: > porthopper/$(DEPDIR)/$(am__dirstamp) porthopper/client.$(OBJEXT): porthopper/$(am__dirstamp) \ porthopper/$(DEPDIR)/$(am__dirstamp) porthopper/client$(EXEEXT): $(porthopper_client_OBJECTS) $(porthopper_client_DEPENDENCIES) $(EXTRA_porthopper_client_DEPENDENCIES) porthopper/$(am__dirstamp) @rm -f porthopper/client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(porthopper_client_OBJECTS) $(porthopper_client_LDADD) $(LIBS) porthopper/server.$(OBJEXT): porthopper/$(am__dirstamp) \ porthopper/$(DEPDIR)/$(am__dirstamp) porthopper/server$(EXEEXT): $(porthopper_server_OBJECTS) $(porthopper_server_DEPENDENCIES) $(EXTRA_porthopper_server_DEPENDENCIES) porthopper/$(am__dirstamp) @rm -f porthopper/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(porthopper_server_OBJECTS) $(porthopper_server_LDADD) $(LIBS) services/$(am__dirstamp): @$(MKDIR_P) services @: > services/$(am__dirstamp) services/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) services/$(DEPDIR) @: > services/$(DEPDIR)/$(am__dirstamp) services/daytime_client.$(OBJEXT): services/$(am__dirstamp) \ services/$(DEPDIR)/$(am__dirstamp) services/logger_service.$(OBJEXT): services/$(am__dirstamp) \ services/$(DEPDIR)/$(am__dirstamp) services/daytime_client$(EXEEXT): $(services_daytime_client_OBJECTS) $(services_daytime_client_DEPENDENCIES) $(EXTRA_services_daytime_client_DEPENDENCIES) services/$(am__dirstamp) @rm -f services/daytime_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(services_daytime_client_OBJECTS) $(services_daytime_client_LDADD) $(LIBS) socks4/$(am__dirstamp): @$(MKDIR_P) socks4 @: > socks4/$(am__dirstamp) socks4/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) socks4/$(DEPDIR) @: > socks4/$(DEPDIR)/$(am__dirstamp) socks4/sync_client.$(OBJEXT): socks4/$(am__dirstamp) \ socks4/$(DEPDIR)/$(am__dirstamp) socks4/sync_client$(EXEEXT): $(socks4_sync_client_OBJECTS) $(socks4_sync_client_DEPENDENCIES) $(EXTRA_socks4_sync_client_DEPENDENCIES) socks4/$(am__dirstamp) @rm -f socks4/sync_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(socks4_sync_client_OBJECTS) $(socks4_sync_client_LDADD) $(LIBS) spawn/$(am__dirstamp): @$(MKDIR_P) spawn @: > spawn/$(am__dirstamp) spawn/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) spawn/$(DEPDIR) @: > spawn/$(DEPDIR)/$(am__dirstamp) spawn/echo_server.$(OBJEXT): spawn/$(am__dirstamp) \ spawn/$(DEPDIR)/$(am__dirstamp) spawn/echo_server$(EXEEXT): $(spawn_echo_server_OBJECTS) $(spawn_echo_server_DEPENDENCIES) $(EXTRA_spawn_echo_server_DEPENDENCIES) spawn/$(am__dirstamp) @rm -f spawn/echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(spawn_echo_server_OBJECTS) $(spawn_echo_server_LDADD) $(LIBS) spawn/parallel_grep.$(OBJEXT): spawn/$(am__dirstamp) \ spawn/$(DEPDIR)/$(am__dirstamp) spawn/parallel_grep$(EXEEXT): $(spawn_parallel_grep_OBJECTS) $(spawn_parallel_grep_DEPENDENCIES) $(EXTRA_spawn_parallel_grep_DEPENDENCIES) spawn/$(am__dirstamp) @rm -f spawn/parallel_grep$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(spawn_parallel_grep_OBJECTS) $(spawn_parallel_grep_LDADD) $(LIBS) ssl/$(am__dirstamp): @$(MKDIR_P) ssl @: > ssl/$(am__dirstamp) ssl/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ssl/$(DEPDIR) @: > ssl/$(DEPDIR)/$(am__dirstamp) ssl/client.$(OBJEXT): ssl/$(am__dirstamp) \ ssl/$(DEPDIR)/$(am__dirstamp) ssl/client$(EXEEXT): $(ssl_client_OBJECTS) $(ssl_client_DEPENDENCIES) $(EXTRA_ssl_client_DEPENDENCIES) ssl/$(am__dirstamp) @rm -f ssl/client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ssl_client_OBJECTS) $(ssl_client_LDADD) $(LIBS) ssl/server.$(OBJEXT): ssl/$(am__dirstamp) \ ssl/$(DEPDIR)/$(am__dirstamp) ssl/server$(EXEEXT): $(ssl_server_OBJECTS) $(ssl_server_DEPENDENCIES) $(EXTRA_ssl_server_DEPENDENCIES) ssl/$(am__dirstamp) @rm -f ssl/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ssl_server_OBJECTS) $(ssl_server_LDADD) $(LIBS) timeouts/$(am__dirstamp): @$(MKDIR_P) timeouts @: > timeouts/$(am__dirstamp) timeouts/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) timeouts/$(DEPDIR) @: > timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/async_tcp_client.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/async_tcp_client$(EXEEXT): $(timeouts_async_tcp_client_OBJECTS) $(timeouts_async_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_async_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/async_tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_async_tcp_client_OBJECTS) $(timeouts_async_tcp_client_LDADD) $(LIBS) timeouts/blocking_tcp_client.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/blocking_tcp_client$(EXEEXT): $(timeouts_blocking_tcp_client_OBJECTS) $(timeouts_blocking_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/blocking_tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_tcp_client_OBJECTS) $(timeouts_blocking_tcp_client_LDADD) $(LIBS) timeouts/blocking_token_tcp_client.$(OBJEXT): \ timeouts/$(am__dirstamp) timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/blocking_token_tcp_client$(EXEEXT): $(timeouts_blocking_token_tcp_client_OBJECTS) $(timeouts_blocking_token_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_token_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/blocking_token_tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_token_tcp_client_OBJECTS) $(timeouts_blocking_token_tcp_client_LDADD) $(LIBS) timeouts/blocking_udp_client.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/blocking_udp_client$(EXEEXT): $(timeouts_blocking_udp_client_OBJECTS) $(timeouts_blocking_udp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_udp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/blocking_udp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_udp_client_OBJECTS) $(timeouts_blocking_udp_client_LDADD) $(LIBS) timeouts/server.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/server$(EXEEXT): $(timeouts_server_OBJECTS) $(timeouts_server_DEPENDENCIES) $(EXTRA_timeouts_server_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_server_OBJECTS) $(timeouts_server_LDADD) $(LIBS) timers/$(am__dirstamp): @$(MKDIR_P) timers @: > timers/$(am__dirstamp) timers/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) timers/$(DEPDIR) @: > timers/$(DEPDIR)/$(am__dirstamp) timers/time_t_timer.$(OBJEXT): timers/$(am__dirstamp) \ timers/$(DEPDIR)/$(am__dirstamp) timers/time_t_timer$(EXEEXT): $(timers_time_t_timer_OBJECTS) $(timers_time_t_timer_DEPENDENCIES) $(EXTRA_timers_time_t_timer_DEPENDENCIES) timers/$(am__dirstamp) @rm -f timers/time_t_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timers_time_t_timer_OBJECTS) $(timers_time_t_timer_LDADD) $(LIBS) tutorial/daytime1/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime1 @: > tutorial/daytime1/$(am__dirstamp) tutorial/daytime1/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime1/$(DEPDIR) @: > tutorial/daytime1/$(DEPDIR)/$(am__dirstamp) tutorial/daytime1/client.$(OBJEXT): tutorial/daytime1/$(am__dirstamp) \ tutorial/daytime1/$(DEPDIR)/$(am__dirstamp) tutorial/daytime1/client$(EXEEXT): $(tutorial_daytime1_client_OBJECTS) $(tutorial_daytime1_client_DEPENDENCIES) $(EXTRA_tutorial_daytime1_client_DEPENDENCIES) tutorial/daytime1/$(am__dirstamp) @rm -f tutorial/daytime1/client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime1_client_OBJECTS) $(tutorial_daytime1_client_LDADD) $(LIBS) tutorial/daytime2/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime2 @: > tutorial/daytime2/$(am__dirstamp) tutorial/daytime2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime2/$(DEPDIR) @: > tutorial/daytime2/$(DEPDIR)/$(am__dirstamp) tutorial/daytime2/server.$(OBJEXT): tutorial/daytime2/$(am__dirstamp) \ tutorial/daytime2/$(DEPDIR)/$(am__dirstamp) tutorial/daytime2/server$(EXEEXT): $(tutorial_daytime2_server_OBJECTS) $(tutorial_daytime2_server_DEPENDENCIES) $(EXTRA_tutorial_daytime2_server_DEPENDENCIES) tutorial/daytime2/$(am__dirstamp) @rm -f tutorial/daytime2/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime2_server_OBJECTS) $(tutorial_daytime2_server_LDADD) $(LIBS) tutorial/daytime3/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime3 @: > tutorial/daytime3/$(am__dirstamp) tutorial/daytime3/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime3/$(DEPDIR) @: > tutorial/daytime3/$(DEPDIR)/$(am__dirstamp) tutorial/daytime3/server.$(OBJEXT): tutorial/daytime3/$(am__dirstamp) \ tutorial/daytime3/$(DEPDIR)/$(am__dirstamp) tutorial/daytime3/server$(EXEEXT): $(tutorial_daytime3_server_OBJECTS) $(tutorial_daytime3_server_DEPENDENCIES) $(EXTRA_tutorial_daytime3_server_DEPENDENCIES) tutorial/daytime3/$(am__dirstamp) @rm -f tutorial/daytime3/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime3_server_OBJECTS) $(tutorial_daytime3_server_LDADD) $(LIBS) tutorial/daytime4/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime4 @: > tutorial/daytime4/$(am__dirstamp) tutorial/daytime4/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime4/$(DEPDIR) @: > tutorial/daytime4/$(DEPDIR)/$(am__dirstamp) tutorial/daytime4/client.$(OBJEXT): tutorial/daytime4/$(am__dirstamp) \ tutorial/daytime4/$(DEPDIR)/$(am__dirstamp) tutorial/daytime4/client$(EXEEXT): $(tutorial_daytime4_client_OBJECTS) $(tutorial_daytime4_client_DEPENDENCIES) $(EXTRA_tutorial_daytime4_client_DEPENDENCIES) tutorial/daytime4/$(am__dirstamp) @rm -f tutorial/daytime4/client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime4_client_OBJECTS) $(tutorial_daytime4_client_LDADD) $(LIBS) tutorial/daytime5/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime5 @: > tutorial/daytime5/$(am__dirstamp) tutorial/daytime5/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime5/$(DEPDIR) @: > tutorial/daytime5/$(DEPDIR)/$(am__dirstamp) tutorial/daytime5/server.$(OBJEXT): tutorial/daytime5/$(am__dirstamp) \ tutorial/daytime5/$(DEPDIR)/$(am__dirstamp) tutorial/daytime5/server$(EXEEXT): $(tutorial_daytime5_server_OBJECTS) $(tutorial_daytime5_server_DEPENDENCIES) $(EXTRA_tutorial_daytime5_server_DEPENDENCIES) tutorial/daytime5/$(am__dirstamp) @rm -f tutorial/daytime5/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime5_server_OBJECTS) $(tutorial_daytime5_server_LDADD) $(LIBS) tutorial/daytime6/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime6 @: > tutorial/daytime6/$(am__dirstamp) tutorial/daytime6/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime6/$(DEPDIR) @: > tutorial/daytime6/$(DEPDIR)/$(am__dirstamp) tutorial/daytime6/server.$(OBJEXT): tutorial/daytime6/$(am__dirstamp) \ tutorial/daytime6/$(DEPDIR)/$(am__dirstamp) tutorial/daytime6/server$(EXEEXT): $(tutorial_daytime6_server_OBJECTS) $(tutorial_daytime6_server_DEPENDENCIES) $(EXTRA_tutorial_daytime6_server_DEPENDENCIES) tutorial/daytime6/$(am__dirstamp) @rm -f tutorial/daytime6/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime6_server_OBJECTS) $(tutorial_daytime6_server_LDADD) $(LIBS) tutorial/daytime7/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime7 @: > tutorial/daytime7/$(am__dirstamp) tutorial/daytime7/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/daytime7/$(DEPDIR) @: > tutorial/daytime7/$(DEPDIR)/$(am__dirstamp) tutorial/daytime7/server.$(OBJEXT): tutorial/daytime7/$(am__dirstamp) \ tutorial/daytime7/$(DEPDIR)/$(am__dirstamp) tutorial/daytime7/server$(EXEEXT): $(tutorial_daytime7_server_OBJECTS) $(tutorial_daytime7_server_DEPENDENCIES) $(EXTRA_tutorial_daytime7_server_DEPENDENCIES) tutorial/daytime7/$(am__dirstamp) @rm -f tutorial/daytime7/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime7_server_OBJECTS) $(tutorial_daytime7_server_LDADD) $(LIBS) tutorial/timer1/$(am__dirstamp): @$(MKDIR_P) tutorial/timer1 @: > tutorial/timer1/$(am__dirstamp) tutorial/timer1/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/timer1/$(DEPDIR) @: > tutorial/timer1/$(DEPDIR)/$(am__dirstamp) tutorial/timer1/timer.$(OBJEXT): tutorial/timer1/$(am__dirstamp) \ tutorial/timer1/$(DEPDIR)/$(am__dirstamp) tutorial/timer1/timer$(EXEEXT): $(tutorial_timer1_timer_OBJECTS) $(tutorial_timer1_timer_DEPENDENCIES) $(EXTRA_tutorial_timer1_timer_DEPENDENCIES) tutorial/timer1/$(am__dirstamp) @rm -f tutorial/timer1/timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer1_timer_OBJECTS) $(tutorial_timer1_timer_LDADD) $(LIBS) tutorial/timer2/$(am__dirstamp): @$(MKDIR_P) tutorial/timer2 @: > tutorial/timer2/$(am__dirstamp) tutorial/timer2/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/timer2/$(DEPDIR) @: > tutorial/timer2/$(DEPDIR)/$(am__dirstamp) tutorial/timer2/timer.$(OBJEXT): tutorial/timer2/$(am__dirstamp) \ tutorial/timer2/$(DEPDIR)/$(am__dirstamp) tutorial/timer2/timer$(EXEEXT): $(tutorial_timer2_timer_OBJECTS) $(tutorial_timer2_timer_DEPENDENCIES) $(EXTRA_tutorial_timer2_timer_DEPENDENCIES) tutorial/timer2/$(am__dirstamp) @rm -f tutorial/timer2/timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer2_timer_OBJECTS) $(tutorial_timer2_timer_LDADD) $(LIBS) tutorial/timer3/$(am__dirstamp): @$(MKDIR_P) tutorial/timer3 @: > tutorial/timer3/$(am__dirstamp) tutorial/timer3/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/timer3/$(DEPDIR) @: > tutorial/timer3/$(DEPDIR)/$(am__dirstamp) tutorial/timer3/timer.$(OBJEXT): tutorial/timer3/$(am__dirstamp) \ tutorial/timer3/$(DEPDIR)/$(am__dirstamp) tutorial/timer3/timer$(EXEEXT): $(tutorial_timer3_timer_OBJECTS) $(tutorial_timer3_timer_DEPENDENCIES) $(EXTRA_tutorial_timer3_timer_DEPENDENCIES) tutorial/timer3/$(am__dirstamp) @rm -f tutorial/timer3/timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer3_timer_OBJECTS) $(tutorial_timer3_timer_LDADD) $(LIBS) tutorial/timer4/$(am__dirstamp): @$(MKDIR_P) tutorial/timer4 @: > tutorial/timer4/$(am__dirstamp) tutorial/timer4/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/timer4/$(DEPDIR) @: > tutorial/timer4/$(DEPDIR)/$(am__dirstamp) tutorial/timer4/timer.$(OBJEXT): tutorial/timer4/$(am__dirstamp) \ tutorial/timer4/$(DEPDIR)/$(am__dirstamp) tutorial/timer4/timer$(EXEEXT): $(tutorial_timer4_timer_OBJECTS) $(tutorial_timer4_timer_DEPENDENCIES) $(EXTRA_tutorial_timer4_timer_DEPENDENCIES) tutorial/timer4/$(am__dirstamp) @rm -f tutorial/timer4/timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer4_timer_OBJECTS) $(tutorial_timer4_timer_LDADD) $(LIBS) tutorial/timer5/$(am__dirstamp): @$(MKDIR_P) tutorial/timer5 @: > tutorial/timer5/$(am__dirstamp) tutorial/timer5/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tutorial/timer5/$(DEPDIR) @: > tutorial/timer5/$(DEPDIR)/$(am__dirstamp) tutorial/timer5/timer.$(OBJEXT): tutorial/timer5/$(am__dirstamp) \ tutorial/timer5/$(DEPDIR)/$(am__dirstamp) tutorial/timer5/timer$(EXEEXT): $(tutorial_timer5_timer_OBJECTS) $(tutorial_timer5_timer_DEPENDENCIES) $(EXTRA_tutorial_timer5_timer_DEPENDENCIES) tutorial/timer5/$(am__dirstamp) @rm -f tutorial/timer5/timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer5_timer_OBJECTS) $(tutorial_timer5_timer_LDADD) $(LIBS) windows/$(am__dirstamp): @$(MKDIR_P) windows @: > windows/$(am__dirstamp) windows/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) windows/$(DEPDIR) @: > windows/$(DEPDIR)/$(am__dirstamp) windows/transmit_file.$(OBJEXT): windows/$(am__dirstamp) \ windows/$(DEPDIR)/$(am__dirstamp) windows/transmit_file$(EXEEXT): $(windows_transmit_file_OBJECTS) $(windows_transmit_file_DEPENDENCIES) $(EXTRA_windows_transmit_file_DEPENDENCIES) windows/$(am__dirstamp) @rm -f windows/transmit_file$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(windows_transmit_file_OBJECTS) $(windows_transmit_file_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../../*.$(OBJEXT) -rm -f allocation/*.$(OBJEXT) -rm -f buffers/*.$(OBJEXT) -rm -f chat/*.$(OBJEXT) -rm -f echo/*.$(OBJEXT) -rm -f fork/*.$(OBJEXT) -rm -f http/client/*.$(OBJEXT) -rm -f http/server/*.$(OBJEXT) -rm -f http/server2/*.$(OBJEXT) -rm -f http/server3/*.$(OBJEXT) -rm -f http/server4/*.$(OBJEXT) -rm -f icmp/*.$(OBJEXT) -rm -f invocation/*.$(OBJEXT) -rm -f iostreams/*.$(OBJEXT) -rm -f local/*.$(OBJEXT) -rm -f multicast/*.$(OBJEXT) -rm -f nonblocking/*.$(OBJEXT) -rm -f porthopper/*.$(OBJEXT) -rm -f services/*.$(OBJEXT) -rm -f socks4/*.$(OBJEXT) -rm -f spawn/*.$(OBJEXT) -rm -f ssl/*.$(OBJEXT) -rm -f timeouts/*.$(OBJEXT) -rm -f timers/*.$(OBJEXT) -rm -f tutorial/daytime1/*.$(OBJEXT) -rm -f tutorial/daytime2/*.$(OBJEXT) -rm -f tutorial/daytime3/*.$(OBJEXT) -rm -f tutorial/daytime4/*.$(OBJEXT) -rm -f tutorial/daytime5/*.$(OBJEXT) -rm -f tutorial/daytime6/*.$(OBJEXT) -rm -f tutorial/daytime7/*.$(OBJEXT) -rm -f tutorial/timer1/*.$(OBJEXT) -rm -f tutorial/timer2/*.$(OBJEXT) -rm -f tutorial/timer3/*.$(OBJEXT) -rm -f tutorial/timer4/*.$(OBJEXT) -rm -f tutorial/timer5/*.$(OBJEXT) -rm -f windows/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@allocation/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@buffers/$(DEPDIR)/reference_counted.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/chat_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/chat_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/posix_chat_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_tcp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_udp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fork/$(DEPDIR)/daemon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fork/$(DEPDIR)/process_per_connection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/client/$(DEPDIR)/async_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/client/$(DEPDIR)/sync_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/connection_manager.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/io_context_pool.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/file_handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@icmp/$(DEPDIR)/ping.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@invocation/$(DEPDIR)/prioritised_handlers.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/daytime_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/daytime_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/http_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/connect_pair.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/iostream_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/stream_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/stream_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@multicast/$(DEPDIR)/receiver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@multicast/$(DEPDIR)/sender.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@nonblocking/$(DEPDIR)/third_party_lib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@porthopper/$(DEPDIR)/client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@porthopper/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@services/$(DEPDIR)/daytime_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@services/$(DEPDIR)/logger_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@socks4/$(DEPDIR)/sync_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spawn/$(DEPDIR)/echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spawn/$(DEPDIR)/parallel_grep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/async_tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_token_tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_udp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timers/$(DEPDIR)/time_t_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime1/$(DEPDIR)/client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime2/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime3/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime4/$(DEPDIR)/client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime5/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime6/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime7/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer1/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer2/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer3/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer4/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer5/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@windows/$(DEPDIR)/transmit_file.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../../$(DEPDIR)/$(am__dirstamp) -rm -f ../../$(am__dirstamp) -rm -f allocation/$(DEPDIR)/$(am__dirstamp) -rm -f allocation/$(am__dirstamp) -rm -f buffers/$(DEPDIR)/$(am__dirstamp) -rm -f buffers/$(am__dirstamp) -rm -f chat/$(DEPDIR)/$(am__dirstamp) -rm -f chat/$(am__dirstamp) -rm -f echo/$(DEPDIR)/$(am__dirstamp) -rm -f echo/$(am__dirstamp) -rm -f fork/$(DEPDIR)/$(am__dirstamp) -rm -f fork/$(am__dirstamp) -rm -f http/client/$(DEPDIR)/$(am__dirstamp) -rm -f http/client/$(am__dirstamp) -rm -f http/server/$(DEPDIR)/$(am__dirstamp) -rm -f http/server/$(am__dirstamp) -rm -f http/server2/$(DEPDIR)/$(am__dirstamp) -rm -f http/server2/$(am__dirstamp) -rm -f http/server3/$(DEPDIR)/$(am__dirstamp) -rm -f http/server3/$(am__dirstamp) -rm -f http/server4/$(DEPDIR)/$(am__dirstamp) -rm -f http/server4/$(am__dirstamp) -rm -f icmp/$(DEPDIR)/$(am__dirstamp) -rm -f icmp/$(am__dirstamp) -rm -f invocation/$(DEPDIR)/$(am__dirstamp) -rm -f invocation/$(am__dirstamp) -rm -f iostreams/$(DEPDIR)/$(am__dirstamp) -rm -f iostreams/$(am__dirstamp) -rm -f local/$(DEPDIR)/$(am__dirstamp) -rm -f local/$(am__dirstamp) -rm -f multicast/$(DEPDIR)/$(am__dirstamp) -rm -f multicast/$(am__dirstamp) -rm -f nonblocking/$(DEPDIR)/$(am__dirstamp) -rm -f nonblocking/$(am__dirstamp) -rm -f porthopper/$(DEPDIR)/$(am__dirstamp) -rm -f porthopper/$(am__dirstamp) -rm -f services/$(DEPDIR)/$(am__dirstamp) -rm -f services/$(am__dirstamp) -rm -f socks4/$(DEPDIR)/$(am__dirstamp) -rm -f socks4/$(am__dirstamp) -rm -f spawn/$(DEPDIR)/$(am__dirstamp) -rm -f spawn/$(am__dirstamp) -rm -f ssl/$(DEPDIR)/$(am__dirstamp) -rm -f ssl/$(am__dirstamp) -rm -f timeouts/$(DEPDIR)/$(am__dirstamp) -rm -f timeouts/$(am__dirstamp) -rm -f timers/$(DEPDIR)/$(am__dirstamp) -rm -f timers/$(am__dirstamp) -rm -f tutorial/daytime1/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime1/$(am__dirstamp) -rm -f tutorial/daytime2/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime2/$(am__dirstamp) -rm -f tutorial/daytime3/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime3/$(am__dirstamp) -rm -f tutorial/daytime4/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime4/$(am__dirstamp) -rm -f tutorial/daytime5/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime5/$(am__dirstamp) -rm -f tutorial/daytime6/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime6/$(am__dirstamp) -rm -f tutorial/daytime7/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/daytime7/$(am__dirstamp) -rm -f tutorial/timer1/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/timer1/$(am__dirstamp) -rm -f tutorial/timer2/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/timer2/$(am__dirstamp) -rm -f tutorial/timer3/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/timer3/$(am__dirstamp) -rm -f tutorial/timer4/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/timer4/$(am__dirstamp) -rm -f tutorial/timer5/$(DEPDIR)/$(am__dirstamp) -rm -f tutorial/timer5/$(am__dirstamp) -rm -f windows/$(DEPDIR)/$(am__dirstamp) -rm -f windows/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -f ../../$(DEPDIR)/asio.Po -rm -f ../../$(DEPDIR)/asio_ssl.Po -rm -f allocation/$(DEPDIR)/server.Po -rm -f buffers/$(DEPDIR)/reference_counted.Po -rm -f chat/$(DEPDIR)/chat_client.Po -rm -f chat/$(DEPDIR)/chat_server.Po -rm -f chat/$(DEPDIR)/posix_chat_client.Po -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po -rm -f fork/$(DEPDIR)/daemon.Po -rm -f fork/$(DEPDIR)/process_per_connection.Po -rm -f http/client/$(DEPDIR)/async_client.Po -rm -f http/client/$(DEPDIR)/sync_client.Po -rm -f http/server/$(DEPDIR)/connection.Po -rm -f http/server/$(DEPDIR)/connection_manager.Po -rm -f http/server/$(DEPDIR)/main.Po -rm -f http/server/$(DEPDIR)/mime_types.Po -rm -f http/server/$(DEPDIR)/reply.Po -rm -f http/server/$(DEPDIR)/request_handler.Po -rm -f http/server/$(DEPDIR)/request_parser.Po -rm -f http/server/$(DEPDIR)/server.Po -rm -f http/server2/$(DEPDIR)/connection.Po -rm -f http/server2/$(DEPDIR)/io_context_pool.Po -rm -f http/server2/$(DEPDIR)/main.Po -rm -f http/server2/$(DEPDIR)/mime_types.Po -rm -f http/server2/$(DEPDIR)/reply.Po -rm -f http/server2/$(DEPDIR)/request_handler.Po -rm -f http/server2/$(DEPDIR)/request_parser.Po -rm -f http/server2/$(DEPDIR)/server.Po -rm -f http/server3/$(DEPDIR)/connection.Po -rm -f http/server3/$(DEPDIR)/main.Po -rm -f http/server3/$(DEPDIR)/mime_types.Po -rm -f http/server3/$(DEPDIR)/reply.Po -rm -f http/server3/$(DEPDIR)/request_handler.Po -rm -f http/server3/$(DEPDIR)/request_parser.Po -rm -f http/server3/$(DEPDIR)/server.Po -rm -f http/server4/$(DEPDIR)/file_handler.Po -rm -f http/server4/$(DEPDIR)/main.Po -rm -f http/server4/$(DEPDIR)/mime_types.Po -rm -f http/server4/$(DEPDIR)/reply.Po -rm -f http/server4/$(DEPDIR)/request_parser.Po -rm -f http/server4/$(DEPDIR)/server.Po -rm -f icmp/$(DEPDIR)/ping.Po -rm -f invocation/$(DEPDIR)/prioritised_handlers.Po -rm -f iostreams/$(DEPDIR)/daytime_client.Po -rm -f iostreams/$(DEPDIR)/daytime_server.Po -rm -f iostreams/$(DEPDIR)/http_client.Po -rm -f local/$(DEPDIR)/connect_pair.Po -rm -f local/$(DEPDIR)/iostream_client.Po -rm -f local/$(DEPDIR)/stream_client.Po -rm -f local/$(DEPDIR)/stream_server.Po -rm -f multicast/$(DEPDIR)/receiver.Po -rm -f multicast/$(DEPDIR)/sender.Po -rm -f nonblocking/$(DEPDIR)/third_party_lib.Po -rm -f porthopper/$(DEPDIR)/client.Po -rm -f porthopper/$(DEPDIR)/server.Po -rm -f services/$(DEPDIR)/daytime_client.Po -rm -f services/$(DEPDIR)/logger_service.Po -rm -f socks4/$(DEPDIR)/sync_client.Po -rm -f spawn/$(DEPDIR)/echo_server.Po -rm -f spawn/$(DEPDIR)/parallel_grep.Po -rm -f ssl/$(DEPDIR)/client.Po -rm -f ssl/$(DEPDIR)/server.Po -rm -f timeouts/$(DEPDIR)/async_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_token_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_udp_client.Po -rm -f timeouts/$(DEPDIR)/server.Po -rm -f timers/$(DEPDIR)/time_t_timer.Po -rm -f tutorial/daytime1/$(DEPDIR)/client.Po -rm -f tutorial/daytime2/$(DEPDIR)/server.Po -rm -f tutorial/daytime3/$(DEPDIR)/server.Po -rm -f tutorial/daytime4/$(DEPDIR)/client.Po -rm -f tutorial/daytime5/$(DEPDIR)/server.Po -rm -f tutorial/daytime6/$(DEPDIR)/server.Po -rm -f tutorial/daytime7/$(DEPDIR)/server.Po -rm -f tutorial/timer1/$(DEPDIR)/timer.Po -rm -f tutorial/timer2/$(DEPDIR)/timer.Po -rm -f tutorial/timer3/$(DEPDIR)/timer.Po -rm -f tutorial/timer4/$(DEPDIR)/timer.Po -rm -f tutorial/timer5/$(DEPDIR)/timer.Po -rm -f windows/$(DEPDIR)/transmit_file.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ../../$(DEPDIR)/asio.Po -rm -f ../../$(DEPDIR)/asio_ssl.Po -rm -f allocation/$(DEPDIR)/server.Po -rm -f buffers/$(DEPDIR)/reference_counted.Po -rm -f chat/$(DEPDIR)/chat_client.Po -rm -f chat/$(DEPDIR)/chat_server.Po -rm -f chat/$(DEPDIR)/posix_chat_client.Po -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po -rm -f fork/$(DEPDIR)/daemon.Po -rm -f fork/$(DEPDIR)/process_per_connection.Po -rm -f http/client/$(DEPDIR)/async_client.Po -rm -f http/client/$(DEPDIR)/sync_client.Po -rm -f http/server/$(DEPDIR)/connection.Po -rm -f http/server/$(DEPDIR)/connection_manager.Po -rm -f http/server/$(DEPDIR)/main.Po -rm -f http/server/$(DEPDIR)/mime_types.Po -rm -f http/server/$(DEPDIR)/reply.Po -rm -f http/server/$(DEPDIR)/request_handler.Po -rm -f http/server/$(DEPDIR)/request_parser.Po -rm -f http/server/$(DEPDIR)/server.Po -rm -f http/server2/$(DEPDIR)/connection.Po -rm -f http/server2/$(DEPDIR)/io_context_pool.Po -rm -f http/server2/$(DEPDIR)/main.Po -rm -f http/server2/$(DEPDIR)/mime_types.Po -rm -f http/server2/$(DEPDIR)/reply.Po -rm -f http/server2/$(DEPDIR)/request_handler.Po -rm -f http/server2/$(DEPDIR)/request_parser.Po -rm -f http/server2/$(DEPDIR)/server.Po -rm -f http/server3/$(DEPDIR)/connection.Po -rm -f http/server3/$(DEPDIR)/main.Po -rm -f http/server3/$(DEPDIR)/mime_types.Po -rm -f http/server3/$(DEPDIR)/reply.Po -rm -f http/server3/$(DEPDIR)/request_handler.Po -rm -f http/server3/$(DEPDIR)/request_parser.Po -rm -f http/server3/$(DEPDIR)/server.Po -rm -f http/server4/$(DEPDIR)/file_handler.Po -rm -f http/server4/$(DEPDIR)/main.Po -rm -f http/server4/$(DEPDIR)/mime_types.Po -rm -f http/server4/$(DEPDIR)/reply.Po -rm -f http/server4/$(DEPDIR)/request_parser.Po -rm -f http/server4/$(DEPDIR)/server.Po -rm -f icmp/$(DEPDIR)/ping.Po -rm -f invocation/$(DEPDIR)/prioritised_handlers.Po -rm -f iostreams/$(DEPDIR)/daytime_client.Po -rm -f iostreams/$(DEPDIR)/daytime_server.Po -rm -f iostreams/$(DEPDIR)/http_client.Po -rm -f local/$(DEPDIR)/connect_pair.Po -rm -f local/$(DEPDIR)/iostream_client.Po -rm -f local/$(DEPDIR)/stream_client.Po -rm -f local/$(DEPDIR)/stream_server.Po -rm -f multicast/$(DEPDIR)/receiver.Po -rm -f multicast/$(DEPDIR)/sender.Po -rm -f nonblocking/$(DEPDIR)/third_party_lib.Po -rm -f porthopper/$(DEPDIR)/client.Po -rm -f porthopper/$(DEPDIR)/server.Po -rm -f services/$(DEPDIR)/daytime_client.Po -rm -f services/$(DEPDIR)/logger_service.Po -rm -f socks4/$(DEPDIR)/sync_client.Po -rm -f spawn/$(DEPDIR)/echo_server.Po -rm -f spawn/$(DEPDIR)/parallel_grep.Po -rm -f ssl/$(DEPDIR)/client.Po -rm -f ssl/$(DEPDIR)/server.Po -rm -f timeouts/$(DEPDIR)/async_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_token_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_udp_client.Po -rm -f timeouts/$(DEPDIR)/server.Po -rm -f timers/$(DEPDIR)/time_t_timer.Po -rm -f tutorial/daytime1/$(DEPDIR)/client.Po -rm -f tutorial/daytime2/$(DEPDIR)/server.Po -rm -f tutorial/daytime3/$(DEPDIR)/server.Po -rm -f tutorial/daytime4/$(DEPDIR)/client.Po -rm -f tutorial/daytime5/$(DEPDIR)/server.Po -rm -f tutorial/daytime6/$(DEPDIR)/server.Po -rm -f tutorial/daytime7/$(DEPDIR)/server.Po -rm -f tutorial/timer1/$(DEPDIR)/timer.Po -rm -f tutorial/timer2/$(DEPDIR)/timer.Po -rm -f tutorial/timer3/$(DEPDIR)/timer.Po -rm -f tutorial/timer4/$(DEPDIR)/timer.Po -rm -f tutorial/timer5/$(DEPDIR)/timer.Po -rm -f windows/$(DEPDIR)/transmit_file.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/src/examples/cpp03/allocation/000077500000000000000000000000001340672067200202165ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/allocation/server.cpp000066400000000000000000000144451340672067200222400ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include "asio.hpp" using asio::ip::tcp; // Class to manage the memory to be used for handler-based custom allocation. // It contains a single block of memory which may be returned for allocation // requests. If the memory is in use when an allocation request is made, the // allocator delegates allocation to the global heap. class handler_memory : private boost::noncopyable { public: handler_memory() : in_use_(false) { } void* allocate(std::size_t size) { if (!in_use_ && size < storage_.size) { in_use_ = true; return storage_.address(); } else { return ::operator new(size); } } void deallocate(void* pointer) { if (pointer == storage_.address()) { in_use_ = false; } else { ::operator delete(pointer); } } private: // Storage space used for handler-based custom memory allocation. boost::aligned_storage<1024> storage_; // Whether the handler-based custom allocation storage has been used. bool in_use_; }; // The allocator to be associated with the handler objects. This allocator only // needs to satisfy the C++11 minimal allocator requirements, plus rebind when // targeting C++03. template class handler_allocator { public: typedef T value_type; explicit handler_allocator(handler_memory& mem) : memory_(mem) { } template handler_allocator(const handler_allocator& other) : memory_(other.memory_) { } template struct rebind { typedef handler_allocator other; }; bool operator==(const handler_allocator& other) const { return &memory_ == &other.memory_; } bool operator!=(const handler_allocator& other) const { return &memory_ != &other.memory_; } T* allocate(std::size_t n) const { return static_cast(memory_.allocate(sizeof(T) * n)); } void deallocate(T* p, std::size_t /*n*/) const { return memory_.deallocate(p); } //private: // The underlying memory. handler_memory& memory_; }; // Wrapper class template for handler objects to allow handler memory // allocation to be customised. The allocator_type typedef and get_allocator() // member function are used by the asynchronous operations to obtain the // allocator. Calls to operator() are forwarded to the encapsulated handler. template class custom_alloc_handler { public: typedef handler_allocator allocator_type; custom_alloc_handler(handler_memory& m, Handler h) : memory_(m), handler_(h) { } allocator_type get_allocator() const { return allocator_type(memory_); } template void operator()(Arg1 arg1) { handler_(arg1); } template void operator()(Arg1 arg1, Arg2 arg2) { handler_(arg1, arg2); } private: handler_memory& memory_; Handler handler_; }; // Helper function to wrap a handler object to add custom allocation. template inline custom_alloc_handler make_custom_alloc_handler( handler_memory& m, Handler h) { return custom_alloc_handler(m, h); } class session : public boost::enable_shared_from_this { public: session(asio::io_context& io_context) : socket_(io_context) { } tcp::socket& socket() { return socket_; } void start() { socket_.async_read_some(asio::buffer(data_), make_custom_alloc_handler(handler_memory_, boost::bind(&session::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred))); } void handle_read(const asio::error_code& error, size_t bytes_transferred) { if (!error) { asio::async_write(socket_, asio::buffer(data_, bytes_transferred), make_custom_alloc_handler(handler_memory_, boost::bind(&session::handle_write, shared_from_this(), asio::placeholders::error))); } } void handle_write(const asio::error_code& error) { if (!error) { socket_.async_read_some(asio::buffer(data_), make_custom_alloc_handler(handler_memory_, boost::bind(&session::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred))); } } private: // The socket used to communicate with the client. tcp::socket socket_; // Buffer used to store data received from the client. boost::array data_; // The memory to use for handler-based custom memory allocation. handler_memory handler_memory_; }; typedef boost::shared_ptr session_ptr; class server { public: server(asio::io_context& io_context, short port) : io_context_(io_context), acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { session_ptr new_session(new session(io_context_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } void handle_accept(session_ptr new_session, const asio::error_code& error) { if (!error) { new_session->start(); } new_session.reset(new session(io_context_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } private: asio::io_context& io_context_; tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/buffers/000077500000000000000000000000001340672067200175255ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/buffers/reference_counted.cpp000066400000000000000000000056121340672067200237140ustar00rootroot00000000000000// // reference_counted.cpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include using asio::ip::tcp; // A reference-counted non-modifiable buffer class. class shared_const_buffer { public: // Construct from a std::string. explicit shared_const_buffer(const std::string& data) : data_(new std::vector(data.begin(), data.end())), buffer_(asio::buffer(*data_)) { } // Implement the ConstBufferSequence requirements. typedef asio::const_buffer value_type; typedef const asio::const_buffer* const_iterator; const asio::const_buffer* begin() const { return &buffer_; } const asio::const_buffer* end() const { return &buffer_ + 1; } private: boost::shared_ptr > data_; asio::const_buffer buffer_; }; class session : public boost::enable_shared_from_this { public: session(asio::io_context& io_context) : socket_(io_context) { } tcp::socket& socket() { return socket_; } void start() { using namespace std; // For time_t, time and ctime. time_t now = time(0); shared_const_buffer buffer(ctime(&now)); asio::async_write(socket_, buffer, boost::bind(&session::handle_write, shared_from_this())); } void handle_write() { } private: // The socket used to communicate with the client. tcp::socket socket_; }; typedef boost::shared_ptr session_ptr; class server { public: server(asio::io_context& io_context, short port) : io_context_(io_context), acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { session_ptr new_session(new session(io_context_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } void handle_accept(session_ptr new_session, const asio::error_code& error) { if (!error) { new_session->start(); } new_session.reset(new session(io_context_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } private: asio::io_context& io_context_; tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: reference_counted \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/chat/000077500000000000000000000000001340672067200170105ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/chat/chat_client.cpp000066400000000000000000000077321340672067200220020ustar00rootroot00000000000000// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" #include "chat_message.hpp" using asio::ip::tcp; typedef std::deque chat_message_queue; class chat_client { public: chat_client(asio::io_context& io_context, const tcp::resolver::results_type& endpoints) : io_context_(io_context), socket_(io_context) { asio::async_connect(socket_, endpoints, boost::bind(&chat_client::handle_connect, this, asio::placeholders::error)); } void write(const chat_message& msg) { asio::post(io_context_, boost::bind(&chat_client::do_write, this, msg)); } void close() { asio::post(io_context_, boost::bind(&chat_client::do_close, this)); } private: void handle_connect(const asio::error_code& error) { if (!error) { asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&chat_client::handle_read_header, this, asio::placeholders::error)); } } void handle_read_header(const asio::error_code& error) { if (!error && read_msg_.decode_header()) { asio::async_read(socket_, asio::buffer(read_msg_.body(), read_msg_.body_length()), boost::bind(&chat_client::handle_read_body, this, asio::placeholders::error)); } else { do_close(); } } void handle_read_body(const asio::error_code& error) { if (!error) { std::cout.write(read_msg_.body(), read_msg_.body_length()); std::cout << "\n"; asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&chat_client::handle_read_header, this, asio::placeholders::error)); } else { do_close(); } } void do_write(chat_message msg) { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); if (!write_in_progress) { asio::async_write(socket_, asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), boost::bind(&chat_client::handle_write, this, asio::placeholders::error)); } } void handle_write(const asio::error_code& error) { if (!error) { write_msgs_.pop_front(); if (!write_msgs_.empty()) { asio::async_write(socket_, asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), boost::bind(&chat_client::handle_write, this, asio::placeholders::error)); } } else { do_close(); } } void do_close() { socket_.close(); } private: asio::io_context& io_context_; tcp::socket socket_; chat_message read_msg_; chat_message_queue write_msgs_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: chat_client \n"; return 1; } asio::io_context io_context; tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); chat_client c(io_context, endpoints); asio::thread t(boost::bind(&asio::io_context::run, &io_context)); char line[chat_message::max_body_length + 1]; while (std::cin.getline(line, chat_message::max_body_length + 1)) { using namespace std; // For strlen and memcpy. chat_message msg; msg.body_length(strlen(line)); memcpy(msg.body(), line, msg.body_length()); msg.encode_header(); c.write(msg); } c.close(); t.join(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/chat/chat_message.hpp000066400000000000000000000032451340672067200221500ustar00rootroot00000000000000// // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef CHAT_MESSAGE_HPP #define CHAT_MESSAGE_HPP #include #include #include class chat_message { public: enum { header_length = 4 }; enum { max_body_length = 512 }; chat_message() : body_length_(0) { } const char* data() const { return data_; } char* data() { return data_; } size_t length() const { return header_length + body_length_; } const char* body() const { return data_ + header_length; } char* body() { return data_ + header_length; } size_t body_length() const { return body_length_; } void body_length(size_t new_length) { body_length_ = new_length; if (body_length_ > max_body_length) body_length_ = max_body_length; } bool decode_header() { using namespace std; // For strncat and atoi. char header[header_length + 1] = ""; strncat(header, data_, header_length); body_length_ = atoi(header); if (body_length_ > max_body_length) { body_length_ = 0; return false; } return true; } void encode_header() { using namespace std; // For sprintf and memcpy. char header[header_length + 1] = ""; sprintf(header, "%4d", static_cast(body_length_)); memcpy(data_, header, header_length); } private: char data_[header_length + max_body_length]; size_t body_length_; }; #endif // CHAT_MESSAGE_HPP asio-1.12.2/src/examples/cpp03/chat/chat_server.cpp000066400000000000000000000133731340672067200220300ustar00rootroot00000000000000// // chat_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include "asio.hpp" #include "chat_message.hpp" using asio::ip::tcp; //---------------------------------------------------------------------- typedef std::deque chat_message_queue; //---------------------------------------------------------------------- class chat_participant { public: virtual ~chat_participant() {} virtual void deliver(const chat_message& msg) = 0; }; typedef boost::shared_ptr chat_participant_ptr; //---------------------------------------------------------------------- class chat_room { public: void join(chat_participant_ptr participant) { participants_.insert(participant); std::for_each(recent_msgs_.begin(), recent_msgs_.end(), boost::bind(&chat_participant::deliver, participant, _1)); } void leave(chat_participant_ptr participant) { participants_.erase(participant); } void deliver(const chat_message& msg) { recent_msgs_.push_back(msg); while (recent_msgs_.size() > max_recent_msgs) recent_msgs_.pop_front(); std::for_each(participants_.begin(), participants_.end(), boost::bind(&chat_participant::deliver, _1, boost::ref(msg))); } private: std::set participants_; enum { max_recent_msgs = 100 }; chat_message_queue recent_msgs_; }; //---------------------------------------------------------------------- class chat_session : public chat_participant, public boost::enable_shared_from_this { public: chat_session(asio::io_context& io_context, chat_room& room) : socket_(io_context), room_(room) { } tcp::socket& socket() { return socket_; } void start() { room_.join(shared_from_this()); asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind( &chat_session::handle_read_header, shared_from_this(), asio::placeholders::error)); } void deliver(const chat_message& msg) { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); if (!write_in_progress) { asio::async_write(socket_, asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), boost::bind(&chat_session::handle_write, shared_from_this(), asio::placeholders::error)); } } void handle_read_header(const asio::error_code& error) { if (!error && read_msg_.decode_header()) { asio::async_read(socket_, asio::buffer(read_msg_.body(), read_msg_.body_length()), boost::bind(&chat_session::handle_read_body, shared_from_this(), asio::placeholders::error)); } else { room_.leave(shared_from_this()); } } void handle_read_body(const asio::error_code& error) { if (!error) { room_.deliver(read_msg_); asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&chat_session::handle_read_header, shared_from_this(), asio::placeholders::error)); } else { room_.leave(shared_from_this()); } } void handle_write(const asio::error_code& error) { if (!error) { write_msgs_.pop_front(); if (!write_msgs_.empty()) { asio::async_write(socket_, asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), boost::bind(&chat_session::handle_write, shared_from_this(), asio::placeholders::error)); } } else { room_.leave(shared_from_this()); } } private: tcp::socket socket_; chat_room& room_; chat_message read_msg_; chat_message_queue write_msgs_; }; typedef boost::shared_ptr chat_session_ptr; //---------------------------------------------------------------------- class chat_server { public: chat_server(asio::io_context& io_context, const tcp::endpoint& endpoint) : io_context_(io_context), acceptor_(io_context, endpoint) { start_accept(); } void start_accept() { chat_session_ptr new_session(new chat_session(io_context_, room_)); acceptor_.async_accept(new_session->socket(), boost::bind(&chat_server::handle_accept, this, new_session, asio::placeholders::error)); } void handle_accept(chat_session_ptr session, const asio::error_code& error) { if (!error) { session->start(); } start_accept(); } private: asio::io_context& io_context_; tcp::acceptor acceptor_; chat_room room_; }; typedef boost::shared_ptr chat_server_ptr; typedef std::list chat_server_list; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc < 2) { std::cerr << "Usage: chat_server [ ...]\n"; return 1; } asio::io_context io_context; chat_server_list servers; for (int i = 1; i < argc; ++i) { using namespace std; // For atoi. tcp::endpoint endpoint(tcp::v4(), atoi(argv[i])); chat_server_ptr server(new chat_server(io_context, endpoint)); servers.push_back(server); } io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/chat/posix_chat_client.cpp000066400000000000000000000125511340672067200232170ustar00rootroot00000000000000// // posix_chat_client.cpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include "asio.hpp" #include "chat_message.hpp" #if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) using asio::ip::tcp; namespace posix = asio::posix; class posix_chat_client { public: posix_chat_client(asio::io_context& io_context, const tcp::resolver::results_type& endpoints) : socket_(io_context), input_(io_context, ::dup(STDIN_FILENO)), output_(io_context, ::dup(STDOUT_FILENO)), input_buffer_(chat_message::max_body_length) { asio::async_connect(socket_, endpoints, boost::bind(&posix_chat_client::handle_connect, this, asio::placeholders::error)); } private: void handle_connect(const asio::error_code& error) { if (!error) { // Read the fixed-length header of the next message from the server. asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&posix_chat_client::handle_read_header, this, asio::placeholders::error)); // Read a line of input entered by the user. asio::async_read_until(input_, input_buffer_, '\n', boost::bind(&posix_chat_client::handle_read_input, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } } void handle_read_header(const asio::error_code& error) { if (!error && read_msg_.decode_header()) { // Read the variable-length body of the message from the server. asio::async_read(socket_, asio::buffer(read_msg_.body(), read_msg_.body_length()), boost::bind(&posix_chat_client::handle_read_body, this, asio::placeholders::error)); } else { close(); } } void handle_read_body(const asio::error_code& error) { if (!error) { // Write out the message we just received, terminated by a newline. static char eol[] = { '\n' }; boost::array buffers = {{ asio::buffer(read_msg_.body(), read_msg_.body_length()), asio::buffer(eol) }}; asio::async_write(output_, buffers, boost::bind(&posix_chat_client::handle_write_output, this, asio::placeholders::error)); } else { close(); } } void handle_write_output(const asio::error_code& error) { if (!error) { // Read the fixed-length header of the next message from the server. asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), boost::bind(&posix_chat_client::handle_read_header, this, asio::placeholders::error)); } else { close(); } } void handle_read_input(const asio::error_code& error, std::size_t length) { if (!error) { // Write the message (minus the newline) to the server. write_msg_.body_length(length - 1); input_buffer_.sgetn(write_msg_.body(), length - 1); input_buffer_.consume(1); // Remove newline from input. write_msg_.encode_header(); asio::async_write(socket_, asio::buffer(write_msg_.data(), write_msg_.length()), boost::bind(&posix_chat_client::handle_write, this, asio::placeholders::error)); } else if (error == asio::error::not_found) { // Didn't get a newline. Send whatever we have. write_msg_.body_length(input_buffer_.size()); input_buffer_.sgetn(write_msg_.body(), input_buffer_.size()); write_msg_.encode_header(); asio::async_write(socket_, asio::buffer(write_msg_.data(), write_msg_.length()), boost::bind(&posix_chat_client::handle_write, this, asio::placeholders::error)); } else { close(); } } void handle_write(const asio::error_code& error) { if (!error) { // Read a line of input entered by the user. asio::async_read_until(input_, input_buffer_, '\n', boost::bind(&posix_chat_client::handle_read_input, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { close(); } } void close() { // Cancel all outstanding asynchronous operations. socket_.close(); input_.close(); output_.close(); } private: tcp::socket socket_; posix::stream_descriptor input_; posix::stream_descriptor output_; chat_message read_msg_; chat_message write_msg_; asio::streambuf input_buffer_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: posix_chat_client \n"; return 1; } asio::io_context io_context; tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); posix_chat_client c(io_context, endpoints); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) int main() {} #endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) asio-1.12.2/src/examples/cpp03/echo/000077500000000000000000000000001340672067200170075ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/echo/async_tcp_echo_server.cpp000066400000000000000000000051421340672067200240640ustar00rootroot00000000000000// // async_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::tcp; class session { public: session(asio::io_context& io_context) : socket_(io_context) { } tcp::socket& socket() { return socket_; } void start() { socket_.async_read_some(asio::buffer(data_, max_length), boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } private: void handle_read(const asio::error_code& error, size_t bytes_transferred) { if (!error) { asio::async_write(socket_, asio::buffer(data_, bytes_transferred), boost::bind(&session::handle_write, this, asio::placeholders::error)); } else { delete this; } } void handle_write(const asio::error_code& error) { if (!error) { socket_.async_read_some(asio::buffer(data_, max_length), boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { delete this; } } tcp::socket socket_; enum { max_length = 1024 }; char data_[max_length]; }; class server { public: server(asio::io_context& io_context, short port) : io_context_(io_context), acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { start_accept(); } private: void start_accept() { session* new_session = new session(io_context_); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } void handle_accept(session* new_session, const asio::error_code& error) { if (!error) { new_session->start(); } else { delete new_session; } start_accept(); } asio::io_context& io_context_; tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_tcp_echo_server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/echo/async_udp_echo_server.cpp000066400000000000000000000043511340672067200240670ustar00rootroot00000000000000// // async_udp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::udp; class server { public: server(asio::io_context& io_context, short port) : socket_(io_context, udp::endpoint(udp::v4(), port)) { socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&server::handle_receive_from, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } void handle_receive_from(const asio::error_code& error, size_t bytes_recvd) { if (!error && bytes_recvd > 0) { socket_.async_send_to( asio::buffer(data_, bytes_recvd), sender_endpoint_, boost::bind(&server::handle_send_to, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&server::handle_receive_from, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } } void handle_send_to(const asio::error_code& /*error*/, size_t /*bytes_sent*/) { socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&server::handle_receive_from, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } private: udp::socket socket_; udp::endpoint sender_endpoint_; enum { max_length = 1024 }; char data_[max_length]; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_udp_echo_server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp000066400000000000000000000026021340672067200245050ustar00rootroot00000000000000// // blocking_tcp_echo_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::tcp; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: blocking_tcp_echo_client \n"; return 1; } asio::io_context io_context; tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(tcp::v4(), argv[1], argv[2]); tcp::socket s(io_context); asio::connect(s, endpoints); using namespace std; // For strlen. std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = strlen(request); asio::write(s, asio::buffer(request, request_length)); char reply[max_length]; size_t reply_length = asio::read(s, asio::buffer(reply, request_length)); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp000066400000000000000000000032441340672067200245400ustar00rootroot00000000000000// // blocking_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" using asio::ip::tcp; const int max_length = 1024; typedef boost::shared_ptr socket_ptr; void session(socket_ptr sock) { try { for (;;) { char data[max_length]; asio::error_code error; size_t length = sock->read_some(asio::buffer(data), error); if (error == asio::error::eof) break; // Connection closed cleanly by peer. else if (error) throw asio::system_error(error); // Some other error. asio::write(*sock, asio::buffer(data, length)); } } catch (std::exception& e) { std::cerr << "Exception in thread: " << e.what() << "\n"; } } void server(asio::io_context& io_context, unsigned short port) { tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port)); for (;;) { socket_ptr sock(new tcp::socket(io_context)); a.accept(*sock); asio::thread t(boost::bind(session, sock)); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: blocking_tcp_echo_server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server(io_context, atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/echo/blocking_udp_echo_client.cpp000066400000000000000000000026771340672067200245230ustar00rootroot00000000000000// // blocking_udp_echo_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::udp; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: blocking_udp_echo_client \n"; return 1; } asio::io_context io_context; udp::socket s(io_context, udp::endpoint(udp::v4(), 0)); udp::resolver resolver(io_context); udp::resolver::results_type endpoints = resolver.resolve(udp::v4(), argv[1], argv[2]); using namespace std; // For strlen. std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = strlen(request); s.send_to(asio::buffer(request, request_length), *endpoints.begin()); char reply[max_length]; udp::endpoint sender_endpoint; size_t reply_length = s.receive_from( asio::buffer(reply, max_length), sender_endpoint); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/echo/blocking_udp_echo_server.cpp000066400000000000000000000022171340672067200245410ustar00rootroot00000000000000// // blocking_udp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include "asio.hpp" using asio::ip::udp; enum { max_length = 1024 }; void server(asio::io_context& io_context, unsigned short port) { udp::socket sock(io_context, udp::endpoint(udp::v4(), port)); for (;;) { char data[max_length]; udp::endpoint sender_endpoint; size_t length = sock.receive_from( asio::buffer(data, max_length), sender_endpoint); sock.send_to(asio::buffer(data, length), sender_endpoint); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: blocking_udp_echo_server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server(io_context, atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/fork/000077500000000000000000000000001340672067200170325ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/fork/daemon.cpp000066400000000000000000000130211340672067200207760ustar00rootroot00000000000000// // daemon.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include using asio::ip::udp; class udp_daytime_server { public: udp_daytime_server(asio::io_context& io_context) : socket_(io_context, udp::endpoint(udp::v4(), 13)) { start_receive(); } private: void start_receive() { socket_.async_receive_from( asio::buffer(recv_buffer_), remote_endpoint_, boost::bind(&udp_daytime_server::handle_receive, this, _1)); } void handle_receive(const asio::error_code& ec) { if (!ec) { using namespace std; // For time_t, time and ctime; time_t now = time(0); std::string message = ctime(&now); asio::error_code ignored_ec; socket_.send_to(asio::buffer(message), remote_endpoint_, 0, ignored_ec); } start_receive(); } udp::socket socket_; udp::endpoint remote_endpoint_; boost::array recv_buffer_; }; int main() { try { asio::io_context io_context; // Initialise the server before becoming a daemon. If the process is // started from a shell, this means any errors will be reported back to the // user. udp_daytime_server server(io_context); // Register signal handlers so that the daemon may be shut down. You may // also want to register for other signals, such as SIGHUP to trigger a // re-read of a configuration file. asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait( boost::bind(&asio::io_context::stop, &io_context)); // Inform the io_context that we are about to become a daemon. The // io_context cleans up any internal resources, such as threads, that may // interfere with forking. io_context.notify_fork(asio::io_context::fork_prepare); // Fork the process and have the parent exit. If the process was started // from a shell, this returns control to the user. Forking a new process is // also a prerequisite for the subsequent call to setsid(). if (pid_t pid = fork()) { if (pid > 0) { // We're in the parent process and need to exit. // // When the exit() function is used, the program terminates without // invoking local variables' destructors. Only global variables are // destroyed. As the io_context object is a local variable, this means // we do not have to call: // // io_context.notify_fork(asio::io_context::fork_parent); // // However, this line should be added before each call to exit() if // using a global io_context object. An additional call: // // io_context.notify_fork(asio::io_context::fork_prepare); // // should also precede the second fork(). exit(0); } else { syslog(LOG_ERR | LOG_USER, "First fork failed: %m"); return 1; } } // Make the process a new session leader. This detaches it from the // terminal. setsid(); // A process inherits its working directory from its parent. This could be // on a mounted filesystem, which means that the running daemon would // prevent this filesystem from being unmounted. Changing to the root // directory avoids this problem. chdir("/"); // The file mode creation mask is also inherited from the parent process. // We don't want to restrict the permissions on files created by the // daemon, so the mask is cleared. umask(0); // A second fork ensures the process cannot acquire a controlling terminal. if (pid_t pid = fork()) { if (pid > 0) { exit(0); } else { syslog(LOG_ERR | LOG_USER, "Second fork failed: %m"); return 1; } } // Close the standard streams. This decouples the daemon from the terminal // that started it. close(0); close(1); close(2); // We don't want the daemon to have any standard input. if (open("/dev/null", O_RDONLY) < 0) { syslog(LOG_ERR | LOG_USER, "Unable to open /dev/null: %m"); return 1; } // Send standard output to a log file. const char* output = "/tmp/asio.daemon.out"; const int flags = O_WRONLY | O_CREAT | O_APPEND; const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; if (open(output, flags, mode) < 0) { syslog(LOG_ERR | LOG_USER, "Unable to open output file %s: %m", output); return 1; } // Also send standard error to the same log file. if (dup(1) < 0) { syslog(LOG_ERR | LOG_USER, "Unable to dup output descriptor: %m"); return 1; } // Inform the io_context that we have finished becoming a daemon. The // io_context uses this opportunity to create any internal file descriptors // that need to be private to the new process. io_context.notify_fork(asio::io_context::fork_child); // The io_context can now be used normally. syslog(LOG_INFO | LOG_USER, "Daemon started"); io_context.run(); syslog(LOG_INFO | LOG_USER, "Daemon stopped"); } catch (std::exception& e) { syslog(LOG_ERR | LOG_USER, "Exception: %s", e.what()); std::cerr << "Exception: " << e.what() << std::endl; } } asio-1.12.2/src/examples/cpp03/fork/process_per_connection.cpp000066400000000000000000000077241340672067200243130ustar00rootroot00000000000000// // process_per_connection.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include using asio::ip::tcp; class server { public: server(asio::io_context& io_context, unsigned short port) : io_context_(io_context), signal_(io_context, SIGCHLD), acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), socket_(io_context) { start_signal_wait(); start_accept(); } private: void start_signal_wait() { signal_.async_wait(boost::bind(&server::handle_signal_wait, this)); } void handle_signal_wait() { // Only the parent process should check for this signal. We can determine // whether we are in the parent by checking if the acceptor is still open. if (acceptor_.is_open()) { // Reap completed child processes so that we don't end up with zombies. int status = 0; while (waitpid(-1, &status, WNOHANG) > 0) {} start_signal_wait(); } } void start_accept() { acceptor_.async_accept(socket_, boost::bind(&server::handle_accept, this, _1)); } void handle_accept(const asio::error_code& ec) { if (!ec) { // Inform the io_context that we are about to fork. The io_context cleans // up any internal resources, such as threads, that may interfere with // forking. io_context_.notify_fork(asio::io_context::fork_prepare); if (fork() == 0) { // Inform the io_context that the fork is finished and that this is the // child process. The io_context uses this opportunity to create any // internal file descriptors that must be private to the new process. io_context_.notify_fork(asio::io_context::fork_child); // The child won't be accepting new connections, so we can close the // acceptor. It remains open in the parent. acceptor_.close(); // The child process is not interested in processing the SIGCHLD signal. signal_.cancel(); start_read(); } else { // Inform the io_context that the fork is finished (or failed) and that // this is the parent process. The io_context uses this opportunity to // recreate any internal resources that were cleaned up during // preparation for the fork. io_context_.notify_fork(asio::io_context::fork_parent); socket_.close(); start_accept(); } } else { std::cerr << "Accept error: " << ec.message() << std::endl; start_accept(); } } void start_read() { socket_.async_read_some(asio::buffer(data_), boost::bind(&server::handle_read, this, _1, _2)); } void handle_read(const asio::error_code& ec, std::size_t length) { if (!ec) start_write(length); } void start_write(std::size_t length) { asio::async_write(socket_, asio::buffer(data_, length), boost::bind(&server::handle_write, this, _1)); } void handle_write(const asio::error_code& ec) { if (!ec) start_read(); } asio::io_context& io_context_; asio::signal_set signal_; tcp::acceptor acceptor_; tcp::socket socket_; boost::array data_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: process_per_connection \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } } asio-1.12.2/src/examples/cpp03/http/000077500000000000000000000000001340672067200170505ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/http/client/000077500000000000000000000000001340672067200203265ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/http/client/async_client.cpp000066400000000000000000000127531340672067200235150ustar00rootroot00000000000000// // async_client.cpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include using asio::ip::tcp; class client { public: client(asio::io_context& io_context, const std::string& server, const std::string& path) : resolver_(io_context), socket_(io_context) { // Form the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. std::ostream request_stream(&request_); request_stream << "GET " << path << " HTTP/1.0\r\n"; request_stream << "Host: " << server << "\r\n"; request_stream << "Accept: */*\r\n"; request_stream << "Connection: close\r\n\r\n"; // Start an asynchronous resolve to translate the server and service names // into a list of endpoints. resolver_.async_resolve(server, "http", boost::bind(&client::handle_resolve, this, asio::placeholders::error, asio::placeholders::results)); } private: void handle_resolve(const asio::error_code& err, const tcp::resolver::results_type& endpoints) { if (!err) { // Attempt a connection to each endpoint in the list until we // successfully establish a connection. asio::async_connect(socket_, endpoints, boost::bind(&client::handle_connect, this, asio::placeholders::error)); } else { std::cout << "Error: " << err.message() << "\n"; } } void handle_connect(const asio::error_code& err) { if (!err) { // The connection was successful. Send the request. asio::async_write(socket_, request_, boost::bind(&client::handle_write_request, this, asio::placeholders::error)); } else { std::cout << "Error: " << err.message() << "\n"; } } void handle_write_request(const asio::error_code& err) { if (!err) { // Read the response status line. The response_ streambuf will // automatically grow to accommodate the entire line. The growth may be // limited by passing a maximum size to the streambuf constructor. asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::handle_read_status_line, this, asio::placeholders::error)); } else { std::cout << "Error: " << err.message() << "\n"; } } void handle_read_status_line(const asio::error_code& err) { if (!err) { // Check that response is OK. std::istream response_stream(&response_); std::string http_version; response_stream >> http_version; unsigned int status_code; response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); if (!response_stream || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return; } if (status_code != 200) { std::cout << "Response returned with status code "; std::cout << status_code << "\n"; return; } // Read the response headers, which are terminated by a blank line. asio::async_read_until(socket_, response_, "\r\n\r\n", boost::bind(&client::handle_read_headers, this, asio::placeholders::error)); } else { std::cout << "Error: " << err << "\n"; } } void handle_read_headers(const asio::error_code& err) { if (!err) { // Process the response headers. std::istream response_stream(&response_); std::string header; while (std::getline(response_stream, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write whatever content we already have to output. if (response_.size() > 0) std::cout << &response_; // Start reading remaining data until EOF. asio::async_read(socket_, response_, asio::transfer_at_least(1), boost::bind(&client::handle_read_content, this, asio::placeholders::error)); } else { std::cout << "Error: " << err << "\n"; } } void handle_read_content(const asio::error_code& err) { if (!err) { // Write all of the data that has been read so far. std::cout << &response_; // Continue reading remaining data until EOF. asio::async_read(socket_, response_, asio::transfer_at_least(1), boost::bind(&client::handle_read_content, this, asio::placeholders::error)); } else if (err != asio::error::eof) { std::cout << "Error: " << err << "\n"; } } tcp::resolver resolver_; tcp::socket socket_; asio::streambuf request_; asio::streambuf response_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: async_client \n"; std::cout << "Example:\n"; std::cout << " async_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } asio::io_context io_context; client c(io_context, argv[1], argv[2]); io_context.run(); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/http/client/sync_client.cpp000066400000000000000000000062671340672067200233570ustar00rootroot00000000000000// // sync_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: sync_client \n"; std::cout << "Example:\n"; std::cout << " sync_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } asio::io_context io_context; // Get a list of endpoints corresponding to the server name. tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(argv[1], "http"); // Try each endpoint until we successfully establish a connection. tcp::socket socket(io_context); asio::connect(socket, endpoints); // Form the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. asio::streambuf request; std::ostream request_stream(&request); request_stream << "GET " << argv[2] << " HTTP/1.0\r\n"; request_stream << "Host: " << argv[1] << "\r\n"; request_stream << "Accept: */*\r\n"; request_stream << "Connection: close\r\n\r\n"; // Send the request. asio::write(socket, request); // Read the response status line. The response streambuf will automatically // grow to accommodate the entire line. The growth may be limited by passing // a maximum size to the streambuf constructor. asio::streambuf response; asio::read_until(socket, response, "\r\n"); // Check that response is OK. std::istream response_stream(&response); std::string http_version; response_stream >> http_version; unsigned int status_code; response_stream >> status_code; std::string status_message; std::getline(response_stream, status_message); if (!response_stream || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return 1; } if (status_code != 200) { std::cout << "Response returned with status code " << status_code << "\n"; return 1; } // Read the response headers, which are terminated by a blank line. asio::read_until(socket, response, "\r\n\r\n"); // Process the response headers. std::string header; while (std::getline(response_stream, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write whatever content we already have to output. if (response.size() > 0) std::cout << &response; // Read until EOF, writing data to output as we go. asio::error_code error; while (asio::read(socket, response, asio::transfer_at_least(1), error)) std::cout << &response; if (error != asio::error::eof) throw asio::system_error(error); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/http/server/000077500000000000000000000000001340672067200203565ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/http/server/connection.cpp000066400000000000000000000047061340672067200232300ustar00rootroot00000000000000// // connection.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "connection.hpp" #include #include #include "connection_manager.hpp" #include "request_handler.hpp" namespace http { namespace server { connection::connection(asio::io_context& io_context, connection_manager& manager, request_handler& handler) : socket_(io_context), connection_manager_(manager), request_handler_(handler) { } asio::ip::tcp::socket& connection::socket() { return socket_; } void connection::start() { socket_.async_read_some(asio::buffer(buffer_), boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } void connection::stop() { socket_.close(); } void connection::handle_read(const asio::error_code& e, std::size_t bytes_transferred) { if (!e) { boost::tribool result; boost::tie(result, boost::tuples::ignore) = request_parser_.parse( request_, buffer_.data(), buffer_.data() + bytes_transferred); if (result) { request_handler_.handle_request(request_, reply_); asio::async_write(socket_, reply_.to_buffers(), boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error)); } else if (!result) { reply_ = reply::stock_reply(reply::bad_request); asio::async_write(socket_, reply_.to_buffers(), boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error)); } else { socket_.async_read_some(asio::buffer(buffer_), boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } } else if (e != asio::error::operation_aborted) { connection_manager_.stop(shared_from_this()); } } void connection::handle_write(const asio::error_code& e) { if (!e) { // Initiate graceful connection closure. asio::error_code ignored_ec; socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); } if (e != asio::error::operation_aborted) { connection_manager_.stop(shared_from_this()); } } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/connection.hpp000066400000000000000000000041161340672067200232300ustar00rootroot00000000000000// // connection.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_CONNECTION_HPP #define HTTP_CONNECTION_HPP #include #include #include #include #include #include "reply.hpp" #include "request.hpp" #include "request_handler.hpp" #include "request_parser.hpp" namespace http { namespace server { class connection_manager; /// Represents a single connection from a client. class connection : public boost::enable_shared_from_this, private boost::noncopyable { public: /// Construct a connection with the given io_context. explicit connection(asio::io_context& io_context, connection_manager& manager, request_handler& handler); /// Get the socket associated with the connection. asio::ip::tcp::socket& socket(); /// Start the first asynchronous operation for the connection. void start(); /// Stop all asynchronous operations associated with the connection. void stop(); private: /// Handle completion of a read operation. void handle_read(const asio::error_code& e, std::size_t bytes_transferred); /// Handle completion of a write operation. void handle_write(const asio::error_code& e); /// Socket for the connection. asio::ip::tcp::socket socket_; /// The manager for this connection. connection_manager& connection_manager_; /// The handler used to process the incoming request. request_handler& request_handler_; /// Buffer for incoming data. boost::array buffer_; /// The incoming request. request request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. reply reply_; }; typedef boost::shared_ptr connection_ptr; } // namespace server } // namespace http #endif // HTTP_CONNECTION_HPP asio-1.12.2/src/examples/cpp03/http/server/connection_manager.cpp000066400000000000000000000014511340672067200247140ustar00rootroot00000000000000// // connection_manager.cpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "connection_manager.hpp" #include #include namespace http { namespace server { void connection_manager::start(connection_ptr c) { connections_.insert(c); c->start(); } void connection_manager::stop(connection_ptr c) { connections_.erase(c); c->stop(); } void connection_manager::stop_all() { std::for_each(connections_.begin(), connections_.end(), boost::bind(&connection::stop, _1)); connections_.clear(); } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/connection_manager.hpp000066400000000000000000000020111340672067200247120ustar00rootroot00000000000000// // connection_manager.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_CONNECTION_MANAGER_HPP #define HTTP_CONNECTION_MANAGER_HPP #include #include #include "connection.hpp" namespace http { namespace server { /// Manages open connections so that they may be cleanly stopped when the server /// needs to shut down. class connection_manager : private boost::noncopyable { public: /// Add the specified connection to the manager and start it. void start(connection_ptr c); /// Stop the specified connection. void stop(connection_ptr c); /// Stop all connections. void stop_all(); private: /// The managed connections. std::set connections_; }; } // namespace server } // namespace http #endif // HTTP_CONNECTION_MANAGER_HPP asio-1.12.2/src/examples/cpp03/http/server/header.hpp000066400000000000000000000007741340672067200223270ustar00rootroot00000000000000// // header.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_HEADER_HPP #define HTTP_HEADER_HPP #include namespace http { namespace server { struct header { std::string name; std::string value; }; } // namespace server } // namespace http #endif // HTTP_HEADER_HPP asio-1.12.2/src/examples/cpp03/http/server/main.cpp000066400000000000000000000017471340672067200220170ustar00rootroot00000000000000// // main.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "server.hpp" int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 4) { std::cerr << "Usage: http_server
\n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 80 .\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 80 .\n"; return 1; } // Initialise the server. http::server::server s(argv[1], argv[2], argv[3]); // Run the server until stopped. s.run(); } catch (std::exception& e) { std::cerr << "exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/http/server/mime_types.cpp000066400000000000000000000016151340672067200232400ustar00rootroot00000000000000// // mime_types.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "mime_types.hpp" namespace http { namespace server { namespace mime_types { struct mapping { const char* extension; const char* mime_type; } mappings[] = { { "gif", "image/gif" }, { "htm", "text/html" }, { "html", "text/html" }, { "jpg", "image/jpeg" }, { "png", "image/png" }, { 0, 0 } // Marks end of list. }; std::string extension_to_type(const std::string& extension) { for (mapping* m = mappings; m->extension; ++m) { if (m->extension == extension) { return m->mime_type; } } return "text/plain"; } } // namespace mime_types } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/mime_types.hpp000066400000000000000000000011611340672067200232410ustar00rootroot00000000000000// // mime_types.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_MIME_TYPES_HPP #define HTTP_MIME_TYPES_HPP #include namespace http { namespace server { namespace mime_types { /// Convert a file extension into a MIME type. std::string extension_to_type(const std::string& extension); } // namespace mime_types } // namespace server } // namespace http #endif // HTTP_MIME_TYPES_HPP asio-1.12.2/src/examples/cpp03/http/server/reply.cpp000066400000000000000000000157061340672067200222260ustar00rootroot00000000000000// // reply.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "reply.hpp" #include #include namespace http { namespace server { namespace status_strings { const std::string ok = "HTTP/1.0 200 OK\r\n"; const std::string created = "HTTP/1.0 201 Created\r\n"; const std::string accepted = "HTTP/1.0 202 Accepted\r\n"; const std::string no_content = "HTTP/1.0 204 No Content\r\n"; const std::string multiple_choices = "HTTP/1.0 300 Multiple Choices\r\n"; const std::string moved_permanently = "HTTP/1.0 301 Moved Permanently\r\n"; const std::string moved_temporarily = "HTTP/1.0 302 Moved Temporarily\r\n"; const std::string not_modified = "HTTP/1.0 304 Not Modified\r\n"; const std::string bad_request = "HTTP/1.0 400 Bad Request\r\n"; const std::string unauthorized = "HTTP/1.0 401 Unauthorized\r\n"; const std::string forbidden = "HTTP/1.0 403 Forbidden\r\n"; const std::string not_found = "HTTP/1.0 404 Not Found\r\n"; const std::string internal_server_error = "HTTP/1.0 500 Internal Server Error\r\n"; const std::string not_implemented = "HTTP/1.0 501 Not Implemented\r\n"; const std::string bad_gateway = "HTTP/1.0 502 Bad Gateway\r\n"; const std::string service_unavailable = "HTTP/1.0 503 Service Unavailable\r\n"; asio::const_buffer to_buffer(reply::status_type status) { switch (status) { case reply::ok: return asio::buffer(ok); case reply::created: return asio::buffer(created); case reply::accepted: return asio::buffer(accepted); case reply::no_content: return asio::buffer(no_content); case reply::multiple_choices: return asio::buffer(multiple_choices); case reply::moved_permanently: return asio::buffer(moved_permanently); case reply::moved_temporarily: return asio::buffer(moved_temporarily); case reply::not_modified: return asio::buffer(not_modified); case reply::bad_request: return asio::buffer(bad_request); case reply::unauthorized: return asio::buffer(unauthorized); case reply::forbidden: return asio::buffer(forbidden); case reply::not_found: return asio::buffer(not_found); case reply::internal_server_error: return asio::buffer(internal_server_error); case reply::not_implemented: return asio::buffer(not_implemented); case reply::bad_gateway: return asio::buffer(bad_gateway); case reply::service_unavailable: return asio::buffer(service_unavailable); default: return asio::buffer(internal_server_error); } } } // namespace status_strings namespace misc_strings { const char name_value_separator[] = { ':', ' ' }; const char crlf[] = { '\r', '\n' }; } // namespace misc_strings std::vector reply::to_buffers() { std::vector buffers; buffers.push_back(status_strings::to_buffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { header& h = headers[i]; buffers.push_back(asio::buffer(h.name)); buffers.push_back(asio::buffer(misc_strings::name_value_separator)); buffers.push_back(asio::buffer(h.value)); buffers.push_back(asio::buffer(misc_strings::crlf)); } buffers.push_back(asio::buffer(misc_strings::crlf)); buffers.push_back(asio::buffer(content)); return buffers; } namespace stock_replies { const char ok[] = ""; const char created[] = "" "Created" "

201 Created

" ""; const char accepted[] = "" "Accepted" "

202 Accepted

" ""; const char no_content[] = "" "No Content" "

204 Content

" ""; const char multiple_choices[] = "" "Multiple Choices" "

300 Multiple Choices

" ""; const char moved_permanently[] = "" "Moved Permanently" "

301 Moved Permanently

" ""; const char moved_temporarily[] = "" "Moved Temporarily" "

302 Moved Temporarily

" ""; const char not_modified[] = "" "Not Modified" "

304 Not Modified

" ""; const char bad_request[] = "" "Bad Request" "

400 Bad Request

" ""; const char unauthorized[] = "" "Unauthorized" "

401 Unauthorized

" ""; const char forbidden[] = "" "Forbidden" "

403 Forbidden

" ""; const char not_found[] = "" "Not Found" "

404 Not Found

" ""; const char internal_server_error[] = "" "Internal Server Error" "

500 Internal Server Error

" ""; const char not_implemented[] = "" "Not Implemented" "

501 Not Implemented

" ""; const char bad_gateway[] = "" "Bad Gateway" "

502 Bad Gateway

" ""; const char service_unavailable[] = "" "Service Unavailable" "

503 Service Unavailable

" ""; std::string to_string(reply::status_type status) { switch (status) { case reply::ok: return ok; case reply::created: return created; case reply::accepted: return accepted; case reply::no_content: return no_content; case reply::multiple_choices: return multiple_choices; case reply::moved_permanently: return moved_permanently; case reply::moved_temporarily: return moved_temporarily; case reply::not_modified: return not_modified; case reply::bad_request: return bad_request; case reply::unauthorized: return unauthorized; case reply::forbidden: return forbidden; case reply::not_found: return not_found; case reply::internal_server_error: return internal_server_error; case reply::not_implemented: return not_implemented; case reply::bad_gateway: return bad_gateway; case reply::service_unavailable: return service_unavailable; default: return internal_server_error; } } } // namespace stock_replies reply reply::stock_reply(reply::status_type status) { reply rep; rep.status = status; rep.content = stock_replies::to_string(status); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = "text/html"; return rep; } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/reply.hpp000066400000000000000000000027331340672067200222270ustar00rootroot00000000000000// // reply.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REPLY_HPP #define HTTP_REPLY_HPP #include #include #include #include "header.hpp" namespace http { namespace server { /// A reply to be sent to a client. struct reply { /// The status of the reply. enum status_type { ok = 200, created = 201, accepted = 202, no_content = 204, multiple_choices = 300, moved_permanently = 301, moved_temporarily = 302, not_modified = 304, bad_request = 400, unauthorized = 401, forbidden = 403, not_found = 404, internal_server_error = 500, not_implemented = 501, bad_gateway = 502, service_unavailable = 503 } status; /// The headers to be included in the reply. std::vector
headers; /// The content to be sent in the reply. std::string content; /// Convert the reply into a vector of buffers. The buffers do not own the /// underlying memory blocks, therefore the reply object must remain valid and /// not be changed until the write operation has completed. std::vector to_buffers(); /// Get a stock reply. static reply stock_reply(status_type status); }; } // namespace server } // namespace http #endif // HTTP_REPLY_HPP asio-1.12.2/src/examples/cpp03/http/server/request.hpp000066400000000000000000000012431340672067200225570ustar00rootroot00000000000000// // request.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REQUEST_HPP #define HTTP_REQUEST_HPP #include #include #include "header.hpp" namespace http { namespace server { /// A request received from a client. struct request { std::string method; std::string uri; int http_version_major; int http_version_minor; std::vector
headers; }; } // namespace server } // namespace http #endif // HTTP_REQUEST_HPP asio-1.12.2/src/examples/cpp03/http/server/request_handler.cpp000066400000000000000000000056161340672067200242570ustar00rootroot00000000000000// // request_handler.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_handler.hpp" #include #include #include #include #include "mime_types.hpp" #include "reply.hpp" #include "request.hpp" namespace http { namespace server { request_handler::request_handler(const std::string& doc_root) : doc_root_(doc_root) { } void request_handler::handle_request(const request& req, reply& rep) { // Decode url to path. std::string request_path; if (!url_decode(req.uri, request_path)) { rep = reply::stock_reply(reply::bad_request); return; } // Request path must be absolute and not contain "..". if (request_path.empty() || request_path[0] != '/' || request_path.find("..") != std::string::npos) { rep = reply::stock_reply(reply::bad_request); return; } // If path ends in slash (i.e. is a directory) then add "index.html". if (request_path[request_path.size() - 1] == '/') { request_path += "index.html"; } // Determine the file extension. std::size_t last_slash_pos = request_path.find_last_of("/"); std::size_t last_dot_pos = request_path.find_last_of("."); std::string extension; if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) { extension = request_path.substr(last_dot_pos + 1); } // Open the file to send back. std::string full_path = doc_root_ + request_path; std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); if (!is) { rep = reply::stock_reply(reply::not_found); return; } // Fill out the reply to be sent to the client. rep.status = reply::ok; char buf[512]; while (is.read(buf, sizeof(buf)).gcount() > 0) rep.content.append(buf, is.gcount()); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = mime_types::extension_to_type(extension); } bool request_handler::url_decode(const std::string& in, std::string& out) { out.clear(); out.reserve(in.size()); for (std::size_t i = 0; i < in.size(); ++i) { if (in[i] == '%') { if (i + 3 <= in.size()) { int value = 0; std::istringstream is(in.substr(i + 1, 2)); if (is >> std::hex >> value) { out += static_cast(value); i += 2; } else { return false; } } else { return false; } } else if (in[i] == '+') { out += ' '; } else { out += in[i]; } } return true; } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/request_handler.hpp000066400000000000000000000021651340672067200242600ustar00rootroot00000000000000// // request_handler.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REQUEST_HANDLER_HPP #define HTTP_REQUEST_HANDLER_HPP #include #include namespace http { namespace server { struct reply; struct request; /// The common handler for all incoming requests. class request_handler : private boost::noncopyable { public: /// Construct with a directory containing files to be served. explicit request_handler(const std::string& doc_root); /// Handle a request and produce a reply. void handle_request(const request& req, reply& rep); private: /// The directory containing the files to be served. std::string doc_root_; /// Perform URL-decoding on a string. Returns false if the encoding was /// invalid. static bool url_decode(const std::string& in, std::string& out); }; } // namespace server } // namespace http #endif // HTTP_REQUEST_HANDLER_HPP asio-1.12.2/src/examples/cpp03/http/server/request_parser.cpp000066400000000000000000000141321340672067200241270ustar00rootroot00000000000000// // request_parser.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_parser.hpp" #include "request.hpp" namespace http { namespace server { request_parser::request_parser() : state_(method_start) { } void request_parser::reset() { state_ = method_start; } boost::tribool request_parser::consume(request& req, char input) { switch (state_) { case method_start: if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { state_ = method; req.method.push_back(input); return boost::indeterminate; } case method: if (input == ' ') { state_ = uri; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.method.push_back(input); return boost::indeterminate; } case uri: if (input == ' ') { state_ = http_version_h; return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { req.uri.push_back(input); return boost::indeterminate; } case http_version_h: if (input == 'H') { state_ = http_version_t_1; return boost::indeterminate; } else { return false; } case http_version_t_1: if (input == 'T') { state_ = http_version_t_2; return boost::indeterminate; } else { return false; } case http_version_t_2: if (input == 'T') { state_ = http_version_p; return boost::indeterminate; } else { return false; } case http_version_p: if (input == 'P') { state_ = http_version_slash; return boost::indeterminate; } else { return false; } case http_version_slash: if (input == '/') { req.http_version_major = 0; req.http_version_minor = 0; state_ = http_version_major_start; return boost::indeterminate; } else { return false; } case http_version_major_start: if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; state_ = http_version_major; return boost::indeterminate; } else { return false; } case http_version_major: if (input == '.') { state_ = http_version_minor_start; return boost::indeterminate; } else if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; return boost::indeterminate; } else { return false; } case http_version_minor_start: if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; state_ = http_version_minor; return boost::indeterminate; } else { return false; } case http_version_minor: if (input == '\r') { state_ = expecting_newline_1; return boost::indeterminate; } else if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; return boost::indeterminate; } else { return false; } case expecting_newline_1: if (input == '\n') { state_ = header_line_start; return boost::indeterminate; } else { return false; } case header_line_start: if (input == '\r') { state_ = expecting_newline_3; return boost::indeterminate; } else if (!req.headers.empty() && (input == ' ' || input == '\t')) { state_ = header_lws; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.headers.push_back(header()); req.headers.back().name.push_back(input); state_ = header_name; return boost::indeterminate; } case header_lws: if (input == '\r') { state_ = expecting_newline_2; return boost::indeterminate; } else if (input == ' ' || input == '\t') { return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { state_ = header_value; req.headers.back().value.push_back(input); return boost::indeterminate; } case header_name: if (input == ':') { state_ = space_before_header_value; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.headers.back().name.push_back(input); return boost::indeterminate; } case space_before_header_value: if (input == ' ') { state_ = header_value; return boost::indeterminate; } else { return false; } case header_value: if (input == '\r') { state_ = expecting_newline_2; return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { req.headers.back().value.push_back(input); return boost::indeterminate; } case expecting_newline_2: if (input == '\n') { state_ = header_line_start; return boost::indeterminate; } else { return false; } case expecting_newline_3: return (input == '\n'); default: return false; } } bool request_parser::is_char(int c) { return c >= 0 && c <= 127; } bool request_parser::is_ctl(int c) { return (c >= 0 && c <= 31) || (c == 127); } bool request_parser::is_tspecial(int c) { switch (c) { case '(': case ')': case '<': case '>': case '@': case ',': case ';': case ':': case '\\': case '"': case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': return true; default: return false; } } bool request_parser::is_digit(int c) { return c >= '0' && c <= '9'; } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/request_parser.hpp000066400000000000000000000044771340672067200241470ustar00rootroot00000000000000// // request_parser.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REQUEST_PARSER_HPP #define HTTP_REQUEST_PARSER_HPP #include #include namespace http { namespace server { struct request; /// Parser for incoming requests. class request_parser { public: /// Construct ready to parse the request method. request_parser(); /// Reset to initial parser state. void reset(); /// Parse some data. The tribool return value is true when a complete request /// has been parsed, false if the data is invalid, indeterminate when more /// data is required. The InputIterator return value indicates how much of the /// input has been consumed. template boost::tuple parse(request& req, InputIterator begin, InputIterator end) { while (begin != end) { boost::tribool result = consume(req, *begin++); if (result || !result) return boost::make_tuple(result, begin); } boost::tribool result = boost::indeterminate; return boost::make_tuple(result, begin); } private: /// Handle the next character of input. boost::tribool consume(request& req, char input); /// Check if a byte is an HTTP character. static bool is_char(int c); /// Check if a byte is an HTTP control character. static bool is_ctl(int c); /// Check if a byte is defined as an HTTP tspecial character. static bool is_tspecial(int c); /// Check if a byte is a digit. static bool is_digit(int c); /// The current state of the parser. enum state { method_start, method, uri, http_version_h, http_version_t_1, http_version_t_2, http_version_p, http_version_slash, http_version_major_start, http_version_major, http_version_minor_start, http_version_minor, expecting_newline_1, header_line_start, header_lws, header_name, space_before_header_value, header_value, expecting_newline_2, expecting_newline_3 } state_; }; } // namespace server } // namespace http #endif // HTTP_REQUEST_PARSER_HPP asio-1.12.2/src/examples/cpp03/http/server/server.cpp000066400000000000000000000051111340672067200223660ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "server.hpp" #include #include namespace http { namespace server { server::server(const std::string& address, const std::string& port, const std::string& doc_root) : io_context_(), signals_(io_context_), acceptor_(io_context_), connection_manager_(), new_connection_(), request_handler_(doc_root) { // Register to handle the signals that indicate when the server should exit. // It is safe to register for the same signal multiple times in a program, // provided all registration for the specified signal is made through Asio. signals_.add(SIGINT); signals_.add(SIGTERM); #if defined(SIGQUIT) signals_.add(SIGQUIT); #endif // defined(SIGQUIT) signals_.async_wait(boost::bind(&server::handle_stop, this)); // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). asio::ip::tcp::resolver resolver(io_context_); asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin(); acceptor_.open(endpoint.protocol()); acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); acceptor_.bind(endpoint); acceptor_.listen(); start_accept(); } void server::run() { // The io_context::run() call will block until all asynchronous operations // have finished. While the server is running, there is always at least one // asynchronous operation outstanding: the asynchronous accept call waiting // for new incoming connections. io_context_.run(); } void server::start_accept() { new_connection_.reset(new connection(io_context_, connection_manager_, request_handler_)); acceptor_.async_accept(new_connection_->socket(), boost::bind(&server::handle_accept, this, asio::placeholders::error)); } void server::handle_accept(const asio::error_code& e) { // Check whether the server was stopped by a signal before this completion // handler had a chance to run. if (!acceptor_.is_open()) { return; } if (!e) { connection_manager_.start(new_connection_); } start_accept(); } void server::handle_stop() { // The server is stopped by cancelling all outstanding asynchronous // operations. Once all operations have finished the io_context::run() call // will exit. acceptor_.close(); connection_manager_.stop_all(); } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp03/http/server/server.hpp000066400000000000000000000034141340672067200223770ustar00rootroot00000000000000// // server.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER_HPP #define HTTP_SERVER_HPP #include #include #include #include "connection.hpp" #include "connection_manager.hpp" #include "request_handler.hpp" namespace http { namespace server { /// The top-level class of the HTTP server. class server : private boost::noncopyable { public: /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit server(const std::string& address, const std::string& port, const std::string& doc_root); /// Run the server's io_context loop. void run(); private: /// Initiate an asynchronous accept operation. void start_accept(); /// Handle completion of an asynchronous accept operation. void handle_accept(const asio::error_code& e); /// Handle a request to stop the server. void handle_stop(); /// The io_context used to perform asynchronous operations. asio::io_context io_context_; /// The signal_set is used to register for process termination notifications. asio::signal_set signals_; /// Acceptor used to listen for incoming connections. asio::ip::tcp::acceptor acceptor_; /// The connection manager which owns all live connections. connection_manager connection_manager_; /// The next connection to be accepted. connection_ptr new_connection_; /// The handler for all incoming requests. request_handler request_handler_; }; } // namespace server } // namespace http #endif // HTTP_SERVER_HPP asio-1.12.2/src/examples/cpp03/http/server2/000077500000000000000000000000001340672067200204405ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/http/server2/connection.cpp000066400000000000000000000052451340672067200233110ustar00rootroot00000000000000// // connection.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "connection.hpp" #include #include #include "request_handler.hpp" namespace http { namespace server2 { connection::connection(asio::io_context& io_context, request_handler& handler) : socket_(io_context), request_handler_(handler) { } asio::ip::tcp::socket& connection::socket() { return socket_; } void connection::start() { socket_.async_read_some(asio::buffer(buffer_), boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } void connection::handle_read(const asio::error_code& e, std::size_t bytes_transferred) { if (!e) { boost::tribool result; boost::tie(result, boost::tuples::ignore) = request_parser_.parse( request_, buffer_.data(), buffer_.data() + bytes_transferred); if (result) { request_handler_.handle_request(request_, reply_); asio::async_write(socket_, reply_.to_buffers(), boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error)); } else if (!result) { reply_ = reply::stock_reply(reply::bad_request); asio::async_write(socket_, reply_.to_buffers(), boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error)); } else { socket_.async_read_some(asio::buffer(buffer_), boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } } // If an error occurs then no new asynchronous operations are started. This // means that all shared_ptr references to the connection object will // disappear and the object will be destroyed automatically after this // handler returns. The connection class's destructor closes the socket. } void connection::handle_write(const asio::error_code& e) { if (!e) { // Initiate graceful connection closure. asio::error_code ignored_ec; socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); } // No new asynchronous operations are started. This means that all shared_ptr // references to the connection object will disappear and the object will be // destroyed automatically after this handler returns. The connection class's // destructor closes the socket. } } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/connection.hpp000066400000000000000000000036061340672067200233150ustar00rootroot00000000000000// // connection.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_CONNECTION_HPP #define HTTP_SERVER2_CONNECTION_HPP #include #include #include #include #include #include "reply.hpp" #include "request.hpp" #include "request_handler.hpp" #include "request_parser.hpp" namespace http { namespace server2 { /// Represents a single connection from a client. class connection : public boost::enable_shared_from_this, private boost::noncopyable { public: /// Construct a connection with the given io_context. explicit connection(asio::io_context& io_context, request_handler& handler); /// Get the socket associated with the connection. asio::ip::tcp::socket& socket(); /// Start the first asynchronous operation for the connection. void start(); private: /// Handle completion of a read operation. void handle_read(const asio::error_code& e, std::size_t bytes_transferred); /// Handle completion of a write operation. void handle_write(const asio::error_code& e); /// Socket for the connection. asio::ip::tcp::socket socket_; /// The handler used to process the incoming request. request_handler& request_handler_; /// Buffer for incoming data. boost::array buffer_; /// The incoming request. request request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. reply reply_; }; typedef boost::shared_ptr connection_ptr; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_CONNECTION_HPP asio-1.12.2/src/examples/cpp03/http/server2/header.hpp000066400000000000000000000010261340672067200224000ustar00rootroot00000000000000// // header.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_HEADER_HPP #define HTTP_SERVER2_HEADER_HPP #include namespace http { namespace server2 { struct header { std::string name; std::string value; }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_HEADER_HPP asio-1.12.2/src/examples/cpp03/http/server2/io_context_pool.cpp000066400000000000000000000036121340672067200243520ustar00rootroot00000000000000// // io_context_pool.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "server.hpp" #include #include #include namespace http { namespace server2 { io_context_pool::io_context_pool(std::size_t pool_size) : next_io_context_(0) { if (pool_size == 0) throw std::runtime_error("io_context_pool size is 0"); // Give all the io_contexts work to do so that their run() functions will not // exit until they are explicitly stopped. for (std::size_t i = 0; i < pool_size; ++i) { io_context_ptr io_context(new asio::io_context); io_contexts_.push_back(io_context); work_.push_back(asio::make_work_guard(*io_context)); } } void io_context_pool::run() { // Create a pool of threads to run all of the io_contexts. std::vector > threads; for (std::size_t i = 0; i < io_contexts_.size(); ++i) { boost::shared_ptr thread(new asio::thread( boost::bind(&asio::io_context::run, io_contexts_[i]))); threads.push_back(thread); } // Wait for all threads in the pool to exit. for (std::size_t i = 0; i < threads.size(); ++i) threads[i]->join(); } void io_context_pool::stop() { // Explicitly stop all io_contexts. for (std::size_t i = 0; i < io_contexts_.size(); ++i) io_contexts_[i]->stop(); } asio::io_context& io_context_pool::get_io_context() { // Use a round-robin scheme to choose the next io_context to use. asio::io_context& io_context = *io_contexts_[next_io_context_]; ++next_io_context_; if (next_io_context_ == io_contexts_.size()) next_io_context_ = 0; return io_context; } } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/io_context_pool.hpp000066400000000000000000000026061340672067200243610ustar00rootroot00000000000000// // io_context_pool.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_IO_SERVICE_POOL_HPP #define HTTP_SERVER2_IO_SERVICE_POOL_HPP #include #include #include #include #include namespace http { namespace server2 { /// A pool of io_context objects. class io_context_pool : private boost::noncopyable { public: /// Construct the io_context pool. explicit io_context_pool(std::size_t pool_size); /// Run all io_context objects in the pool. void run(); /// Stop all io_context objects in the pool. void stop(); /// Get an io_context to use. asio::io_context& get_io_context(); private: typedef boost::shared_ptr io_context_ptr; typedef asio::executor_work_guard< asio::io_context::executor_type> io_context_work; /// The pool of io_contexts. std::vector io_contexts_; /// The work that keeps the io_contexts running. std::list work_; /// The next io_context to use for a connection. std::size_t next_io_context_; }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_IO_SERVICE_POOL_HPP asio-1.12.2/src/examples/cpp03/http/server2/main.cpp000066400000000000000000000021561340672067200220740ustar00rootroot00000000000000// // main.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include "server.hpp" int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 5) { std::cerr << "Usage: http_server
\n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 80 1 .\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 80 1 .\n"; return 1; } // Initialise the server. std::size_t num_threads = boost::lexical_cast(argv[3]); http::server2::server s(argv[1], argv[2], argv[4], num_threads); // Run the server until stopped. s.run(); } catch (std::exception& e) { std::cerr << "exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/http/server2/mime_types.cpp000066400000000000000000000016171340672067200233240ustar00rootroot00000000000000// // mime_types.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "mime_types.hpp" namespace http { namespace server2 { namespace mime_types { struct mapping { const char* extension; const char* mime_type; } mappings[] = { { "gif", "image/gif" }, { "htm", "text/html" }, { "html", "text/html" }, { "jpg", "image/jpeg" }, { "png", "image/png" }, { 0, 0 } // Marks end of list. }; std::string extension_to_type(const std::string& extension) { for (mapping* m = mappings; m->extension; ++m) { if (m->extension == extension) { return m->mime_type; } } return "text/plain"; } } // namespace mime_types } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/mime_types.hpp000066400000000000000000000012131340672067200233210ustar00rootroot00000000000000// // mime_types.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_MIME_TYPES_HPP #define HTTP_SERVER2_MIME_TYPES_HPP #include namespace http { namespace server2 { namespace mime_types { /// Convert a file extension into a MIME type. std::string extension_to_type(const std::string& extension); } // namespace mime_types } // namespace server2 } // namespace http #endif // HTTP_SERVER2_MIME_TYPES_HPP asio-1.12.2/src/examples/cpp03/http/server2/reply.cpp000066400000000000000000000157101340672067200223030ustar00rootroot00000000000000// // reply.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "reply.hpp" #include #include namespace http { namespace server2 { namespace status_strings { const std::string ok = "HTTP/1.0 200 OK\r\n"; const std::string created = "HTTP/1.0 201 Created\r\n"; const std::string accepted = "HTTP/1.0 202 Accepted\r\n"; const std::string no_content = "HTTP/1.0 204 No Content\r\n"; const std::string multiple_choices = "HTTP/1.0 300 Multiple Choices\r\n"; const std::string moved_permanently = "HTTP/1.0 301 Moved Permanently\r\n"; const std::string moved_temporarily = "HTTP/1.0 302 Moved Temporarily\r\n"; const std::string not_modified = "HTTP/1.0 304 Not Modified\r\n"; const std::string bad_request = "HTTP/1.0 400 Bad Request\r\n"; const std::string unauthorized = "HTTP/1.0 401 Unauthorized\r\n"; const std::string forbidden = "HTTP/1.0 403 Forbidden\r\n"; const std::string not_found = "HTTP/1.0 404 Not Found\r\n"; const std::string internal_server_error = "HTTP/1.0 500 Internal Server Error\r\n"; const std::string not_implemented = "HTTP/1.0 501 Not Implemented\r\n"; const std::string bad_gateway = "HTTP/1.0 502 Bad Gateway\r\n"; const std::string service_unavailable = "HTTP/1.0 503 Service Unavailable\r\n"; asio::const_buffer to_buffer(reply::status_type status) { switch (status) { case reply::ok: return asio::buffer(ok); case reply::created: return asio::buffer(created); case reply::accepted: return asio::buffer(accepted); case reply::no_content: return asio::buffer(no_content); case reply::multiple_choices: return asio::buffer(multiple_choices); case reply::moved_permanently: return asio::buffer(moved_permanently); case reply::moved_temporarily: return asio::buffer(moved_temporarily); case reply::not_modified: return asio::buffer(not_modified); case reply::bad_request: return asio::buffer(bad_request); case reply::unauthorized: return asio::buffer(unauthorized); case reply::forbidden: return asio::buffer(forbidden); case reply::not_found: return asio::buffer(not_found); case reply::internal_server_error: return asio::buffer(internal_server_error); case reply::not_implemented: return asio::buffer(not_implemented); case reply::bad_gateway: return asio::buffer(bad_gateway); case reply::service_unavailable: return asio::buffer(service_unavailable); default: return asio::buffer(internal_server_error); } } } // namespace status_strings namespace misc_strings { const char name_value_separator[] = { ':', ' ' }; const char crlf[] = { '\r', '\n' }; } // namespace misc_strings std::vector reply::to_buffers() { std::vector buffers; buffers.push_back(status_strings::to_buffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { header& h = headers[i]; buffers.push_back(asio::buffer(h.name)); buffers.push_back(asio::buffer(misc_strings::name_value_separator)); buffers.push_back(asio::buffer(h.value)); buffers.push_back(asio::buffer(misc_strings::crlf)); } buffers.push_back(asio::buffer(misc_strings::crlf)); buffers.push_back(asio::buffer(content)); return buffers; } namespace stock_replies { const char ok[] = ""; const char created[] = "" "Created" "

201 Created

" ""; const char accepted[] = "" "Accepted" "

202 Accepted

" ""; const char no_content[] = "" "No Content" "

204 Content

" ""; const char multiple_choices[] = "" "Multiple Choices" "

300 Multiple Choices

" ""; const char moved_permanently[] = "" "Moved Permanently" "

301 Moved Permanently

" ""; const char moved_temporarily[] = "" "Moved Temporarily" "

302 Moved Temporarily

" ""; const char not_modified[] = "" "Not Modified" "

304 Not Modified

" ""; const char bad_request[] = "" "Bad Request" "

400 Bad Request

" ""; const char unauthorized[] = "" "Unauthorized" "

401 Unauthorized

" ""; const char forbidden[] = "" "Forbidden" "

403 Forbidden

" ""; const char not_found[] = "" "Not Found" "

404 Not Found

" ""; const char internal_server_error[] = "" "Internal Server Error" "

500 Internal Server Error

" ""; const char not_implemented[] = "" "Not Implemented" "

501 Not Implemented

" ""; const char bad_gateway[] = "" "Bad Gateway" "

502 Bad Gateway

" ""; const char service_unavailable[] = "" "Service Unavailable" "

503 Service Unavailable

" ""; std::string to_string(reply::status_type status) { switch (status) { case reply::ok: return ok; case reply::created: return created; case reply::accepted: return accepted; case reply::no_content: return no_content; case reply::multiple_choices: return multiple_choices; case reply::moved_permanently: return moved_permanently; case reply::moved_temporarily: return moved_temporarily; case reply::not_modified: return not_modified; case reply::bad_request: return bad_request; case reply::unauthorized: return unauthorized; case reply::forbidden: return forbidden; case reply::not_found: return not_found; case reply::internal_server_error: return internal_server_error; case reply::not_implemented: return not_implemented; case reply::bad_gateway: return bad_gateway; case reply::service_unavailable: return service_unavailable; default: return internal_server_error; } } } // namespace stock_replies reply reply::stock_reply(reply::status_type status) { reply rep; rep.status = status; rep.content = stock_replies::to_string(status); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = "text/html"; return rep; } } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/reply.hpp000066400000000000000000000027651340672067200223160ustar00rootroot00000000000000// // reply.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_REPLY_HPP #define HTTP_SERVER2_REPLY_HPP #include #include #include #include "header.hpp" namespace http { namespace server2 { /// A reply to be sent to a client. struct reply { /// The status of the reply. enum status_type { ok = 200, created = 201, accepted = 202, no_content = 204, multiple_choices = 300, moved_permanently = 301, moved_temporarily = 302, not_modified = 304, bad_request = 400, unauthorized = 401, forbidden = 403, not_found = 404, internal_server_error = 500, not_implemented = 501, bad_gateway = 502, service_unavailable = 503 } status; /// The headers to be included in the reply. std::vector
headers; /// The content to be sent in the reply. std::string content; /// Convert the reply into a vector of buffers. The buffers do not own the /// underlying memory blocks, therefore the reply object must remain valid and /// not be changed until the write operation has completed. std::vector to_buffers(); /// Get a stock reply. static reply stock_reply(status_type status); }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_REPLY_HPP asio-1.12.2/src/examples/cpp03/http/server2/request.hpp000066400000000000000000000012751340672067200226460ustar00rootroot00000000000000// // request.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_REQUEST_HPP #define HTTP_SERVER2_REQUEST_HPP #include #include #include "header.hpp" namespace http { namespace server2 { /// A request received from a client. struct request { std::string method; std::string uri; int http_version_major; int http_version_minor; std::vector
headers; }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_REQUEST_HPP asio-1.12.2/src/examples/cpp03/http/server2/request_handler.cpp000066400000000000000000000056201340672067200243340ustar00rootroot00000000000000// // request_handler.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_handler.hpp" #include #include #include #include #include "mime_types.hpp" #include "reply.hpp" #include "request.hpp" namespace http { namespace server2 { request_handler::request_handler(const std::string& doc_root) : doc_root_(doc_root) { } void request_handler::handle_request(const request& req, reply& rep) { // Decode url to path. std::string request_path; if (!url_decode(req.uri, request_path)) { rep = reply::stock_reply(reply::bad_request); return; } // Request path must be absolute and not contain "..". if (request_path.empty() || request_path[0] != '/' || request_path.find("..") != std::string::npos) { rep = reply::stock_reply(reply::bad_request); return; } // If path ends in slash (i.e. is a directory) then add "index.html". if (request_path[request_path.size() - 1] == '/') { request_path += "index.html"; } // Determine the file extension. std::size_t last_slash_pos = request_path.find_last_of("/"); std::size_t last_dot_pos = request_path.find_last_of("."); std::string extension; if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) { extension = request_path.substr(last_dot_pos + 1); } // Open the file to send back. std::string full_path = doc_root_ + request_path; std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); if (!is) { rep = reply::stock_reply(reply::not_found); return; } // Fill out the reply to be sent to the client. rep.status = reply::ok; char buf[512]; while (is.read(buf, sizeof(buf)).gcount() > 0) rep.content.append(buf, is.gcount()); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = mime_types::extension_to_type(extension); } bool request_handler::url_decode(const std::string& in, std::string& out) { out.clear(); out.reserve(in.size()); for (std::size_t i = 0; i < in.size(); ++i) { if (in[i] == '%') { if (i + 3 <= in.size()) { int value = 0; std::istringstream is(in.substr(i + 1, 2)); if (is >> std::hex >> value) { out += static_cast(value); i += 2; } else { return false; } } else { return false; } } else if (in[i] == '+') { out += ' '; } else { out += in[i]; } } return true; } } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/request_handler.hpp000066400000000000000000000022171340672067200243400ustar00rootroot00000000000000// // request_handler.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_REQUEST_HANDLER_HPP #define HTTP_SERVER2_REQUEST_HANDLER_HPP #include #include namespace http { namespace server2 { struct reply; struct request; /// The common handler for all incoming requests. class request_handler : private boost::noncopyable { public: /// Construct with a directory containing files to be served. explicit request_handler(const std::string& doc_root); /// Handle a request and produce a reply. void handle_request(const request& req, reply& rep); private: /// The directory containing the files to be served. std::string doc_root_; /// Perform URL-decoding on a string. Returns false if the encoding was /// invalid. static bool url_decode(const std::string& in, std::string& out); }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_REQUEST_HANDLER_HPP asio-1.12.2/src/examples/cpp03/http/server2/request_parser.cpp000066400000000000000000000141341340672067200242130ustar00rootroot00000000000000// // request_parser.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_parser.hpp" #include "request.hpp" namespace http { namespace server2 { request_parser::request_parser() : state_(method_start) { } void request_parser::reset() { state_ = method_start; } boost::tribool request_parser::consume(request& req, char input) { switch (state_) { case method_start: if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { state_ = method; req.method.push_back(input); return boost::indeterminate; } case method: if (input == ' ') { state_ = uri; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.method.push_back(input); return boost::indeterminate; } case uri: if (input == ' ') { state_ = http_version_h; return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { req.uri.push_back(input); return boost::indeterminate; } case http_version_h: if (input == 'H') { state_ = http_version_t_1; return boost::indeterminate; } else { return false; } case http_version_t_1: if (input == 'T') { state_ = http_version_t_2; return boost::indeterminate; } else { return false; } case http_version_t_2: if (input == 'T') { state_ = http_version_p; return boost::indeterminate; } else { return false; } case http_version_p: if (input == 'P') { state_ = http_version_slash; return boost::indeterminate; } else { return false; } case http_version_slash: if (input == '/') { req.http_version_major = 0; req.http_version_minor = 0; state_ = http_version_major_start; return boost::indeterminate; } else { return false; } case http_version_major_start: if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; state_ = http_version_major; return boost::indeterminate; } else { return false; } case http_version_major: if (input == '.') { state_ = http_version_minor_start; return boost::indeterminate; } else if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; return boost::indeterminate; } else { return false; } case http_version_minor_start: if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; state_ = http_version_minor; return boost::indeterminate; } else { return false; } case http_version_minor: if (input == '\r') { state_ = expecting_newline_1; return boost::indeterminate; } else if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; return boost::indeterminate; } else { return false; } case expecting_newline_1: if (input == '\n') { state_ = header_line_start; return boost::indeterminate; } else { return false; } case header_line_start: if (input == '\r') { state_ = expecting_newline_3; return boost::indeterminate; } else if (!req.headers.empty() && (input == ' ' || input == '\t')) { state_ = header_lws; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.headers.push_back(header()); req.headers.back().name.push_back(input); state_ = header_name; return boost::indeterminate; } case header_lws: if (input == '\r') { state_ = expecting_newline_2; return boost::indeterminate; } else if (input == ' ' || input == '\t') { return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { state_ = header_value; req.headers.back().value.push_back(input); return boost::indeterminate; } case header_name: if (input == ':') { state_ = space_before_header_value; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.headers.back().name.push_back(input); return boost::indeterminate; } case space_before_header_value: if (input == ' ') { state_ = header_value; return boost::indeterminate; } else { return false; } case header_value: if (input == '\r') { state_ = expecting_newline_2; return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { req.headers.back().value.push_back(input); return boost::indeterminate; } case expecting_newline_2: if (input == '\n') { state_ = header_line_start; return boost::indeterminate; } else { return false; } case expecting_newline_3: return (input == '\n'); default: return false; } } bool request_parser::is_char(int c) { return c >= 0 && c <= 127; } bool request_parser::is_ctl(int c) { return (c >= 0 && c <= 31) || (c == 127); } bool request_parser::is_tspecial(int c) { switch (c) { case '(': case ')': case '<': case '>': case '@': case ',': case ';': case ':': case '\\': case '"': case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': return true; default: return false; } } bool request_parser::is_digit(int c) { return c >= '0' && c <= '9'; } } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/request_parser.hpp000066400000000000000000000045311340672067200242200ustar00rootroot00000000000000// // request_parser.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_REQUEST_PARSER_HPP #define HTTP_SERVER2_REQUEST_PARSER_HPP #include #include namespace http { namespace server2 { struct request; /// Parser for incoming requests. class request_parser { public: /// Construct ready to parse the request method. request_parser(); /// Reset to initial parser state. void reset(); /// Parse some data. The tribool return value is true when a complete request /// has been parsed, false if the data is invalid, indeterminate when more /// data is required. The InputIterator return value indicates how much of the /// input has been consumed. template boost::tuple parse(request& req, InputIterator begin, InputIterator end) { while (begin != end) { boost::tribool result = consume(req, *begin++); if (result || !result) return boost::make_tuple(result, begin); } boost::tribool result = boost::indeterminate; return boost::make_tuple(result, begin); } private: /// Handle the next character of input. boost::tribool consume(request& req, char input); /// Check if a byte is an HTTP character. static bool is_char(int c); /// Check if a byte is an HTTP control character. static bool is_ctl(int c); /// Check if a byte is defined as an HTTP tspecial character. static bool is_tspecial(int c); /// Check if a byte is a digit. static bool is_digit(int c); /// The current state of the parser. enum state { method_start, method, uri, http_version_h, http_version_t_1, http_version_t_2, http_version_p, http_version_slash, http_version_major_start, http_version_major, http_version_minor_start, http_version_minor, expecting_newline_1, header_line_start, header_lws, header_name, space_before_header_value, header_value, expecting_newline_2, expecting_newline_3 } state_; }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_REQUEST_PARSER_HPP asio-1.12.2/src/examples/cpp03/http/server2/server.cpp000066400000000000000000000040431340672067200224530ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "server.hpp" #include namespace http { namespace server2 { server::server(const std::string& address, const std::string& port, const std::string& doc_root, std::size_t io_context_pool_size) : io_context_pool_(io_context_pool_size), signals_(io_context_pool_.get_io_context()), acceptor_(io_context_pool_.get_io_context()), new_connection_(), request_handler_(doc_root) { // Register to handle the signals that indicate when the server should exit. // It is safe to register for the same signal multiple times in a program, // provided all registration for the specified signal is made through Asio. signals_.add(SIGINT); signals_.add(SIGTERM); #if defined(SIGQUIT) signals_.add(SIGQUIT); #endif // defined(SIGQUIT) signals_.async_wait(boost::bind(&server::handle_stop, this)); // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). asio::ip::tcp::resolver resolver(acceptor_.get_executor().context()); asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin(); acceptor_.open(endpoint.protocol()); acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); acceptor_.bind(endpoint); acceptor_.listen(); start_accept(); } void server::run() { io_context_pool_.run(); } void server::start_accept() { new_connection_.reset(new connection( io_context_pool_.get_io_context(), request_handler_)); acceptor_.async_accept(new_connection_->socket(), boost::bind(&server::handle_accept, this, asio::placeholders::error)); } void server::handle_accept(const asio::error_code& e) { if (!e) { new_connection_->start(); } start_accept(); } void server::handle_stop() { io_context_pool_.stop(); } } // namespace server2 } // namespace http asio-1.12.2/src/examples/cpp03/http/server2/server.hpp000066400000000000000000000034421340672067200224620ustar00rootroot00000000000000// // server.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER2_SERVER_HPP #define HTTP_SERVER2_SERVER_HPP #include #include #include #include #include #include "connection.hpp" #include "io_context_pool.hpp" #include "request_handler.hpp" namespace http { namespace server2 { /// The top-level class of the HTTP server. class server : private boost::noncopyable { public: /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit server(const std::string& address, const std::string& port, const std::string& doc_root, std::size_t io_context_pool_size); /// Run the server's io_context loop. void run(); private: /// Initiate an asynchronous accept operation. void start_accept(); /// Handle completion of an asynchronous accept operation. void handle_accept(const asio::error_code& e); /// Handle a request to stop the server. void handle_stop(); /// The pool of io_context objects used to perform asynchronous operations. io_context_pool io_context_pool_; /// The signal_set is used to register for process termination notifications. asio::signal_set signals_; /// Acceptor used to listen for incoming connections. asio::ip::tcp::acceptor acceptor_; /// The next connection to be accepted. connection_ptr new_connection_; /// The handler for all incoming requests. request_handler request_handler_; }; } // namespace server2 } // namespace http #endif // HTTP_SERVER2_SERVER_HPP asio-1.12.2/src/examples/cpp03/http/server3/000077500000000000000000000000001340672067200204415ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/http/server3/connection.cpp000066400000000000000000000055561340672067200233170ustar00rootroot00000000000000// // connection.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "connection.hpp" #include #include #include "request_handler.hpp" namespace http { namespace server3 { connection::connection(asio::io_context& io_context, request_handler& handler) : strand_(io_context), socket_(io_context), request_handler_(handler) { } asio::ip::tcp::socket& connection::socket() { return socket_; } void connection::start() { socket_.async_read_some(asio::buffer(buffer_), asio::bind_executor(strand_, boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred))); } void connection::handle_read(const asio::error_code& e, std::size_t bytes_transferred) { if (!e) { boost::tribool result; boost::tie(result, boost::tuples::ignore) = request_parser_.parse( request_, buffer_.data(), buffer_.data() + bytes_transferred); if (result) { request_handler_.handle_request(request_, reply_); asio::async_write(socket_, reply_.to_buffers(), asio::bind_executor(strand_, boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error))); } else if (!result) { reply_ = reply::stock_reply(reply::bad_request); asio::async_write(socket_, reply_.to_buffers(), asio::bind_executor(strand_, boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error))); } else { socket_.async_read_some(asio::buffer(buffer_), asio::bind_executor(strand_, boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred))); } } // If an error occurs then no new asynchronous operations are started. This // means that all shared_ptr references to the connection object will // disappear and the object will be destroyed automatically after this // handler returns. The connection class's destructor closes the socket. } void connection::handle_write(const asio::error_code& e) { if (!e) { // Initiate graceful connection closure. asio::error_code ignored_ec; socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); } // No new asynchronous operations are started. This means that all shared_ptr // references to the connection object will disappear and the object will be // destroyed automatically after this handler returns. The connection class's // destructor closes the socket. } } // namespace server3 } // namespace http asio-1.12.2/src/examples/cpp03/http/server3/connection.hpp000066400000000000000000000037711340672067200233210ustar00rootroot00000000000000// // connection.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_CONNECTION_HPP #define HTTP_SERVER3_CONNECTION_HPP #include #include #include #include #include #include "reply.hpp" #include "request.hpp" #include "request_handler.hpp" #include "request_parser.hpp" namespace http { namespace server3 { /// Represents a single connection from a client. class connection : public boost::enable_shared_from_this, private boost::noncopyable { public: /// Construct a connection with the given io_context. explicit connection(asio::io_context& io_context, request_handler& handler); /// Get the socket associated with the connection. asio::ip::tcp::socket& socket(); /// Start the first asynchronous operation for the connection. void start(); private: /// Handle completion of a read operation. void handle_read(const asio::error_code& e, std::size_t bytes_transferred); /// Handle completion of a write operation. void handle_write(const asio::error_code& e); /// Strand to ensure the connection's handlers are not called concurrently. asio::io_context::strand strand_; /// Socket for the connection. asio::ip::tcp::socket socket_; /// The handler used to process the incoming request. request_handler& request_handler_; /// Buffer for incoming data. boost::array buffer_; /// The incoming request. request request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. reply reply_; }; typedef boost::shared_ptr connection_ptr; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_CONNECTION_HPP asio-1.12.2/src/examples/cpp03/http/server3/header.hpp000066400000000000000000000010261340672067200224010ustar00rootroot00000000000000// // header.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_HEADER_HPP #define HTTP_SERVER3_HEADER_HPP #include namespace http { namespace server3 { struct header { std::string name; std::string value; }; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_HEADER_HPP asio-1.12.2/src/examples/cpp03/http/server3/main.cpp000066400000000000000000000021561340672067200220750ustar00rootroot00000000000000// // main.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include "server.hpp" int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 5) { std::cerr << "Usage: http_server
\n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 80 1 .\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 80 1 .\n"; return 1; } // Initialise the server. std::size_t num_threads = boost::lexical_cast(argv[3]); http::server3::server s(argv[1], argv[2], argv[4], num_threads); // Run the server until stopped. s.run(); } catch (std::exception& e) { std::cerr << "exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/http/server3/mime_types.cpp000066400000000000000000000016171340672067200233250ustar00rootroot00000000000000// // mime_types.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "mime_types.hpp" namespace http { namespace server3 { namespace mime_types { struct mapping { const char* extension; const char* mime_type; } mappings[] = { { "gif", "image/gif" }, { "htm", "text/html" }, { "html", "text/html" }, { "jpg", "image/jpeg" }, { "png", "image/png" }, { 0, 0 } // Marks end of list. }; std::string extension_to_type(const std::string& extension) { for (mapping* m = mappings; m->extension; ++m) { if (m->extension == extension) { return m->mime_type; } } return "text/plain"; } } // namespace mime_types } // namespace server3 } // namespace http asio-1.12.2/src/examples/cpp03/http/server3/mime_types.hpp000066400000000000000000000012131340672067200233220ustar00rootroot00000000000000// // mime_types.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_MIME_TYPES_HPP #define HTTP_SERVER3_MIME_TYPES_HPP #include namespace http { namespace server3 { namespace mime_types { /// Convert a file extension into a MIME type. std::string extension_to_type(const std::string& extension); } // namespace mime_types } // namespace server3 } // namespace http #endif // HTTP_SERVER3_MIME_TYPES_HPP asio-1.12.2/src/examples/cpp03/http/server3/reply.cpp000066400000000000000000000157101340672067200223040ustar00rootroot00000000000000// // reply.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "reply.hpp" #include #include namespace http { namespace server3 { namespace status_strings { const std::string ok = "HTTP/1.0 200 OK\r\n"; const std::string created = "HTTP/1.0 201 Created\r\n"; const std::string accepted = "HTTP/1.0 202 Accepted\r\n"; const std::string no_content = "HTTP/1.0 204 No Content\r\n"; const std::string multiple_choices = "HTTP/1.0 300 Multiple Choices\r\n"; const std::string moved_permanently = "HTTP/1.0 301 Moved Permanently\r\n"; const std::string moved_temporarily = "HTTP/1.0 302 Moved Temporarily\r\n"; const std::string not_modified = "HTTP/1.0 304 Not Modified\r\n"; const std::string bad_request = "HTTP/1.0 400 Bad Request\r\n"; const std::string unauthorized = "HTTP/1.0 401 Unauthorized\r\n"; const std::string forbidden = "HTTP/1.0 403 Forbidden\r\n"; const std::string not_found = "HTTP/1.0 404 Not Found\r\n"; const std::string internal_server_error = "HTTP/1.0 500 Internal Server Error\r\n"; const std::string not_implemented = "HTTP/1.0 501 Not Implemented\r\n"; const std::string bad_gateway = "HTTP/1.0 502 Bad Gateway\r\n"; const std::string service_unavailable = "HTTP/1.0 503 Service Unavailable\r\n"; asio::const_buffer to_buffer(reply::status_type status) { switch (status) { case reply::ok: return asio::buffer(ok); case reply::created: return asio::buffer(created); case reply::accepted: return asio::buffer(accepted); case reply::no_content: return asio::buffer(no_content); case reply::multiple_choices: return asio::buffer(multiple_choices); case reply::moved_permanently: return asio::buffer(moved_permanently); case reply::moved_temporarily: return asio::buffer(moved_temporarily); case reply::not_modified: return asio::buffer(not_modified); case reply::bad_request: return asio::buffer(bad_request); case reply::unauthorized: return asio::buffer(unauthorized); case reply::forbidden: return asio::buffer(forbidden); case reply::not_found: return asio::buffer(not_found); case reply::internal_server_error: return asio::buffer(internal_server_error); case reply::not_implemented: return asio::buffer(not_implemented); case reply::bad_gateway: return asio::buffer(bad_gateway); case reply::service_unavailable: return asio::buffer(service_unavailable); default: return asio::buffer(internal_server_error); } } } // namespace status_strings namespace misc_strings { const char name_value_separator[] = { ':', ' ' }; const char crlf[] = { '\r', '\n' }; } // namespace misc_strings std::vector reply::to_buffers() { std::vector buffers; buffers.push_back(status_strings::to_buffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { header& h = headers[i]; buffers.push_back(asio::buffer(h.name)); buffers.push_back(asio::buffer(misc_strings::name_value_separator)); buffers.push_back(asio::buffer(h.value)); buffers.push_back(asio::buffer(misc_strings::crlf)); } buffers.push_back(asio::buffer(misc_strings::crlf)); buffers.push_back(asio::buffer(content)); return buffers; } namespace stock_replies { const char ok[] = ""; const char created[] = "" "Created" "

201 Created

" ""; const char accepted[] = "" "Accepted" "

202 Accepted

" ""; const char no_content[] = "" "No Content" "

204 Content

" ""; const char multiple_choices[] = "" "Multiple Choices" "

300 Multiple Choices

" ""; const char moved_permanently[] = "" "Moved Permanently" "

301 Moved Permanently

" ""; const char moved_temporarily[] = "" "Moved Temporarily" "

302 Moved Temporarily

" ""; const char not_modified[] = "" "Not Modified" "

304 Not Modified

" ""; const char bad_request[] = "" "Bad Request" "

400 Bad Request

" ""; const char unauthorized[] = "" "Unauthorized" "

401 Unauthorized

" ""; const char forbidden[] = "" "Forbidden" "

403 Forbidden

" ""; const char not_found[] = "" "Not Found" "

404 Not Found

" ""; const char internal_server_error[] = "" "Internal Server Error" "

500 Internal Server Error

" ""; const char not_implemented[] = "" "Not Implemented" "

501 Not Implemented

" ""; const char bad_gateway[] = "" "Bad Gateway" "

502 Bad Gateway

" ""; const char service_unavailable[] = "" "Service Unavailable" "

503 Service Unavailable

" ""; std::string to_string(reply::status_type status) { switch (status) { case reply::ok: return ok; case reply::created: return created; case reply::accepted: return accepted; case reply::no_content: return no_content; case reply::multiple_choices: return multiple_choices; case reply::moved_permanently: return moved_permanently; case reply::moved_temporarily: return moved_temporarily; case reply::not_modified: return not_modified; case reply::bad_request: return bad_request; case reply::unauthorized: return unauthorized; case reply::forbidden: return forbidden; case reply::not_found: return not_found; case reply::internal_server_error: return internal_server_error; case reply::not_implemented: return not_implemented; case reply::bad_gateway: return bad_gateway; case reply::service_unavailable: return service_unavailable; default: return internal_server_error; } } } // namespace stock_replies reply reply::stock_reply(reply::status_type status) { reply rep; rep.status = status; rep.content = stock_replies::to_string(status); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = "text/html"; return rep; } } // namespace server3 } // namespace http asio-1.12.2/src/examples/cpp03/http/server3/reply.hpp000066400000000000000000000027651340672067200223170ustar00rootroot00000000000000// // reply.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_REPLY_HPP #define HTTP_SERVER3_REPLY_HPP #include #include #include #include "header.hpp" namespace http { namespace server3 { /// A reply to be sent to a client. struct reply { /// The status of the reply. enum status_type { ok = 200, created = 201, accepted = 202, no_content = 204, multiple_choices = 300, moved_permanently = 301, moved_temporarily = 302, not_modified = 304, bad_request = 400, unauthorized = 401, forbidden = 403, not_found = 404, internal_server_error = 500, not_implemented = 501, bad_gateway = 502, service_unavailable = 503 } status; /// The headers to be included in the reply. std::vector
headers; /// The content to be sent in the reply. std::string content; /// Convert the reply into a vector of buffers. The buffers do not own the /// underlying memory blocks, therefore the reply object must remain valid and /// not be changed until the write operation has completed. std::vector to_buffers(); /// Get a stock reply. static reply stock_reply(status_type status); }; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_REPLY_HPP asio-1.12.2/src/examples/cpp03/http/server3/request.hpp000066400000000000000000000012751340672067200226470ustar00rootroot00000000000000// // request.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_REQUEST_HPP #define HTTP_SERVER3_REQUEST_HPP #include #include #include "header.hpp" namespace http { namespace server3 { /// A request received from a client. struct request { std::string method; std::string uri; int http_version_major; int http_version_minor; std::vector
headers; }; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_REQUEST_HPP asio-1.12.2/src/examples/cpp03/http/server3/request_handler.cpp000066400000000000000000000056201340672067200243350ustar00rootroot00000000000000// // request_handler.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_handler.hpp" #include #include #include #include #include "mime_types.hpp" #include "reply.hpp" #include "request.hpp" namespace http { namespace server3 { request_handler::request_handler(const std::string& doc_root) : doc_root_(doc_root) { } void request_handler::handle_request(const request& req, reply& rep) { // Decode url to path. std::string request_path; if (!url_decode(req.uri, request_path)) { rep = reply::stock_reply(reply::bad_request); return; } // Request path must be absolute and not contain "..". if (request_path.empty() || request_path[0] != '/' || request_path.find("..") != std::string::npos) { rep = reply::stock_reply(reply::bad_request); return; } // If path ends in slash (i.e. is a directory) then add "index.html". if (request_path[request_path.size() - 1] == '/') { request_path += "index.html"; } // Determine the file extension. std::size_t last_slash_pos = request_path.find_last_of("/"); std::size_t last_dot_pos = request_path.find_last_of("."); std::string extension; if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) { extension = request_path.substr(last_dot_pos + 1); } // Open the file to send back. std::string full_path = doc_root_ + request_path; std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); if (!is) { rep = reply::stock_reply(reply::not_found); return; } // Fill out the reply to be sent to the client. rep.status = reply::ok; char buf[512]; while (is.read(buf, sizeof(buf)).gcount() > 0) rep.content.append(buf, is.gcount()); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = mime_types::extension_to_type(extension); } bool request_handler::url_decode(const std::string& in, std::string& out) { out.clear(); out.reserve(in.size()); for (std::size_t i = 0; i < in.size(); ++i) { if (in[i] == '%') { if (i + 3 <= in.size()) { int value = 0; std::istringstream is(in.substr(i + 1, 2)); if (is >> std::hex >> value) { out += static_cast(value); i += 2; } else { return false; } } else { return false; } } else if (in[i] == '+') { out += ' '; } else { out += in[i]; } } return true; } } // namespace server3 } // namespace http asio-1.12.2/src/examples/cpp03/http/server3/request_handler.hpp000066400000000000000000000022171340672067200243410ustar00rootroot00000000000000// // request_handler.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_REQUEST_HANDLER_HPP #define HTTP_SERVER3_REQUEST_HANDLER_HPP #include #include namespace http { namespace server3 { struct reply; struct request; /// The common handler for all incoming requests. class request_handler : private boost::noncopyable { public: /// Construct with a directory containing files to be served. explicit request_handler(const std::string& doc_root); /// Handle a request and produce a reply. void handle_request(const request& req, reply& rep); private: /// The directory containing the files to be served. std::string doc_root_; /// Perform URL-decoding on a string. Returns false if the encoding was /// invalid. static bool url_decode(const std::string& in, std::string& out); }; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_REQUEST_HANDLER_HPP asio-1.12.2/src/examples/cpp03/http/server3/request_parser.cpp000066400000000000000000000141341340672067200242140ustar00rootroot00000000000000// // request_parser.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_parser.hpp" #include "request.hpp" namespace http { namespace server3 { request_parser::request_parser() : state_(method_start) { } void request_parser::reset() { state_ = method_start; } boost::tribool request_parser::consume(request& req, char input) { switch (state_) { case method_start: if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { state_ = method; req.method.push_back(input); return boost::indeterminate; } case method: if (input == ' ') { state_ = uri; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.method.push_back(input); return boost::indeterminate; } case uri: if (input == ' ') { state_ = http_version_h; return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { req.uri.push_back(input); return boost::indeterminate; } case http_version_h: if (input == 'H') { state_ = http_version_t_1; return boost::indeterminate; } else { return false; } case http_version_t_1: if (input == 'T') { state_ = http_version_t_2; return boost::indeterminate; } else { return false; } case http_version_t_2: if (input == 'T') { state_ = http_version_p; return boost::indeterminate; } else { return false; } case http_version_p: if (input == 'P') { state_ = http_version_slash; return boost::indeterminate; } else { return false; } case http_version_slash: if (input == '/') { req.http_version_major = 0; req.http_version_minor = 0; state_ = http_version_major_start; return boost::indeterminate; } else { return false; } case http_version_major_start: if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; state_ = http_version_major; return boost::indeterminate; } else { return false; } case http_version_major: if (input == '.') { state_ = http_version_minor_start; return boost::indeterminate; } else if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; return boost::indeterminate; } else { return false; } case http_version_minor_start: if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; state_ = http_version_minor; return boost::indeterminate; } else { return false; } case http_version_minor: if (input == '\r') { state_ = expecting_newline_1; return boost::indeterminate; } else if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; return boost::indeterminate; } else { return false; } case expecting_newline_1: if (input == '\n') { state_ = header_line_start; return boost::indeterminate; } else { return false; } case header_line_start: if (input == '\r') { state_ = expecting_newline_3; return boost::indeterminate; } else if (!req.headers.empty() && (input == ' ' || input == '\t')) { state_ = header_lws; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.headers.push_back(header()); req.headers.back().name.push_back(input); state_ = header_name; return boost::indeterminate; } case header_lws: if (input == '\r') { state_ = expecting_newline_2; return boost::indeterminate; } else if (input == ' ' || input == '\t') { return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { state_ = header_value; req.headers.back().value.push_back(input); return boost::indeterminate; } case header_name: if (input == ':') { state_ = space_before_header_value; return boost::indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return false; } else { req.headers.back().name.push_back(input); return boost::indeterminate; } case space_before_header_value: if (input == ' ') { state_ = header_value; return boost::indeterminate; } else { return false; } case header_value: if (input == '\r') { state_ = expecting_newline_2; return boost::indeterminate; } else if (is_ctl(input)) { return false; } else { req.headers.back().value.push_back(input); return boost::indeterminate; } case expecting_newline_2: if (input == '\n') { state_ = header_line_start; return boost::indeterminate; } else { return false; } case expecting_newline_3: return (input == '\n'); default: return false; } } bool request_parser::is_char(int c) { return c >= 0 && c <= 127; } bool request_parser::is_ctl(int c) { return (c >= 0 && c <= 31) || (c == 127); } bool request_parser::is_tspecial(int c) { switch (c) { case '(': case ')': case '<': case '>': case '@': case ',': case ';': case ':': case '\\': case '"': case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': return true; default: return false; } } bool request_parser::is_digit(int c) { return c >= '0' && c <= '9'; } } // namespace server3 } // namespace http asio-1.12.2/src/examples/cpp03/http/server3/request_parser.hpp000066400000000000000000000045311340672067200242210ustar00rootroot00000000000000// // request_parser.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_REQUEST_PARSER_HPP #define HTTP_SERVER3_REQUEST_PARSER_HPP #include #include namespace http { namespace server3 { struct request; /// Parser for incoming requests. class request_parser { public: /// Construct ready to parse the request method. request_parser(); /// Reset to initial parser state. void reset(); /// Parse some data. The tribool return value is true when a complete request /// has been parsed, false if the data is invalid, indeterminate when more /// data is required. The InputIterator return value indicates how much of the /// input has been consumed. template boost::tuple parse(request& req, InputIterator begin, InputIterator end) { while (begin != end) { boost::tribool result = consume(req, *begin++); if (result || !result) return boost::make_tuple(result, begin); } boost::tribool result = boost::indeterminate; return boost::make_tuple(result, begin); } private: /// Handle the next character of input. boost::tribool consume(request& req, char input); /// Check if a byte is an HTTP character. static bool is_char(int c); /// Check if a byte is an HTTP control character. static bool is_ctl(int c); /// Check if a byte is defined as an HTTP tspecial character. static bool is_tspecial(int c); /// Check if a byte is a digit. static bool is_digit(int c); /// The current state of the parser. enum state { method_start, method, uri, http_version_h, http_version_t_1, http_version_t_2, http_version_p, http_version_slash, http_version_major_start, http_version_major, http_version_minor_start, http_version_minor, expecting_newline_1, header_line_start, header_lws, header_name, space_before_header_value, header_value, expecting_newline_2, expecting_newline_3 } state_; }; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_REQUEST_PARSER_HPP asio-1.12.2/src/examples/cpp03/http/server3/server.cpp000066400000000000000000000046271340672067200224640ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "server.hpp" #include #include #include namespace http { namespace server3 { server::server(const std::string& address, const std::string& port, const std::string& doc_root, std::size_t thread_pool_size) : thread_pool_size_(thread_pool_size), signals_(io_context_), acceptor_(io_context_), new_connection_(), request_handler_(doc_root) { // Register to handle the signals that indicate when the server should exit. // It is safe to register for the same signal multiple times in a program, // provided all registration for the specified signal is made through Asio. signals_.add(SIGINT); signals_.add(SIGTERM); #if defined(SIGQUIT) signals_.add(SIGQUIT); #endif // defined(SIGQUIT) signals_.async_wait(boost::bind(&server::handle_stop, this)); // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). asio::ip::tcp::resolver resolver(io_context_); asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin(); acceptor_.open(endpoint.protocol()); acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); acceptor_.bind(endpoint); acceptor_.listen(); start_accept(); } void server::run() { // Create a pool of threads to run all of the io_contexts. std::vector > threads; for (std::size_t i = 0; i < thread_pool_size_; ++i) { boost::shared_ptr thread(new asio::thread( boost::bind(&asio::io_context::run, &io_context_))); threads.push_back(thread); } // Wait for all threads in the pool to exit. for (std::size_t i = 0; i < threads.size(); ++i) threads[i]->join(); } void server::start_accept() { new_connection_.reset(new connection(io_context_, request_handler_)); acceptor_.async_accept(new_connection_->socket(), boost::bind(&server::handle_accept, this, asio::placeholders::error)); } void server::handle_accept(const asio::error_code& e) { if (!e) { new_connection_->start(); } start_accept(); } void server::handle_stop() { io_context_.stop(); } } // namespace server3 } // namespace http asio-1.12.2/src/examples/cpp03/http/server3/server.hpp000066400000000000000000000035131340672067200224620ustar00rootroot00000000000000// // server.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER3_SERVER_HPP #define HTTP_SERVER3_SERVER_HPP #include #include #include #include #include #include "connection.hpp" #include "request_handler.hpp" namespace http { namespace server3 { /// The top-level class of the HTTP server. class server : private boost::noncopyable { public: /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit server(const std::string& address, const std::string& port, const std::string& doc_root, std::size_t thread_pool_size); /// Run the server's io_context loop. void run(); private: /// Initiate an asynchronous accept operation. void start_accept(); /// Handle completion of an asynchronous accept operation. void handle_accept(const asio::error_code& e); /// Handle a request to stop the server. void handle_stop(); /// The number of threads that will call io_context::run(). std::size_t thread_pool_size_; /// The io_context used to perform asynchronous operations. asio::io_context io_context_; /// The signal_set is used to register for process termination notifications. asio::signal_set signals_; /// Acceptor used to listen for incoming connections. asio::ip::tcp::acceptor acceptor_; /// The next connection to be accepted. connection_ptr new_connection_; /// The handler for all incoming requests. request_handler request_handler_; }; } // namespace server3 } // namespace http #endif // HTTP_SERVER3_SERVER_HPP asio-1.12.2/src/examples/cpp03/http/server4/000077500000000000000000000000001340672067200204425ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/http/server4/file_handler.cpp000066400000000000000000000055671340672067200235770ustar00rootroot00000000000000// // file_handler.cpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "file_handler.hpp" #include #include #include #include #include "mime_types.hpp" #include "reply.hpp" #include "request.hpp" namespace http { namespace server4 { file_handler::file_handler(const std::string& doc_root) : doc_root_(doc_root) { } void file_handler::operator()(const request& req, reply& rep) { // Decode url to path. std::string request_path; if (!url_decode(req.uri, request_path)) { rep = reply::stock_reply(reply::bad_request); return; } // Request path must be absolute and not contain "..". if (request_path.empty() || request_path[0] != '/' || request_path.find("..") != std::string::npos) { rep = reply::stock_reply(reply::bad_request); return; } // If path ends in slash (i.e. is a directory) then add "index.html". if (request_path[request_path.size() - 1] == '/') { request_path += "index.html"; } // Determine the file extension. std::size_t last_slash_pos = request_path.find_last_of("/"); std::size_t last_dot_pos = request_path.find_last_of("."); std::string extension; if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) { extension = request_path.substr(last_dot_pos + 1); } // Open the file to send back. std::string full_path = doc_root_ + request_path; std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); if (!is) { rep = reply::stock_reply(reply::not_found); return; } // Fill out the reply to be sent to the client. rep.status = reply::ok; char buf[512]; while (is.read(buf, sizeof(buf)).gcount() > 0) rep.content.append(buf, is.gcount()); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = mime_types::extension_to_type(extension); } bool file_handler::url_decode(const std::string& in, std::string& out) { out.clear(); out.reserve(in.size()); for (std::size_t i = 0; i < in.size(); ++i) { if (in[i] == '%') { if (i + 3 <= in.size()) { int value = 0; std::istringstream is(in.substr(i + 1, 2)); if (is >> std::hex >> value) { out += static_cast(value); i += 2; } else { return false; } } else { return false; } } else if (in[i] == '+') { out += ' '; } else { out += in[i]; } } return true; } } // namespace server4 } // namespace http asio-1.12.2/src/examples/cpp03/http/server4/file_handler.hpp000066400000000000000000000020661340672067200235730ustar00rootroot00000000000000// // file_handler.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_FILE_HANDLER_HPP #define HTTP_SERVER4_FILE_HANDLER_HPP #include namespace http { namespace server4 { struct reply; struct request; /// The common handler for all incoming requests. class file_handler { public: /// Construct with a directory containing files to be served. explicit file_handler(const std::string& doc_root); /// Handle a request and produce a reply. void operator()(const request& req, reply& rep); private: /// The directory containing the files to be served. std::string doc_root_; /// Perform URL-decoding on a string. Returns false if the encoding was /// invalid. static bool url_decode(const std::string& in, std::string& out); }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_FILE_HANDLER_HPP asio-1.12.2/src/examples/cpp03/http/server4/header.hpp000066400000000000000000000010261340672067200224020ustar00rootroot00000000000000// // header.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_HEADER_HPP #define HTTP_SERVER4_HEADER_HPP #include namespace http { namespace server4 { struct header { std::string name; std::string value; }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_HEADER_HPP asio-1.12.2/src/examples/cpp03/http/server4/main.cpp000066400000000000000000000026261340672067200221000ustar00rootroot00000000000000// // main.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "server.hpp" #include "file_handler.hpp" int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 4) { std::cerr << "Usage: http_server
\n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 80 .\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 80 .\n"; return 1; } asio::io_context io_context; // Launch the initial server coroutine. http::server4::server(io_context, argv[1], argv[2], http::server4::file_handler(argv[3]))(); // Wait for signals indicating time to shut down. asio::signal_set signals(io_context); signals.add(SIGINT); signals.add(SIGTERM); #if defined(SIGQUIT) signals.add(SIGQUIT); #endif // defined(SIGQUIT) signals.async_wait(boost::bind( &asio::io_context::stop, &io_context)); // Run the server. io_context.run(); } catch (std::exception& e) { std::cerr << "exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/http/server4/mime_types.cpp000066400000000000000000000016171340672067200233260ustar00rootroot00000000000000// // mime_types.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "mime_types.hpp" namespace http { namespace server4 { namespace mime_types { struct mapping { const char* extension; const char* mime_type; } mappings[] = { { "gif", "image/gif" }, { "htm", "text/html" }, { "html", "text/html" }, { "jpg", "image/jpeg" }, { "png", "image/png" }, { 0, 0 } // Marks end of list. }; std::string extension_to_type(const std::string& extension) { for (mapping* m = mappings; m->extension; ++m) { if (m->extension == extension) { return m->mime_type; } } return "text/plain"; } } // namespace mime_types } // namespace server4 } // namespace http asio-1.12.2/src/examples/cpp03/http/server4/mime_types.hpp000066400000000000000000000012131340672067200233230ustar00rootroot00000000000000// // mime_types.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_MIME_TYPES_HPP #define HTTP_SERVER4_MIME_TYPES_HPP #include namespace http { namespace server4 { namespace mime_types { /// Convert a file extension into a MIME type. std::string extension_to_type(const std::string& extension); } // namespace mime_types } // namespace server4 } // namespace http #endif // HTTP_SERVER4_MIME_TYPES_HPP asio-1.12.2/src/examples/cpp03/http/server4/reply.cpp000066400000000000000000000157101340672067200223050ustar00rootroot00000000000000// // reply.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "reply.hpp" #include #include namespace http { namespace server4 { namespace status_strings { const std::string ok = "HTTP/1.0 200 OK\r\n"; const std::string created = "HTTP/1.0 201 Created\r\n"; const std::string accepted = "HTTP/1.0 202 Accepted\r\n"; const std::string no_content = "HTTP/1.0 204 No Content\r\n"; const std::string multiple_choices = "HTTP/1.0 300 Multiple Choices\r\n"; const std::string moved_permanently = "HTTP/1.0 301 Moved Permanently\r\n"; const std::string moved_temporarily = "HTTP/1.0 302 Moved Temporarily\r\n"; const std::string not_modified = "HTTP/1.0 304 Not Modified\r\n"; const std::string bad_request = "HTTP/1.0 400 Bad Request\r\n"; const std::string unauthorized = "HTTP/1.0 401 Unauthorized\r\n"; const std::string forbidden = "HTTP/1.0 403 Forbidden\r\n"; const std::string not_found = "HTTP/1.0 404 Not Found\r\n"; const std::string internal_server_error = "HTTP/1.0 500 Internal Server Error\r\n"; const std::string not_implemented = "HTTP/1.0 501 Not Implemented\r\n"; const std::string bad_gateway = "HTTP/1.0 502 Bad Gateway\r\n"; const std::string service_unavailable = "HTTP/1.0 503 Service Unavailable\r\n"; asio::const_buffer to_buffer(reply::status_type status) { switch (status) { case reply::ok: return asio::buffer(ok); case reply::created: return asio::buffer(created); case reply::accepted: return asio::buffer(accepted); case reply::no_content: return asio::buffer(no_content); case reply::multiple_choices: return asio::buffer(multiple_choices); case reply::moved_permanently: return asio::buffer(moved_permanently); case reply::moved_temporarily: return asio::buffer(moved_temporarily); case reply::not_modified: return asio::buffer(not_modified); case reply::bad_request: return asio::buffer(bad_request); case reply::unauthorized: return asio::buffer(unauthorized); case reply::forbidden: return asio::buffer(forbidden); case reply::not_found: return asio::buffer(not_found); case reply::internal_server_error: return asio::buffer(internal_server_error); case reply::not_implemented: return asio::buffer(not_implemented); case reply::bad_gateway: return asio::buffer(bad_gateway); case reply::service_unavailable: return asio::buffer(service_unavailable); default: return asio::buffer(internal_server_error); } } } // namespace status_strings namespace misc_strings { const char name_value_separator[] = { ':', ' ' }; const char crlf[] = { '\r', '\n' }; } // namespace misc_strings std::vector reply::to_buffers() { std::vector buffers; buffers.push_back(status_strings::to_buffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { header& h = headers[i]; buffers.push_back(asio::buffer(h.name)); buffers.push_back(asio::buffer(misc_strings::name_value_separator)); buffers.push_back(asio::buffer(h.value)); buffers.push_back(asio::buffer(misc_strings::crlf)); } buffers.push_back(asio::buffer(misc_strings::crlf)); buffers.push_back(asio::buffer(content)); return buffers; } namespace stock_replies { const char ok[] = ""; const char created[] = "" "Created" "

201 Created

" ""; const char accepted[] = "" "Accepted" "

202 Accepted

" ""; const char no_content[] = "" "No Content" "

204 Content

" ""; const char multiple_choices[] = "" "Multiple Choices" "

300 Multiple Choices

" ""; const char moved_permanently[] = "" "Moved Permanently" "

301 Moved Permanently

" ""; const char moved_temporarily[] = "" "Moved Temporarily" "

302 Moved Temporarily

" ""; const char not_modified[] = "" "Not Modified" "

304 Not Modified

" ""; const char bad_request[] = "" "Bad Request" "

400 Bad Request

" ""; const char unauthorized[] = "" "Unauthorized" "

401 Unauthorized

" ""; const char forbidden[] = "" "Forbidden" "

403 Forbidden

" ""; const char not_found[] = "" "Not Found" "

404 Not Found

" ""; const char internal_server_error[] = "" "Internal Server Error" "

500 Internal Server Error

" ""; const char not_implemented[] = "" "Not Implemented" "

501 Not Implemented

" ""; const char bad_gateway[] = "" "Bad Gateway" "

502 Bad Gateway

" ""; const char service_unavailable[] = "" "Service Unavailable" "

503 Service Unavailable

" ""; std::string to_string(reply::status_type status) { switch (status) { case reply::ok: return ok; case reply::created: return created; case reply::accepted: return accepted; case reply::no_content: return no_content; case reply::multiple_choices: return multiple_choices; case reply::moved_permanently: return moved_permanently; case reply::moved_temporarily: return moved_temporarily; case reply::not_modified: return not_modified; case reply::bad_request: return bad_request; case reply::unauthorized: return unauthorized; case reply::forbidden: return forbidden; case reply::not_found: return not_found; case reply::internal_server_error: return internal_server_error; case reply::not_implemented: return not_implemented; case reply::bad_gateway: return bad_gateway; case reply::service_unavailable: return service_unavailable; default: return internal_server_error; } } } // namespace stock_replies reply reply::stock_reply(reply::status_type status) { reply rep; rep.status = status; rep.content = stock_replies::to_string(status); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = boost::lexical_cast(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = "text/html"; return rep; } } // namespace server4 } // namespace http asio-1.12.2/src/examples/cpp03/http/server4/reply.hpp000066400000000000000000000027651340672067200223200ustar00rootroot00000000000000// // reply.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_REPLY_HPP #define HTTP_SERVER4_REPLY_HPP #include #include #include #include "header.hpp" namespace http { namespace server4 { /// A reply to be sent to a client. struct reply { /// The status of the reply. enum status_type { ok = 200, created = 201, accepted = 202, no_content = 204, multiple_choices = 300, moved_permanently = 301, moved_temporarily = 302, not_modified = 304, bad_request = 400, unauthorized = 401, forbidden = 403, not_found = 404, internal_server_error = 500, not_implemented = 501, bad_gateway = 502, service_unavailable = 503 } status; /// The headers to be included in the reply. std::vector
headers; /// The content to be sent in the reply. std::string content; /// Convert the reply into a vector of buffers. The buffers do not own the /// underlying memory blocks, therefore the reply object must remain valid and /// not be changed until the write operation has completed. std::vector to_buffers(); /// Get a stock reply. static reply stock_reply(status_type status); }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_REPLY_HPP asio-1.12.2/src/examples/cpp03/http/server4/request.hpp000066400000000000000000000017541340672067200226520ustar00rootroot00000000000000// // request.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_REQUEST_HPP #define HTTP_SERVER4_REQUEST_HPP #include #include #include "header.hpp" namespace http { namespace server4 { /// A request received from a client. struct request { /// The request method, e.g. "GET", "POST". std::string method; /// The requested URI, such as a path to a file. std::string uri; /// Major version number, usually 1. int http_version_major; /// Minor version number, usually 0 or 1. int http_version_minor; /// The headers included with the request. std::vector
headers; /// The optional content sent with the request. std::string content; }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_REQUEST_HPP asio-1.12.2/src/examples/cpp03/http/server4/request_parser.cpp000066400000000000000000000126031340672067200242140ustar00rootroot00000000000000// // request_parser.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_parser.hpp" #include #include #include #include "request.hpp" namespace http { namespace server4 { // Enable the pseudo-keywords reenter, yield and fork. #include std::string request_parser::content_length_name_ = "Content-Length"; boost::tribool request_parser::consume(request& req, char c) { reenter (this) { req.method.clear(); req.uri.clear(); req.http_version_major = 0; req.http_version_minor = 0; req.headers.clear(); req.content.clear(); content_length_ = 0; // Request method. while (is_char(c) && !is_ctl(c) && !is_tspecial(c) && c != ' ') { req.method.push_back(c); yield return boost::indeterminate; } if (req.method.empty()) return false; // Space. if (c != ' ') return false; yield return boost::indeterminate; // URI. while (!is_ctl(c) && c != ' ') { req.uri.push_back(c); yield return boost::indeterminate; } if (req.uri.empty()) return false; // Space. if (c != ' ') return false; yield return boost::indeterminate; // HTTP protocol identifier. if (c != 'H') return false; yield return boost::indeterminate; if (c != 'T') return false; yield return boost::indeterminate; if (c != 'T') return false; yield return boost::indeterminate; if (c != 'P') return false; yield return boost::indeterminate; // Slash. if (c != '/') return false; yield return boost::indeterminate; // Major version number. if (!is_digit(c)) return false; while (is_digit(c)) { req.http_version_major = req.http_version_major * 10 + c - '0'; yield return boost::indeterminate; } // Dot. if (c != '.') return false; yield return boost::indeterminate; // Minor version number. if (!is_digit(c)) return false; while (is_digit(c)) { req.http_version_minor = req.http_version_minor * 10 + c - '0'; yield return boost::indeterminate; } // CRLF. if (c != '\r') return false; yield return boost::indeterminate; if (c != '\n') return false; yield return boost::indeterminate; // Headers. while ((is_char(c) && !is_ctl(c) && !is_tspecial(c) && c != '\r') || (c == ' ' || c == '\t')) { if (c == ' ' || c == '\t') { // Leading whitespace. Must be continuation of previous header's value. if (req.headers.empty()) return false; while (c == ' ' || c == '\t') yield return boost::indeterminate; } else { // Start the next header. req.headers.push_back(header()); // Header name. while (is_char(c) && !is_ctl(c) && !is_tspecial(c) && c != ':') { req.headers.back().name.push_back(c); yield return boost::indeterminate; } // Colon and space separates the header name from the header value. if (c != ':') return false; yield return boost::indeterminate; if (c != ' ') return false; yield return boost::indeterminate; } // Header value. while (is_char(c) && !is_ctl(c) && c != '\r') { req.headers.back().value.push_back(c); yield return boost::indeterminate; } // CRLF. if (c != '\r') return false; yield return boost::indeterminate; if (c != '\n') return false; yield return boost::indeterminate; } // CRLF. if (c != '\r') return false; yield return boost::indeterminate; if (c != '\n') return false; // Check for optional Content-Length header. for (std::size_t i = 0; i < req.headers.size(); ++i) { if (headers_equal(req.headers[i].name, content_length_name_)) { try { content_length_ = boost::lexical_cast(req.headers[i].value); } catch (boost::bad_lexical_cast&) { return false; } } } // Content. while (req.content.size() < content_length_) { yield return boost::indeterminate; req.content.push_back(c); } } return true; } // Disable the pseudo-keywords reenter, yield and fork. #include bool request_parser::is_char(int c) { return c >= 0 && c <= 127; } bool request_parser::is_ctl(int c) { return (c >= 0 && c <= 31) || (c == 127); } bool request_parser::is_tspecial(int c) { switch (c) { case '(': case ')': case '<': case '>': case '@': case ',': case ';': case ':': case '\\': case '"': case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': return true; default: return false; } } bool request_parser::is_digit(int c) { return c >= '0' && c <= '9'; } bool request_parser::tolower_compare(char a, char b) { return std::tolower(a) == std::tolower(b); } bool request_parser::headers_equal(const std::string& a, const std::string& b) { if (a.length() != b.length()) return false; return std::equal(a.begin(), a.end(), b.begin(), &request_parser::tolower_compare); } } // namespace server4 } // namespace http asio-1.12.2/src/examples/cpp03/http/server4/request_parser.hpp000066400000000000000000000043101340672067200242150ustar00rootroot00000000000000// // request_parser.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_REQUEST_PARSER_HPP #define HTTP_SERVER4_REQUEST_PARSER_HPP #include #include #include #include namespace http { namespace server4 { struct request; /// Parser for incoming requests. class request_parser : asio::coroutine { public: /// Parse some data. The tribool return value is true when a complete request /// has been parsed, false if the data is invalid, indeterminate when more /// data is required. The InputIterator return value indicates how much of the /// input has been consumed. template boost::tuple parse(request& req, InputIterator begin, InputIterator end) { while (begin != end) { boost::tribool result = consume(req, *begin++); if (result || !result) return boost::make_tuple(result, begin); } boost::tribool result = boost::indeterminate; return boost::make_tuple(result, begin); } private: /// The name of the content length header. static std::string content_length_name_; /// Content length as decoded from headers. Defaults to 0. std::size_t content_length_; /// Handle the next character of input. boost::tribool consume(request& req, char input); /// Check if a byte is an HTTP character. static bool is_char(int c); /// Check if a byte is an HTTP control character. static bool is_ctl(int c); /// Check if a byte is defined as an HTTP tspecial character. static bool is_tspecial(int c); /// Check if a byte is a digit. static bool is_digit(int c); /// Check if two characters are equal, without regard to case. static bool tolower_compare(char a, char b); /// Check whether the two request header names match. bool headers_equal(const std::string& a, const std::string& b); }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_REQUEST_PARSER_HPP asio-1.12.2/src/examples/cpp03/http/server4/server.cpp000066400000000000000000000110131340672067200224500ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "server.hpp" #include "request.hpp" #include "reply.hpp" namespace http { namespace server4 { server::server(asio::io_context& io_context, const std::string& address, const std::string& port, boost::function request_handler) : request_handler_(request_handler) { tcp::resolver resolver(io_context); asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin(); acceptor_.reset(new tcp::acceptor(io_context, endpoint)); } // Enable the pseudo-keywords reenter, yield and fork. #include void server::operator()(asio::error_code ec, std::size_t length) { // In this example we keep the error handling code in one place by // hoisting it outside the coroutine. An alternative approach would be to // check the value of ec after each yield for an asynchronous operation. if (!ec) { // On reentering a coroutine, control jumps to the location of the last // yield or fork. The argument to the "reenter" pseudo-keyword can be a // pointer or reference to an object of type coroutine. reenter (this) { // Loop to accept incoming connections. do { // Create a new socket for the next incoming connection. socket_.reset(new tcp::socket(acceptor_->get_executor().context())); // Accept a new connection. The "yield" pseudo-keyword saves the current // line number and exits the coroutine's "reenter" block. We use the // server coroutine as the completion handler for the async_accept // operation. When the asynchronous operation completes, the io_context // invokes the function call operator, we "reenter" the coroutine, and // then control resumes at the following line. yield acceptor_->async_accept(*socket_, *this); // We "fork" by cloning a new server coroutine to handle the connection. // After forking we have a parent coroutine and a child coroutine. Both // parent and child continue execution at the following line. They can // be distinguished using the functions coroutine::is_parent() and // coroutine::is_child(). fork server(*this)(); // The parent continues looping to accept the next incoming connection. // The child exits the loop and processes the connection. } while (is_parent()); // Create the objects needed to receive a request on the connection. buffer_.reset(new boost::array); request_.reset(new request); // Loop until a complete request (or an invalid one) has been received. do { // Receive some more data. When control resumes at the following line, // the ec and length parameters reflect the result of the asynchronous // operation. yield socket_->async_read_some(asio::buffer(*buffer_), *this); // Parse the data we just received. boost::tie(valid_request_, boost::tuples::ignore) = request_parser_.parse(*request_, buffer_->data(), buffer_->data() + length); // An indeterminate result means we need more data, so keep looping. } while (boost::indeterminate(valid_request_)); // Create the reply object that will be sent back to the client. reply_.reset(new reply); if (valid_request_) { // A valid request was received. Call the user-supplied function object // to process the request and compose a reply. request_handler_(*request_, *reply_); } else { // The request was invalid. *reply_ = reply::stock_reply(reply::bad_request); } // Send the reply back to the client. yield asio::async_write(*socket_, reply_->to_buffers(), *this); // Initiate graceful connection closure. socket_->shutdown(tcp::socket::shutdown_both, ec); } } // If an error occurs then the coroutine is not reentered. Consequently, no // new asynchronous operations are started. This means that all shared_ptr // references will disappear and the resources associated with the coroutine // will be destroyed automatically after this function call returns. } // Disable the pseudo-keywords reenter, yield and fork. #include } // namespace server4 } // namespace http asio-1.12.2/src/examples/cpp03/http/server4/server.hpp000066400000000000000000000036201340672067200224620ustar00rootroot00000000000000// // server.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER4_SERVER_HPP #define HTTP_SERVER4_SERVER_HPP #include #include #include #include #include #include "request_parser.hpp" namespace http { namespace server4 { struct request; struct reply; /// The top-level coroutine of the HTTP server. class server : asio::coroutine { public: /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit server(asio::io_context& io_context, const std::string& address, const std::string& port, boost::function request_handler); /// Perform work associated with the server. void operator()( asio::error_code ec = asio::error_code(), std::size_t length = 0); private: typedef asio::ip::tcp tcp; /// The user-supplied handler for all incoming requests. boost::function request_handler_; /// Acceptor used to listen for incoming connections. boost::shared_ptr acceptor_; /// The current connection from a client. boost::shared_ptr socket_; /// Buffer for incoming data. boost::shared_ptr > buffer_; /// The incoming request. boost::shared_ptr request_; /// Whether the request is valid or not. boost::tribool valid_request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. boost::shared_ptr reply_; }; } // namespace server4 } // namespace http #endif // HTTP_SERVER4_SERVER_HPP asio-1.12.2/src/examples/cpp03/icmp/000077500000000000000000000000001340672067200170215ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/icmp/icmp_header.hpp000066400000000000000000000064101340672067200217730ustar00rootroot00000000000000// // icmp_header.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ICMP_HEADER_HPP #define ICMP_HEADER_HPP #include #include #include // ICMP header for both IPv4 and IPv6. // // The wire format of an ICMP header is: // // 0 8 16 31 // +---------------+---------------+------------------------------+ --- // | | | | ^ // | type | code | checksum | | // | | | | | // +---------------+---------------+------------------------------+ 8 bytes // | | | | // | identifier | sequence number | | // | | | v // +-------------------------------+------------------------------+ --- class icmp_header { public: enum { echo_reply = 0, destination_unreachable = 3, source_quench = 4, redirect = 5, echo_request = 8, time_exceeded = 11, parameter_problem = 12, timestamp_request = 13, timestamp_reply = 14, info_request = 15, info_reply = 16, address_request = 17, address_reply = 18 }; icmp_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); } unsigned char type() const { return rep_[0]; } unsigned char code() const { return rep_[1]; } unsigned short checksum() const { return decode(2, 3); } unsigned short identifier() const { return decode(4, 5); } unsigned short sequence_number() const { return decode(6, 7); } void type(unsigned char n) { rep_[0] = n; } void code(unsigned char n) { rep_[1] = n; } void checksum(unsigned short n) { encode(2, 3, n); } void identifier(unsigned short n) { encode(4, 5, n); } void sequence_number(unsigned short n) { encode(6, 7, n); } friend std::istream& operator>>(std::istream& is, icmp_header& header) { return is.read(reinterpret_cast(header.rep_), 8); } friend std::ostream& operator<<(std::ostream& os, const icmp_header& header) { return os.write(reinterpret_cast(header.rep_), 8); } private: unsigned short decode(int a, int b) const { return (rep_[a] << 8) + rep_[b]; } void encode(int a, int b, unsigned short n) { rep_[a] = static_cast(n >> 8); rep_[b] = static_cast(n & 0xFF); } unsigned char rep_[8]; }; template void compute_checksum(icmp_header& header, Iterator body_begin, Iterator body_end) { unsigned int sum = (header.type() << 8) + header.code() + header.identifier() + header.sequence_number(); Iterator body_iter = body_begin; while (body_iter != body_end) { sum += (static_cast(*body_iter++) << 8); if (body_iter != body_end) sum += static_cast(*body_iter++); } sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); header.checksum(static_cast(~sum)); } #endif // ICMP_HEADER_HPP asio-1.12.2/src/examples/cpp03/icmp/ipv4_header.hpp000066400000000000000000000105641340672067200217320ustar00rootroot00000000000000// // ipv4_header.hpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef IPV4_HEADER_HPP #define IPV4_HEADER_HPP #include #include // Packet header for IPv4. // // The wire format of an IPv4 header is: // // 0 8 16 31 // +-------+-------+---------------+------------------------------+ --- // | | | | | ^ // |version|header | type of | total length in bytes | | // | (4) | length| service | | | // +-------+-------+---------------+-+-+-+------------------------+ | // | | | | | | | // | identification |0|D|M| fragment offset | | // | | |F|F| | | // +---------------+---------------+-+-+-+------------------------+ | // | | | | | // | time to live | protocol | header checksum | 20 bytes // | | | | | // +---------------+---------------+------------------------------+ | // | | | // | source IPv4 address | | // | | | // +--------------------------------------------------------------+ | // | | | // | destination IPv4 address | | // | | v // +--------------------------------------------------------------+ --- // | | ^ // | | | // / options (if any) / 0 - 40 // / / bytes // | | | // | | v // +--------------------------------------------------------------+ --- class ipv4_header { public: ipv4_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); } unsigned char version() const { return (rep_[0] >> 4) & 0xF; } unsigned short header_length() const { return (rep_[0] & 0xF) * 4; } unsigned char type_of_service() const { return rep_[1]; } unsigned short total_length() const { return decode(2, 3); } unsigned short identification() const { return decode(4, 5); } bool dont_fragment() const { return (rep_[6] & 0x40) != 0; } bool more_fragments() const { return (rep_[6] & 0x20) != 0; } unsigned short fragment_offset() const { return decode(6, 7) & 0x1FFF; } unsigned int time_to_live() const { return rep_[8]; } unsigned char protocol() const { return rep_[9]; } unsigned short header_checksum() const { return decode(10, 11); } asio::ip::address_v4 source_address() const { asio::ip::address_v4::bytes_type bytes = { { rep_[12], rep_[13], rep_[14], rep_[15] } }; return asio::ip::address_v4(bytes); } asio::ip::address_v4 destination_address() const { asio::ip::address_v4::bytes_type bytes = { { rep_[16], rep_[17], rep_[18], rep_[19] } }; return asio::ip::address_v4(bytes); } friend std::istream& operator>>(std::istream& is, ipv4_header& header) { is.read(reinterpret_cast(header.rep_), 20); if (header.version() != 4) is.setstate(std::ios::failbit); std::streamsize options_length = header.header_length() - 20; if (options_length < 0 || options_length > 40) is.setstate(std::ios::failbit); else is.read(reinterpret_cast(header.rep_) + 20, options_length); return is; } private: unsigned short decode(int a, int b) const { return (rep_[a] << 8) + rep_[b]; } unsigned char rep_[60]; }; #endif // IPV4_HEADER_HPP asio-1.12.2/src/examples/cpp03/icmp/ping.cpp000066400000000000000000000110521340672067200204610ustar00rootroot00000000000000// // ping.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include "icmp_header.hpp" #include "ipv4_header.hpp" using asio::ip::icmp; using asio::steady_timer; namespace chrono = asio::chrono; class pinger { public: pinger(asio::io_context& io_context, const char* destination) : resolver_(io_context), socket_(io_context, icmp::v4()), timer_(io_context), sequence_number_(0), num_replies_(0) { destination_ = *resolver_.resolve(icmp::v4(), destination, "").begin(); start_send(); start_receive(); } private: void start_send() { std::string body("\"Hello!\" from Asio ping."); // Create an ICMP header for an echo request. icmp_header echo_request; echo_request.type(icmp_header::echo_request); echo_request.code(0); echo_request.identifier(get_identifier()); echo_request.sequence_number(++sequence_number_); compute_checksum(echo_request, body.begin(), body.end()); // Encode the request packet. asio::streambuf request_buffer; std::ostream os(&request_buffer); os << echo_request << body; // Send the request. time_sent_ = steady_timer::clock_type::now(); socket_.send_to(request_buffer.data(), destination_); // Wait up to five seconds for a reply. num_replies_ = 0; timer_.expires_at(time_sent_ + chrono::seconds(5)); timer_.async_wait(boost::bind(&pinger::handle_timeout, this)); } void handle_timeout() { if (num_replies_ == 0) std::cout << "Request timed out" << std::endl; // Requests must be sent no less than one second apart. timer_.expires_at(time_sent_ + chrono::seconds(1)); timer_.async_wait(boost::bind(&pinger::start_send, this)); } void start_receive() { // Discard any data already in the buffer. reply_buffer_.consume(reply_buffer_.size()); // Wait for a reply. We prepare the buffer to receive up to 64KB. socket_.async_receive(reply_buffer_.prepare(65536), boost::bind(&pinger::handle_receive, this, _2)); } void handle_receive(std::size_t length) { // The actual number of bytes received is committed to the buffer so that we // can extract it using a std::istream object. reply_buffer_.commit(length); // Decode the reply packet. std::istream is(&reply_buffer_); ipv4_header ipv4_hdr; icmp_header icmp_hdr; is >> ipv4_hdr >> icmp_hdr; // We can receive all ICMP packets received by the host, so we need to // filter out only the echo replies that match the our identifier and // expected sequence number. if (is && icmp_hdr.type() == icmp_header::echo_reply && icmp_hdr.identifier() == get_identifier() && icmp_hdr.sequence_number() == sequence_number_) { // If this is the first reply, interrupt the five second timeout. if (num_replies_++ == 0) timer_.cancel(); // Print out some information about the reply packet. chrono::steady_clock::time_point now = chrono::steady_clock::now(); chrono::steady_clock::duration elapsed = now - time_sent_; std::cout << length - ipv4_hdr.header_length() << " bytes from " << ipv4_hdr.source_address() << ": icmp_seq=" << icmp_hdr.sequence_number() << ", ttl=" << ipv4_hdr.time_to_live() << ", time=" << chrono::duration_cast(elapsed).count() << std::endl; } start_receive(); } static unsigned short get_identifier() { #if defined(ASIO_WINDOWS) return static_cast(::GetCurrentProcessId()); #else return static_cast(::getpid()); #endif } icmp::resolver resolver_; icmp::endpoint destination_; icmp::socket socket_; steady_timer timer_; unsigned short sequence_number_; chrono::steady_clock::time_point time_sent_; asio::streambuf reply_buffer_; std::size_t num_replies_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: ping " << std::endl; #if !defined(ASIO_WINDOWS) std::cerr << "(You may need to run this program as root.)" << std::endl; #endif return 1; } asio::io_context io_context; pinger p(io_context, argv[1]); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } } asio-1.12.2/src/examples/cpp03/invocation/000077500000000000000000000000001340672067200202425ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/invocation/prioritised_handlers.cpp000066400000000000000000000075431340672067200251740ustar00rootroot00000000000000// // prioritised_handlers.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio.hpp" #include #include #include using asio::ip::tcp; class handler_priority_queue : public asio::execution_context { public: void add(int priority, boost::function function) { handlers_.push(queued_handler(priority, function)); } void execute_all() { while (!handlers_.empty()) { queued_handler handler = handlers_.top(); handler.execute(); handlers_.pop(); } } class executor { public: executor(handler_priority_queue& q, int p) : context_(q), priority_(p) { } handler_priority_queue& context() const { return context_; } template void dispatch(const Function& f, const Allocator&) const { context_.add(priority_, f); } template void post(const Function& f, const Allocator&) const { context_.add(priority_, f); } template void defer(const Function& f, const Allocator&) const { context_.add(priority_, f); } void on_work_started() const {} void on_work_finished() const {} bool operator==(const executor& other) const { return &context_ == &other.context_ && priority_ == other.priority_; } bool operator!=(const executor& other) const { return !operator==(other); } private: handler_priority_queue& context_; int priority_; }; template asio::executor_binder wrap(int priority, Handler handler) { return asio::bind_executor(executor(*this, priority), handler); } private: class queued_handler { public: queued_handler(int p, boost::function f) : priority_(p), function_(f) { } void execute() { function_(); } friend bool operator<(const queued_handler& a, const queued_handler& b) { return a.priority_ < b.priority_; } private: int priority_; boost::function function_; }; std::priority_queue handlers_; }; //---------------------------------------------------------------------- void high_priority_handler(const asio::error_code& /*ec*/) { std::cout << "High priority handler\n"; } void middle_priority_handler(const asio::error_code& /*ec*/) { std::cout << "Middle priority handler\n"; } void low_priority_handler() { std::cout << "Low priority handler\n"; } int main() { asio::io_context io_context; handler_priority_queue pri_queue; // Post a completion handler to be run immediately. asio::post(io_context, pri_queue.wrap(0, low_priority_handler)); // Start an asynchronous accept that will complete immediately. tcp::endpoint endpoint(asio::ip::address_v4::loopback(), 0); tcp::acceptor acceptor(io_context, endpoint); tcp::socket server_socket(io_context); acceptor.async_accept(server_socket, pri_queue.wrap(100, high_priority_handler)); tcp::socket client_socket(io_context); client_socket.connect(acceptor.local_endpoint()); // Set a deadline timer to expire immediately. asio::steady_timer timer(io_context); timer.expires_at(asio::steady_timer::time_point::min()); timer.async_wait(pri_queue.wrap(42, middle_priority_handler)); while (io_context.run_one()) { // The custom invocation hook adds the handlers to the priority queue // rather than executing them from within the poll_one() call. while (io_context.poll_one()) ; pri_queue.execute_all(); } return 0; } asio-1.12.2/src/examples/cpp03/iostreams/000077500000000000000000000000001340672067200200775ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/iostreams/daytime_client.cpp000066400000000000000000000015641340672067200236030ustar00rootroot00000000000000// // daytime_client.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: daytime_client " << std::endl; return 1; } tcp::iostream s(argv[1], "daytime"); if (!s) { std::cout << "Unable to connect: " << s.error().message() << std::endl; return 1; } std::string line; std::getline(s, line); std::cout << line << std::endl; } catch (std::exception& e) { std::cout << "Exception: " << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/iostreams/daytime_server.cpp000066400000000000000000000017101340672067200236240ustar00rootroot00000000000000// // daytime_server.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include using asio::ip::tcp; std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } int main() { try { asio::io_context io_context; tcp::endpoint endpoint(tcp::v4(), 13); tcp::acceptor acceptor(io_context, endpoint); for (;;) { tcp::iostream stream; asio::error_code ec; acceptor.accept(stream.socket(), ec); if (!ec) { stream << make_daytime_string(); } } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/iostreams/http_client.cpp000066400000000000000000000050151340672067200231210ustar00rootroot00000000000000// // http_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: http_client \n"; std::cout << "Example:\n"; std::cout << " http_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } asio::ip::tcp::iostream s; // The entire sequence of I/O operations must complete within 60 seconds. // If an expiry occurs, the socket is automatically closed and the stream // becomes bad. s.expires_after(asio::chrono::seconds(60)); // Establish a connection to the server. s.connect(argv[1], "http"); if (!s) { std::cout << "Unable to connect: " << s.error().message() << "\n"; return 1; } // Send the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. s << "GET " << argv[2] << " HTTP/1.0\r\n"; s << "Host: " << argv[1] << "\r\n"; s << "Accept: */*\r\n"; s << "Connection: close\r\n\r\n"; // By default, the stream is tied with itself. This means that the stream // automatically flush the buffered output before attempting a read. It is // not necessary not explicitly flush the stream at this point. // Check that response is OK. std::string http_version; s >> http_version; unsigned int status_code; s >> status_code; std::string status_message; std::getline(s, status_message); if (!s || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return 1; } if (status_code != 200) { std::cout << "Response returned with status code " << status_code << "\n"; return 1; } // Process the response headers, which are terminated by a blank line. std::string header; while (std::getline(s, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write the remaining data to output. std::cout << s.rdbuf(); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/local/000077500000000000000000000000001340672067200171635ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/local/connect_pair.cpp000066400000000000000000000061741340672067200223430ustar00rootroot00000000000000// // connect_pair.cpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; class uppercase_filter { public: uppercase_filter(asio::io_context& io_context) : socket_(io_context) { } stream_protocol::socket& socket() { return socket_; } void start() { // Wait for request. socket_.async_read_some(asio::buffer(data_), boost::bind(&uppercase_filter::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } private: void handle_read(const asio::error_code& ec, std::size_t size) { if (!ec) { // Compute result. for (std::size_t i = 0; i < size; ++i) data_[i] = std::toupper(data_[i]); // Send result. asio::async_write(socket_, asio::buffer(data_, size), boost::bind(&uppercase_filter::handle_write, this, asio::placeholders::error)); } else { throw asio::system_error(ec); } } void handle_write(const asio::error_code& ec) { if (!ec) { // Wait for request. socket_.async_read_some(asio::buffer(data_), boost::bind(&uppercase_filter::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { throw asio::system_error(ec); } } stream_protocol::socket socket_; boost::array data_; }; void run(asio::io_context* io_context) { try { io_context->run(); } catch (std::exception& e) { std::cerr << "Exception in thread: " << e.what() << "\n"; std::exit(1); } } int main() { try { asio::io_context io_context; // Create filter and establish a connection to it. uppercase_filter filter(io_context); stream_protocol::socket socket(io_context); asio::local::connect_pair(socket, filter.socket()); filter.start(); // The io_context runs in a background thread to perform filtering. asio::thread thread(boost::bind(run, &io_context)); for (;;) { // Collect request from user. std::cout << "Enter a string: "; std::string request; std::getline(std::cin, request); // Send request to filter. asio::write(socket, asio::buffer(request)); // Wait for reply from filter. std::vector reply(request.size()); asio::read(socket, asio::buffer(reply)); // Show reply to user. std::cout << "Result: "; std::cout.write(&reply[0], request.size()); std::cout << std::endl; } } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; std::exit(1); } } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp03/local/iostream_client.cpp000066400000000000000000000025571340672067200230610ustar00rootroot00000000000000// // stream_client.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include "asio.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: iostream_client \n"; return 1; } stream_protocol::endpoint ep(argv[1]); stream_protocol::iostream s(ep); if (!s) { std::cerr << "Unable to connect: " << s.error().message() << std::endl; return 1; } using namespace std; // For strlen. std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t length = strlen(request); s << request; char reply[max_length]; s.read(reply, length); std::cout << "Reply is: "; std::cout.write(reply, length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp03/local/stream_client.cpp000066400000000000000000000026541340672067200225270ustar00rootroot00000000000000// // stream_client.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: stream_client \n"; return 1; } asio::io_context io_context; stream_protocol::socket s(io_context); s.connect(stream_protocol::endpoint(argv[1])); using namespace std; // For strlen. std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = strlen(request); asio::write(s, asio::buffer(request, request_length)); char reply[max_length]; size_t reply_length = asio::read(s, asio::buffer(reply, request_length)); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp03/local/stream_server.cpp000066400000000000000000000063121340672067200225520ustar00rootroot00000000000000// // stream_server.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include "asio.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; class session : public boost::enable_shared_from_this { public: session(asio::io_context& io_context) : socket_(io_context) { } stream_protocol::socket& socket() { return socket_; } void start() { socket_.async_read_some(asio::buffer(data_), boost::bind(&session::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } void handle_read(const asio::error_code& error, size_t bytes_transferred) { if (!error) { asio::async_write(socket_, asio::buffer(data_, bytes_transferred), boost::bind(&session::handle_write, shared_from_this(), asio::placeholders::error)); } } void handle_write(const asio::error_code& error) { if (!error) { socket_.async_read_some(asio::buffer(data_), boost::bind(&session::handle_read, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } } private: // The socket used to communicate with the client. stream_protocol::socket socket_; // Buffer used to store data received from the client. boost::array data_; }; typedef boost::shared_ptr session_ptr; class server { public: server(asio::io_context& io_context, const std::string& file) : io_context_(io_context), acceptor_(io_context, stream_protocol::endpoint(file)) { session_ptr new_session(new session(io_context_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } void handle_accept(session_ptr new_session, const asio::error_code& error) { if (!error) { new_session->start(); } new_session.reset(new session(io_context_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } private: asio::io_context& io_context_; stream_protocol::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: stream_server \n"; std::cerr << "*** WARNING: existing file is removed ***\n"; return 1; } asio::io_context io_context; std::remove(argv[1]); server s(io_context, argv[1]); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp03/multicast/000077500000000000000000000000001340672067200200765ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/multicast/receiver.cpp000066400000000000000000000046741340672067200224210ustar00rootroot00000000000000// // receiver.cpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include "asio.hpp" #include "boost/bind.hpp" const short multicast_port = 30001; class receiver { public: receiver(asio::io_context& io_context, const asio::ip::address& listen_address, const asio::ip::address& multicast_address) : socket_(io_context) { // Create the socket so that multiple may be bound to the same address. asio::ip::udp::endpoint listen_endpoint( listen_address, multicast_port); socket_.open(listen_endpoint.protocol()); socket_.set_option(asio::ip::udp::socket::reuse_address(true)); socket_.bind(listen_endpoint); // Join the multicast group. socket_.set_option( asio::ip::multicast::join_group(multicast_address)); socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&receiver::handle_receive_from, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } void handle_receive_from(const asio::error_code& error, size_t bytes_recvd) { if (!error) { std::cout.write(data_, bytes_recvd); std::cout << std::endl; socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&receiver::handle_receive_from, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } } private: asio::ip::udp::socket socket_; asio::ip::udp::endpoint sender_endpoint_; enum { max_length = 1024 }; char data_[max_length]; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: receiver \n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 239.255.0.1\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 ff31::8000:1234\n"; return 1; } asio::io_context io_context; receiver r(io_context, asio::ip::make_address(argv[1]), asio::ip::make_address(argv[2])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/multicast/sender.cpp000066400000000000000000000044511340672067200220660ustar00rootroot00000000000000// // sender.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" #include "boost/bind.hpp" const short multicast_port = 30001; const int max_message_count = 10; class sender { public: sender(asio::io_context& io_context, const asio::ip::address& multicast_address) : endpoint_(multicast_address, multicast_port), socket_(io_context, endpoint_.protocol()), timer_(io_context), message_count_(0) { std::ostringstream os; os << "Message " << message_count_++; message_ = os.str(); socket_.async_send_to( asio::buffer(message_), endpoint_, boost::bind(&sender::handle_send_to, this, asio::placeholders::error)); } void handle_send_to(const asio::error_code& error) { if (!error && message_count_ < max_message_count) { timer_.expires_after(asio::chrono::seconds(1)); timer_.async_wait( boost::bind(&sender::handle_timeout, this, asio::placeholders::error)); } } void handle_timeout(const asio::error_code& error) { if (!error) { std::ostringstream os; os << "Message " << message_count_++; message_ = os.str(); socket_.async_send_to( asio::buffer(message_), endpoint_, boost::bind(&sender::handle_send_to, this, asio::placeholders::error)); } } private: asio::ip::udp::endpoint endpoint_; asio::ip::udp::socket socket_; asio::steady_timer timer_; int message_count_; std::string message_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: sender \n"; std::cerr << " For IPv4, try:\n"; std::cerr << " sender 239.255.0.1\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " sender ff31::8000:1234\n"; return 1; } asio::io_context io_context; sender s(io_context, asio::ip::make_address(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/nonblocking/000077500000000000000000000000001340672067200203745ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/nonblocking/third_party_lib.cpp000066400000000000000000000135331340672067200242640ustar00rootroot00000000000000// // third_party_lib.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include using asio::ip::tcp; namespace third_party_lib { // Simulation of a third party library that wants to perform read and write // operations directly on a socket. It needs to be polled to determine whether // it requires a read or write operation, and notified when the socket is ready // for reading or writing. class session { public: session(tcp::socket& socket) : socket_(socket), state_(reading) { } // Returns true if the third party library wants to be notified when the // socket is ready for reading. bool want_read() const { return state_ == reading; } // Notify that third party library that it should perform its read operation. void do_read(asio::error_code& ec) { if (std::size_t len = socket_.read_some(asio::buffer(data_), ec)) { write_buffer_ = asio::buffer(data_, len); state_ = writing; } } // Returns true if the third party library wants to be notified when the // socket is ready for writing. bool want_write() const { return state_ == writing; } // Notify that third party library that it should perform its write operation. void do_write(asio::error_code& ec) { if (std::size_t len = socket_.write_some( asio::buffer(write_buffer_), ec)) { write_buffer_ = write_buffer_ + len; state_ = asio::buffer_size(write_buffer_) > 0 ? writing : reading; } } private: tcp::socket& socket_; enum { reading, writing } state_; boost::array data_; asio::const_buffer write_buffer_; }; } // namespace third_party_lib // The glue between asio's sockets and the third party library. class connection : public boost::enable_shared_from_this { public: typedef boost::shared_ptr pointer; static pointer create(asio::io_context& io_context) { return pointer(new connection(io_context)); } tcp::socket& socket() { return socket_; } void start() { // Put the socket into non-blocking mode. socket_.non_blocking(true); start_operations(); } private: connection(asio::io_context& io_context) : socket_(io_context), session_impl_(socket_), read_in_progress_(false), write_in_progress_(false) { } void start_operations() { // Start a read operation if the third party library wants one. if (session_impl_.want_read() && !read_in_progress_) { read_in_progress_ = true; socket_.async_wait(tcp::socket::wait_read, boost::bind(&connection::handle_read, shared_from_this(), asio::placeholders::error)); } // Start a write operation if the third party library wants one. if (session_impl_.want_write() && !write_in_progress_) { write_in_progress_ = true; socket_.async_wait(tcp::socket::wait_write, boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error)); } } void handle_read(asio::error_code ec) { read_in_progress_ = false; // Notify third party library that it can perform a read. if (!ec) session_impl_.do_read(ec); // The third party library successfully performed a read on the socket. // Start new read or write operations based on what it now wants. if (!ec || ec == asio::error::would_block) start_operations(); // Otherwise, an error occurred. Closing the socket cancels any outstanding // asynchronous read or write operations. The connection object will be // destroyed automatically once those outstanding operations complete. else socket_.close(); } void handle_write(asio::error_code ec) { write_in_progress_ = false; // Notify third party library that it can perform a write. if (!ec) session_impl_.do_write(ec); // The third party library successfully performed a write on the socket. // Start new read or write operations based on what it now wants. if (!ec || ec == asio::error::would_block) start_operations(); // Otherwise, an error occurred. Closing the socket cancels any outstanding // asynchronous read or write operations. The connection object will be // destroyed automatically once those outstanding operations complete. else socket_.close(); } private: tcp::socket socket_; third_party_lib::session session_impl_; bool read_in_progress_; bool write_in_progress_; }; class server { public: server(asio::io_context& io_context, unsigned short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { start_accept(); } private: void start_accept() { connection::pointer new_connection = connection::create(acceptor_.get_executor().context()); acceptor_.async_accept(new_connection->socket(), boost::bind(&server::handle_accept, this, new_connection, asio::placeholders::error)); } void handle_accept(connection::pointer new_connection, const asio::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: third_party_lib \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/porthopper/000077500000000000000000000000001340672067200202735ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/porthopper/client.cpp000066400000000000000000000152671340672067200222700ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include "protocol.hpp" using namespace boost; using asio::ip::tcp; using asio::ip::udp; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: client \n"; return 1; } using namespace std; // For atoi. std::string host_name = argv[1]; std::string port = argv[2]; asio::io_context io_context; // Determine the location of the server. tcp::resolver resolver(io_context); tcp::endpoint remote_endpoint = *resolver.resolve(host_name, port).begin(); // Establish the control connection to the server. tcp::socket control_socket(io_context); control_socket.connect(remote_endpoint); // Create a datagram socket to receive data from the server. boost::shared_ptr data_socket( new udp::socket(io_context, udp::endpoint(udp::v4(), 0))); // Determine what port we will receive data on. udp::endpoint data_endpoint = data_socket->local_endpoint(); // Ask the server to start sending us data. control_request start = control_request::start(data_endpoint.port()); asio::write(control_socket, start.to_buffers()); unsigned long last_frame_number = 0; for (;;) { // Receive 50 messages on the current data socket. for (int i = 0; i < 50; ++i) { // Receive a frame from the server. frame f; data_socket->receive(f.to_buffers(), 0); if (f.number() > last_frame_number) { last_frame_number = f.number(); std::cout << "\n" << f.payload(); } } // Time to switch to a new socket. To ensure seamless handover we will // continue to receive packets using the old socket until data arrives on // the new one. std::cout << " Starting renegotiation"; // Create the new data socket. boost::shared_ptr new_data_socket( new udp::socket(io_context, udp::endpoint(udp::v4(), 0))); // Determine the new port we will use to receive data. udp::endpoint new_data_endpoint = new_data_socket->local_endpoint(); // Ask the server to switch over to the new port. control_request change = control_request::change( data_endpoint.port(), new_data_endpoint.port()); asio::error_code control_result; asio::async_write(control_socket, change.to_buffers(), ( lambda::var(control_result) = lambda::_1 )); // Try to receive a frame from the server on the new data socket. If we // successfully receive a frame on this new data socket we can consider // the renegotation complete. In that case we will close the old data // socket, which will cause any outstanding receive operation on it to be // cancelled. frame f1; asio::error_code new_data_socket_result; new_data_socket->async_receive(f1.to_buffers(), ( // Note: lambda::_1 is the first argument to the callback handler, // which in this case is the error code for the operation. lambda::var(new_data_socket_result) = lambda::_1, lambda::if_(!lambda::_1) [ // We have successfully received a frame on the new data socket, // so we can close the old data socket. This will cancel any // outstanding receive operation on the old data socket. lambda::var(data_socket) = boost::shared_ptr() ] )); // This loop will continue until we have successfully completed the // renegotiation (i.e. received a frame on the new data socket), or some // unrecoverable error occurs. bool done = false; while (!done) { // Even though we're performing a renegotation, we want to continue // receiving data as smoothly as possible. Therefore we will continue to // try to receive a frame from the server on the old data socket. If we // receive a frame on this socket we will interrupt the io_context, // print the frame, and resume waiting for the other operations to // complete. frame f2; done = true; // Let's be optimistic. if (data_socket) // Might have been closed by new_data_socket's handler. { data_socket->async_receive(f2.to_buffers(), 0, ( lambda::if_(!lambda::_1) [ // We have successfully received a frame on the old data // socket. Stop the io_context so that we can print it. lambda::bind(&asio::io_context::stop, &io_context), lambda::var(done) = false ] )); } // Run the operations in parallel. This will block until all operations // have finished, or until the io_context is interrupted. (No threads!) io_context.restart(); io_context.run(); // If the io_context.run() was interrupted then we have received a frame // on the old data socket. We need to keep waiting for the renegotation // operations to complete. if (!done) { if (f2.number() > last_frame_number) { last_frame_number = f2.number(); std::cout << "\n" << f2.payload(); } } } // Since the loop has finished, we have either successfully completed // the renegotation, or an error has occurred. First we'll check for // errors. if (control_result) throw asio::system_error(control_result); if (new_data_socket_result) throw asio::system_error(new_data_socket_result); // If we get here it means we have successfully started receiving data on // the new data socket. This new data socket will be used from now on // (until the next time we renegotiate). std::cout << " Renegotiation complete"; data_socket = new_data_socket; data_endpoint = new_data_endpoint; if (f1.number() > last_frame_number) { last_frame_number = f1.number(); std::cout << "\n" << f1.payload(); } } } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/porthopper/protocol.hpp000066400000000000000000000102561340672067200226510ustar00rootroot00000000000000// // protocol.hpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef PORTHOPPER_PROTOCOL_HPP #define PORTHOPPER_PROTOCOL_HPP #include #include #include #include #include #include // This request is sent by the client to the server over a TCP connection. // The client uses it to perform three functions: // - To request that data start being sent to a given port. // - To request that data is no longer sent to a given port. // - To change the target port to another. class control_request { public: // Construct an empty request. Used when receiving. control_request() { } // Create a request to start sending data to a given port. static const control_request start(unsigned short port) { return control_request(0, port); } // Create a request to stop sending data to a given port. static const control_request stop(unsigned short port) { return control_request(port, 0); } // Create a request to change the port that data is sent to. static const control_request change( unsigned short old_port, unsigned short new_port) { return control_request(old_port, new_port); } // Get the old port. Returns 0 for start requests. unsigned short old_port() const { std::istrstream is(data_, encoded_port_size); unsigned short port = 0; is >> std::setw(encoded_port_size) >> std::hex >> port; return port; } // Get the new port. Returns 0 for stop requests. unsigned short new_port() const { std::istrstream is(data_ + encoded_port_size, encoded_port_size); unsigned short port = 0; is >> std::setw(encoded_port_size) >> std::hex >> port; return port; } // Obtain buffers for reading from or writing to a socket. boost::array to_buffers() { boost::array buffers = { { asio::buffer(data_) } }; return buffers; } private: // Construct with specified old and new ports. control_request(unsigned short old_port_number, unsigned short new_port_number) { std::ostrstream os(data_, control_request_size); os << std::setw(encoded_port_size) << std::hex << old_port_number; os << std::setw(encoded_port_size) << std::hex << new_port_number; } // The length in bytes of a control_request and its components. enum { encoded_port_size = 4, // 16-bit port in hex. control_request_size = encoded_port_size * 2 }; // The encoded request data. char data_[control_request_size]; }; // This frame is sent from the server to subscribed clients over UDP. class frame { public: // The maximum allowable length of the payload. enum { payload_size = 32 }; // Construct an empty frame. Used when receiving. frame() { } // Construct a frame with specified frame number and payload. frame(unsigned long frame_number, const std::string& payload_data) { std::ostrstream os(data_, frame_size); os << std::setw(encoded_number_size) << std::hex << frame_number; os << std::setw(payload_size) << std::setfill(' ') << payload_data.substr(0, payload_size); } // Get the frame number. unsigned long number() const { std::istrstream is(data_, encoded_number_size); unsigned long frame_number = 0; is >> std::setw(encoded_number_size) >> std::hex >> frame_number; return frame_number; } // Get the payload data. const std::string payload() const { return std::string(data_ + encoded_number_size, payload_size); } // Obtain buffers for reading from or writing to a socket. boost::array to_buffers() { boost::array buffers = { { asio::buffer(data_) } }; return buffers; } private: // The length in bytes of a frame and its components. enum { encoded_number_size = 8, // Frame number in hex. frame_size = encoded_number_size + payload_size }; // The encoded frame data. char data_[frame_size]; }; #endif // PORTHOPPER_PROTOCOL_HPP asio-1.12.2/src/examples/cpp03/porthopper/server.cpp000066400000000000000000000134711340672067200223130ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include "protocol.hpp" using asio::ip::tcp; using asio::ip::udp; typedef boost::shared_ptr tcp_socket_ptr; typedef boost::shared_ptr timer_ptr; typedef boost::shared_ptr control_request_ptr; class server { public: // Construct the server to wait for incoming control connections. server(asio::io_context& io_context, unsigned short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), timer_(io_context), udp_socket_(io_context, udp::endpoint(udp::v4(), 0)), next_frame_number_(1) { // Start waiting for a new control connection. tcp_socket_ptr new_socket( new tcp::socket(acceptor_.get_executor().context())); acceptor_.async_accept(*new_socket, boost::bind(&server::handle_accept, this, asio::placeholders::error, new_socket)); // Start the timer used to generate outgoing frames. timer_.expires_after(asio::chrono::milliseconds(100)); timer_.async_wait(boost::bind(&server::handle_timer, this)); } // Handle a new control connection. void handle_accept(const asio::error_code& ec, tcp_socket_ptr socket) { if (!ec) { // Start receiving control requests on the connection. control_request_ptr request(new control_request); asio::async_read(*socket, request->to_buffers(), boost::bind(&server::handle_control_request, this, asio::placeholders::error, socket, request)); } // Start waiting for a new control connection. tcp_socket_ptr new_socket( new tcp::socket(acceptor_.get_executor().context())); acceptor_.async_accept(*new_socket, boost::bind(&server::handle_accept, this, asio::placeholders::error, new_socket)); } // Handle a new control request. void handle_control_request(const asio::error_code& ec, tcp_socket_ptr socket, control_request_ptr request) { if (!ec) { // Delay handling of the control request to simulate network latency. timer_ptr delay_timer( new asio::steady_timer(acceptor_.get_executor().context())); delay_timer->expires_after(asio::chrono::seconds(2)); delay_timer->async_wait( boost::bind(&server::handle_control_request_timer, this, socket, request, delay_timer)); } } void handle_control_request_timer(tcp_socket_ptr socket, control_request_ptr request, timer_ptr /*delay_timer*/) { // Determine what address this client is connected from, since // subscriptions must be stored on the server as a complete endpoint, not // just a port. We use the non-throwing overload of remote_endpoint() since // it may fail if the socket is no longer connected. asio::error_code ec; tcp::endpoint remote_endpoint = socket->remote_endpoint(ec); if (!ec) { // Remove old port subscription, if any. if (unsigned short old_port = request->old_port()) { udp::endpoint old_endpoint(remote_endpoint.address(), old_port); subscribers_.erase(old_endpoint); std::cout << "Removing subscription " << old_endpoint << std::endl; } // Add new port subscription, if any. if (unsigned short new_port = request->new_port()) { udp::endpoint new_endpoint(remote_endpoint.address(), new_port); subscribers_.insert(new_endpoint); std::cout << "Adding subscription " << new_endpoint << std::endl; } } // Wait for next control request on this connection. asio::async_read(*socket, request->to_buffers(), boost::bind(&server::handle_control_request, this, asio::placeholders::error, socket, request)); } // Every time the timer fires we will generate a new frame and send it to all // subscribers. void handle_timer() { // Generate payload. double x = next_frame_number_ * 0.2; double y = std::sin(x); int char_index = static_cast((y + 1.0) * (frame::payload_size / 2)); std::string payload; for (int i = 0; i < frame::payload_size; ++i) payload += (i == char_index ? '*' : '.'); // Create the frame to be sent to all subscribers. frame f(next_frame_number_++, payload); // Send frame to all subscribers. We can use synchronous calls here since // UDP send operations typically do not block. std::set::iterator j; for (j = subscribers_.begin(); j != subscribers_.end(); ++j) { asio::error_code ec; udp_socket_.send_to(f.to_buffers(), *j, 0, ec); } // Wait for next timeout. timer_.expires_after(asio::chrono::milliseconds(100)); timer_.async_wait(boost::bind(&server::handle_timer, this)); } private: // The acceptor used to accept incoming control connections. tcp::acceptor acceptor_; // The timer used for generating data. asio::steady_timer timer_; // The socket used to send data to subscribers. udp::socket udp_socket_; // The next frame number. unsigned long next_frame_number_; // The set of endpoints that are subscribed. std::set subscribers_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/serialization/000077500000000000000000000000001340672067200207465ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/serialization/client.cpp000066400000000000000000000072631340672067200227400ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "connection.hpp" // Must come before boost/serialization headers. #include #include "stock.hpp" namespace s11n_example { /// Downloads stock quote information from a server. class client { public: /// Constructor starts the asynchronous connect operation. client(asio::io_context& io_context, const std::string& host, const std::string& service) : connection_(io_context) { // Resolve the host name into an IP address. asio::ip::tcp::resolver resolver(io_context); asio::ip::tcp::resolver::query query(host, service); asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); // Start an asynchronous connect operation. asio::async_connect(connection_.socket(), endpoint_iterator, boost::bind(&client::handle_connect, this, asio::placeholders::error)); } /// Handle completion of a connect operation. void handle_connect(const asio::error_code& e) { if (!e) { // Successfully established connection. Start operation to read the list // of stocks. The connection::async_read() function will automatically // decode the data that is read from the underlying socket. connection_.async_read(stocks_, boost::bind(&client::handle_read, this, asio::placeholders::error)); } else { // An error occurred. Log it and return. Since we are not starting a new // operation the io_context will run out of work to do and the client will // exit. std::cerr << e.message() << std::endl; } } /// Handle completion of a read operation. void handle_read(const asio::error_code& e) { if (!e) { // Print out the data that was received. for (std::size_t i = 0; i < stocks_.size(); ++i) { std::cout << "Stock number " << i << "\n"; std::cout << " code: " << stocks_[i].code << "\n"; std::cout << " name: " << stocks_[i].name << "\n"; std::cout << " open_price: " << stocks_[i].open_price << "\n"; std::cout << " high_price: " << stocks_[i].high_price << "\n"; std::cout << " low_price: " << stocks_[i].low_price << "\n"; std::cout << " last_price: " << stocks_[i].last_price << "\n"; std::cout << " buy_price: " << stocks_[i].buy_price << "\n"; std::cout << " buy_quantity: " << stocks_[i].buy_quantity << "\n"; std::cout << " sell_price: " << stocks_[i].sell_price << "\n"; std::cout << " sell_quantity: " << stocks_[i].sell_quantity << "\n"; } } else { // An error occurred. std::cerr << e.message() << std::endl; } // Since we are not starting a new operation the io_context will run out of // work to do and the client will exit. } private: /// The connection to the server. connection connection_; /// The data received from the server. std::vector stocks_; }; } // namespace s11n_example int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 3) { std::cerr << "Usage: client " << std::endl; return 1; } asio::io_context io_context; s11n_example::client client(io_context, argv[1], argv[2]); io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/serialization/connection.hpp000066400000000000000000000127721340672067200236270ustar00rootroot00000000000000// // connection.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SERIALIZATION_CONNECTION_HPP #define SERIALIZATION_CONNECTION_HPP #include #include #include #include #include #include #include #include #include #include namespace s11n_example { /// The connection class provides serialization primitives on top of a socket. /** * Each message sent using this class consists of: * @li An 8-byte header containing the length of the serialized data in * hexadecimal. * @li The serialized data. */ class connection { public: /// Constructor. connection(asio::io_context& io_context) : socket_(io_context) { } /// Get the underlying socket. Used for making a connection or for accepting /// an incoming connection. asio::ip::tcp::socket& socket() { return socket_; } /// Asynchronously write a data structure to the socket. template void async_write(const T& t, Handler handler) { // Serialize the data first so we know how large it is. std::ostringstream archive_stream; boost::archive::text_oarchive archive(archive_stream); archive << t; outbound_data_ = archive_stream.str(); // Format the header. std::ostringstream header_stream; header_stream << std::setw(header_length) << std::hex << outbound_data_.size(); if (!header_stream || header_stream.str().size() != header_length) { // Something went wrong, inform the caller. asio::error_code error(asio::error::invalid_argument); asio::post(socket_.get_executor(), boost::bind(handler, error)); return; } outbound_header_ = header_stream.str(); // Write the serialized data to the socket. We use "gather-write" to send // both the header and the data in a single write operation. std::vector buffers; buffers.push_back(asio::buffer(outbound_header_)); buffers.push_back(asio::buffer(outbound_data_)); asio::async_write(socket_, buffers, handler); } /// Asynchronously read a data structure from the socket. template void async_read(T& t, Handler handler) { // Issue a read operation to read exactly the number of bytes in a header. void (connection::*f)( const asio::error_code&, T&, boost::tuple) = &connection::handle_read_header; asio::async_read(socket_, asio::buffer(inbound_header_), boost::bind(f, this, asio::placeholders::error, boost::ref(t), boost::make_tuple(handler))); } /// Handle a completed read of a message header. The handler is passed using /// a tuple since boost::bind seems to have trouble binding a function object /// created using boost::bind as a parameter. template void handle_read_header(const asio::error_code& e, T& t, boost::tuple handler) { if (e) { boost::get<0>(handler)(e); } else { // Determine the length of the serialized data. std::istringstream is(std::string(inbound_header_, header_length)); std::size_t inbound_data_size = 0; if (!(is >> std::hex >> inbound_data_size)) { // Header doesn't seem to be valid. Inform the caller. asio::error_code error(asio::error::invalid_argument); boost::get<0>(handler)(error); return; } // Start an asynchronous call to receive the data. inbound_data_.resize(inbound_data_size); void (connection::*f)( const asio::error_code&, T&, boost::tuple) = &connection::handle_read_data; asio::async_read(socket_, asio::buffer(inbound_data_), boost::bind(f, this, asio::placeholders::error, boost::ref(t), handler)); } } /// Handle a completed read of message data. template void handle_read_data(const asio::error_code& e, T& t, boost::tuple handler) { if (e) { boost::get<0>(handler)(e); } else { // Extract the data structure from the data just received. try { std::string archive_data(&inbound_data_[0], inbound_data_.size()); std::istringstream archive_stream(archive_data); boost::archive::text_iarchive archive(archive_stream); archive >> t; } catch (std::exception& e) { // Unable to decode data. asio::error_code error(asio::error::invalid_argument); boost::get<0>(handler)(error); return; } // Inform caller that data has been received ok. boost::get<0>(handler)(e); } } private: /// The underlying socket. asio::ip::tcp::socket socket_; /// The size of a fixed length header. enum { header_length = 8 }; /// Holds an outbound header. std::string outbound_header_; /// Holds the outbound data. std::string outbound_data_; /// Holds an inbound header. char inbound_header_[header_length]; /// Holds the inbound data. std::vector inbound_data_; }; typedef boost::shared_ptr connection_ptr; } // namespace s11n_example #endif // SERIALIZATION_CONNECTION_HPP asio-1.12.2/src/examples/cpp03/serialization/server.cpp000066400000000000000000000066671340672067200227770ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include "connection.hpp" // Must come before boost/serialization headers. #include #include "stock.hpp" namespace s11n_example { /// Serves stock quote information to any client that connects to it. class server { public: /// Constructor opens the acceptor and starts waiting for the first incoming /// connection. server(asio::io_context& io_context, unsigned short port) : acceptor_(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)) { // Create the data to be sent to each client. stock s; s.code = "ABC"; s.name = "A Big Company"; s.open_price = 4.56; s.high_price = 5.12; s.low_price = 4.33; s.last_price = 4.98; s.buy_price = 4.96; s.buy_quantity = 1000; s.sell_price = 4.99; s.sell_quantity = 2000; stocks_.push_back(s); s.code = "DEF"; s.name = "Developer Entertainment Firm"; s.open_price = 20.24; s.high_price = 22.88; s.low_price = 19.50; s.last_price = 19.76; s.buy_price = 19.72; s.buy_quantity = 34000; s.sell_price = 19.85; s.sell_quantity = 45000; stocks_.push_back(s); // Start an accept operation for a new connection. connection_ptr new_conn(new connection(acceptor_.get_io_context())); acceptor_.async_accept(new_conn->socket(), boost::bind(&server::handle_accept, this, asio::placeholders::error, new_conn)); } /// Handle completion of a accept operation. void handle_accept(const asio::error_code& e, connection_ptr conn) { if (!e) { // Successfully accepted a new connection. Send the list of stocks to the // client. The connection::async_write() function will automatically // serialize the data structure for us. conn->async_write(stocks_, boost::bind(&server::handle_write, this, asio::placeholders::error, conn)); } // Start an accept operation for a new connection. connection_ptr new_conn(new connection(acceptor_.get_io_context())); acceptor_.async_accept(new_conn->socket(), boost::bind(&server::handle_accept, this, asio::placeholders::error, new_conn)); } /// Handle completion of a write operation. void handle_write(const asio::error_code& e, connection_ptr conn) { // Nothing to do. The socket will be closed automatically when the last // reference to the connection object goes away. } private: /// The acceptor object used to accept incoming socket connections. asio::ip::tcp::acceptor acceptor_; /// The data to be sent to each client. std::vector stocks_; }; } // namespace s11n_example int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 2) { std::cerr << "Usage: server " << std::endl; return 1; } unsigned short port = boost::lexical_cast(argv[1]); asio::io_context io_context; s11n_example::server server(io_context, port); io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/serialization/stock.hpp000066400000000000000000000017761340672067200226150ustar00rootroot00000000000000// // stock.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SERIALIZATION_STOCK_HPP #define SERIALIZATION_STOCK_HPP #include namespace s11n_example { /// Structure to hold information about a single stock. struct stock { std::string code; std::string name; double open_price; double high_price; double low_price; double last_price; double buy_price; int buy_quantity; double sell_price; int sell_quantity; template void serialize(Archive& ar, const unsigned int version) { ar & code; ar & name; ar & open_price; ar & high_price; ar & low_price; ar & last_price; ar & buy_price; ar & buy_quantity; ar & sell_price; ar & sell_quantity; } }; } // namespace s11n_example #endif // SERIALIZATION_STOCK_HPP asio-1.12.2/src/examples/cpp03/services/000077500000000000000000000000001340672067200177145ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/services/basic_logger.hpp000066400000000000000000000036231340672067200230510ustar00rootroot00000000000000// // basic_logger.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SERVICES_BASIC_LOGGER_HPP #define SERVICES_BASIC_LOGGER_HPP #include #include #include namespace services { /// Class to provide simple logging functionality. Use the services::logger /// typedef. template class basic_logger : private boost::noncopyable { public: /// The type of the service that will be used to provide timer operations. typedef Service service_type; /// The native implementation type of the timer. typedef typename service_type::impl_type impl_type; /// Constructor. /** * This constructor creates a logger. * * @param io_context The io_context object used to locate the logger service. * * @param identifier An identifier for this logger. */ explicit basic_logger(asio::io_context& io_context, const std::string& identifier) : service_(asio::use_service(io_context)), impl_(service_.null()) { service_.create(impl_, identifier); } /// Destructor. ~basic_logger() { service_.destroy(impl_); } /// Get the io_context associated with the object. asio::io_context& get_io_context() { return service_.get_io_context(); } /// Set the output file for all logger instances. void use_file(const std::string& file) { service_.use_file(impl_, file); } /// Log a message. void log(const std::string& message) { service_.log(impl_, message); } private: /// The backend service implementation. service_type& service_; /// The underlying native implementation. impl_type impl_; }; } // namespace services #endif // SERVICES_BASIC_LOGGER_HPP asio-1.12.2/src/examples/cpp03/services/daytime_client.cpp000066400000000000000000000044351340672067200234200ustar00rootroot00000000000000// // daytime_client.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "logger.hpp" using asio::ip::tcp; char read_buffer[1024]; void read_handler(const asio::error_code& e, std::size_t bytes_transferred, tcp::socket* s) { if (!e) { std::cout.write(read_buffer, bytes_transferred); s->async_read_some(asio::buffer(read_buffer), boost::bind(read_handler, asio::placeholders::error, asio::placeholders::bytes_transferred, s)); } else { services::logger logger(s->get_executor().context(), "read_handler"); std::string msg = "Read error: "; msg += e.message(); logger.log(msg); } } void connect_handler(const asio::error_code& e, tcp::socket* s) { services::logger logger(s->get_executor().context(), "connect_handler"); if (!e) { logger.log("Connection established"); s->async_read_some(asio::buffer(read_buffer), boost::bind(read_handler, asio::placeholders::error, asio::placeholders::bytes_transferred, s)); } else { std::string msg = "Unable to establish connection: "; msg += e.message(); logger.log(msg); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: daytime_client " << std::endl; return 1; } asio::io_context io_context; // Set the name of the file that all logger instances will use. services::logger logger(io_context, ""); logger.use_file("log.txt"); // Resolve the address corresponding to the given host. tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(argv[1], "daytime"); // Start an asynchronous connect. tcp::socket socket(io_context); asio::async_connect(socket, endpoints, boost::bind(connect_handler, asio::placeholders::error, &socket)); // Run the io_context until all operations have finished. io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/services/logger.hpp000066400000000000000000000010461340672067200217050ustar00rootroot00000000000000// // logger.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SERVICES_LOGGER_HPP #define SERVICES_LOGGER_HPP #include "basic_logger.hpp" #include "logger_service.hpp" namespace services { /// Typedef for typical logger usage. typedef basic_logger logger; } // namespace services #endif // SERVICES_LOGGER_HPP asio-1.12.2/src/examples/cpp03/services/logger_service.cpp000066400000000000000000000006301340672067200234160ustar00rootroot00000000000000// // logger_service.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "logger_service.hpp" namespace services { asio::io_context::id logger_service::id; } // namespace services asio-1.12.2/src/examples/cpp03/services/logger_service.hpp000066400000000000000000000077561340672067200234430ustar00rootroot00000000000000// // logger_service.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SERVICES_LOGGER_SERVICE_HPP #define SERVICES_LOGGER_SERVICE_HPP #include #include #include #include #include #include #include #include namespace services { /// Service implementation for the logger. class logger_service : public asio::io_context::service { public: /// The unique service identifier. static asio::io_context::id id; /// The backend implementation of a logger. struct logger_impl { explicit logger_impl(const std::string& ident) : identifier(ident) {} std::string identifier; }; /// The type for an implementation of the logger. typedef logger_impl* impl_type; /// Constructor creates a thread to run a private io_context. logger_service(asio::io_context& io_context) : asio::io_context::service(io_context), work_io_context_(), work_(asio::make_work_guard(work_io_context_)), work_thread_(new asio::thread( boost::bind(&asio::io_context::run, &work_io_context_))) { } /// Destructor shuts down the private io_context. ~logger_service() { /// Indicate that we have finished with the private io_context. Its /// io_context::run() function will exit once all other work has completed. work_.reset(); if (work_thread_) work_thread_->join(); } /// Destroy all user-defined handler objects owned by the service. void shutdown_service() { } /// Return a null logger implementation. impl_type null() const { return 0; } /// Create a new logger implementation. void create(impl_type& impl, const std::string& identifier) { impl = new logger_impl(identifier); } /// Destroy a logger implementation. void destroy(impl_type& impl) { delete impl; impl = null(); } /// Set the output file for the logger. The current implementation sets the /// output file for all logger instances, and so the impl parameter is not /// actually needed. It is retained here to illustrate how service functions /// are typically defined. void use_file(impl_type& /*impl*/, const std::string& file) { // Pass the work of opening the file to the background thread. asio::post(work_io_context_, boost::bind( &logger_service::use_file_impl, this, file)); } /// Log a message. void log(impl_type& impl, const std::string& message) { // Format the text to be logged. std::ostringstream os; os << impl->identifier << ": " << message; // Pass the work of writing to the file to the background thread. asio::post(work_io_context_, boost::bind( &logger_service::log_impl, this, os.str())); } private: /// Helper function used to open the output file from within the private /// io_context's thread. void use_file_impl(const std::string& file) { ofstream_.close(); ofstream_.clear(); ofstream_.open(file.c_str()); } /// Helper function used to log a message from within the private io_context's /// thread. void log_impl(const std::string& text) { ofstream_ << text << std::endl; } /// Private io_context used for performing logging operations. asio::io_context work_io_context_; /// Work for the private io_context to perform. If we do not give the /// io_context some work to do then the io_context::run() function will exit /// immediately. asio::executor_work_guard< asio::io_context::executor_type> work_; /// Thread used for running the work io_context's run loop. boost::scoped_ptr work_thread_; /// The file to which log messages will be written. std::ofstream ofstream_; }; } // namespace services #endif // SERVICES_LOGGER_SERVICE_HPP asio-1.12.2/src/examples/cpp03/socks4/000077500000000000000000000000001340672067200172775ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/socks4/socks4.hpp000066400000000000000000000057561340672067200212330ustar00rootroot00000000000000// // socks4.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SOCKS4_HPP #define SOCKS4_HPP #include #include #include namespace socks4 { const unsigned char version = 0x04; class request { public: enum command_type { connect = 0x01, bind = 0x02 }; request(command_type cmd, const asio::ip::tcp::endpoint& endpoint, const std::string& user_id) : version_(version), command_(cmd), user_id_(user_id), null_byte_(0) { // Only IPv4 is supported by the SOCKS 4 protocol. if (endpoint.protocol() != asio::ip::tcp::v4()) { throw asio::system_error( asio::error::address_family_not_supported); } // Convert port number to network byte order. unsigned short port = endpoint.port(); port_high_byte_ = (port >> 8) & 0xff; port_low_byte_ = port & 0xff; // Save IP address in network byte order. address_ = endpoint.address().to_v4().to_bytes(); } boost::array buffers() const { boost::array bufs = { { asio::buffer(&version_, 1), asio::buffer(&command_, 1), asio::buffer(&port_high_byte_, 1), asio::buffer(&port_low_byte_, 1), asio::buffer(address_), asio::buffer(user_id_), asio::buffer(&null_byte_, 1) } }; return bufs; } private: unsigned char version_; unsigned char command_; unsigned char port_high_byte_; unsigned char port_low_byte_; asio::ip::address_v4::bytes_type address_; std::string user_id_; unsigned char null_byte_; }; class reply { public: enum status_type { request_granted = 0x5a, request_failed = 0x5b, request_failed_no_identd = 0x5c, request_failed_bad_user_id = 0x5d }; reply() : null_byte_(0), status_() { } boost::array buffers() { boost::array bufs = { { asio::buffer(&null_byte_, 1), asio::buffer(&status_, 1), asio::buffer(&port_high_byte_, 1), asio::buffer(&port_low_byte_, 1), asio::buffer(address_) } }; return bufs; } bool success() const { return null_byte_ == 0 && status_ == request_granted; } unsigned char status() const { return status_; } asio::ip::tcp::endpoint endpoint() const { unsigned short port = port_high_byte_; port = (port << 8) & 0xff00; port = port | port_low_byte_; asio::ip::address_v4 address(address_); return asio::ip::tcp::endpoint(address, port); } private: unsigned char null_byte_; unsigned char status_; unsigned char port_high_byte_; unsigned char port_low_byte_; asio::ip::address_v4::bytes_type address_; }; } // namespace socks4 #endif // SOCKS4_HPP asio-1.12.2/src/examples/cpp03/socks4/sync_client.cpp000066400000000000000000000055201340672067200223170ustar00rootroot00000000000000// // sync_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include "socks4.hpp" using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 4) { std::cout << "Usage: sync_client \n"; std::cout << "Examples:\n"; std::cout << " sync_client 127.0.0.1 1080 chris\n"; std::cout << " sync_client localhost socks chris\n"; return 1; } asio::io_context io_context; // Get a list of endpoints corresponding to the SOCKS 4 server name. tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); // Try each endpoint until we successfully establish a connection to the // SOCKS 4 server. tcp::socket socket(io_context); asio::connect(socket, endpoints); // Get an endpoint for the Boost website. This will be passed to the SOCKS // 4 server. Explicitly specify IPv4 since SOCKS 4 does not support IPv6. tcp::endpoint http_endpoint = *resolver.resolve(tcp::v4(), "www.boost.org", "http").begin(); // Send the request to the SOCKS 4 server. socks4::request socks_request( socks4::request::connect, http_endpoint, argv[3]); asio::write(socket, socks_request.buffers()); // Receive a response from the SOCKS 4 server. socks4::reply socks_reply; asio::read(socket, socks_reply.buffers()); // Check whether we successfully negotiated with the SOCKS 4 server. if (!socks_reply.success()) { std::cout << "Connection failed.\n"; std::cout << "status = 0x" << std::hex << socks_reply.status(); return 1; } // Form the HTTP request. We specify the "Connection: close" header so that // the server will close the socket after transmitting the response. This // will allow us to treat all data up until the EOF as the response. std::string request = "GET / HTTP/1.0\r\n" "Host: www.boost.org\r\n" "Accept: */*\r\n" "Connection: close\r\n\r\n"; // Send the HTTP request. asio::write(socket, asio::buffer(request)); // Read until EOF, writing data to output as we go. boost::array response; asio::error_code error; while (std::size_t s = socket.read_some( asio::buffer(response), error)) std::cout.write(response.data(), s); if (error != asio::error::eof) throw asio::system_error(error); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/spawn/000077500000000000000000000000001340672067200172215ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/spawn/echo_server.cpp000066400000000000000000000051031340672067200222300ustar00rootroot00000000000000// // echo_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include using asio::ip::tcp; class session : public boost::enable_shared_from_this { public: explicit session(asio::io_context& io_context) : strand_(io_context), socket_(io_context), timer_(io_context) { } tcp::socket& socket() { return socket_; } void go() { asio::spawn(strand_, boost::bind(&session::echo, shared_from_this(), _1)); asio::spawn(strand_, boost::bind(&session::timeout, shared_from_this(), _1)); } private: void echo(asio::yield_context yield) { try { char data[128]; for (;;) { timer_.expires_after(asio::chrono::seconds(10)); std::size_t n = socket_.async_read_some(asio::buffer(data), yield); asio::async_write(socket_, asio::buffer(data, n), yield); } } catch (std::exception& e) { socket_.close(); timer_.cancel(); } } void timeout(asio::yield_context yield) { while (socket_.is_open()) { asio::error_code ignored_ec; timer_.async_wait(yield[ignored_ec]); if (timer_.expiry() <= asio::steady_timer::clock_type::now()) socket_.close(); } } asio::io_context::strand strand_; tcp::socket socket_; asio::steady_timer timer_; }; void do_accept(asio::io_context& io_context, unsigned short port, asio::yield_context yield) { tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port)); for (;;) { asio::error_code ec; boost::shared_ptr new_session(new session(io_context)); acceptor.async_accept(new_session->socket(), yield[ec]); if (!ec) new_session->go(); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: echo_server \n"; return 1; } asio::io_context io_context; asio::spawn(io_context, boost::bind(do_accept, boost::ref(io_context), atoi(argv[1]), _1)); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/spawn/parallel_grep.cpp000066400000000000000000000045271340672067200225460ustar00rootroot00000000000000// // parallel_grep.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include using asio::dispatch; using asio::spawn; using asio::strand; using asio::thread_pool; using asio::yield_context; void print_match(std::string input_file, std::string line) { std::cout << input_file << ':' << line << std::endl; } void search_file(std::string search_string, std::string input_file, strand output_strand, yield_context yield) { std::ifstream is(input_file.c_str()); std::string line; std::size_t line_num = 0; while (std::getline(is, line)) { // If we find a match, send a message to the output. if (line.find(search_string) != std::string::npos) { dispatch(output_strand, boost::bind(&print_match, input_file, line)); } // Every so often we yield control to another coroutine. if (++line_num % 10 == 0) post(yield); } } int main(int argc, char* argv[]) { try { if (argc < 2) { std::cerr << "Usage: parallel_grep \n"; return 1; } // We use a fixed size pool of threads for reading the input files. The // number of threads is automatically determined based on the number of // CPUs available in the system. thread_pool pool; // To prevent the output from being garbled, we use a strand to synchronise // printing. strand output_strand(pool.get_executor()); // Spawn a new coroutine for each file specified on the command line. std::string search_string = argv[1]; for (int argn = 2; argn < argc; ++argn) { std::string input_file = argv[argn]; spawn(pool, boost::bind(&search_file, search_string, input_file, output_strand, _1)); } // Join the thread pool to wait for all the spawned tasks to complete. pool.join(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/ssl/000077500000000000000000000000001340672067200166725ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/ssl/README000066400000000000000000000005641340672067200175570ustar00rootroot00000000000000The passphrase for both the CA and server private keys is "test". ------------------------------------------------------------------------------- Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) asio-1.12.2/src/examples/cpp03/ssl/ca.pem000066400000000000000000000056511340672067200177670ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDlzCCAn+gAwIBAgIJAMJYU3U6A0IRMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV BAYTAkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChME YXNpbzAeFw0xNTExMTgyMjMzNDhaFw0yMDExMTYyMjMzNDhaMDsxCzAJBgNVBAYT AkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNp bzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcRJocHdVMdLUJ/pypY QVSTC0t3IIgjwjazrK3kAaoIMvzPmDFxEXWcDx+nyz8kQ/E38Ir/ef2BCNGci5hu wkfMSuMoW9l2N4hx3QCcF46tTDEZztFxWAH7QbE2wYMlMgKZSxWimNfq0YjxEEXb QM0lGPLFh7Xoko29H0F3LKaaQV9u/vop3Hs0h12HeWlY4PiLp7QQTNGqbWcXycA0 NZ/fyismireyEvPAgo6L8iXuAi7g0TVKVNlrticGGjMcMq6IMvxzEpSMkuMQ5rWj pZjWOoBjSYBuXdblcBRvXhOr2Ws8jJLMZfehKq9q1reQfoGV6xMnbwmumSXbWRWT 0vkCAwEAAaOBnTCBmjAdBgNVHQ4EFgQUK/Zv/AVtfIeucJw8VEtux1dhI1YwawYD VR0jBGQwYoAUK/Zv/AVtfIeucJw8VEtux1dhI1ahP6Q9MDsxCzAJBgNVBAYTAkFV MQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNpb4IJ AMJYU3U6A0IRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBABLYXimq v/HLyIJi7Xn8AJUsICj8LKF/J24nwwiF+ibf7UkoChJURs4nN78bod/lpDVPTEVl gTBdV/vBJs416sCEFfsGjqB9OBYj4gb0VaJDsQd0+NMvXp0faKv2y9wgScxG9/cg aM7eRmyfMn1qjb6tpNxVOPpe/nFi8Vx/1orejBRaZr4zF5TkoPepfwLWQeXDUIdE +QHZ60jZAkR5RXTVU4u3kOKcJs839pmJYyxM4H2VxpR18vy4/YdIVWkREIUM2OgT 5iznIQIIgR56QRGP85uef+I6n0BHzrBk6du69bkQFxrFjLVGlal4bIQqSg4KGWgx dEdymMWzmMxpO9s= -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpgIBAAKCAQEAxxEmhwd1Ux0tQn+nKlhBVJMLS3cgiCPCNrOsreQBqggy/M+Y MXERdZwPH6fLPyRD8Tfwiv95/YEI0ZyLmG7CR8xK4yhb2XY3iHHdAJwXjq1MMRnO 0XFYAftBsTbBgyUyAplLFaKY1+rRiPEQRdtAzSUY8sWHteiSjb0fQXcspppBX27+ +incezSHXYd5aVjg+IuntBBM0aptZxfJwDQ1n9/KKyaKt7IS88CCjovyJe4CLuDR NUpU2Wu2JwYaMxwyrogy/HMSlIyS4xDmtaOlmNY6gGNJgG5d1uVwFG9eE6vZazyM ksxl96Eqr2rWt5B+gZXrEydvCa6ZJdtZFZPS+QIDAQABAoIBAQCOma+SvPoDzvvU DiPOxqgOEMPfjHfGbm86xl0luBalGfiEd6WbjVanfGKtF4MWOUFec+chez+FJMEP fufVC0qrKiJfNVMOpYvEd2SMgkSx1VymM8me6WXVDYsSipn2+1cm228ZEYAR9Emj oqQ4loaGLlP/3RaJbhBF7ruMJvXaZZQ4fZy74Z4tyRaaE1B659ua7Rjne7eNhQE8 cR7cQDkxsNNN3LTbfLRwEc/gcDXWgLe5JlR/K4ZrdKc3lyivm+Uew3ubKs+fgkyY kHmuI3RJGIjpnsZW0/So+pHm3b/fo6lmlhTXtNNd+tkkKn2K9ttbXT3Sc13Pc+4w c4MLyUpdAoGBAOxTtGDpeF6U4s+GPuOCzHCwKQyzfOyCL/UTZv1UJX7Kn1FYycJH eOjtBRtS661cGkGd1MPfjdX2VV84AmBGDUmRqJ2KfTI1NjLAEJ115ANTpmSTm3lF UYncgbzl6aflLpjE1mgY+JTJykYeN5jhhO0r2bsdY7S+zaMCSI5NLuznAoGBANej aMtqLg2qKoq+fUkNBHHLXelR5dBXFnKgSrTj++H4yeW9pYbl8bK3gTF3I5+dSjHW DdC4+X09iPqY7p8vm8Gq/vgO8Bu+EnKNVr80PJSj7AzFGd6mk/CVrAzoY2XJWbAp YFwpo1WfHjS5wBfQzBlXY7kWVB7fj32kk14PYmUfAoGBAJXfd7NGHPoOfdCSGGv8 VV7ZuQ6+/WiYH4XS6iuaI7VHFsZmAn3dCcbeGbD8Y04r7NLUH0yhB7g7YmTihk87 3c1cPIy8eS1QJbEFsQPK8fFSKWH7YkwEM/O0DesX+5hodaaYnkiiHXNujYLuQuAH lV87wfcyajsEDjFkj1L/i9TdAoGBAKYfRUQv8HqmdU+doHb+iEYCHb75UMpHzQtR YTwpxoo3V5Kdnz9lNeYwaF7rIY59ZgMunEYHumw5U6V625nW228/hF0lZOR6cUu+ hu2WGHWKMvdDgMJ+IcpeA8WN4cUwcN+9gHZ/vUzg4CxOTSYLvLBpGnIkOXnvUGPC vaTgxTSRAoGBAOHcuZ9hcUrPuVI1HVkjQQLu5mLZ3tz6linEbe/RCdJMK8JrRX4w ubB7gFclMYGbLlDNAJVYkydJaCy/2NAI3rfsOda+VmDqGx6z4BbSGceHhomyU1Oo 1H7YaXsuzDkzl23HRsyp0pKJpTdghZdbVsGF8vAB8ygK3ehM233neSln -----END RSA PRIVATE KEY----- asio-1.12.2/src/examples/cpp03/ssl/client.cpp000066400000000000000000000077411340672067200206650ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" #include "asio/ssl.hpp" enum { max_length = 1024 }; class client { public: client(asio::io_context& io_context, asio::ssl::context& context, asio::ip::tcp::resolver::results_type endpoints) : socket_(io_context, context) { socket_.set_verify_mode(asio::ssl::verify_peer); socket_.set_verify_callback( boost::bind(&client::verify_certificate, this, _1, _2)); asio::async_connect(socket_.lowest_layer(), endpoints, boost::bind(&client::handle_connect, this, asio::placeholders::error)); } bool verify_certificate(bool preverified, asio::ssl::verify_context& ctx) { // The verify callback can be used to check whether the certificate that is // being presented is valid for the peer. For example, RFC 2818 describes // the steps involved in doing this for HTTPS. Consult the OpenSSL // documentation for more details. Note that the callback is called once // for each certificate in the certificate chain, starting from the root // certificate authority. // In this example we will simply print the certificate's subject name. char subject_name[256]; X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); std::cout << "Verifying " << subject_name << "\n"; return preverified; } void handle_connect(const asio::error_code& error) { if (!error) { socket_.async_handshake(asio::ssl::stream_base::client, boost::bind(&client::handle_handshake, this, asio::placeholders::error)); } else { std::cout << "Connect failed: " << error.message() << "\n"; } } void handle_handshake(const asio::error_code& error) { if (!error) { std::cout << "Enter message: "; std::cin.getline(request_, max_length); size_t request_length = strlen(request_); asio::async_write(socket_, asio::buffer(request_, request_length), boost::bind(&client::handle_write, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { std::cout << "Handshake failed: " << error.message() << "\n"; } } void handle_write(const asio::error_code& error, size_t bytes_transferred) { if (!error) { asio::async_read(socket_, asio::buffer(reply_, bytes_transferred), boost::bind(&client::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { std::cout << "Write failed: " << error.message() << "\n"; } } void handle_read(const asio::error_code& error, size_t bytes_transferred) { if (!error) { std::cout << "Reply: "; std::cout.write(reply_, bytes_transferred); std::cout << "\n"; } else { std::cout << "Read failed: " << error.message() << "\n"; } } private: asio::ssl::stream socket_; char request_[max_length]; char reply_[max_length]; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: client \n"; return 1; } asio::io_context io_context; asio::ip::tcp::resolver resolver(io_context); asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]); asio::ssl::context ctx(asio::ssl::context::sslv23); ctx.load_verify_file("ca.pem"); client c(io_context, ctx, endpoints); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/ssl/dh2048.pem000066400000000000000000000006501340672067200203070ustar00rootroot00000000000000-----BEGIN DH PARAMETERS----- MIIBCAKCAQEAyNnxZSYc6J89mDNnqOH8bnwBiAJxcaUS3PkIEcwW8D9o2BlNq6EO XKMIbdfwPFZi80GMpNu3YP2A2B42sAHmb7w7ZA92QDv3JjqzR0QuS/CkMv4CEjha QBFwBDDWnnHBSj4w/t54ii0SH34mWcjBItI2eMtnM9J6fnvNiWqJxdt4iA4mZjZD qZTjIRyjgKAevzkqAlBqQRoVUUgu+9Cf29wXjVl3bE+0VU5CdFeyT+Y9yunz88mq rGyx1uPt+zbIfxuNLH+coY67y1ht7iZEL5WLd3wGCycRT+lYy2AL/rxGBPxStFIT 2bOkQao6sAfb4UdGEUlwHUXZrAV51oM30wIBAg== -----END DH PARAMETERS----- asio-1.12.2/src/examples/cpp03/ssl/server.cpp000066400000000000000000000071061340672067200207100ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" #include "asio/ssl.hpp" typedef asio::ssl::stream ssl_socket; class session { public: session(asio::io_context& io_context, asio::ssl::context& context) : socket_(io_context, context) { } ssl_socket::lowest_layer_type& socket() { return socket_.lowest_layer(); } void start() { socket_.async_handshake(asio::ssl::stream_base::server, boost::bind(&session::handle_handshake, this, asio::placeholders::error)); } void handle_handshake(const asio::error_code& error) { if (!error) { socket_.async_read_some(asio::buffer(data_, max_length), boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { delete this; } } void handle_read(const asio::error_code& error, size_t bytes_transferred) { if (!error) { asio::async_write(socket_, asio::buffer(data_, bytes_transferred), boost::bind(&session::handle_write, this, asio::placeholders::error)); } else { delete this; } } void handle_write(const asio::error_code& error) { if (!error) { socket_.async_read_some(asio::buffer(data_, max_length), boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } else { delete this; } } private: ssl_socket socket_; enum { max_length = 1024 }; char data_[max_length]; }; class server { public: server(asio::io_context& io_context, unsigned short port) : io_context_(io_context), acceptor_(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)), context_(asio::ssl::context::sslv23) { context_.set_options( asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use); context_.set_password_callback(boost::bind(&server::get_password, this)); context_.use_certificate_chain_file("server.pem"); context_.use_private_key_file("server.pem", asio::ssl::context::pem); context_.use_tmp_dh_file("dh2048.pem"); start_accept(); } std::string get_password() const { return "test"; } void start_accept() { session* new_session = new session(io_context_, context_); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, asio::placeholders::error)); } void handle_accept(session* new_session, const asio::error_code& error) { if (!error) { new_session->start(); } else { delete new_session; } start_accept(); } private: asio::io_context& io_context_; asio::ip::tcp::acceptor acceptor_; asio::ssl::context context_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/ssl/server.pem000066400000000000000000000101231340672067200207000ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIDAzCCAesCCQD9QcRiWk0y9TANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJB VTEMMAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxDTALBgNVBAoTBGFzaW8w HhcNMTUxMTE4MjIzNzMxWhcNMjAxMTE2MjIzNzMxWjBMMQswCQYDVQQGEwJBVTEM MAoGA1UECBMDTlNXMQ8wDQYDVQQHEwZTeWRuZXkxDTALBgNVBAoTBGFzaW8xDzAN BgNVBAsTBnNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0 +NXSklsGJR7HYHP/H4V5+KpYrmFKva/K7iiqi+XyWEjGnj+/iImJW26phhg9GouN JJxdrP7/0LwpMsEC/9v09dMNAEewtYhPgD4kiUH/E/79wVmayMZZZGrpF9Rw+wWv q58y3L1wKge3qilX6slVDdNhqU3vBiMKEJfsjE4PKcEVjPCjVJG2562eHK9FxyjQ DykyH61lQKBQOiElilPQKzAO7U36yTvs+chWuUfK47B8EC+PJ5KcLEppli4ljlwE w01HnGxwvjDLobKm2jL6CWi3aYGWudyTsNAd7YC5C7psktBypQLBcfp7uUrrR5Bb PEjFHJUWIlyoYvm2OjMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAtceVW6tixFsB ZRhjL5aRCcbx2iMwEXd54lcP6BWe1qOcDPHoSYI1zvvGzohbEvBfqUv78S9MtzaT gMe5rIU9M1ZM09PyaM6ZutGpKHE8L4qcOslTt41GQFsSqPFdcbgSV20MvBzjGayR AI/WV0avW3oasdetJPZCR7bRbCbMbWTgclUfv5F25ENcR+BhNuilfL15owL0s4sS Wb4jOOHhXV9iXeS2dH0snFqv4BmQ9ZoA7zbM9lG3EU5DuxHESYkCnzJyEqqY3vWv PFRViCxLp5LQLmkTQ3dglVQA4x6ZaonaewdPtdhjkLUuIqDvQx5+kIaOELbSws+c bREYlnGrFw== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,D459676347D389E9135496D8AAFA7953 wbrjxr9NHur8kgxDsgXOY9qFGKpONIQLxkuahUrDD/H+s/l7ugsLWOPsOXbjNL/7 QYUBAx85HKm9D8BQ5g78Y82qfArap3/3IIuysDfQDh4fQodhVtmGTFiCOvudlGEp lq1niQRLThlxeRoFphH8KKiOTO9a/d8tdL7zRmiFwnVnhK4014mgVmgcSefA1AF5 RbJAeMclUKddG6ltQK00ptg84CDXiMWQXFBGGmQ1av2lyFzC+xLP+qDqZAYTM9lZ NFRo2oEZP1ozfOVNSbXTanJgZ0DSSmhGE1PcVrHSeE/v+k1kPh3oVKi9GV51kIDC Zd9f/XltuDOzy1Ybn6gRy4nzNpzcwjSCIHEdSD5nxU5JfHfQ3OtnsEab7qf989iP s2LbCSp5uGTMvfesMIkixIZAQp2FeahZTAgU2Vx+wi5Kks68rOqeywEfzACL/Um5 7XZu8gDs4MgRRWnxK1BbJDPifICLvSJZvgB9FKX/hk4FHFF+MtcrkalehCuLooDV 3rfHNvRSbg7J97XQ3QC+k9ZDaumpy6n+LhaVv7BIJRBnBBtZ5Eg3DmPg6flqaHAU Y/8d82wb/pCmbvR3B1/Ebgs84DPJ+uZnY9M5Iwx19oqlVSR2ts/Tx619LGAm+BiQ 7YDoC4CFmpAA8Uw0xnUbNgx94NdNmlnLeLtS50b0XlWpHKbVzmVbNYEjY6NHMlLt aqxWHTYTa7g/c1bg2/nxF1Lbfu5VSTROGBUuer1c3yzVuyBrjcX92Jp4BJH78qOp N6lY6MnH4HYRXHjzlt/S0ZzO0faPPe18Q8SWvnDVuE3fYzzL772B56d2t8eodc+/ t6M3qJ60eXdsmgYOaPRLRUovN2xT2UUr0+biuguHyqfaVfcEU/adw+b9oUVE+5Nw nZHI5qhPnhLxChyZqbBl68zMUyKlfff4OyLvRGpfcHwBw6DTGjduB+DDsqqkcIB9 2VL6nps7ZVCwMPI18siUd6cttEOf6ZXrVqHg9wfDvJOlh2NNKNLxSAFubHc90Jlj KejrWenXo2w6YkSUeTV4t4cWu7U8rXIkTJXDl1S6NO8DWqNDo5KjgJ2SK5NlSOJ7 jgECn390ooneJOxxytPVQO2xppXQZZS65RHrvhB+ss5xUknly9q+ICyt6xTR9nqA PKkeSE6qVY0J4JgFXpkgQxgwMnjSED3LKr3jlz28pr5cC6tsc5SSlekHjT2fcSrX uccaVahaJRigf+q+4XzmJtdwbZU+YWGZRVMlQLA5yzPHQHDYkPpOeYU4WReND8S4 TZRkPHaxOZ2lKQwJB93V8Vbt2MvwRy392452a33S4TcQLaWzoOljXjmZjrp2rvRz prBaNe8LnO4V8Oliv+H+E0UWiWFDuI+HBy4X4O9plsbw/gk64Phl9qLiBwaX/AIR 66FXvC/czABo9oSt2jekcMtJofYr8Gr2bsJlt5ZX+GEOxz4jMv7xvz5/L3W7jVav pHGIv4xfN9FrXzL47O7UuUF9xZg4Rp/fxwpgEDNZmX/3DnP0ewZQUcgUX0pdqNGQ YVqJXcRF7KqG2NSQFuwPESZQnxU0WzSgRyUae7xg1WKfSuN8NVAzKhOgeqlD2IAo -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIDlzCCAn+gAwIBAgIJAMJYU3U6A0IRMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV BAYTAkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChME YXNpbzAeFw0xNTExMTgyMjMzNDhaFw0yMDExMTYyMjMzNDhaMDsxCzAJBgNVBAYT AkFVMQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNp bzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMcRJocHdVMdLUJ/pypY QVSTC0t3IIgjwjazrK3kAaoIMvzPmDFxEXWcDx+nyz8kQ/E38Ir/ef2BCNGci5hu wkfMSuMoW9l2N4hx3QCcF46tTDEZztFxWAH7QbE2wYMlMgKZSxWimNfq0YjxEEXb QM0lGPLFh7Xoko29H0F3LKaaQV9u/vop3Hs0h12HeWlY4PiLp7QQTNGqbWcXycA0 NZ/fyismireyEvPAgo6L8iXuAi7g0TVKVNlrticGGjMcMq6IMvxzEpSMkuMQ5rWj pZjWOoBjSYBuXdblcBRvXhOr2Ws8jJLMZfehKq9q1reQfoGV6xMnbwmumSXbWRWT 0vkCAwEAAaOBnTCBmjAdBgNVHQ4EFgQUK/Zv/AVtfIeucJw8VEtux1dhI1YwawYD VR0jBGQwYoAUK/Zv/AVtfIeucJw8VEtux1dhI1ahP6Q9MDsxCzAJBgNVBAYTAkFV MQwwCgYDVQQIEwNOU1cxDzANBgNVBAcTBlN5ZG5leTENMAsGA1UEChMEYXNpb4IJ AMJYU3U6A0IRMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBABLYXimq v/HLyIJi7Xn8AJUsICj8LKF/J24nwwiF+ibf7UkoChJURs4nN78bod/lpDVPTEVl gTBdV/vBJs416sCEFfsGjqB9OBYj4gb0VaJDsQd0+NMvXp0faKv2y9wgScxG9/cg aM7eRmyfMn1qjb6tpNxVOPpe/nFi8Vx/1orejBRaZr4zF5TkoPepfwLWQeXDUIdE +QHZ60jZAkR5RXTVU4u3kOKcJs839pmJYyxM4H2VxpR18vy4/YdIVWkREIUM2OgT 5iznIQIIgR56QRGP85uef+I6n0BHzrBk6du69bkQFxrFjLVGlal4bIQqSg4KGWgx dEdymMWzmMxpO9s= -----END CERTIFICATE----- asio-1.12.2/src/examples/cpp03/timeouts/000077500000000000000000000000001340672067200177425ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/timeouts/async_tcp_client.cpp000066400000000000000000000216101340672067200237670ustar00rootroot00000000000000// // async_tcp_client.cpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/read_until.hpp" #include "asio/steady_timer.hpp" #include "asio/write.hpp" #include #include #include using asio::steady_timer; using asio::ip::tcp; // // This class manages socket timeouts by applying the concept of a deadline. // Some asynchronous operations are given deadlines by which they must complete. // Deadlines are enforced by an "actor" that persists for the lifetime of the // client object: // // +----------------+ // | | // | check_deadline |<---+ // | | | // +----------------+ | async_wait() // | | // +---------+ // // If the deadline actor determines that the deadline has expired, the socket // is closed and any outstanding operations are consequently cancelled. // // Connection establishment involves trying each endpoint in turn until a // connection is successful, or the available endpoints are exhausted. If the // deadline actor closes the socket, the connect actor is woken up and moves to // the next endpoint. // // +---------------+ // | | // | start_connect |<---+ // | | | // +---------------+ | // | | // async_- | +----------------+ // connect() | | | // +--->| handle_connect | // | | // +----------------+ // : // Once a connection is : // made, the connect : // actor forks in two - : // : // an actor for reading : and an actor for // inbound messages: : sending heartbeats: // : // +------------+ : +-------------+ // | |<- - - - -+- - - - ->| | // | start_read | | start_write |<---+ // | |<---+ | | | // +------------+ | +-------------+ | async_wait() // | | | | // async_- | +-------------+ async_- | +--------------+ // read_- | | | write() | | | // until() +--->| handle_read | +--->| handle_write | // | | | | // +-------------+ +--------------+ // // The input actor reads messages from the socket, where messages are delimited // by the newline character. The deadline for a complete message is 30 seconds. // // The heartbeat actor sends a heartbeat (a message that consists of a single // newline character) every 10 seconds. In this example, no deadline is applied // to message sending. // class client { public: client(asio::io_context& io_context) : stopped_(false), socket_(io_context), deadline_(io_context), heartbeat_timer_(io_context) { } // Called by the user of the client class to initiate the connection process. // The endpoints will have been obtained using a tcp::resolver. void start(tcp::resolver::results_type endpoints) { // Start the connect actor. endpoints_ = endpoints; start_connect(endpoints_.begin()); // Start the deadline actor. You will note that we're not setting any // particular deadline here. Instead, the connect and input actors will // update the deadline prior to each asynchronous operation. deadline_.async_wait(boost::bind(&client::check_deadline, this)); } // This function terminates all the actors to shut down the connection. It // may be called by the user of the client class, or by the class itself in // response to graceful termination or an unrecoverable error. void stop() { stopped_ = true; asio::error_code ignored_ec; socket_.close(ignored_ec); deadline_.cancel(); heartbeat_timer_.cancel(); } private: void start_connect(tcp::resolver::results_type::iterator endpoint_iter) { if (endpoint_iter != endpoints_.end()) { std::cout << "Trying " << endpoint_iter->endpoint() << "...\n"; // Set a deadline for the connect operation. deadline_.expires_after(asio::chrono::seconds(60)); // Start the asynchronous connect operation. socket_.async_connect(endpoint_iter->endpoint(), boost::bind(&client::handle_connect, this, _1, endpoint_iter)); } else { // There are no more endpoints to try. Shut down the client. stop(); } } void handle_connect(const asio::error_code& ec, tcp::resolver::results_type::iterator endpoint_iter) { if (stopped_) return; // The async_connect() function automatically opens the socket at the start // of the asynchronous operation. If the socket is closed at this time then // the timeout handler must have run first. if (!socket_.is_open()) { std::cout << "Connect timed out\n"; // Try the next available endpoint. start_connect(++endpoint_iter); } // Check if the connect operation failed before the deadline expired. else if (ec) { std::cout << "Connect error: " << ec.message() << "\n"; // We need to close the socket used in the previous connection attempt // before starting a new one. socket_.close(); // Try the next available endpoint. start_connect(++endpoint_iter); } // Otherwise we have successfully established a connection. else { std::cout << "Connected to " << endpoint_iter->endpoint() << "\n"; // Start the input actor. start_read(); // Start the heartbeat actor. start_write(); } } void start_read() { // Set a deadline for the read operation. deadline_.expires_after(asio::chrono::seconds(30)); // Start an asynchronous operation to read a newline-delimited message. asio::async_read_until(socket_, asio::dynamic_buffer(input_buffer_), '\n', boost::bind(&client::handle_read, this, _1, _2)); } void handle_read(const asio::error_code& ec, std::size_t n) { if (stopped_) return; if (!ec) { // Extract the newline-delimited message from the buffer. std::string line(input_buffer_.substr(0, n - 1)); input_buffer_.erase(0, n); // Empty messages are heartbeats and so ignored. if (!line.empty()) { std::cout << "Received: " << line << "\n"; } start_read(); } else { std::cout << "Error on receive: " << ec.message() << "\n"; stop(); } } void start_write() { if (stopped_) return; // Start an asynchronous operation to send a heartbeat message. asio::async_write(socket_, asio::buffer("\n", 1), boost::bind(&client::handle_write, this, _1)); } void handle_write(const asio::error_code& ec) { if (stopped_) return; if (!ec) { // Wait 10 seconds before sending the next heartbeat. heartbeat_timer_.expires_after(asio::chrono::seconds(10)); heartbeat_timer_.async_wait(boost::bind(&client::start_write, this)); } else { std::cout << "Error on heartbeat: " << ec.message() << "\n"; stop(); } } void check_deadline() { if (stopped_) return; // Check whether the deadline has passed. We compare the deadline against // the current time since a new asynchronous operation may have moved the // deadline before this actor had a chance to run. if (deadline_.expiry() <= steady_timer::clock_type::now()) { // The deadline has passed. The socket is closed so that any outstanding // asynchronous operations are cancelled. socket_.close(); // There is no longer an active deadline. The expiry is set to the // maximum time point so that the actor takes no action until a new // deadline is set. deadline_.expires_at(steady_timer::time_point::max()); } // Put the actor back to sleep. deadline_.async_wait(boost::bind(&client::check_deadline, this)); } private: bool stopped_; tcp::resolver::results_type endpoints_; tcp::socket socket_; std::string input_buffer_; steady_timer deadline_; steady_timer heartbeat_timer_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: client \n"; return 1; } asio::io_context io_context; tcp::resolver r(io_context); client c(io_context); c.start(r.resolve(argv[1], argv[2])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/timeouts/blocking_tcp_client.cpp000066400000000000000000000135661340672067200244550ustar00rootroot00000000000000// // blocking_tcp_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/buffer.hpp" #include "asio/connect.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/read_until.hpp" #include "asio/system_error.hpp" #include "asio/write.hpp" #include #include #include #include #include using asio::ip::tcp; using boost::lambda::bind; using boost::lambda::var; using boost::lambda::_1; using boost::lambda::_2; //---------------------------------------------------------------------- // // This class manages socket timeouts by running the io_context using the timed // io_context::run_for() member function. Each asynchronous operation is given // a timeout within which it must complete. The socket operations themselves // use boost::lambda function objects as completion handlers. For a given // socket operation, the client object runs the io_context to block thread // execution until the operation completes or the timeout is reached. If the // io_context::run_for() function times out, the socket is closed and the // outstanding asynchronous operation is cancelled. // class client { public: client() : socket_(io_context_) { } void connect(const std::string& host, const std::string& service, asio::chrono::steady_clock::duration timeout) { // Resolve the host name and service to a list of endpoints. tcp::resolver::results_type endpoints = tcp::resolver(io_context_).resolve(host, service); // Start the asynchronous operation itself. The boost::lambda function // object is used as a callback and will update the ec variable when the // operation completes. The blocking_udp_client.cpp example shows how you // can use boost::bind rather than boost::lambda. asio::error_code ec; asio::async_connect(socket_, endpoints, var(ec) = _1); // Run the operation until it completes, or until the timeout. run(timeout); // Determine whether a connection was successfully established. if (ec) throw asio::system_error(ec); } std::string read_line(asio::chrono::steady_clock::duration timeout) { // Start the asynchronous operation. The boost::lambda function object is // used as a callback and will update the ec variable when the operation // completes. The blocking_udp_client.cpp example shows how you can use // boost::bind rather than boost::lambda. asio::error_code ec; std::size_t n = 0; asio::async_read_until(socket_, asio::dynamic_buffer(input_buffer_), '\n', (var(ec) = _1, var(n) = _2)); // Run the operation until it completes, or until the timeout. run(timeout); // Determine whether the read completed successfully. if (ec) throw asio::system_error(ec); std::string line(input_buffer_.substr(0, n - 1)); input_buffer_.erase(0, n); return line; } void write_line(const std::string& line, asio::chrono::steady_clock::duration timeout) { std::string data = line + "\n"; // Start the asynchronous operation. The boost::lambda function object is // used as a callback and will update the ec variable when the operation // completes. The blocking_udp_client.cpp example shows how you can use // boost::bind rather than boost::lambda. asio::error_code ec; asio::async_write(socket_, asio::buffer(data), var(ec) = _1); // Run the operation until it completes, or until the timeout. run(timeout); // Determine whether the read completed successfully. if (ec) throw asio::system_error(ec); } private: void run(asio::chrono::steady_clock::duration timeout) { // Restart the io_context, as it may have been left in the "stopped" state // by a previous operation. io_context_.restart(); // Block until the asynchronous operation has completed, or timed out. If // the pending asynchronous operation is a composed operation, the deadline // applies to the entire operation, rather than individual operations on // the socket. io_context_.run_for(timeout); // If the asynchronous operation completed successfully then the io_context // would have been stopped due to running out of work. If it was not // stopped, then the io_context::run_for call must have timed out. if (!io_context_.stopped()) { // Close the socket to cancel the outstanding asynchronous operation. socket_.close(); // Run the io_context again until the operation completes. io_context_.run(); } } asio::io_context io_context_; tcp::socket socket_; std::string input_buffer_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc != 4) { std::cerr << "Usage: blocking_tcp_client \n"; return 1; } client c; c.connect(argv[1], argv[2], asio::chrono::seconds(10)); asio::chrono::steady_clock::time_point time_sent = asio::chrono::steady_clock::now(); c.write_line(argv[3], asio::chrono::seconds(10)); for (;;) { std::string line = c.read_line(asio::chrono::seconds(10)); // Keep going until we get back the line that was sent. if (line == argv[3]) break; } asio::chrono::steady_clock::time_point time_received = asio::chrono::steady_clock::now(); std::cout << "Round trip time: "; std::cout << asio::chrono::duration_cast< asio::chrono::microseconds>( time_received - time_sent).count(); std::cout << " microseconds\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp000066400000000000000000000134021340672067200256420ustar00rootroot00000000000000// // blocking_token_tcp_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/connect.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/read_until.hpp" #include "asio/streambuf.hpp" #include "asio/system_error.hpp" #include "asio/write.hpp" #include #include #include #include using asio::ip::tcp; //---------------------------------------------------------------------- // A custom completion token that makes asynchronous operations behave as // though they are blocking calls with a timeout. struct close_after { close_after(asio::chrono::steady_clock::duration t, tcp::socket& s) : timeout_(t), socket_(s) { } // The maximum time to wait for an asynchronous operation to complete. asio::chrono::steady_clock::duration timeout_; // The socket to be closed if the operation does not complete in time. tcp::socket& socket_; }; namespace asio { // The async_result template is specialised to allow the close_after token to // be used with asynchronous operations that have a completion signature of // void(error_code, T). Generalising this for all completion signature forms is // left as an exercise for the reader. template class async_result { public: // An asynchronous operation's initiating function automatically creates an // completion_handler_type object from the token. This function object is // then called on completion of the asynchronous operation. class completion_handler_type { public: completion_handler_type(const close_after& token) : token_(token) { } void operator()(asio::error_code ec, T t) { *ec_ = ec; *t_ = t; } private: friend class async_result; close_after token_; asio::error_code* ec_; T* t_; }; // The async_result constructor associates the completion handler object with // the result of the initiating function. explicit async_result(completion_handler_type& h) : timeout_(h.token_.timeout_), socket_(h.token_.socket_) { h.ec_ = &ec_; h.t_ = &t_; } // The return_type typedef determines the result type of the asynchronous // operation's initiating function. typedef T return_type; // The get() function is used to obtain the result of the asynchronous // operation's initiating function. For the close_after completion token, we // use this function to run the io_context until the operation is complete. return_type get() { asio::io_context& io_context = socket_.get_executor().context(); // Restart the io_context, as it may have been left in the "stopped" state // by a previous operation. io_context.restart(); // Block until the asynchronous operation has completed, or timed out. If // the pending asynchronous operation is a composed operation, the deadline // applies to the entire operation, rather than individual operations on // the socket. io_context.run_for(timeout_); // If the asynchronous operation completed successfully then the io_context // would have been stopped due to running out of work. If it was not // stopped, then the io_context::run_for call must have timed out and the // operation is still incomplete. if (!io_context.stopped()) { // Close the socket to cancel the outstanding asynchronous operation. socket_.close(); // Run the io_context again until the operation completes. io_context.run(); } // If the operation failed, throw an exception. Otherwise return the result. return ec_ ? throw asio::system_error(ec_) : t_; } private: asio::chrono::steady_clock::duration timeout_; tcp::socket& socket_; asio::error_code ec_; T t_; }; } // namespace asio //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc != 4) { std::cerr << "Usage: blocking_tcp_client \n"; return 1; } asio::io_context io_context; // Resolve the host name and service to a list of endpoints. tcp::resolver::results_type endpoints = tcp::resolver(io_context).resolve(argv[1], argv[2]); tcp::socket socket(io_context); // Run an asynchronous connect operation with a timeout. asio::async_connect(socket, endpoints, close_after(asio::chrono::seconds(10), socket)); asio::chrono::steady_clock::time_point time_sent = asio::chrono::steady_clock::now(); // Run an asynchronous write operation with a timeout. std::string msg = argv[3] + std::string("\n"); asio::async_write(socket, asio::buffer(msg), close_after(asio::chrono::seconds(10), socket)); for (std::string input_buffer;;) { // Run an asynchronous read operation with a timeout. std::size_t n = asio::async_read_until(socket, asio::dynamic_buffer(input_buffer), '\n', close_after(asio::chrono::seconds(10), socket)); std::string line(input_buffer.substr(0, n - 1)); input_buffer.erase(0, n); // Keep going until we get back the line that was sent. if (line == argv[3]) break; } asio::chrono::steady_clock::time_point time_received = asio::chrono::steady_clock::now(); std::cout << "Round trip time: "; std::cout << asio::chrono::duration_cast< asio::chrono::microseconds>( time_received - time_sent).count(); std::cout << " microseconds\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/timeouts/blocking_udp_client.cpp000066400000000000000000000102101340672067200244360ustar00rootroot00000000000000// // blocking_udp_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ip/udp.hpp" #include #include #include using asio::ip::udp; //---------------------------------------------------------------------- // // This class manages socket timeouts by running the io_context using the timed // io_context::run_for() member function. Each asynchronous operation is given // a timeout within which it must complete. The socket operations themselves // use boost::bind to specify the completion handler: // // +---------------+ // | | // | receive | // | | // +---------------+ // | // async_- | +----------------+ // receive() | | | // +--->| handle_receive | // | | // +----------------+ // // For a given socket operation, the client object runs the io_context to block // thread execution until the operation completes or the timeout is reached. If // the io_context::run_for() function times out, the socket is closed and the // outstanding asynchronous operation is cancelled. // class client { public: client(const udp::endpoint& listen_endpoint) : socket_(io_context_, listen_endpoint) { } std::size_t receive(const asio::mutable_buffer& buffer, asio::chrono::steady_clock::duration timeout, asio::error_code& ec) { // Start the asynchronous operation. The handle_receive function used as a // callback will update the ec and length variables. std::size_t length = 0; socket_.async_receive(asio::buffer(buffer), boost::bind(&client::handle_receive, _1, _2, &ec, &length)); // Run the operation until it completes, or until the timeout. run(timeout); return length; } private: void run(asio::chrono::steady_clock::duration timeout) { // Restart the io_context, as it may have been left in the "stopped" state // by a previous operation. io_context_.restart(); // Block until the asynchronous operation has completed, or timed out. If // the pending asynchronous operation is a composed operation, the deadline // applies to the entire operation, rather than individual operations on // the socket. io_context_.run_for(timeout); // If the asynchronous operation completed successfully then the io_context // would have been stopped due to running out of work. If it was not // stopped, then the io_context::run_for call must have timed out. if (!io_context_.stopped()) { // Cancel the outstanding asynchronous operation. socket_.cancel(); // Run the io_context again until the operation completes. io_context_.run(); } } static void handle_receive( const asio::error_code& ec, std::size_t length, asio::error_code* out_ec, std::size_t* out_length) { *out_ec = ec; *out_length = length; } private: asio::io_context io_context_; udp::socket socket_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { using namespace std; // For atoi. if (argc != 3) { std::cerr << "Usage: blocking_udp_client \n"; return 1; } udp::endpoint listen_endpoint( asio::ip::make_address(argv[1]), std::atoi(argv[2])); client c(listen_endpoint); for (;;) { char data[1024]; asio::error_code ec; std::size_t n = c.receive(asio::buffer(data), asio::chrono::seconds(10), ec); if (ec) { std::cout << "Receive error: " << ec.message() << "\n"; } else { std::cout << "Received: "; std::cout.write(data, n); std::cout << "\n"; } } } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/timeouts/server.cpp000066400000000000000000000267131340672067200217650ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/ip/udp.hpp" #include "asio/read_until.hpp" #include "asio/steady_timer.hpp" #include "asio/write.hpp" using asio::steady_timer; using asio::ip::tcp; using asio::ip::udp; //---------------------------------------------------------------------- class subscriber { public: virtual ~subscriber() {} virtual void deliver(const std::string& msg) = 0; }; typedef boost::shared_ptr subscriber_ptr; //---------------------------------------------------------------------- class channel { public: void join(subscriber_ptr subscriber) { subscribers_.insert(subscriber); } void leave(subscriber_ptr subscriber) { subscribers_.erase(subscriber); } void deliver(const std::string& msg) { std::for_each(subscribers_.begin(), subscribers_.end(), boost::bind(&subscriber::deliver, _1, boost::ref(msg))); } private: std::set subscribers_; }; //---------------------------------------------------------------------- // // This class manages socket timeouts by applying the concept of a deadline. // Some asynchronous operations are given deadlines by which they must complete. // Deadlines are enforced by two "actors" that persist for the lifetime of the // session object, one for input and one for output: // // +----------------+ +----------------+ // | | | | // | check_deadline |<---+ | check_deadline |<---+ // | | | async_wait() | | | async_wait() // +----------------+ | on input +----------------+ | on output // | | deadline | | deadline // +---------+ +---------+ // // If either deadline actor determines that the corresponding deadline has // expired, the socket is closed and any outstanding operations are cancelled. // // The input actor reads messages from the socket, where messages are delimited // by the newline character: // // +------------+ // | | // | start_read |<---+ // | | | // +------------+ | // | | // async_- | +-------------+ // read_- | | | // until() +--->| handle_read | // | | // +-------------+ // // The deadline for receiving a complete message is 30 seconds. If a non-empty // message is received, it is delivered to all subscribers. If a heartbeat (a // message that consists of a single newline character) is received, a heartbeat // is enqueued for the client, provided there are no other messages waiting to // be sent. // // The output actor is responsible for sending messages to the client: // // +--------------+ // | |<---------------------+ // | await_output | | // | |<---+ | // +--------------+ | | // | | | async_wait() | // | +--------+ | // V | // +-------------+ +--------------+ // | | async_write() | | // | start_write |-------------->| handle_write | // | | | | // +-------------+ +--------------+ // // The output actor first waits for an output message to be enqueued. It does // this by using a steady_timer as an asynchronous condition variable. The // steady_timer will be signalled whenever the output queue is non-empty. // // Once a message is available, it is sent to the client. The deadline for // sending a complete message is 30 seconds. After the message is successfully // sent, the output actor again waits for the output queue to become non-empty. // class tcp_session : public subscriber, public boost::enable_shared_from_this { public: tcp_session(asio::io_context& io_context, channel& ch) : channel_(ch), socket_(io_context), input_deadline_(io_context), non_empty_output_queue_(io_context), output_deadline_(io_context) { input_deadline_.expires_at(steady_timer::time_point::max()); output_deadline_.expires_at(steady_timer::time_point::max()); // The non_empty_output_queue_ steady_timer is set to the maximum time // point whenever the output queue is empty. This ensures that the output // actor stays asleep until a message is put into the queue. non_empty_output_queue_.expires_at(steady_timer::time_point::max()); } tcp::socket& socket() { return socket_; } // Called by the server object to initiate the four actors. void start() { channel_.join(shared_from_this()); start_read(); input_deadline_.async_wait( boost::bind(&tcp_session::check_deadline, shared_from_this(), &input_deadline_)); await_output(); output_deadline_.async_wait( boost::bind(&tcp_session::check_deadline, shared_from_this(), &output_deadline_)); } private: void stop() { channel_.leave(shared_from_this()); asio::error_code ignored_ec; socket_.close(ignored_ec); input_deadline_.cancel(); non_empty_output_queue_.cancel(); output_deadline_.cancel(); } bool stopped() const { return !socket_.is_open(); } void deliver(const std::string& msg) { output_queue_.push_back(msg + "\n"); // Signal that the output queue contains messages. Modifying the expiry // will wake the output actor, if it is waiting on the timer. non_empty_output_queue_.expires_at(steady_timer::time_point::min()); } void start_read() { // Set a deadline for the read operation. input_deadline_.expires_after(asio::chrono::seconds(30)); // Start an asynchronous operation to read a newline-delimited message. asio::async_read_until(socket_, asio::dynamic_buffer(input_buffer_), '\n', boost::bind(&tcp_session::handle_read, shared_from_this(), _1, _2)); } void handle_read(const asio::error_code& ec, std::size_t n) { if (stopped()) return; if (!ec) { // Extract the newline-delimited message from the buffer. std::string msg(input_buffer_.substr(0, n - 1)); input_buffer_.erase(0, n); if (!msg.empty()) { channel_.deliver(msg); } else { // We received a heartbeat message from the client. If there's nothing // else being sent or ready to be sent, send a heartbeat right back. if (output_queue_.empty()) { output_queue_.push_back("\n"); // Signal that the output queue contains messages. Modifying the // expiry will wake the output actor, if it is waiting on the timer. non_empty_output_queue_.expires_at(steady_timer::time_point::min()); } } start_read(); } else { stop(); } } void await_output() { if (stopped()) return; if (output_queue_.empty()) { // There are no messages that are ready to be sent. The actor goes to // sleep by waiting on the non_empty_output_queue_ timer. When a new // message is added, the timer will be modified and the actor will wake. non_empty_output_queue_.expires_at(steady_timer::time_point::max()); non_empty_output_queue_.async_wait( boost::bind(&tcp_session::await_output, shared_from_this())); } else { start_write(); } } void start_write() { // Set a deadline for the write operation. output_deadline_.expires_after(asio::chrono::seconds(30)); // Start an asynchronous operation to send a message. asio::async_write(socket_, asio::buffer(output_queue_.front()), boost::bind(&tcp_session::handle_write, shared_from_this(), _1)); } void handle_write(const asio::error_code& ec) { if (stopped()) return; if (!ec) { output_queue_.pop_front(); await_output(); } else { stop(); } } void check_deadline(steady_timer* deadline) { if (stopped()) return; // Check whether the deadline has passed. We compare the deadline against // the current time since a new asynchronous operation may have moved the // deadline before this actor had a chance to run. if (deadline->expiry() <= steady_timer::clock_type::now()) { // The deadline has passed. Stop the session. The other actors will // terminate as soon as possible. stop(); } else { // Put the actor back to sleep. deadline->async_wait( boost::bind(&tcp_session::check_deadline, shared_from_this(), deadline)); } } channel& channel_; tcp::socket socket_; std::string input_buffer_; steady_timer input_deadline_; std::deque output_queue_; steady_timer non_empty_output_queue_; steady_timer output_deadline_; }; typedef boost::shared_ptr tcp_session_ptr; //---------------------------------------------------------------------- class udp_broadcaster : public subscriber { public: udp_broadcaster(asio::io_context& io_context, const udp::endpoint& broadcast_endpoint) : socket_(io_context) { socket_.connect(broadcast_endpoint); socket_.set_option(udp::socket::broadcast(true)); } private: void deliver(const std::string& msg) { asio::error_code ignored_ec; socket_.send(asio::buffer(msg), 0, ignored_ec); } udp::socket socket_; }; //---------------------------------------------------------------------- class server { public: server(asio::io_context& io_context, const tcp::endpoint& listen_endpoint, const udp::endpoint& broadcast_endpoint) : io_context_(io_context), acceptor_(io_context, listen_endpoint) { subscriber_ptr bc(new udp_broadcaster(io_context_, broadcast_endpoint)); channel_.join(bc); start_accept(); } void start_accept() { tcp_session_ptr new_session(new tcp_session(io_context_, channel_)); acceptor_.async_accept(new_session->socket(), boost::bind(&server::handle_accept, this, new_session, _1)); } void handle_accept(tcp_session_ptr session, const asio::error_code& ec) { if (!ec) { session->start(); } start_accept(); } private: asio::io_context& io_context_; tcp::acceptor acceptor_; channel channel_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { using namespace std; // For atoi. if (argc != 4) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; tcp::endpoint listen_endpoint(tcp::v4(), atoi(argv[1])); udp::endpoint broadcast_endpoint( asio::ip::make_address(argv[2]), atoi(argv[3])); server s(io_context, listen_endpoint, broadcast_endpoint); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/timers/000077500000000000000000000000001340672067200173745ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/timers/time_t_timer.cpp000066400000000000000000000061641340672067200225700ustar00rootroot00000000000000// // time_t_timer.cpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include // A custom implementation of the Clock concept from the standard C++ library. struct time_t_clock { // The duration type. typedef asio::chrono::steady_clock::duration duration; // The duration's underlying arithmetic representation. typedef duration::rep rep; // The ratio representing the duration's tick period. typedef duration::period period; // An absolute time point represented using the clock. typedef asio::chrono::time_point time_point; // The clock is not monotonically increasing. static const bool is_steady = false; // Get the current time. static time_point now() { return time_point() + asio::chrono::seconds(std::time(0)); } }; // The asio::basic_waitable_timer template accepts an optional WaitTraits // template parameter. The underlying time_t clock has one-second granularity, // so these traits may be customised to reduce the latency between the clock // ticking over and a wait operation's completion. When the timeout is near // (less than one second away) we poll the clock more frequently to detect the // time change closer to when it occurs. The user can select the appropriate // trade off between accuracy and the increased CPU cost of polling. In extreme // cases, a zero duration may be returned to make the timers as accurate as // possible, albeit with 100% CPU usage. struct time_t_wait_traits { // Determine how long until the clock should be next polled to determine // whether the duration has elapsed. static time_t_clock::duration to_wait_duration( const time_t_clock::duration& d) { if (d > asio::chrono::seconds(1)) return d - asio::chrono::seconds(1); else if (d > asio::chrono::seconds(0)) return asio::chrono::milliseconds(10); else return asio::chrono::seconds(0); } // Determine how long until the clock should be next polled to determine // whether the absoluate time has been reached. static time_t_clock::duration to_wait_duration( const time_t_clock::time_point& t) { return to_wait_duration(t - time_t_clock::now()); } }; typedef asio::basic_waitable_timer< time_t_clock, time_t_wait_traits> time_t_timer; void handle_timeout(const asio::error_code&) { std::cout << "handle_timeout\n"; } int main() { try { asio::io_context io_context; time_t_timer timer(io_context); timer.expires_after(asio::chrono::seconds(5)); std::cout << "Starting synchronous wait\n"; timer.wait(); std::cout << "Finished synchronous wait\n"; timer.expires_after(asio::chrono::seconds(5)); std::cout << "Starting asynchronous wait\n"; timer.async_wait(&handle_timeout); io_context.run(); std::cout << "Finished asynchronous wait\n"; } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/000077500000000000000000000000001340672067200177345ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime1/000077500000000000000000000000001340672067200214515ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime1/client.cpp000066400000000000000000000022771340672067200234430ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: client " << std::endl; return 1; } asio::io_context io_context; tcp::resolver resolver(io_context); tcp::resolver::results_type endpoints = resolver.resolve(argv[1], "daytime"); tcp::socket socket(io_context); asio::connect(socket, endpoints); for (;;) { boost::array buf; asio::error_code error; size_t len = socket.read_some(asio::buffer(buf), error); if (error == asio::error::eof) break; // Connection closed cleanly by peer. else if (error) throw asio::system_error(error); // Some other error. std::cout.write(buf.data(), len); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/daytime2/000077500000000000000000000000001340672067200214525ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime2/server.cpp000066400000000000000000000017271340672067200234730ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include using asio::ip::tcp; std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } int main() { try { asio::io_context io_context; tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13)); for (;;) { tcp::socket socket(io_context); acceptor.accept(socket); std::string message = make_daytime_string(); asio::error_code ignored_error; asio::write(socket, asio::buffer(message), ignored_error); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/daytime3/000077500000000000000000000000001340672067200214535ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime3/server.cpp000066400000000000000000000044441340672067200234730ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::tcp; std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } class tcp_connection : public boost::enable_shared_from_this { public: typedef boost::shared_ptr pointer; static pointer create(asio::io_context& io_context) { return pointer(new tcp_connection(io_context)); } tcp::socket& socket() { return socket_; } void start() { message_ = make_daytime_string(); asio::async_write(socket_, asio::buffer(message_), boost::bind(&tcp_connection::handle_write, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } private: tcp_connection(asio::io_context& io_context) : socket_(io_context) { } void handle_write(const asio::error_code& /*error*/, size_t /*bytes_transferred*/) { } tcp::socket socket_; std::string message_; }; class tcp_server { public: tcp_server(asio::io_context& io_context) : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13)) { start_accept(); } private: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_executor().context()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, asio::placeholders::error)); } void handle_accept(tcp_connection::pointer new_connection, const asio::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } tcp::acceptor acceptor_; }; int main() { try { asio::io_context io_context; tcp_server server(io_context); io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/daytime4/000077500000000000000000000000001340672067200214545ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime4/client.cpp000066400000000000000000000022151340672067200234360ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include using asio::ip::udp; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: client " << std::endl; return 1; } asio::io_context io_context; udp::resolver resolver(io_context); udp::endpoint receiver_endpoint = *resolver.resolve(udp::v4(), argv[1], "daytime").begin(); udp::socket socket(io_context); socket.open(udp::v4()); boost::array send_buf = {{ 0 }}; socket.send_to(asio::buffer(send_buf), receiver_endpoint); boost::array recv_buf; udp::endpoint sender_endpoint; size_t len = socket.receive_from( asio::buffer(recv_buf), sender_endpoint); std::cout.write(recv_buf.data(), len); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/daytime5/000077500000000000000000000000001340672067200214555ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime5/server.cpp000066400000000000000000000021571340672067200234740ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include using asio::ip::udp; std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } int main() { try { asio::io_context io_context; udp::socket socket(io_context, udp::endpoint(udp::v4(), 13)); for (;;) { boost::array recv_buf; udp::endpoint remote_endpoint; asio::error_code error; socket.receive_from(asio::buffer(recv_buf), remote_endpoint); std::string message = make_daytime_string(); asio::error_code ignored_error; socket.send_to(asio::buffer(message), remote_endpoint, 0, ignored_error); } } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/daytime6/000077500000000000000000000000001340672067200214565ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime6/server.cpp000066400000000000000000000036501340672067200234740ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::udp; std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } class udp_server { public: udp_server(asio::io_context& io_context) : socket_(io_context, udp::endpoint(udp::v4(), 13)) { start_receive(); } private: void start_receive() { socket_.async_receive_from( asio::buffer(recv_buffer_), remote_endpoint_, boost::bind(&udp_server::handle_receive, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } void handle_receive(const asio::error_code& error, std::size_t /*bytes_transferred*/) { if (!error) { boost::shared_ptr message( new std::string(make_daytime_string())); socket_.async_send_to(asio::buffer(*message), remote_endpoint_, boost::bind(&udp_server::handle_send, this, message, asio::placeholders::error, asio::placeholders::bytes_transferred)); start_receive(); } } void handle_send(boost::shared_ptr /*message*/, const asio::error_code& /*error*/, std::size_t /*bytes_transferred*/) { } udp::socket socket_; udp::endpoint remote_endpoint_; boost::array recv_buffer_; }; int main() { try { asio::io_context io_context; udp_server server(io_context); io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/daytime7/000077500000000000000000000000001340672067200214575ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/daytime7/server.cpp000066400000000000000000000061351340672067200234760ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include using asio::ip::tcp; using asio::ip::udp; std::string make_daytime_string() { using namespace std; // For time_t, time and ctime; time_t now = time(0); return ctime(&now); } class tcp_connection : public boost::enable_shared_from_this { public: typedef boost::shared_ptr pointer; static pointer create(asio::io_context& io_context) { return pointer(new tcp_connection(io_context)); } tcp::socket& socket() { return socket_; } void start() { message_ = make_daytime_string(); asio::async_write(socket_, asio::buffer(message_), boost::bind(&tcp_connection::handle_write, shared_from_this())); } private: tcp_connection(asio::io_context& io_context) : socket_(io_context) { } void handle_write() { } tcp::socket socket_; std::string message_; }; class tcp_server { public: tcp_server(asio::io_context& io_context) : acceptor_(io_context, tcp::endpoint(tcp::v4(), 13)) { start_accept(); } private: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(acceptor_.get_executor().context()); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, asio::placeholders::error)); } void handle_accept(tcp_connection::pointer new_connection, const asio::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } tcp::acceptor acceptor_; }; class udp_server { public: udp_server(asio::io_context& io_context) : socket_(io_context, udp::endpoint(udp::v4(), 13)) { start_receive(); } private: void start_receive() { socket_.async_receive_from( asio::buffer(recv_buffer_), remote_endpoint_, boost::bind(&udp_server::handle_receive, this, asio::placeholders::error)); } void handle_receive(const asio::error_code& error) { if (!error) { boost::shared_ptr message( new std::string(make_daytime_string())); socket_.async_send_to(asio::buffer(*message), remote_endpoint_, boost::bind(&udp_server::handle_send, this, message)); start_receive(); } } void handle_send(boost::shared_ptr /*message*/) { } udp::socket socket_; udp::endpoint remote_endpoint_; boost::array recv_buffer_; }; int main() { try { asio::io_context io_context; tcp_server server1(io_context); udp_server server2(io_context); io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp03/tutorial/timer1/000077500000000000000000000000001340672067200211355ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/timer1/timer.cpp000066400000000000000000000007341340672067200227650ustar00rootroot00000000000000// // timer.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include int main() { asio::io_context io; asio::steady_timer t(io, asio::chrono::seconds(5)); t.wait(); std::cout << "Hello, world!" << std::endl; return 0; } asio-1.12.2/src/examples/cpp03/tutorial/timer2/000077500000000000000000000000001340672067200211365ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/timer2/timer.cpp000066400000000000000000000010431340672067200227600ustar00rootroot00000000000000// // timer.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include void print(const asio::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; } int main() { asio::io_context io; asio::steady_timer t(io, asio::chrono::seconds(5)); t.async_wait(&print); io.run(); return 0; } asio-1.12.2/src/examples/cpp03/tutorial/timer3/000077500000000000000000000000001340672067200211375ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/timer3/timer.cpp000066400000000000000000000016361340672067200227710ustar00rootroot00000000000000// // timer.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include void print(const asio::error_code& /*e*/, asio::steady_timer* t, int* count) { if (*count < 5) { std::cout << *count << std::endl; ++(*count); t->expires_at(t->expiry() + asio::chrono::seconds(1)); t->async_wait(boost::bind(print, asio::placeholders::error, t, count)); } } int main() { asio::io_context io; int count = 0; asio::steady_timer t(io, asio::chrono::seconds(1)); t.async_wait(boost::bind(print, asio::placeholders::error, &t, &count)); io.run(); std::cout << "Final count is " << count << std::endl; return 0; } asio-1.12.2/src/examples/cpp03/tutorial/timer4/000077500000000000000000000000001340672067200211405ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/timer4/timer.cpp000066400000000000000000000017261340672067200227720ustar00rootroot00000000000000// // timer.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include class printer { public: printer(asio::io_context& io) : timer_(io, asio::chrono::seconds(1)), count_(0) { timer_.async_wait(boost::bind(&printer::print, this)); } ~printer() { std::cout << "Final count is " << count_ << std::endl; } void print() { if (count_ < 5) { std::cout << count_ << std::endl; ++count_; timer_.expires_at(timer_.expiry() + asio::chrono::seconds(1)); timer_.async_wait(boost::bind(&printer::print, this)); } } private: asio::steady_timer timer_; int count_; }; int main() { asio::io_context io; printer p(io); io.run(); return 0; } asio-1.12.2/src/examples/cpp03/tutorial/timer5/000077500000000000000000000000001340672067200211415ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/tutorial/timer5/timer.cpp000066400000000000000000000032451340672067200227710ustar00rootroot00000000000000// // timer.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include class printer { public: printer(asio::io_context& io) : strand_(io), timer1_(io, asio::chrono::seconds(1)), timer2_(io, asio::chrono::seconds(1)), count_(0) { timer1_.async_wait(asio::bind_executor(strand_, boost::bind(&printer::print1, this))); timer2_.async_wait(asio::bind_executor(strand_, boost::bind(&printer::print2, this))); } ~printer() { std::cout << "Final count is " << count_ << std::endl; } void print1() { if (count_ < 10) { std::cout << "Timer 1: " << count_ << std::endl; ++count_; timer1_.expires_at(timer1_.expiry() + asio::chrono::seconds(1)); timer1_.async_wait(asio::bind_executor(strand_, boost::bind(&printer::print1, this))); } } void print2() { if (count_ < 10) { std::cout << "Timer 2: " << count_ << std::endl; ++count_; timer2_.expires_at(timer2_.expiry() + asio::chrono::seconds(1)); timer2_.async_wait(asio::bind_executor(strand_, boost::bind(&printer::print2, this))); } } private: asio::io_context::strand strand_; asio::steady_timer timer1_; asio::steady_timer timer2_; int count_; }; int main() { asio::io_context io; printer p(io); asio::thread t(boost::bind(&asio::io_context::run, &io)); io.run(); t.join(); return 0; } asio-1.12.2/src/examples/cpp03/windows/000077500000000000000000000000001340672067200175635ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp03/windows/transmit_file.cpp000066400000000000000000000102631340672067200231310ustar00rootroot00000000000000// // transmit_file.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include "asio.hpp" #if defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) using asio::ip::tcp; using asio::windows::overlapped_ptr; using asio::windows::random_access_handle; // A wrapper for the TransmitFile overlapped I/O operation. template void transmit_file(tcp::socket& socket, random_access_handle& file, Handler handler) { // Construct an OVERLAPPED-derived object to contain the handler. overlapped_ptr overlapped(socket.get_executor().context(), handler); // Initiate the TransmitFile operation. BOOL ok = ::TransmitFile(socket.native_handle(), file.native_handle(), 0, 0, overlapped.get(), 0, 0); DWORD last_error = ::GetLastError(); // Check if the operation completed immediately. if (!ok && last_error != ERROR_IO_PENDING) { // The operation completed immediately, so a completion notification needs // to be posted. When complete() is called, ownership of the OVERLAPPED- // derived object passes to the io_context. asio::error_code ec(last_error, asio::error::get_system_category()); overlapped.complete(ec, 0); } else { // The operation was successfully initiated, so ownership of the // OVERLAPPED-derived object has passed to the io_context. overlapped.release(); } } class connection : public boost::enable_shared_from_this { public: typedef boost::shared_ptr pointer; static pointer create(asio::io_context& io_context, const std::string& filename) { return pointer(new connection(io_context, filename)); } tcp::socket& socket() { return socket_; } void start() { asio::error_code ec; file_.assign(::CreateFile(filename_.c_str(), GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0), ec); if (file_.is_open()) { transmit_file(socket_, file_, boost::bind(&connection::handle_write, shared_from_this(), asio::placeholders::error, asio::placeholders::bytes_transferred)); } } private: connection(asio::io_context& io_context, const std::string& filename) : socket_(io_context), filename_(filename), file_(io_context) { } void handle_write(const asio::error_code& /*error*/, size_t /*bytes_transferred*/) { asio::error_code ignored_ec; socket_.shutdown(tcp::socket::shutdown_both, ignored_ec); } tcp::socket socket_; std::string filename_; random_access_handle file_; }; class server { public: server(asio::io_context& io_context, unsigned short port, const std::string& filename) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), filename_(filename) { start_accept(); } private: void start_accept() { connection::pointer new_connection = connection::create(acceptor_.get_executor().context(), filename_); acceptor_.async_accept(new_connection->socket(), boost::bind(&server::handle_accept, this, new_connection, asio::placeholders::error)); } void handle_accept(connection::pointer new_connection, const asio::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } tcp::acceptor acceptor_; std::string filename_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: transmit_file \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1]), argv[2]); io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } #else // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) # error Overlapped I/O not available on this platform #endif // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) asio-1.12.2/src/examples/cpp11/000077500000000000000000000000001340672067200160705ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/Makefile.am000066400000000000000000000121031340672067200201210ustar00rootroot00000000000000AUTOMAKE_OPTIONS = subdir-objects if SEPARATE_COMPILATION noinst_LIBRARIES = libasio.a libasio_a_SOURCES = ../../asio.cpp if HAVE_OPENSSL libasio_a_SOURCES += ../../asio_ssl.cpp endif LDADD = libasio.a endif noinst_PROGRAMS = \ allocation/server \ buffers/reference_counted \ chat/chat_client \ chat/chat_server \ echo/async_tcp_echo_server \ echo/async_udp_echo_server \ echo/blocking_tcp_echo_client \ echo/blocking_tcp_echo_server \ echo/blocking_udp_echo_client \ echo/blocking_udp_echo_server \ executors/actor \ executors/bank_account_1 \ executors/bank_account_2 \ executors/fork_join \ executors/pipeline \ executors/priority_scheduler \ futures/daytime_client \ http/server/http_server \ invocation/prioritised_handlers \ iostreams/http_client \ multicast/receiver \ multicast/sender \ nonblocking/third_party_lib \ operations/composed_1 \ operations/composed_2 \ operations/composed_3 \ operations/composed_4 \ operations/composed_5 \ socks4/sync_client \ timeouts/async_tcp_client \ timeouts/blocking_tcp_client \ timeouts/blocking_token_tcp_client \ timeouts/blocking_udp_client \ timeouts/server \ timers/time_t_timer if !WINDOWS_TARGET noinst_PROGRAMS += \ fork/daemon \ fork/process_per_connection \ local/connect_pair \ local/iostream_client \ local/stream_server \ local/stream_client endif if HAVE_OPENSSL noinst_PROGRAMS += \ ssl/client \ ssl/server endif if HAVE_BOOST_COROUTINE noinst_PROGRAMS += \ spawn/echo_server \ spawn/parallel_grep endif noinst_HEADERS = \ socks4/socks4.hpp \ chat/chat_message.hpp AM_CXXFLAGS = -I$(srcdir)/../../../include allocation_server_SOURCES = allocation/server.cpp buffers_reference_counted_SOURCES = buffers/reference_counted.cpp chat_chat_client_SOURCES = chat/chat_client.cpp chat_chat_server_SOURCES = chat/chat_server.cpp echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp executors_actor_SOURCES = executors/actor.cpp executors_bank_account_1_SOURCES = executors/bank_account_1.cpp executors_bank_account_2_SOURCES = executors/bank_account_2.cpp executors_fork_join_SOURCES = executors/fork_join.cpp executors_pipeline_SOURCES = executors/pipeline.cpp executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp futures_daytime_client_SOURCES = futures/daytime_client.cpp http_server_http_server_SOURCES = \ http/server/connection.cpp \ http/server/connection_manager.cpp \ http/server/main.cpp \ http/server/mime_types.cpp \ http/server/reply.cpp \ http/server/request_handler.cpp \ http/server/request_parser.cpp \ http/server/server.cpp invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp iostreams_http_client_SOURCES = iostreams/http_client.cpp multicast_receiver_SOURCES = multicast/receiver.cpp multicast_sender_SOURCES = multicast/sender.cpp nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp operations_composed_1_SOURCES = operations/composed_1.cpp operations_composed_2_SOURCES = operations/composed_2.cpp operations_composed_3_SOURCES = operations/composed_3.cpp operations_composed_4_SOURCES = operations/composed_4.cpp operations_composed_5_SOURCES = operations/composed_5.cpp socks4_sync_client_SOURCES = socks4/sync_client.cpp timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp timeouts_blocking_token_tcp_client_SOURCES = timeouts/blocking_token_tcp_client.cpp timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp timeouts_server_SOURCES = timeouts/server.cpp timers_time_t_timer_SOURCES = timers/time_t_timer.cpp if !WINDOWS_TARGET fork_daemon_SOURCES = fork/daemon.cpp fork_process_per_connection_SOURCES = fork/process_per_connection.cpp local_connect_pair_SOURCES = local/connect_pair.cpp local_iostream_client_SOURCES = local/iostream_client.cpp local_stream_server_SOURCES = local/stream_server.cpp local_stream_client_SOURCES = local/stream_client.cpp endif if HAVE_OPENSSL ssl_client_SOURCES = ssl/client.cpp ssl_server_SOURCES = ssl/server.cpp endif if HAVE_BOOST_COROUTINE spawn_echo_server_SOURCES = spawn/echo_server.cpp spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system endif EXTRA_DIST = \ handler_tracking/custom_tracking.hpp \ http/server/connection.hpp \ http/server/connection_manager.hpp \ http/server/header.hpp \ http/server/mime_types.hpp \ http/server/reply.hpp \ http/server/request.hpp \ http/server/request_handler.hpp \ http/server/request_parser.hpp \ http/server/server.hpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/src/examples/cpp11/Makefile.in000066400000000000000000002276651340672067200201570ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp noinst_PROGRAMS = allocation/server$(EXEEXT) \ buffers/reference_counted$(EXEEXT) chat/chat_client$(EXEEXT) \ chat/chat_server$(EXEEXT) echo/async_tcp_echo_server$(EXEEXT) \ echo/async_udp_echo_server$(EXEEXT) \ echo/blocking_tcp_echo_client$(EXEEXT) \ echo/blocking_tcp_echo_server$(EXEEXT) \ echo/blocking_udp_echo_client$(EXEEXT) \ echo/blocking_udp_echo_server$(EXEEXT) \ executors/actor$(EXEEXT) executors/bank_account_1$(EXEEXT) \ executors/bank_account_2$(EXEEXT) executors/fork_join$(EXEEXT) \ executors/pipeline$(EXEEXT) \ executors/priority_scheduler$(EXEEXT) \ futures/daytime_client$(EXEEXT) \ http/server/http_server$(EXEEXT) \ invocation/prioritised_handlers$(EXEEXT) \ iostreams/http_client$(EXEEXT) multicast/receiver$(EXEEXT) \ multicast/sender$(EXEEXT) nonblocking/third_party_lib$(EXEEXT) \ operations/composed_1$(EXEEXT) operations/composed_2$(EXEEXT) \ operations/composed_3$(EXEEXT) operations/composed_4$(EXEEXT) \ operations/composed_5$(EXEEXT) socks4/sync_client$(EXEEXT) \ timeouts/async_tcp_client$(EXEEXT) \ timeouts/blocking_tcp_client$(EXEEXT) \ timeouts/blocking_token_tcp_client$(EXEEXT) \ timeouts/blocking_udp_client$(EXEEXT) timeouts/server$(EXEEXT) \ timers/time_t_timer$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \ $(am__EXEEXT_3) @WINDOWS_TARGET_FALSE@am__append_2 = \ @WINDOWS_TARGET_FALSE@ fork/daemon \ @WINDOWS_TARGET_FALSE@ fork/process_per_connection \ @WINDOWS_TARGET_FALSE@ local/connect_pair \ @WINDOWS_TARGET_FALSE@ local/iostream_client \ @WINDOWS_TARGET_FALSE@ local/stream_server \ @WINDOWS_TARGET_FALSE@ local/stream_client @HAVE_OPENSSL_TRUE@am__append_3 = \ @HAVE_OPENSSL_TRUE@ ssl/client \ @HAVE_OPENSSL_TRUE@ ssl/server @HAVE_BOOST_COROUTINE_TRUE@am__append_4 = \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/echo_server \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep subdir = src/examples/cpp11 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @WINDOWS_TARGET_FALSE@am__EXEEXT_1 = fork/daemon$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ fork/process_per_connection$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/connect_pair$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/iostream_client$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/stream_server$(EXEEXT) \ @WINDOWS_TARGET_FALSE@ local/stream_client$(EXEEXT) @HAVE_OPENSSL_TRUE@am__EXEEXT_2 = ssl/client$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ ssl/server$(EXEEXT) @HAVE_BOOST_COROUTINE_TRUE@am__EXEEXT_3 = spawn/echo_server$(EXEEXT) \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libasio_a_AR = $(AR) $(ARFLAGS) libasio_a_LIBADD = am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp am__dirstamp = $(am__leading_dot)dirstamp @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT) @SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \ @SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \ @SEPARATE_COMPILATION_TRUE@ $(am__objects_1) libasio_a_OBJECTS = $(am_libasio_a_OBJECTS) am_allocation_server_OBJECTS = allocation/server.$(OBJEXT) allocation_server_OBJECTS = $(am_allocation_server_OBJECTS) allocation_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@allocation_server_DEPENDENCIES = libasio.a am_buffers_reference_counted_OBJECTS = \ buffers/reference_counted.$(OBJEXT) buffers_reference_counted_OBJECTS = \ $(am_buffers_reference_counted_OBJECTS) buffers_reference_counted_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@buffers_reference_counted_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_chat_chat_client_OBJECTS = chat/chat_client.$(OBJEXT) chat_chat_client_OBJECTS = $(am_chat_chat_client_OBJECTS) chat_chat_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@chat_chat_client_DEPENDENCIES = libasio.a am_chat_chat_server_OBJECTS = chat/chat_server.$(OBJEXT) chat_chat_server_OBJECTS = $(am_chat_chat_server_OBJECTS) chat_chat_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@chat_chat_server_DEPENDENCIES = libasio.a am_echo_async_tcp_echo_server_OBJECTS = \ echo/async_tcp_echo_server.$(OBJEXT) echo_async_tcp_echo_server_OBJECTS = \ $(am_echo_async_tcp_echo_server_OBJECTS) echo_async_tcp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_async_tcp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_async_udp_echo_server_OBJECTS = \ echo/async_udp_echo_server.$(OBJEXT) echo_async_udp_echo_server_OBJECTS = \ $(am_echo_async_udp_echo_server_OBJECTS) echo_async_udp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_async_udp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_tcp_echo_client_OBJECTS = \ echo/blocking_tcp_echo_client.$(OBJEXT) echo_blocking_tcp_echo_client_OBJECTS = \ $(am_echo_blocking_tcp_echo_client_OBJECTS) echo_blocking_tcp_echo_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_tcp_echo_server_OBJECTS = \ echo/blocking_tcp_echo_server.$(OBJEXT) echo_blocking_tcp_echo_server_OBJECTS = \ $(am_echo_blocking_tcp_echo_server_OBJECTS) echo_blocking_tcp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_udp_echo_client_OBJECTS = \ echo/blocking_udp_echo_client.$(OBJEXT) echo_blocking_udp_echo_client_OBJECTS = \ $(am_echo_blocking_udp_echo_client_OBJECTS) echo_blocking_udp_echo_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_udp_echo_server_OBJECTS = \ echo/blocking_udp_echo_server.$(OBJEXT) echo_blocking_udp_echo_server_OBJECTS = \ $(am_echo_blocking_udp_echo_server_OBJECTS) echo_blocking_udp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_actor_OBJECTS = executors/actor.$(OBJEXT) executors_actor_OBJECTS = $(am_executors_actor_OBJECTS) executors_actor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_actor_DEPENDENCIES = libasio.a am_executors_bank_account_1_OBJECTS = \ executors/bank_account_1.$(OBJEXT) executors_bank_account_1_OBJECTS = \ $(am_executors_bank_account_1_OBJECTS) executors_bank_account_1_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_bank_account_1_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_bank_account_2_OBJECTS = \ executors/bank_account_2.$(OBJEXT) executors_bank_account_2_OBJECTS = \ $(am_executors_bank_account_2_OBJECTS) executors_bank_account_2_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_bank_account_2_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_fork_join_OBJECTS = executors/fork_join.$(OBJEXT) executors_fork_join_OBJECTS = $(am_executors_fork_join_OBJECTS) executors_fork_join_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_fork_join_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_pipeline_OBJECTS = executors/pipeline.$(OBJEXT) executors_pipeline_OBJECTS = $(am_executors_pipeline_OBJECTS) executors_pipeline_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_pipeline_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_priority_scheduler_OBJECTS = \ executors/priority_scheduler.$(OBJEXT) executors_priority_scheduler_OBJECTS = \ $(am_executors_priority_scheduler_OBJECTS) executors_priority_scheduler_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_priority_scheduler_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__fork_daemon_SOURCES_DIST = fork/daemon.cpp @WINDOWS_TARGET_FALSE@am_fork_daemon_OBJECTS = fork/daemon.$(OBJEXT) fork_daemon_OBJECTS = $(am_fork_daemon_OBJECTS) fork_daemon_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@fork_daemon_DEPENDENCIES = libasio.a am__fork_process_per_connection_SOURCES_DIST = \ fork/process_per_connection.cpp @WINDOWS_TARGET_FALSE@am_fork_process_per_connection_OBJECTS = \ @WINDOWS_TARGET_FALSE@ fork/process_per_connection.$(OBJEXT) fork_process_per_connection_OBJECTS = \ $(am_fork_process_per_connection_OBJECTS) fork_process_per_connection_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@fork_process_per_connection_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_futures_daytime_client_OBJECTS = futures/daytime_client.$(OBJEXT) futures_daytime_client_OBJECTS = $(am_futures_daytime_client_OBJECTS) futures_daytime_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@futures_daytime_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_http_server_http_server_OBJECTS = http/server/connection.$(OBJEXT) \ http/server/connection_manager.$(OBJEXT) \ http/server/main.$(OBJEXT) http/server/mime_types.$(OBJEXT) \ http/server/reply.$(OBJEXT) \ http/server/request_handler.$(OBJEXT) \ http/server/request_parser.$(OBJEXT) \ http/server/server.$(OBJEXT) http_server_http_server_OBJECTS = \ $(am_http_server_http_server_OBJECTS) http_server_http_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@http_server_http_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_invocation_prioritised_handlers_OBJECTS = \ invocation/prioritised_handlers.$(OBJEXT) invocation_prioritised_handlers_OBJECTS = \ $(am_invocation_prioritised_handlers_OBJECTS) invocation_prioritised_handlers_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@invocation_prioritised_handlers_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_iostreams_http_client_OBJECTS = iostreams/http_client.$(OBJEXT) iostreams_http_client_OBJECTS = $(am_iostreams_http_client_OBJECTS) iostreams_http_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@iostreams_http_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_connect_pair_SOURCES_DIST = local/connect_pair.cpp @WINDOWS_TARGET_FALSE@am_local_connect_pair_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/connect_pair.$(OBJEXT) local_connect_pair_OBJECTS = $(am_local_connect_pair_OBJECTS) local_connect_pair_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_connect_pair_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_iostream_client_SOURCES_DIST = local/iostream_client.cpp @WINDOWS_TARGET_FALSE@am_local_iostream_client_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/iostream_client.$(OBJEXT) local_iostream_client_OBJECTS = $(am_local_iostream_client_OBJECTS) local_iostream_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_iostream_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_stream_client_SOURCES_DIST = local/stream_client.cpp @WINDOWS_TARGET_FALSE@am_local_stream_client_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/stream_client.$(OBJEXT) local_stream_client_OBJECTS = $(am_local_stream_client_OBJECTS) local_stream_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_stream_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__local_stream_server_SOURCES_DIST = local/stream_server.cpp @WINDOWS_TARGET_FALSE@am_local_stream_server_OBJECTS = \ @WINDOWS_TARGET_FALSE@ local/stream_server.$(OBJEXT) local_stream_server_OBJECTS = $(am_local_stream_server_OBJECTS) local_stream_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@local_stream_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_multicast_receiver_OBJECTS = multicast/receiver.$(OBJEXT) multicast_receiver_OBJECTS = $(am_multicast_receiver_OBJECTS) multicast_receiver_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@multicast_receiver_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_multicast_sender_OBJECTS = multicast/sender.$(OBJEXT) multicast_sender_OBJECTS = $(am_multicast_sender_OBJECTS) multicast_sender_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@multicast_sender_DEPENDENCIES = libasio.a am_nonblocking_third_party_lib_OBJECTS = \ nonblocking/third_party_lib.$(OBJEXT) nonblocking_third_party_lib_OBJECTS = \ $(am_nonblocking_third_party_lib_OBJECTS) nonblocking_third_party_lib_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@nonblocking_third_party_lib_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_operations_composed_1_OBJECTS = operations/composed_1.$(OBJEXT) operations_composed_1_OBJECTS = $(am_operations_composed_1_OBJECTS) operations_composed_1_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@operations_composed_1_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_operations_composed_2_OBJECTS = operations/composed_2.$(OBJEXT) operations_composed_2_OBJECTS = $(am_operations_composed_2_OBJECTS) operations_composed_2_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@operations_composed_2_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_operations_composed_3_OBJECTS = operations/composed_3.$(OBJEXT) operations_composed_3_OBJECTS = $(am_operations_composed_3_OBJECTS) operations_composed_3_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@operations_composed_3_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_operations_composed_4_OBJECTS = operations/composed_4.$(OBJEXT) operations_composed_4_OBJECTS = $(am_operations_composed_4_OBJECTS) operations_composed_4_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@operations_composed_4_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_operations_composed_5_OBJECTS = operations/composed_5.$(OBJEXT) operations_composed_5_OBJECTS = $(am_operations_composed_5_OBJECTS) operations_composed_5_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@operations_composed_5_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_socks4_sync_client_OBJECTS = socks4/sync_client.$(OBJEXT) socks4_sync_client_OBJECTS = $(am_socks4_sync_client_OBJECTS) socks4_sync_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@socks4_sync_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__spawn_echo_server_SOURCES_DIST = spawn/echo_server.cpp @HAVE_BOOST_COROUTINE_TRUE@am_spawn_echo_server_OBJECTS = \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/echo_server.$(OBJEXT) spawn_echo_server_OBJECTS = $(am_spawn_echo_server_OBJECTS) @HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_DEPENDENCIES = $(LDADD) am__spawn_parallel_grep_SOURCES_DIST = spawn/parallel_grep.cpp @HAVE_BOOST_COROUTINE_TRUE@am_spawn_parallel_grep_OBJECTS = \ @HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep.$(OBJEXT) spawn_parallel_grep_OBJECTS = $(am_spawn_parallel_grep_OBJECTS) @HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_DEPENDENCIES = \ @HAVE_BOOST_COROUTINE_TRUE@ $(LDADD) am__ssl_client_SOURCES_DIST = ssl/client.cpp @HAVE_OPENSSL_TRUE@am_ssl_client_OBJECTS = ssl/client.$(OBJEXT) ssl_client_OBJECTS = $(am_ssl_client_OBJECTS) ssl_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@ssl_client_DEPENDENCIES = libasio.a am__ssl_server_SOURCES_DIST = ssl/server.cpp @HAVE_OPENSSL_TRUE@am_ssl_server_OBJECTS = ssl/server.$(OBJEXT) ssl_server_OBJECTS = $(am_ssl_server_OBJECTS) ssl_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@ssl_server_DEPENDENCIES = libasio.a am_timeouts_async_tcp_client_OBJECTS = \ timeouts/async_tcp_client.$(OBJEXT) timeouts_async_tcp_client_OBJECTS = \ $(am_timeouts_async_tcp_client_OBJECTS) timeouts_async_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_async_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_blocking_tcp_client_OBJECTS = \ timeouts/blocking_tcp_client.$(OBJEXT) timeouts_blocking_tcp_client_OBJECTS = \ $(am_timeouts_blocking_tcp_client_OBJECTS) timeouts_blocking_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_blocking_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_blocking_token_tcp_client_OBJECTS = \ timeouts/blocking_token_tcp_client.$(OBJEXT) timeouts_blocking_token_tcp_client_OBJECTS = \ $(am_timeouts_blocking_token_tcp_client_OBJECTS) timeouts_blocking_token_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_blocking_token_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_blocking_udp_client_OBJECTS = \ timeouts/blocking_udp_client.$(OBJEXT) timeouts_blocking_udp_client_OBJECTS = \ $(am_timeouts_blocking_udp_client_OBJECTS) timeouts_blocking_udp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_blocking_udp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_timeouts_server_OBJECTS = timeouts/server.$(OBJEXT) timeouts_server_OBJECTS = $(am_timeouts_server_OBJECTS) timeouts_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timeouts_server_DEPENDENCIES = libasio.a am_timers_time_t_timer_OBJECTS = timers/time_t_timer.$(OBJEXT) timers_time_t_timer_OBJECTS = $(am_timers_time_t_timer_OBJECTS) timers_time_t_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@timers_time_t_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ../../$(DEPDIR)/asio.Po \ ../../$(DEPDIR)/asio_ssl.Po allocation/$(DEPDIR)/server.Po \ buffers/$(DEPDIR)/reference_counted.Po \ chat/$(DEPDIR)/chat_client.Po chat/$(DEPDIR)/chat_server.Po \ echo/$(DEPDIR)/async_tcp_echo_server.Po \ echo/$(DEPDIR)/async_udp_echo_server.Po \ echo/$(DEPDIR)/blocking_tcp_echo_client.Po \ echo/$(DEPDIR)/blocking_tcp_echo_server.Po \ echo/$(DEPDIR)/blocking_udp_echo_client.Po \ echo/$(DEPDIR)/blocking_udp_echo_server.Po \ executors/$(DEPDIR)/actor.Po \ executors/$(DEPDIR)/bank_account_1.Po \ executors/$(DEPDIR)/bank_account_2.Po \ executors/$(DEPDIR)/fork_join.Po \ executors/$(DEPDIR)/pipeline.Po \ executors/$(DEPDIR)/priority_scheduler.Po \ fork/$(DEPDIR)/daemon.Po \ fork/$(DEPDIR)/process_per_connection.Po \ futures/$(DEPDIR)/daytime_client.Po \ http/server/$(DEPDIR)/connection.Po \ http/server/$(DEPDIR)/connection_manager.Po \ http/server/$(DEPDIR)/main.Po \ http/server/$(DEPDIR)/mime_types.Po \ http/server/$(DEPDIR)/reply.Po \ http/server/$(DEPDIR)/request_handler.Po \ http/server/$(DEPDIR)/request_parser.Po \ http/server/$(DEPDIR)/server.Po \ invocation/$(DEPDIR)/prioritised_handlers.Po \ iostreams/$(DEPDIR)/http_client.Po \ local/$(DEPDIR)/connect_pair.Po \ local/$(DEPDIR)/iostream_client.Po \ local/$(DEPDIR)/stream_client.Po \ local/$(DEPDIR)/stream_server.Po \ multicast/$(DEPDIR)/receiver.Po multicast/$(DEPDIR)/sender.Po \ nonblocking/$(DEPDIR)/third_party_lib.Po \ operations/$(DEPDIR)/composed_1.Po \ operations/$(DEPDIR)/composed_2.Po \ operations/$(DEPDIR)/composed_3.Po \ operations/$(DEPDIR)/composed_4.Po \ operations/$(DEPDIR)/composed_5.Po \ socks4/$(DEPDIR)/sync_client.Po spawn/$(DEPDIR)/echo_server.Po \ spawn/$(DEPDIR)/parallel_grep.Po ssl/$(DEPDIR)/client.Po \ ssl/$(DEPDIR)/server.Po timeouts/$(DEPDIR)/async_tcp_client.Po \ timeouts/$(DEPDIR)/blocking_tcp_client.Po \ timeouts/$(DEPDIR)/blocking_token_tcp_client.Po \ timeouts/$(DEPDIR)/blocking_udp_client.Po \ timeouts/$(DEPDIR)/server.Po timers/$(DEPDIR)/time_t_timer.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libasio_a_SOURCES) $(allocation_server_SOURCES) \ $(buffers_reference_counted_SOURCES) \ $(chat_chat_client_SOURCES) $(chat_chat_server_SOURCES) \ $(echo_async_tcp_echo_server_SOURCES) \ $(echo_async_udp_echo_server_SOURCES) \ $(echo_blocking_tcp_echo_client_SOURCES) \ $(echo_blocking_tcp_echo_server_SOURCES) \ $(echo_blocking_udp_echo_client_SOURCES) \ $(echo_blocking_udp_echo_server_SOURCES) \ $(executors_actor_SOURCES) $(executors_bank_account_1_SOURCES) \ $(executors_bank_account_2_SOURCES) \ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \ $(executors_priority_scheduler_SOURCES) $(fork_daemon_SOURCES) \ $(fork_process_per_connection_SOURCES) \ $(futures_daytime_client_SOURCES) \ $(http_server_http_server_SOURCES) \ $(invocation_prioritised_handlers_SOURCES) \ $(iostreams_http_client_SOURCES) $(local_connect_pair_SOURCES) \ $(local_iostream_client_SOURCES) \ $(local_stream_client_SOURCES) $(local_stream_server_SOURCES) \ $(multicast_receiver_SOURCES) $(multicast_sender_SOURCES) \ $(nonblocking_third_party_lib_SOURCES) \ $(operations_composed_1_SOURCES) \ $(operations_composed_2_SOURCES) \ $(operations_composed_3_SOURCES) \ $(operations_composed_4_SOURCES) \ $(operations_composed_5_SOURCES) $(socks4_sync_client_SOURCES) \ $(spawn_echo_server_SOURCES) $(spawn_parallel_grep_SOURCES) \ $(ssl_client_SOURCES) $(ssl_server_SOURCES) \ $(timeouts_async_tcp_client_SOURCES) \ $(timeouts_blocking_tcp_client_SOURCES) \ $(timeouts_blocking_token_tcp_client_SOURCES) \ $(timeouts_blocking_udp_client_SOURCES) \ $(timeouts_server_SOURCES) $(timers_time_t_timer_SOURCES) DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \ $(allocation_server_SOURCES) \ $(buffers_reference_counted_SOURCES) \ $(chat_chat_client_SOURCES) $(chat_chat_server_SOURCES) \ $(echo_async_tcp_echo_server_SOURCES) \ $(echo_async_udp_echo_server_SOURCES) \ $(echo_blocking_tcp_echo_client_SOURCES) \ $(echo_blocking_tcp_echo_server_SOURCES) \ $(echo_blocking_udp_echo_client_SOURCES) \ $(echo_blocking_udp_echo_server_SOURCES) \ $(executors_actor_SOURCES) $(executors_bank_account_1_SOURCES) \ $(executors_bank_account_2_SOURCES) \ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \ $(executors_priority_scheduler_SOURCES) \ $(am__fork_daemon_SOURCES_DIST) \ $(am__fork_process_per_connection_SOURCES_DIST) \ $(futures_daytime_client_SOURCES) \ $(http_server_http_server_SOURCES) \ $(invocation_prioritised_handlers_SOURCES) \ $(iostreams_http_client_SOURCES) \ $(am__local_connect_pair_SOURCES_DIST) \ $(am__local_iostream_client_SOURCES_DIST) \ $(am__local_stream_client_SOURCES_DIST) \ $(am__local_stream_server_SOURCES_DIST) \ $(multicast_receiver_SOURCES) $(multicast_sender_SOURCES) \ $(nonblocking_third_party_lib_SOURCES) \ $(operations_composed_1_SOURCES) \ $(operations_composed_2_SOURCES) \ $(operations_composed_3_SOURCES) \ $(operations_composed_4_SOURCES) \ $(operations_composed_5_SOURCES) $(socks4_sync_client_SOURCES) \ $(am__spawn_echo_server_SOURCES_DIST) \ $(am__spawn_parallel_grep_SOURCES_DIST) \ $(am__ssl_client_SOURCES_DIST) $(am__ssl_server_SOURCES_DIST) \ $(timeouts_async_tcp_client_SOURCES) \ $(timeouts_blocking_tcp_client_SOURCES) \ $(timeouts_blocking_token_tcp_client_SOURCES) \ $(timeouts_blocking_udp_client_SOURCES) \ $(timeouts_server_SOURCES) $(timers_time_t_timer_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects @SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a @SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \ @SEPARATE_COMPILATION_TRUE@ $(am__append_1) @SEPARATE_COMPILATION_TRUE@LDADD = libasio.a noinst_HEADERS = \ socks4/socks4.hpp \ chat/chat_message.hpp AM_CXXFLAGS = -I$(srcdir)/../../../include allocation_server_SOURCES = allocation/server.cpp buffers_reference_counted_SOURCES = buffers/reference_counted.cpp chat_chat_client_SOURCES = chat/chat_client.cpp chat_chat_server_SOURCES = chat/chat_server.cpp echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp executors_actor_SOURCES = executors/actor.cpp executors_bank_account_1_SOURCES = executors/bank_account_1.cpp executors_bank_account_2_SOURCES = executors/bank_account_2.cpp executors_fork_join_SOURCES = executors/fork_join.cpp executors_pipeline_SOURCES = executors/pipeline.cpp executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp futures_daytime_client_SOURCES = futures/daytime_client.cpp http_server_http_server_SOURCES = \ http/server/connection.cpp \ http/server/connection_manager.cpp \ http/server/main.cpp \ http/server/mime_types.cpp \ http/server/reply.cpp \ http/server/request_handler.cpp \ http/server/request_parser.cpp \ http/server/server.cpp invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp iostreams_http_client_SOURCES = iostreams/http_client.cpp multicast_receiver_SOURCES = multicast/receiver.cpp multicast_sender_SOURCES = multicast/sender.cpp nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp operations_composed_1_SOURCES = operations/composed_1.cpp operations_composed_2_SOURCES = operations/composed_2.cpp operations_composed_3_SOURCES = operations/composed_3.cpp operations_composed_4_SOURCES = operations/composed_4.cpp operations_composed_5_SOURCES = operations/composed_5.cpp socks4_sync_client_SOURCES = socks4/sync_client.cpp timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp timeouts_blocking_token_tcp_client_SOURCES = timeouts/blocking_token_tcp_client.cpp timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp timeouts_server_SOURCES = timeouts/server.cpp timers_time_t_timer_SOURCES = timers/time_t_timer.cpp @WINDOWS_TARGET_FALSE@fork_daemon_SOURCES = fork/daemon.cpp @WINDOWS_TARGET_FALSE@fork_process_per_connection_SOURCES = fork/process_per_connection.cpp @WINDOWS_TARGET_FALSE@local_connect_pair_SOURCES = local/connect_pair.cpp @WINDOWS_TARGET_FALSE@local_iostream_client_SOURCES = local/iostream_client.cpp @WINDOWS_TARGET_FALSE@local_stream_server_SOURCES = local/stream_server.cpp @WINDOWS_TARGET_FALSE@local_stream_client_SOURCES = local/stream_client.cpp @HAVE_OPENSSL_TRUE@ssl_client_SOURCES = ssl/client.cpp @HAVE_OPENSSL_TRUE@ssl_server_SOURCES = ssl/server.cpp @HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_SOURCES = spawn/echo_server.cpp @HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system @HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp @HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system EXTRA_DIST = \ handler_tracking/custom_tracking.hpp \ http/server/connection.hpp \ http/server/connection_manager.hpp \ http/server/header.hpp \ http/server/mime_types.hpp \ http/server/reply.hpp \ http/server/request.hpp \ http/server/request_handler.hpp \ http/server/request_parser.hpp \ http/server/server.hpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp11/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/examples/cpp11/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) ../../$(am__dirstamp): @$(MKDIR_P) ../.. @: > ../../$(am__dirstamp) ../../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../../$(DEPDIR) @: > ../../$(DEPDIR)/$(am__dirstamp) ../../asio.$(OBJEXT): ../../$(am__dirstamp) \ ../../$(DEPDIR)/$(am__dirstamp) ../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \ ../../$(DEPDIR)/$(am__dirstamp) libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES) $(AM_V_at)-rm -f libasio.a $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD) $(AM_V_at)$(RANLIB) libasio.a allocation/$(am__dirstamp): @$(MKDIR_P) allocation @: > allocation/$(am__dirstamp) allocation/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) allocation/$(DEPDIR) @: > allocation/$(DEPDIR)/$(am__dirstamp) allocation/server.$(OBJEXT): allocation/$(am__dirstamp) \ allocation/$(DEPDIR)/$(am__dirstamp) allocation/server$(EXEEXT): $(allocation_server_OBJECTS) $(allocation_server_DEPENDENCIES) $(EXTRA_allocation_server_DEPENDENCIES) allocation/$(am__dirstamp) @rm -f allocation/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(allocation_server_OBJECTS) $(allocation_server_LDADD) $(LIBS) buffers/$(am__dirstamp): @$(MKDIR_P) buffers @: > buffers/$(am__dirstamp) buffers/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) buffers/$(DEPDIR) @: > buffers/$(DEPDIR)/$(am__dirstamp) buffers/reference_counted.$(OBJEXT): buffers/$(am__dirstamp) \ buffers/$(DEPDIR)/$(am__dirstamp) buffers/reference_counted$(EXEEXT): $(buffers_reference_counted_OBJECTS) $(buffers_reference_counted_DEPENDENCIES) $(EXTRA_buffers_reference_counted_DEPENDENCIES) buffers/$(am__dirstamp) @rm -f buffers/reference_counted$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(buffers_reference_counted_OBJECTS) $(buffers_reference_counted_LDADD) $(LIBS) chat/$(am__dirstamp): @$(MKDIR_P) chat @: > chat/$(am__dirstamp) chat/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) chat/$(DEPDIR) @: > chat/$(DEPDIR)/$(am__dirstamp) chat/chat_client.$(OBJEXT): chat/$(am__dirstamp) \ chat/$(DEPDIR)/$(am__dirstamp) chat/chat_client$(EXEEXT): $(chat_chat_client_OBJECTS) $(chat_chat_client_DEPENDENCIES) $(EXTRA_chat_chat_client_DEPENDENCIES) chat/$(am__dirstamp) @rm -f chat/chat_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chat_chat_client_OBJECTS) $(chat_chat_client_LDADD) $(LIBS) chat/chat_server.$(OBJEXT): chat/$(am__dirstamp) \ chat/$(DEPDIR)/$(am__dirstamp) chat/chat_server$(EXEEXT): $(chat_chat_server_OBJECTS) $(chat_chat_server_DEPENDENCIES) $(EXTRA_chat_chat_server_DEPENDENCIES) chat/$(am__dirstamp) @rm -f chat/chat_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(chat_chat_server_OBJECTS) $(chat_chat_server_LDADD) $(LIBS) echo/$(am__dirstamp): @$(MKDIR_P) echo @: > echo/$(am__dirstamp) echo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) echo/$(DEPDIR) @: > echo/$(DEPDIR)/$(am__dirstamp) echo/async_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/async_tcp_echo_server$(EXEEXT): $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/async_tcp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_LDADD) $(LIBS) echo/async_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/async_udp_echo_server$(EXEEXT): $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/async_udp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_LDADD) $(LIBS) echo/blocking_tcp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_tcp_echo_client$(EXEEXT): $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_client_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_tcp_echo_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_LDADD) $(LIBS) echo/blocking_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_tcp_echo_server$(EXEEXT): $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_tcp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_LDADD) $(LIBS) echo/blocking_udp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_udp_echo_client$(EXEEXT): $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_client_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_udp_echo_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_LDADD) $(LIBS) echo/blocking_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_udp_echo_server$(EXEEXT): $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_udp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_LDADD) $(LIBS) executors/$(am__dirstamp): @$(MKDIR_P) executors @: > executors/$(am__dirstamp) executors/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) executors/$(DEPDIR) @: > executors/$(DEPDIR)/$(am__dirstamp) executors/actor.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/actor$(EXEEXT): $(executors_actor_OBJECTS) $(executors_actor_DEPENDENCIES) $(EXTRA_executors_actor_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/actor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_actor_OBJECTS) $(executors_actor_LDADD) $(LIBS) executors/bank_account_1.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/bank_account_1$(EXEEXT): $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_DEPENDENCIES) $(EXTRA_executors_bank_account_1_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/bank_account_1$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_LDADD) $(LIBS) executors/bank_account_2.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/bank_account_2$(EXEEXT): $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_DEPENDENCIES) $(EXTRA_executors_bank_account_2_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/bank_account_2$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_LDADD) $(LIBS) executors/fork_join.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/fork_join$(EXEEXT): $(executors_fork_join_OBJECTS) $(executors_fork_join_DEPENDENCIES) $(EXTRA_executors_fork_join_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/fork_join$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_fork_join_OBJECTS) $(executors_fork_join_LDADD) $(LIBS) executors/pipeline.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/pipeline$(EXEEXT): $(executors_pipeline_OBJECTS) $(executors_pipeline_DEPENDENCIES) $(EXTRA_executors_pipeline_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/pipeline$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_pipeline_OBJECTS) $(executors_pipeline_LDADD) $(LIBS) executors/priority_scheduler.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/priority_scheduler$(EXEEXT): $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_DEPENDENCIES) $(EXTRA_executors_priority_scheduler_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/priority_scheduler$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_LDADD) $(LIBS) fork/$(am__dirstamp): @$(MKDIR_P) fork @: > fork/$(am__dirstamp) fork/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) fork/$(DEPDIR) @: > fork/$(DEPDIR)/$(am__dirstamp) fork/daemon.$(OBJEXT): fork/$(am__dirstamp) \ fork/$(DEPDIR)/$(am__dirstamp) fork/daemon$(EXEEXT): $(fork_daemon_OBJECTS) $(fork_daemon_DEPENDENCIES) $(EXTRA_fork_daemon_DEPENDENCIES) fork/$(am__dirstamp) @rm -f fork/daemon$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(fork_daemon_OBJECTS) $(fork_daemon_LDADD) $(LIBS) fork/process_per_connection.$(OBJEXT): fork/$(am__dirstamp) \ fork/$(DEPDIR)/$(am__dirstamp) fork/process_per_connection$(EXEEXT): $(fork_process_per_connection_OBJECTS) $(fork_process_per_connection_DEPENDENCIES) $(EXTRA_fork_process_per_connection_DEPENDENCIES) fork/$(am__dirstamp) @rm -f fork/process_per_connection$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(fork_process_per_connection_OBJECTS) $(fork_process_per_connection_LDADD) $(LIBS) futures/$(am__dirstamp): @$(MKDIR_P) futures @: > futures/$(am__dirstamp) futures/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) futures/$(DEPDIR) @: > futures/$(DEPDIR)/$(am__dirstamp) futures/daytime_client.$(OBJEXT): futures/$(am__dirstamp) \ futures/$(DEPDIR)/$(am__dirstamp) futures/daytime_client$(EXEEXT): $(futures_daytime_client_OBJECTS) $(futures_daytime_client_DEPENDENCIES) $(EXTRA_futures_daytime_client_DEPENDENCIES) futures/$(am__dirstamp) @rm -f futures/daytime_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(futures_daytime_client_OBJECTS) $(futures_daytime_client_LDADD) $(LIBS) http/server/$(am__dirstamp): @$(MKDIR_P) http/server @: > http/server/$(am__dirstamp) http/server/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) http/server/$(DEPDIR) @: > http/server/$(DEPDIR)/$(am__dirstamp) http/server/connection.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/connection_manager.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/main.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/mime_types.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/reply.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/request_handler.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/request_parser.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/server.$(OBJEXT): http/server/$(am__dirstamp) \ http/server/$(DEPDIR)/$(am__dirstamp) http/server/http_server$(EXEEXT): $(http_server_http_server_OBJECTS) $(http_server_http_server_DEPENDENCIES) $(EXTRA_http_server_http_server_DEPENDENCIES) http/server/$(am__dirstamp) @rm -f http/server/http_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(http_server_http_server_OBJECTS) $(http_server_http_server_LDADD) $(LIBS) invocation/$(am__dirstamp): @$(MKDIR_P) invocation @: > invocation/$(am__dirstamp) invocation/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) invocation/$(DEPDIR) @: > invocation/$(DEPDIR)/$(am__dirstamp) invocation/prioritised_handlers.$(OBJEXT): invocation/$(am__dirstamp) \ invocation/$(DEPDIR)/$(am__dirstamp) invocation/prioritised_handlers$(EXEEXT): $(invocation_prioritised_handlers_OBJECTS) $(invocation_prioritised_handlers_DEPENDENCIES) $(EXTRA_invocation_prioritised_handlers_DEPENDENCIES) invocation/$(am__dirstamp) @rm -f invocation/prioritised_handlers$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(invocation_prioritised_handlers_OBJECTS) $(invocation_prioritised_handlers_LDADD) $(LIBS) iostreams/$(am__dirstamp): @$(MKDIR_P) iostreams @: > iostreams/$(am__dirstamp) iostreams/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) iostreams/$(DEPDIR) @: > iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/http_client.$(OBJEXT): iostreams/$(am__dirstamp) \ iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/http_client$(EXEEXT): $(iostreams_http_client_OBJECTS) $(iostreams_http_client_DEPENDENCIES) $(EXTRA_iostreams_http_client_DEPENDENCIES) iostreams/$(am__dirstamp) @rm -f iostreams/http_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(iostreams_http_client_OBJECTS) $(iostreams_http_client_LDADD) $(LIBS) local/$(am__dirstamp): @$(MKDIR_P) local @: > local/$(am__dirstamp) local/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) local/$(DEPDIR) @: > local/$(DEPDIR)/$(am__dirstamp) local/connect_pair.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/connect_pair$(EXEEXT): $(local_connect_pair_OBJECTS) $(local_connect_pair_DEPENDENCIES) $(EXTRA_local_connect_pair_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/connect_pair$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_connect_pair_OBJECTS) $(local_connect_pair_LDADD) $(LIBS) local/iostream_client.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/iostream_client$(EXEEXT): $(local_iostream_client_OBJECTS) $(local_iostream_client_DEPENDENCIES) $(EXTRA_local_iostream_client_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/iostream_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_iostream_client_OBJECTS) $(local_iostream_client_LDADD) $(LIBS) local/stream_client.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/stream_client$(EXEEXT): $(local_stream_client_OBJECTS) $(local_stream_client_DEPENDENCIES) $(EXTRA_local_stream_client_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/stream_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_stream_client_OBJECTS) $(local_stream_client_LDADD) $(LIBS) local/stream_server.$(OBJEXT): local/$(am__dirstamp) \ local/$(DEPDIR)/$(am__dirstamp) local/stream_server$(EXEEXT): $(local_stream_server_OBJECTS) $(local_stream_server_DEPENDENCIES) $(EXTRA_local_stream_server_DEPENDENCIES) local/$(am__dirstamp) @rm -f local/stream_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(local_stream_server_OBJECTS) $(local_stream_server_LDADD) $(LIBS) multicast/$(am__dirstamp): @$(MKDIR_P) multicast @: > multicast/$(am__dirstamp) multicast/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) multicast/$(DEPDIR) @: > multicast/$(DEPDIR)/$(am__dirstamp) multicast/receiver.$(OBJEXT): multicast/$(am__dirstamp) \ multicast/$(DEPDIR)/$(am__dirstamp) multicast/receiver$(EXEEXT): $(multicast_receiver_OBJECTS) $(multicast_receiver_DEPENDENCIES) $(EXTRA_multicast_receiver_DEPENDENCIES) multicast/$(am__dirstamp) @rm -f multicast/receiver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(multicast_receiver_OBJECTS) $(multicast_receiver_LDADD) $(LIBS) multicast/sender.$(OBJEXT): multicast/$(am__dirstamp) \ multicast/$(DEPDIR)/$(am__dirstamp) multicast/sender$(EXEEXT): $(multicast_sender_OBJECTS) $(multicast_sender_DEPENDENCIES) $(EXTRA_multicast_sender_DEPENDENCIES) multicast/$(am__dirstamp) @rm -f multicast/sender$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(multicast_sender_OBJECTS) $(multicast_sender_LDADD) $(LIBS) nonblocking/$(am__dirstamp): @$(MKDIR_P) nonblocking @: > nonblocking/$(am__dirstamp) nonblocking/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) nonblocking/$(DEPDIR) @: > nonblocking/$(DEPDIR)/$(am__dirstamp) nonblocking/third_party_lib.$(OBJEXT): nonblocking/$(am__dirstamp) \ nonblocking/$(DEPDIR)/$(am__dirstamp) nonblocking/third_party_lib$(EXEEXT): $(nonblocking_third_party_lib_OBJECTS) $(nonblocking_third_party_lib_DEPENDENCIES) $(EXTRA_nonblocking_third_party_lib_DEPENDENCIES) nonblocking/$(am__dirstamp) @rm -f nonblocking/third_party_lib$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(nonblocking_third_party_lib_OBJECTS) $(nonblocking_third_party_lib_LDADD) $(LIBS) operations/$(am__dirstamp): @$(MKDIR_P) operations @: > operations/$(am__dirstamp) operations/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) operations/$(DEPDIR) @: > operations/$(DEPDIR)/$(am__dirstamp) operations/composed_1.$(OBJEXT): operations/$(am__dirstamp) \ operations/$(DEPDIR)/$(am__dirstamp) operations/composed_1$(EXEEXT): $(operations_composed_1_OBJECTS) $(operations_composed_1_DEPENDENCIES) $(EXTRA_operations_composed_1_DEPENDENCIES) operations/$(am__dirstamp) @rm -f operations/composed_1$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_1_OBJECTS) $(operations_composed_1_LDADD) $(LIBS) operations/composed_2.$(OBJEXT): operations/$(am__dirstamp) \ operations/$(DEPDIR)/$(am__dirstamp) operations/composed_2$(EXEEXT): $(operations_composed_2_OBJECTS) $(operations_composed_2_DEPENDENCIES) $(EXTRA_operations_composed_2_DEPENDENCIES) operations/$(am__dirstamp) @rm -f operations/composed_2$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_2_OBJECTS) $(operations_composed_2_LDADD) $(LIBS) operations/composed_3.$(OBJEXT): operations/$(am__dirstamp) \ operations/$(DEPDIR)/$(am__dirstamp) operations/composed_3$(EXEEXT): $(operations_composed_3_OBJECTS) $(operations_composed_3_DEPENDENCIES) $(EXTRA_operations_composed_3_DEPENDENCIES) operations/$(am__dirstamp) @rm -f operations/composed_3$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_3_OBJECTS) $(operations_composed_3_LDADD) $(LIBS) operations/composed_4.$(OBJEXT): operations/$(am__dirstamp) \ operations/$(DEPDIR)/$(am__dirstamp) operations/composed_4$(EXEEXT): $(operations_composed_4_OBJECTS) $(operations_composed_4_DEPENDENCIES) $(EXTRA_operations_composed_4_DEPENDENCIES) operations/$(am__dirstamp) @rm -f operations/composed_4$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_4_OBJECTS) $(operations_composed_4_LDADD) $(LIBS) operations/composed_5.$(OBJEXT): operations/$(am__dirstamp) \ operations/$(DEPDIR)/$(am__dirstamp) operations/composed_5$(EXEEXT): $(operations_composed_5_OBJECTS) $(operations_composed_5_DEPENDENCIES) $(EXTRA_operations_composed_5_DEPENDENCIES) operations/$(am__dirstamp) @rm -f operations/composed_5$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_5_OBJECTS) $(operations_composed_5_LDADD) $(LIBS) socks4/$(am__dirstamp): @$(MKDIR_P) socks4 @: > socks4/$(am__dirstamp) socks4/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) socks4/$(DEPDIR) @: > socks4/$(DEPDIR)/$(am__dirstamp) socks4/sync_client.$(OBJEXT): socks4/$(am__dirstamp) \ socks4/$(DEPDIR)/$(am__dirstamp) socks4/sync_client$(EXEEXT): $(socks4_sync_client_OBJECTS) $(socks4_sync_client_DEPENDENCIES) $(EXTRA_socks4_sync_client_DEPENDENCIES) socks4/$(am__dirstamp) @rm -f socks4/sync_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(socks4_sync_client_OBJECTS) $(socks4_sync_client_LDADD) $(LIBS) spawn/$(am__dirstamp): @$(MKDIR_P) spawn @: > spawn/$(am__dirstamp) spawn/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) spawn/$(DEPDIR) @: > spawn/$(DEPDIR)/$(am__dirstamp) spawn/echo_server.$(OBJEXT): spawn/$(am__dirstamp) \ spawn/$(DEPDIR)/$(am__dirstamp) spawn/echo_server$(EXEEXT): $(spawn_echo_server_OBJECTS) $(spawn_echo_server_DEPENDENCIES) $(EXTRA_spawn_echo_server_DEPENDENCIES) spawn/$(am__dirstamp) @rm -f spawn/echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(spawn_echo_server_OBJECTS) $(spawn_echo_server_LDADD) $(LIBS) spawn/parallel_grep.$(OBJEXT): spawn/$(am__dirstamp) \ spawn/$(DEPDIR)/$(am__dirstamp) spawn/parallel_grep$(EXEEXT): $(spawn_parallel_grep_OBJECTS) $(spawn_parallel_grep_DEPENDENCIES) $(EXTRA_spawn_parallel_grep_DEPENDENCIES) spawn/$(am__dirstamp) @rm -f spawn/parallel_grep$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(spawn_parallel_grep_OBJECTS) $(spawn_parallel_grep_LDADD) $(LIBS) ssl/$(am__dirstamp): @$(MKDIR_P) ssl @: > ssl/$(am__dirstamp) ssl/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ssl/$(DEPDIR) @: > ssl/$(DEPDIR)/$(am__dirstamp) ssl/client.$(OBJEXT): ssl/$(am__dirstamp) \ ssl/$(DEPDIR)/$(am__dirstamp) ssl/client$(EXEEXT): $(ssl_client_OBJECTS) $(ssl_client_DEPENDENCIES) $(EXTRA_ssl_client_DEPENDENCIES) ssl/$(am__dirstamp) @rm -f ssl/client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ssl_client_OBJECTS) $(ssl_client_LDADD) $(LIBS) ssl/server.$(OBJEXT): ssl/$(am__dirstamp) \ ssl/$(DEPDIR)/$(am__dirstamp) ssl/server$(EXEEXT): $(ssl_server_OBJECTS) $(ssl_server_DEPENDENCIES) $(EXTRA_ssl_server_DEPENDENCIES) ssl/$(am__dirstamp) @rm -f ssl/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ssl_server_OBJECTS) $(ssl_server_LDADD) $(LIBS) timeouts/$(am__dirstamp): @$(MKDIR_P) timeouts @: > timeouts/$(am__dirstamp) timeouts/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) timeouts/$(DEPDIR) @: > timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/async_tcp_client.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/async_tcp_client$(EXEEXT): $(timeouts_async_tcp_client_OBJECTS) $(timeouts_async_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_async_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/async_tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_async_tcp_client_OBJECTS) $(timeouts_async_tcp_client_LDADD) $(LIBS) timeouts/blocking_tcp_client.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/blocking_tcp_client$(EXEEXT): $(timeouts_blocking_tcp_client_OBJECTS) $(timeouts_blocking_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/blocking_tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_tcp_client_OBJECTS) $(timeouts_blocking_tcp_client_LDADD) $(LIBS) timeouts/blocking_token_tcp_client.$(OBJEXT): \ timeouts/$(am__dirstamp) timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/blocking_token_tcp_client$(EXEEXT): $(timeouts_blocking_token_tcp_client_OBJECTS) $(timeouts_blocking_token_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_token_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/blocking_token_tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_token_tcp_client_OBJECTS) $(timeouts_blocking_token_tcp_client_LDADD) $(LIBS) timeouts/blocking_udp_client.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/blocking_udp_client$(EXEEXT): $(timeouts_blocking_udp_client_OBJECTS) $(timeouts_blocking_udp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_udp_client_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/blocking_udp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_udp_client_OBJECTS) $(timeouts_blocking_udp_client_LDADD) $(LIBS) timeouts/server.$(OBJEXT): timeouts/$(am__dirstamp) \ timeouts/$(DEPDIR)/$(am__dirstamp) timeouts/server$(EXEEXT): $(timeouts_server_OBJECTS) $(timeouts_server_DEPENDENCIES) $(EXTRA_timeouts_server_DEPENDENCIES) timeouts/$(am__dirstamp) @rm -f timeouts/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timeouts_server_OBJECTS) $(timeouts_server_LDADD) $(LIBS) timers/$(am__dirstamp): @$(MKDIR_P) timers @: > timers/$(am__dirstamp) timers/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) timers/$(DEPDIR) @: > timers/$(DEPDIR)/$(am__dirstamp) timers/time_t_timer.$(OBJEXT): timers/$(am__dirstamp) \ timers/$(DEPDIR)/$(am__dirstamp) timers/time_t_timer$(EXEEXT): $(timers_time_t_timer_OBJECTS) $(timers_time_t_timer_DEPENDENCIES) $(EXTRA_timers_time_t_timer_DEPENDENCIES) timers/$(am__dirstamp) @rm -f timers/time_t_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(timers_time_t_timer_OBJECTS) $(timers_time_t_timer_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../../*.$(OBJEXT) -rm -f allocation/*.$(OBJEXT) -rm -f buffers/*.$(OBJEXT) -rm -f chat/*.$(OBJEXT) -rm -f echo/*.$(OBJEXT) -rm -f executors/*.$(OBJEXT) -rm -f fork/*.$(OBJEXT) -rm -f futures/*.$(OBJEXT) -rm -f http/server/*.$(OBJEXT) -rm -f invocation/*.$(OBJEXT) -rm -f iostreams/*.$(OBJEXT) -rm -f local/*.$(OBJEXT) -rm -f multicast/*.$(OBJEXT) -rm -f nonblocking/*.$(OBJEXT) -rm -f operations/*.$(OBJEXT) -rm -f socks4/*.$(OBJEXT) -rm -f spawn/*.$(OBJEXT) -rm -f ssl/*.$(OBJEXT) -rm -f timeouts/*.$(OBJEXT) -rm -f timers/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@allocation/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@buffers/$(DEPDIR)/reference_counted.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/chat_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/chat_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_tcp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_udp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/actor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/fork_join.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/pipeline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/priority_scheduler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fork/$(DEPDIR)/daemon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@fork/$(DEPDIR)/process_per_connection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@futures/$(DEPDIR)/daytime_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/connection_manager.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@invocation/$(DEPDIR)/prioritised_handlers.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/http_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/connect_pair.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/iostream_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/stream_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/stream_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@multicast/$(DEPDIR)/receiver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@multicast/$(DEPDIR)/sender.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@nonblocking/$(DEPDIR)/third_party_lib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@socks4/$(DEPDIR)/sync_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spawn/$(DEPDIR)/echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@spawn/$(DEPDIR)/parallel_grep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/async_tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_token_tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_udp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@timers/$(DEPDIR)/time_t_timer.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../../$(DEPDIR)/$(am__dirstamp) -rm -f ../../$(am__dirstamp) -rm -f allocation/$(DEPDIR)/$(am__dirstamp) -rm -f allocation/$(am__dirstamp) -rm -f buffers/$(DEPDIR)/$(am__dirstamp) -rm -f buffers/$(am__dirstamp) -rm -f chat/$(DEPDIR)/$(am__dirstamp) -rm -f chat/$(am__dirstamp) -rm -f echo/$(DEPDIR)/$(am__dirstamp) -rm -f echo/$(am__dirstamp) -rm -f executors/$(DEPDIR)/$(am__dirstamp) -rm -f executors/$(am__dirstamp) -rm -f fork/$(DEPDIR)/$(am__dirstamp) -rm -f fork/$(am__dirstamp) -rm -f futures/$(DEPDIR)/$(am__dirstamp) -rm -f futures/$(am__dirstamp) -rm -f http/server/$(DEPDIR)/$(am__dirstamp) -rm -f http/server/$(am__dirstamp) -rm -f invocation/$(DEPDIR)/$(am__dirstamp) -rm -f invocation/$(am__dirstamp) -rm -f iostreams/$(DEPDIR)/$(am__dirstamp) -rm -f iostreams/$(am__dirstamp) -rm -f local/$(DEPDIR)/$(am__dirstamp) -rm -f local/$(am__dirstamp) -rm -f multicast/$(DEPDIR)/$(am__dirstamp) -rm -f multicast/$(am__dirstamp) -rm -f nonblocking/$(DEPDIR)/$(am__dirstamp) -rm -f nonblocking/$(am__dirstamp) -rm -f operations/$(DEPDIR)/$(am__dirstamp) -rm -f operations/$(am__dirstamp) -rm -f socks4/$(DEPDIR)/$(am__dirstamp) -rm -f socks4/$(am__dirstamp) -rm -f spawn/$(DEPDIR)/$(am__dirstamp) -rm -f spawn/$(am__dirstamp) -rm -f ssl/$(DEPDIR)/$(am__dirstamp) -rm -f ssl/$(am__dirstamp) -rm -f timeouts/$(DEPDIR)/$(am__dirstamp) -rm -f timeouts/$(am__dirstamp) -rm -f timers/$(DEPDIR)/$(am__dirstamp) -rm -f timers/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -f ../../$(DEPDIR)/asio.Po -rm -f ../../$(DEPDIR)/asio_ssl.Po -rm -f allocation/$(DEPDIR)/server.Po -rm -f buffers/$(DEPDIR)/reference_counted.Po -rm -f chat/$(DEPDIR)/chat_client.Po -rm -f chat/$(DEPDIR)/chat_server.Po -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po -rm -f executors/$(DEPDIR)/actor.Po -rm -f executors/$(DEPDIR)/bank_account_1.Po -rm -f executors/$(DEPDIR)/bank_account_2.Po -rm -f executors/$(DEPDIR)/fork_join.Po -rm -f executors/$(DEPDIR)/pipeline.Po -rm -f executors/$(DEPDIR)/priority_scheduler.Po -rm -f fork/$(DEPDIR)/daemon.Po -rm -f fork/$(DEPDIR)/process_per_connection.Po -rm -f futures/$(DEPDIR)/daytime_client.Po -rm -f http/server/$(DEPDIR)/connection.Po -rm -f http/server/$(DEPDIR)/connection_manager.Po -rm -f http/server/$(DEPDIR)/main.Po -rm -f http/server/$(DEPDIR)/mime_types.Po -rm -f http/server/$(DEPDIR)/reply.Po -rm -f http/server/$(DEPDIR)/request_handler.Po -rm -f http/server/$(DEPDIR)/request_parser.Po -rm -f http/server/$(DEPDIR)/server.Po -rm -f invocation/$(DEPDIR)/prioritised_handlers.Po -rm -f iostreams/$(DEPDIR)/http_client.Po -rm -f local/$(DEPDIR)/connect_pair.Po -rm -f local/$(DEPDIR)/iostream_client.Po -rm -f local/$(DEPDIR)/stream_client.Po -rm -f local/$(DEPDIR)/stream_server.Po -rm -f multicast/$(DEPDIR)/receiver.Po -rm -f multicast/$(DEPDIR)/sender.Po -rm -f nonblocking/$(DEPDIR)/third_party_lib.Po -rm -f operations/$(DEPDIR)/composed_1.Po -rm -f operations/$(DEPDIR)/composed_2.Po -rm -f operations/$(DEPDIR)/composed_3.Po -rm -f operations/$(DEPDIR)/composed_4.Po -rm -f operations/$(DEPDIR)/composed_5.Po -rm -f socks4/$(DEPDIR)/sync_client.Po -rm -f spawn/$(DEPDIR)/echo_server.Po -rm -f spawn/$(DEPDIR)/parallel_grep.Po -rm -f ssl/$(DEPDIR)/client.Po -rm -f ssl/$(DEPDIR)/server.Po -rm -f timeouts/$(DEPDIR)/async_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_token_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_udp_client.Po -rm -f timeouts/$(DEPDIR)/server.Po -rm -f timers/$(DEPDIR)/time_t_timer.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ../../$(DEPDIR)/asio.Po -rm -f ../../$(DEPDIR)/asio_ssl.Po -rm -f allocation/$(DEPDIR)/server.Po -rm -f buffers/$(DEPDIR)/reference_counted.Po -rm -f chat/$(DEPDIR)/chat_client.Po -rm -f chat/$(DEPDIR)/chat_server.Po -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po -rm -f executors/$(DEPDIR)/actor.Po -rm -f executors/$(DEPDIR)/bank_account_1.Po -rm -f executors/$(DEPDIR)/bank_account_2.Po -rm -f executors/$(DEPDIR)/fork_join.Po -rm -f executors/$(DEPDIR)/pipeline.Po -rm -f executors/$(DEPDIR)/priority_scheduler.Po -rm -f fork/$(DEPDIR)/daemon.Po -rm -f fork/$(DEPDIR)/process_per_connection.Po -rm -f futures/$(DEPDIR)/daytime_client.Po -rm -f http/server/$(DEPDIR)/connection.Po -rm -f http/server/$(DEPDIR)/connection_manager.Po -rm -f http/server/$(DEPDIR)/main.Po -rm -f http/server/$(DEPDIR)/mime_types.Po -rm -f http/server/$(DEPDIR)/reply.Po -rm -f http/server/$(DEPDIR)/request_handler.Po -rm -f http/server/$(DEPDIR)/request_parser.Po -rm -f http/server/$(DEPDIR)/server.Po -rm -f invocation/$(DEPDIR)/prioritised_handlers.Po -rm -f iostreams/$(DEPDIR)/http_client.Po -rm -f local/$(DEPDIR)/connect_pair.Po -rm -f local/$(DEPDIR)/iostream_client.Po -rm -f local/$(DEPDIR)/stream_client.Po -rm -f local/$(DEPDIR)/stream_server.Po -rm -f multicast/$(DEPDIR)/receiver.Po -rm -f multicast/$(DEPDIR)/sender.Po -rm -f nonblocking/$(DEPDIR)/third_party_lib.Po -rm -f operations/$(DEPDIR)/composed_1.Po -rm -f operations/$(DEPDIR)/composed_2.Po -rm -f operations/$(DEPDIR)/composed_3.Po -rm -f operations/$(DEPDIR)/composed_4.Po -rm -f operations/$(DEPDIR)/composed_5.Po -rm -f socks4/$(DEPDIR)/sync_client.Po -rm -f spawn/$(DEPDIR)/echo_server.Po -rm -f spawn/$(DEPDIR)/parallel_grep.Po -rm -f ssl/$(DEPDIR)/client.Po -rm -f ssl/$(DEPDIR)/server.Po -rm -f timeouts/$(DEPDIR)/async_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_token_tcp_client.Po -rm -f timeouts/$(DEPDIR)/blocking_udp_client.Po -rm -f timeouts/$(DEPDIR)/server.Po -rm -f timers/$(DEPDIR)/time_t_timer.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/src/examples/cpp11/allocation/000077500000000000000000000000001340672067200202155ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/allocation/server.cpp000066400000000000000000000125361340672067200222360ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include "asio.hpp" using asio::ip::tcp; // Class to manage the memory to be used for handler-based custom allocation. // It contains a single block of memory which may be returned for allocation // requests. If the memory is in use when an allocation request is made, the // allocator delegates allocation to the global heap. class handler_memory { public: handler_memory() : in_use_(false) { } handler_memory(const handler_memory&) = delete; handler_memory& operator=(const handler_memory&) = delete; void* allocate(std::size_t size) { if (!in_use_ && size < sizeof(storage_)) { in_use_ = true; return &storage_; } else { return ::operator new(size); } } void deallocate(void* pointer) { if (pointer == &storage_) { in_use_ = false; } else { ::operator delete(pointer); } } private: // Storage space used for handler-based custom memory allocation. typename std::aligned_storage<1024>::type storage_; // Whether the handler-based custom allocation storage has been used. bool in_use_; }; // The allocator to be associated with the handler objects. This allocator only // needs to satisfy the C++11 minimal allocator requirements. template class handler_allocator { public: using value_type = T; explicit handler_allocator(handler_memory& mem) : memory_(mem) { } template handler_allocator(const handler_allocator& other) noexcept : memory_(other.memory_) { } bool operator==(const handler_allocator& other) const noexcept { return &memory_ == &other.memory_; } bool operator!=(const handler_allocator& other) const noexcept { return &memory_ != &other.memory_; } T* allocate(std::size_t n) const { return static_cast(memory_.allocate(sizeof(T) * n)); } void deallocate(T* p, std::size_t /*n*/) const { return memory_.deallocate(p); } private: template friend class handler_allocator; // The underlying memory. handler_memory& memory_; }; // Wrapper class template for handler objects to allow handler memory // allocation to be customised. The allocator_type type and get_allocator() // member function are used by the asynchronous operations to obtain the // allocator. Calls to operator() are forwarded to the encapsulated handler. template class custom_alloc_handler { public: using allocator_type = handler_allocator; custom_alloc_handler(handler_memory& m, Handler h) : memory_(m), handler_(h) { } allocator_type get_allocator() const noexcept { return allocator_type(memory_); } template void operator()(Args&&... args) { handler_(std::forward(args)...); } private: handler_memory& memory_; Handler handler_; }; // Helper function to wrap a handler object to add custom allocation. template inline custom_alloc_handler make_custom_alloc_handler( handler_memory& m, Handler h) { return custom_alloc_handler(m, h); } class session : public std::enable_shared_from_this { public: session(tcp::socket socket) : socket_(std::move(socket)) { } void start() { do_read(); } private: void do_read() { auto self(shared_from_this()); socket_.async_read_some(asio::buffer(data_), make_custom_alloc_handler(handler_memory_, [this, self](std::error_code ec, std::size_t length) { if (!ec) { do_write(length); } })); } void do_write(std::size_t length) { auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(data_, length), make_custom_alloc_handler(handler_memory_, [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec) { do_read(); } })); } // The socket used to communicate with the client. tcp::socket socket_; // Buffer used to store data received from the client. std::array data_; // The memory to use for handler-based custom memory allocation. handler_memory handler_memory_; }; class server { public: server(asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { do_accept(); } private: void do_accept() { acceptor_.async_accept( [this](std::error_code ec, tcp::socket socket) { if (!ec) { std::make_shared(std::move(socket))->start(); } do_accept(); }); } tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/buffers/000077500000000000000000000000001340672067200175245ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/buffers/reference_counted.cpp000066400000000000000000000046321340672067200237140ustar00rootroot00000000000000// // reference_counted.cpp // ~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include using asio::ip::tcp; // A reference-counted non-modifiable buffer class. class shared_const_buffer { public: // Construct from a std::string. explicit shared_const_buffer(const std::string& data) : data_(new std::vector(data.begin(), data.end())), buffer_(asio::buffer(*data_)) { } // Implement the ConstBufferSequence requirements. typedef asio::const_buffer value_type; typedef const asio::const_buffer* const_iterator; const asio::const_buffer* begin() const { return &buffer_; } const asio::const_buffer* end() const { return &buffer_ + 1; } private: std::shared_ptr > data_; asio::const_buffer buffer_; }; class session : public std::enable_shared_from_this { public: session(tcp::socket socket) : socket_(std::move(socket)) { } void start() { do_write(); } private: void do_write() { std::time_t now = std::time(0); shared_const_buffer buffer(std::ctime(&now)); auto self(shared_from_this()); asio::async_write(socket_, buffer, [this, self](std::error_code /*ec*/, std::size_t /*length*/) { }); } // The socket used to communicate with the client. tcp::socket socket_; }; class server { public: server(asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { do_accept(); } private: void do_accept() { acceptor_.async_accept( [this](std::error_code ec, tcp::socket socket) { if (!ec) { std::make_shared(std::move(socket))->start(); } do_accept(); }); } tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: reference_counted \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/chat/000077500000000000000000000000001340672067200170075ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/chat/chat_client.cpp000066400000000000000000000070201340672067200217670ustar00rootroot00000000000000// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" #include "chat_message.hpp" using asio::ip::tcp; typedef std::deque chat_message_queue; class chat_client { public: chat_client(asio::io_context& io_context, const tcp::resolver::results_type& endpoints) : io_context_(io_context), socket_(io_context) { do_connect(endpoints); } void write(const chat_message& msg) { asio::post(io_context_, [this, msg]() { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); if (!write_in_progress) { do_write(); } }); } void close() { asio::post(io_context_, [this]() { socket_.close(); }); } private: void do_connect(const tcp::resolver::results_type& endpoints) { asio::async_connect(socket_, endpoints, [this](std::error_code ec, tcp::endpoint) { if (!ec) { do_read_header(); } }); } void do_read_header() { asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), [this](std::error_code ec, std::size_t /*length*/) { if (!ec && read_msg_.decode_header()) { do_read_body(); } else { socket_.close(); } }); } void do_read_body() { asio::async_read(socket_, asio::buffer(read_msg_.body(), read_msg_.body_length()), [this](std::error_code ec, std::size_t /*length*/) { if (!ec) { std::cout.write(read_msg_.body(), read_msg_.body_length()); std::cout << "\n"; do_read_header(); } else { socket_.close(); } }); } void do_write() { asio::async_write(socket_, asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), [this](std::error_code ec, std::size_t /*length*/) { if (!ec) { write_msgs_.pop_front(); if (!write_msgs_.empty()) { do_write(); } } else { socket_.close(); } }); } private: asio::io_context& io_context_; tcp::socket socket_; chat_message read_msg_; chat_message_queue write_msgs_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: chat_client \n"; return 1; } asio::io_context io_context; tcp::resolver resolver(io_context); auto endpoints = resolver.resolve(argv[1], argv[2]); chat_client c(io_context, endpoints); std::thread t([&io_context](){ io_context.run(); }); char line[chat_message::max_body_length + 1]; while (std::cin.getline(line, chat_message::max_body_length + 1)) { chat_message msg; msg.body_length(std::strlen(line)); std::memcpy(msg.body(), line, msg.body_length()); msg.encode_header(); c.write(msg); } c.close(); t.join(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/chat/chat_message.hpp000066400000000000000000000031471340672067200221500ustar00rootroot00000000000000// // chat_message.hpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef CHAT_MESSAGE_HPP #define CHAT_MESSAGE_HPP #include #include #include class chat_message { public: enum { header_length = 4 }; enum { max_body_length = 512 }; chat_message() : body_length_(0) { } const char* data() const { return data_; } char* data() { return data_; } std::size_t length() const { return header_length + body_length_; } const char* body() const { return data_ + header_length; } char* body() { return data_ + header_length; } std::size_t body_length() const { return body_length_; } void body_length(std::size_t new_length) { body_length_ = new_length; if (body_length_ > max_body_length) body_length_ = max_body_length; } bool decode_header() { char header[header_length + 1] = ""; std::strncat(header, data_, header_length); body_length_ = std::atoi(header); if (body_length_ > max_body_length) { body_length_ = 0; return false; } return true; } void encode_header() { char header[header_length + 1] = ""; std::sprintf(header, "%4d", static_cast(body_length_)); std::memcpy(data_, header, header_length); } private: char data_[header_length + max_body_length]; std::size_t body_length_; }; #endif // CHAT_MESSAGE_HPP asio-1.12.2/src/examples/cpp11/chat/chat_server.cpp000066400000000000000000000113721340672067200220240ustar00rootroot00000000000000// // chat_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include "asio.hpp" #include "chat_message.hpp" using asio::ip::tcp; //---------------------------------------------------------------------- typedef std::deque chat_message_queue; //---------------------------------------------------------------------- class chat_participant { public: virtual ~chat_participant() {} virtual void deliver(const chat_message& msg) = 0; }; typedef std::shared_ptr chat_participant_ptr; //---------------------------------------------------------------------- class chat_room { public: void join(chat_participant_ptr participant) { participants_.insert(participant); for (auto msg: recent_msgs_) participant->deliver(msg); } void leave(chat_participant_ptr participant) { participants_.erase(participant); } void deliver(const chat_message& msg) { recent_msgs_.push_back(msg); while (recent_msgs_.size() > max_recent_msgs) recent_msgs_.pop_front(); for (auto participant: participants_) participant->deliver(msg); } private: std::set participants_; enum { max_recent_msgs = 100 }; chat_message_queue recent_msgs_; }; //---------------------------------------------------------------------- class chat_session : public chat_participant, public std::enable_shared_from_this { public: chat_session(tcp::socket socket, chat_room& room) : socket_(std::move(socket)), room_(room) { } void start() { room_.join(shared_from_this()); do_read_header(); } void deliver(const chat_message& msg) { bool write_in_progress = !write_msgs_.empty(); write_msgs_.push_back(msg); if (!write_in_progress) { do_write(); } } private: void do_read_header() { auto self(shared_from_this()); asio::async_read(socket_, asio::buffer(read_msg_.data(), chat_message::header_length), [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec && read_msg_.decode_header()) { do_read_body(); } else { room_.leave(shared_from_this()); } }); } void do_read_body() { auto self(shared_from_this()); asio::async_read(socket_, asio::buffer(read_msg_.body(), read_msg_.body_length()), [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec) { room_.deliver(read_msg_); do_read_header(); } else { room_.leave(shared_from_this()); } }); } void do_write() { auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(write_msgs_.front().data(), write_msgs_.front().length()), [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec) { write_msgs_.pop_front(); if (!write_msgs_.empty()) { do_write(); } } else { room_.leave(shared_from_this()); } }); } tcp::socket socket_; chat_room& room_; chat_message read_msg_; chat_message_queue write_msgs_; }; //---------------------------------------------------------------------- class chat_server { public: chat_server(asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor_(io_context, endpoint) { do_accept(); } private: void do_accept() { acceptor_.async_accept( [this](std::error_code ec, tcp::socket socket) { if (!ec) { std::make_shared(std::move(socket), room_)->start(); } do_accept(); }); } tcp::acceptor acceptor_; chat_room room_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc < 2) { std::cerr << "Usage: chat_server [ ...]\n"; return 1; } asio::io_context io_context; std::list servers; for (int i = 1; i < argc; ++i) { tcp::endpoint endpoint(tcp::v4(), std::atoi(argv[i])); servers.emplace_back(io_context, endpoint); } io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/echo/000077500000000000000000000000001340672067200170065ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/echo/async_tcp_echo_server.cpp000066400000000000000000000040631340672067200240640ustar00rootroot00000000000000// // async_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" using asio::ip::tcp; class session : public std::enable_shared_from_this { public: session(tcp::socket socket) : socket_(std::move(socket)) { } void start() { do_read(); } private: void do_read() { auto self(shared_from_this()); socket_.async_read_some(asio::buffer(data_, max_length), [this, self](std::error_code ec, std::size_t length) { if (!ec) { do_write(length); } }); } void do_write(std::size_t length) { auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(data_, length), [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec) { do_read(); } }); } tcp::socket socket_; enum { max_length = 1024 }; char data_[max_length]; }; class server { public: server(asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { do_accept(); } private: void do_accept() { acceptor_.async_accept( [this](std::error_code ec, tcp::socket socket) { if (!ec) { std::make_shared(std::move(socket))->start(); } do_accept(); }); } tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_tcp_echo_server \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/echo/async_udp_echo_server.cpp000066400000000000000000000031431340672067200240640ustar00rootroot00000000000000// // async_udp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include "asio.hpp" using asio::ip::udp; class server { public: server(asio::io_context& io_context, short port) : socket_(io_context, udp::endpoint(udp::v4(), port)) { do_receive(); } void do_receive() { socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, [this](std::error_code ec, std::size_t bytes_recvd) { if (!ec && bytes_recvd > 0) { do_send(bytes_recvd); } else { do_receive(); } }); } void do_send(std::size_t length) { socket_.async_send_to( asio::buffer(data_, length), sender_endpoint_, [this](std::error_code /*ec*/, std::size_t /*bytes_sent*/) { do_receive(); }); } private: udp::socket socket_; udp::endpoint sender_endpoint_; enum { max_length = 1024 }; char data_[max_length]; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_udp_echo_server \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp000066400000000000000000000024261340672067200245100ustar00rootroot00000000000000// // blocking_tcp_echo_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::tcp; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: blocking_tcp_echo_client \n"; return 1; } asio::io_context io_context; tcp::socket s(io_context); tcp::resolver resolver(io_context); asio::connect(s, resolver.resolve(argv[1], argv[2])); std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = std::strlen(request); asio::write(s, asio::buffer(request, request_length)); char reply[max_length]; size_t reply_length = asio::read(s, asio::buffer(reply, request_length)); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp000066400000000000000000000027621340672067200245430ustar00rootroot00000000000000// // blocking_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" using asio::ip::tcp; const int max_length = 1024; void session(tcp::socket sock) { try { for (;;) { char data[max_length]; asio::error_code error; size_t length = sock.read_some(asio::buffer(data), error); if (error == asio::error::eof) break; // Connection closed cleanly by peer. else if (error) throw asio::system_error(error); // Some other error. asio::write(sock, asio::buffer(data, length)); } } catch (std::exception& e) { std::cerr << "Exception in thread: " << e.what() << "\n"; } } void server(asio::io_context& io_context, unsigned short port) { tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port)); for (;;) { std::thread(session, a.accept()).detach(); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: blocking_tcp_echo_server \n"; return 1; } asio::io_context io_context; server(io_context, std::atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/echo/blocking_udp_echo_client.cpp000066400000000000000000000026341340672067200245130ustar00rootroot00000000000000// // blocking_udp_echo_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::udp; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: blocking_udp_echo_client \n"; return 1; } asio::io_context io_context; udp::socket s(io_context, udp::endpoint(udp::v4(), 0)); udp::resolver resolver(io_context); udp::resolver::results_type endpoints = resolver.resolve(udp::v4(), argv[1], argv[2]); std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = std::strlen(request); s.send_to(asio::buffer(request, request_length), *endpoints.begin()); char reply[max_length]; udp::endpoint sender_endpoint; size_t reply_length = s.receive_from( asio::buffer(reply, max_length), sender_endpoint); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/echo/blocking_udp_echo_server.cpp000066400000000000000000000021561340672067200245420ustar00rootroot00000000000000// // blocking_udp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include "asio.hpp" using asio::ip::udp; enum { max_length = 1024 }; void server(asio::io_context& io_context, unsigned short port) { udp::socket sock(io_context, udp::endpoint(udp::v4(), port)); for (;;) { char data[max_length]; udp::endpoint sender_endpoint; size_t length = sock.receive_from( asio::buffer(data, max_length), sender_endpoint); sock.send_to(asio::buffer(data, length), sender_endpoint); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: blocking_udp_echo_server \n"; return 1; } asio::io_context io_context; server(io_context, std::atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/executors/000077500000000000000000000000001340672067200201115ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/executors/actor.cpp000066400000000000000000000167301340672067200217340ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include using asio::defer; using asio::executor; using asio::post; using asio::strand; using asio::system_executor; //------------------------------------------------------------------------------ // A tiny actor framework // ~~~~~~~~~~~~~~~~~~~~~~ class actor; // Used to identify the sender and recipient of messages. typedef actor* actor_address; // Base class for all registered message handlers. class message_handler_base { public: virtual ~message_handler_base() {} // Used to determine which message handlers receive an incoming message. virtual const std::type_info& message_id() const = 0; }; // Base class for a handler for a specific message type. template class message_handler : public message_handler_base { public: // Handle an incoming message. virtual void handle_message(Message msg, actor_address from) = 0; }; // Concrete message handler for a specific message type. template class mf_message_handler : public message_handler { public: // Construct a message handler to invoke the specified member function. mf_message_handler(void (Actor::* mf)(Message, actor_address), Actor* a) : function_(mf), actor_(a) { } // Used to determine which message handlers receive an incoming message. virtual const std::type_info& message_id() const { return typeid(Message); } // Handle an incoming message. virtual void handle_message(Message msg, actor_address from) { (actor_->*function_)(std::move(msg), from); } // Determine whether the message handler represents the specified function. bool is_function(void (Actor::* mf)(Message, actor_address)) const { return mf == function_; } private: void (Actor::* function_)(Message, actor_address); Actor* actor_; }; // Base class for all actors. class actor { public: virtual ~actor() { } // Obtain the actor's address for use as a message sender or recipient. actor_address address() { return this; } // Send a message from one actor to another. template friend void send(Message msg, actor_address from, actor_address to) { // Execute the message handler in the context of the target's executor. post(to->executor_, [=] { to->call_handler(std::move(msg), from); }); } protected: // Construct the actor to use the specified executor for all message handlers. actor(executor e) : executor_(std::move(e)) { } // Register a handler for a specific message type. Duplicates are permitted. template void register_handler(void (Actor::* mf)(Message, actor_address)) { handlers_.push_back( std::make_shared>( mf, static_cast(this))); } // Deregister a handler. Removes only the first matching handler. template void deregister_handler(void (Actor::* mf)(Message, actor_address)) { const std::type_info& id = typeid(message_handler); for (auto iter = handlers_.begin(); iter != handlers_.end(); ++iter) { if ((*iter)->message_id() == id) { auto mh = static_cast*>(iter->get()); if (mh->is_function(mf)) { handlers_.erase(iter); return; } } } } // Send a message from within a message handler. template void tail_send(Message msg, actor_address to) { // Execute the message handler in the context of the target's executor. actor* from = this; defer(to->executor_, [=] { to->call_handler(std::move(msg), from); }); } private: // Find the matching message handlers, if any, and call them. template void call_handler(Message msg, actor_address from) { const std::type_info& message_id = typeid(Message); for (auto& h: handlers_) { if (h->message_id() == message_id) { auto mh = static_cast*>(h.get()); mh->handle_message(msg, from); } } } // All messages associated with a single actor object should be processed // non-concurrently. We use a strand to ensure non-concurrent execution even // if the underlying executor may use multiple threads. strand executor_; std::vector> handlers_; }; // A concrete actor that allows synchronous message retrieval. template class receiver : public actor { public: receiver() : actor(system_executor()) { register_handler(&receiver::message_handler); } // Block until a message has been received. Message wait() { std::unique_lock lock(mutex_); condition_.wait(lock, [this]{ return !message_queue_.empty(); }); Message msg(std::move(message_queue_.front())); message_queue_.pop_front(); return msg; } private: // Handle a new message by adding it to the queue and waking a waiter. void message_handler(Message msg, actor_address /* from */) { std::lock_guard lock(mutex_); message_queue_.push_back(std::move(msg)); condition_.notify_one(); } std::mutex mutex_; std::condition_variable condition_; std::deque message_queue_; }; //------------------------------------------------------------------------------ #include #include using asio::thread_pool; class member : public actor { public: explicit member(executor e) : actor(std::move(e)) { register_handler(&member::init_handler); } private: void init_handler(actor_address next, actor_address from) { next_ = next; caller_ = from; register_handler(&member::token_handler); deregister_handler(&member::init_handler); } void token_handler(int token, actor_address /*from*/) { int msg(token); actor_address to(caller_); if (token > 0) { msg = token - 1; to = next_; } tail_send(msg, to); } actor_address next_; actor_address caller_; }; int main() { const std::size_t num_threads = 16; const int num_hops = 50000000; const std::size_t num_actors = 503; const int token_value = (num_hops + num_actors - 1) / num_actors; const std::size_t actors_per_thread = num_actors / num_threads; struct single_thread_pool : thread_pool { single_thread_pool() : thread_pool(1) {} }; single_thread_pool pools[num_threads]; std::vector> members(num_actors); receiver rcvr; // Create the member actors. for (std::size_t i = 0; i < num_actors; ++i) members[i] = std::make_shared(pools[(i / actors_per_thread) % num_threads].get_executor()); // Initialise the actors by passing each one the address of the next actor in the ring. for (std::size_t i = num_actors, next_i = 0; i > 0; next_i = --i) send(members[next_i]->address(), rcvr.address(), members[i - 1]->address()); // Send exactly one token to each actor, all with the same initial value, rounding up if required. for (std::size_t i = 0; i < num_actors; ++i) send(token_value, rcvr.address(), members[i]->address()); // Wait for all signal messages, indicating the tokens have all reached zero. for (std::size_t i = 0; i < num_actors; ++i) rcvr.wait(); } asio-1.12.2/src/examples/cpp11/executors/bank_account_1.cpp000066400000000000000000000014341340672067200234660ustar00rootroot00000000000000#include #include #include using asio::post; using asio::thread_pool; // Traditional active object pattern. // Member functions do not block. class bank_account { int balance_ = 0; mutable thread_pool pool_{1}; public: void deposit(int amount) { post(pool_, [=] { balance_ += amount; }); } void withdraw(int amount) { post(pool_, [=] { if (balance_ >= amount) balance_ -= amount; }); } void print_balance() const { post(pool_, [=] { std::cout << "balance = " << balance_ << "\n"; }); } ~bank_account() { pool_.join(); } }; int main() { bank_account acct; acct.deposit(20); acct.withdraw(10); acct.print_balance(); } asio-1.12.2/src/examples/cpp11/executors/bank_account_2.cpp000066400000000000000000000016301340672067200234650ustar00rootroot00000000000000#include #include #include #include using asio::post; using asio::thread_pool; using asio::use_future; // Traditional active object pattern. // Member functions block until operation is finished. class bank_account { int balance_ = 0; mutable thread_pool pool_{1}; public: void deposit(int amount) { post(pool_, use_future([=] { balance_ += amount; })).get(); } void withdraw(int amount) { post(pool_, use_future([=] { if (balance_ >= amount) balance_ -= amount; })).get(); } int balance() const { return post(pool_, use_future([=] { return balance_; })).get(); } }; int main() { bank_account acct; acct.deposit(20); acct.withdraw(10); std::cout << "balance = " << acct.balance() << "\n"; } asio-1.12.2/src/examples/cpp11/executors/fork_join.cpp000066400000000000000000000205141340672067200225770ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using asio::dispatch; using asio::execution_context; using asio::thread_pool; // A fixed-size thread pool used to implement fork/join semantics. Functions // are scheduled using a simple FIFO queue. Implementing work stealing, or // using a queue based on atomic operations, are left as tasks for the reader. class fork_join_pool : public execution_context { public: // The constructor starts a thread pool with the specified number of threads. // Note that the thread_count is not a fixed limit on the pool's concurrency. // Additional threads may temporarily be added to the pool if they join a // fork_executor. explicit fork_join_pool( std::size_t thread_count = std::thread::hardware_concurrency() * 2) : use_count_(1), threads_(thread_count) { try { // Ask each thread in the pool to dequeue and execute functions until // it is time to shut down, i.e. the use count is zero. for (thread_count_ = 0; thread_count_ < thread_count; ++thread_count_) { dispatch(threads_, [&] { std::unique_lock lock(mutex_); while (use_count_ > 0) if (!execute_next(lock)) condition_.wait(lock); }); } } catch (...) { stop_threads(); threads_.join(); throw; } } // The destructor waits for the pool to finish executing functions. ~fork_join_pool() { stop_threads(); threads_.join(); } private: friend class fork_executor; // The base for all functions that are queued in the pool. struct function_base { std::shared_ptr work_count_; void (*execute_)(std::shared_ptr& p); }; // Execute the next function from the queue, if any. Returns true if a // function was executed, and false if the queue was empty. bool execute_next(std::unique_lock& lock) { if (queue_.empty()) return false; auto p(queue_.front()); queue_.pop(); lock.unlock(); execute(lock, p); return true; } // Execute a function and decrement the outstanding work. void execute(std::unique_lock& lock, std::shared_ptr& p) { std::shared_ptr work_count(std::move(p->work_count_)); try { p->execute_(p); lock.lock(); do_work_finished(work_count); } catch (...) { lock.lock(); do_work_finished(work_count); throw; } } // Increment outstanding work. void do_work_started(const std::shared_ptr& work_count) noexcept { if (++(*work_count) == 1) ++use_count_; } // Decrement outstanding work. Notify waiting threads if we run out. void do_work_finished(const std::shared_ptr& work_count) noexcept { if (--(*work_count) == 0) { --use_count_; condition_.notify_all(); } } // Dispatch a function, executing it immediately if the queue is already // loaded. Otherwise adds the function to the queue and wakes a thread. void do_dispatch(std::shared_ptr p, const std::shared_ptr& work_count) { std::unique_lock lock(mutex_); if (queue_.size() > thread_count_ * 16) { do_work_started(work_count); lock.unlock(); execute(lock, p); } else { queue_.push(p); do_work_started(work_count); condition_.notify_one(); } } // Add a function to the queue and wake a thread. void do_post(std::shared_ptr p, const std::shared_ptr& work_count) { std::lock_guard lock(mutex_); queue_.push(p); do_work_started(work_count); condition_.notify_one(); } // Ask all threads to shut down. void stop_threads() { std::lock_guard lock(mutex_); --use_count_; condition_.notify_all(); } std::mutex mutex_; std::condition_variable condition_; std::queue> queue_; std::size_t use_count_; std::size_t thread_count_; thread_pool threads_; }; // A class that satisfies the Executor requirements. Every function or piece of // work associated with a fork_executor is part of a single, joinable group. class fork_executor { public: fork_executor(fork_join_pool& ctx) : context_(ctx), work_count_(std::make_shared(0)) { } fork_join_pool& context() const noexcept { return context_; } void on_work_started() const noexcept { std::lock_guard lock(context_.mutex_); context_.do_work_started(work_count_); } void on_work_finished() const noexcept { std::lock_guard lock(context_.mutex_); context_.do_work_finished(work_count_); } template void dispatch(Func&& f, const Alloc& a) const { auto p(std::allocate_shared>( typename std::allocator_traits::template rebind_alloc(a), std::move(f), work_count_)); context_.do_dispatch(p, work_count_); } template void post(Func f, const Alloc& a) const { auto p(std::allocate_shared>( typename std::allocator_traits::template rebind_alloc(a), std::move(f), work_count_)); context_.do_post(p, work_count_); } template void defer(Func&& f, const Alloc& a) const { post(std::forward(f), a); } friend bool operator==(const fork_executor& a, const fork_executor& b) noexcept { return a.work_count_ == b.work_count_; } friend bool operator!=(const fork_executor& a, const fork_executor& b) noexcept { return a.work_count_ != b.work_count_; } // Block until all work associated with the executor is complete. While it is // waiting, the thread may be borrowed to execute functions from the queue. void join() const { std::unique_lock lock(context_.mutex_); while (*work_count_ > 0) if (!context_.execute_next(lock)) context_.condition_.wait(lock); } private: template struct function : fork_join_pool::function_base { explicit function(Func f, const std::shared_ptr& w) : function_(std::move(f)) { work_count_ = w; execute_ = [](std::shared_ptr& p) { Func tmp(std::move(static_cast(p.get())->function_)); p.reset(); tmp(); }; } Func function_; }; fork_join_pool& context_; std::shared_ptr work_count_; }; // Helper class to automatically join a fork_executor when exiting a scope. class join_guard { public: explicit join_guard(const fork_executor& ex) : ex_(ex) {} join_guard(const join_guard&) = delete; join_guard(join_guard&&) = delete; ~join_guard() { ex_.join(); } private: fork_executor ex_; }; //------------------------------------------------------------------------------ #include #include #include #include fork_join_pool pool; template void fork_join_sort(Iterator begin, Iterator end) { std::size_t n = end - begin; if (n > 32768) { { fork_executor fork(pool); join_guard join(fork); dispatch(fork, [=]{ fork_join_sort(begin, begin + n / 2); }); dispatch(fork, [=]{ fork_join_sort(begin + n / 2, end); }); } std::inplace_merge(begin, begin + n / 2, end); } else { std::sort(begin, end); } } int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage: fork_join \n"; return 1; } std::vector vec(std::atoll(argv[1])); std::iota(vec.begin(), vec.end(), 0); std::random_device rd; std::mt19937 g(rd()); std::shuffle(vec.begin(), vec.end(), g); std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); fork_join_sort(vec.begin(), vec.end()); std::chrono::steady_clock::duration elapsed = std::chrono::steady_clock::now() - start; std::cout << "sort took "; std::cout << std::chrono::duration_cast(elapsed).count(); std::cout << " microseconds" << std::endl; } asio-1.12.2/src/examples/cpp11/executors/pipeline.cpp000066400000000000000000000157021340672067200224270ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include using asio::execution_context; using asio::executor_binder; using asio::get_associated_executor; using asio::post; using asio::system_executor; using asio::use_future; using asio::use_service; // An executor that launches a new thread for each function submitted to it. // This class satisfies the Executor requirements. class thread_executor { private: // Service to track all threads started through a thread_executor. class thread_bag : public execution_context::service { public: typedef thread_bag key_type; explicit thread_bag(execution_context& ctx) : execution_context::service(ctx) { } void add_thread(std::thread&& t) { std::unique_lock lock(mutex_); threads_.push_back(std::move(t)); } private: virtual void shutdown() { for (auto& t : threads_) t.join(); } std::mutex mutex_; std::vector threads_; }; public: execution_context& context() const noexcept { return system_executor().context(); } void on_work_started() const noexcept { // This executor doesn't count work. } void on_work_finished() const noexcept { // This executor doesn't count work. } template void dispatch(Func&& f, const Alloc& a) const { post(std::forward(f), a); } template void post(Func f, const Alloc&) const { thread_bag& bag = use_service(context()); bag.add_thread(std::thread(std::move(f))); } template void defer(Func&& f, const Alloc& a) const { post(std::forward(f), a); } friend bool operator==(const thread_executor&, const thread_executor&) noexcept { return true; } friend bool operator!=(const thread_executor&, const thread_executor&) noexcept { return false; } }; // Base class for all thread-safe queue implementations. class queue_impl_base { template friend class queue_front; template friend class queue_back; std::mutex mutex_; std::condition_variable condition_; bool stop_ = false; }; // Underlying implementation of a thread-safe queue, shared between the // queue_front and queue_back classes. template class queue_impl : public queue_impl_base { template friend class queue_front; template friend class queue_back; std::queue queue_; }; // The front end of a queue between consecutive pipeline stages. template class queue_front { public: typedef T value_type; explicit queue_front(std::shared_ptr> impl) : impl_(impl) { } void push(T t) { std::unique_lock lock(impl_->mutex_); impl_->queue_.push(std::move(t)); impl_->condition_.notify_one(); } void stop() { std::unique_lock lock(impl_->mutex_); impl_->stop_ = true; impl_->condition_.notify_one(); } private: std::shared_ptr> impl_; }; // The back end of a queue between consecutive pipeline stages. template class queue_back { public: typedef T value_type; explicit queue_back(std::shared_ptr> impl) : impl_(impl) { } bool pop(T& t) { std::unique_lock lock(impl_->mutex_); while (impl_->queue_.empty() && !impl_->stop_) impl_->condition_.wait(lock); if (!impl_->queue_.empty()) { t = impl_->queue_.front(); impl_->queue_.pop(); return true; } return false; } private: std::shared_ptr> impl_; }; // Launch the last stage in a pipeline. template std::future pipeline(queue_back in, F f) { // Get the function's associated executor, defaulting to thread_executor. auto ex = get_associated_executor(f, thread_executor()); // Run the function, and as we're the last stage return a future so that the // caller can wait for the pipeline to finish. return post(ex, use_future([in, f]() mutable { f(in); })); } // Launch an intermediate stage in a pipeline. template std::future pipeline(queue_back in, F f, Tail... t) { // Determine the output queue type. typedef typename executor_binder::second_argument_type::value_type output_value_type; // Create the output queue and its implementation. auto out_impl = std::make_shared>(); queue_front out(out_impl); queue_back next_in(out_impl); // Get the function's associated executor, defaulting to thread_executor. auto ex = get_associated_executor(f, thread_executor()); // Run the function. post(ex, [in, out, f]() mutable { f(in, out); out.stop(); }); // Launch the rest of the pipeline. return pipeline(next_in, std::move(t)...); } // Launch the first stage in a pipeline. template std::future pipeline(F f, Tail... t) { // Determine the output queue type. typedef typename executor_binder::argument_type::value_type output_value_type; // Create the output queue and its implementation. auto out_impl = std::make_shared>(); queue_front out(out_impl); queue_back next_in(out_impl); // Get the function's associated executor, defaulting to thread_executor. auto ex = get_associated_executor(f, thread_executor()); // Run the function. post(ex, [out, f]() mutable { f(out); out.stop(); }); // Launch the rest of the pipeline. return pipeline(next_in, std::move(t)...); } //------------------------------------------------------------------------------ #include #include #include using asio::bind_executor; using asio::thread_pool; void reader(queue_front out) { std::string line; while (std::getline(std::cin, line)) out.push(line); } void filter(queue_back in, queue_front out) { std::string line; while (in.pop(line)) if (line.length() > 5) out.push(line); } void upper(queue_back in, queue_front out) { std::string line; while (in.pop(line)) { std::string new_line; for (char c : line) new_line.push_back(std::toupper(c)); out.push(new_line); } } void writer(queue_back in) { std::size_t count = 0; std::string line; while (in.pop(line)) std::cout << count++ << ": " << line << std::endl; } int main() { thread_pool pool; auto f = pipeline(reader, filter, bind_executor(pool, upper), writer); f.wait(); } asio-1.12.2/src/examples/cpp11/executors/priority_scheduler.cpp000066400000000000000000000075121340672067200245410ustar00rootroot00000000000000#include #include #include #include #include #include #include using asio::dispatch; using asio::execution_context; class priority_scheduler : public execution_context { public: // A class that satisfies the Executor requirements. class executor_type { public: executor_type(priority_scheduler& ctx, int pri) noexcept : context_(ctx), priority_(pri) { } priority_scheduler& context() const noexcept { return context_; } void on_work_started() const noexcept { // This executor doesn't count work. Instead, the scheduler simply runs // until explicitly stopped. } void on_work_finished() const noexcept { // This executor doesn't count work. Instead, the scheduler simply runs // until explicitly stopped. } template void dispatch(Func&& f, const Alloc& a) const { post(std::forward(f), a); } template void post(Func f, const Alloc& a) const { auto p(std::allocate_shared>( typename std::allocator_traits< Alloc>::template rebind_alloc(a), priority_, std::move(f))); std::lock_guard lock(context_.mutex_); context_.queue_.push(p); context_.condition_.notify_one(); } template void defer(Func&& f, const Alloc& a) const { post(std::forward(f), a); } friend bool operator==(const executor_type& a, const executor_type& b) noexcept { return &a.context_ == &b.context_; } friend bool operator!=(const executor_type& a, const executor_type& b) noexcept { return &a.context_ != &b.context_; } private: priority_scheduler& context_; int priority_; }; executor_type get_executor(int pri = 0) noexcept { return executor_type(*const_cast(this), pri); } void run() { std::unique_lock lock(mutex_); for (;;) { condition_.wait(lock, [&]{ return stopped_ || !queue_.empty(); }); if (stopped_) return; auto p(queue_.top()); queue_.pop(); lock.unlock(); p->execute_(p); lock.lock(); } } void stop() { std::lock_guard lock(mutex_); stopped_ = true; condition_.notify_all(); } private: struct item_base { int priority_; void (*execute_)(std::shared_ptr&); }; template struct item : item_base { item(int pri, Func f) : function_(std::move(f)) { priority_ = pri; execute_ = [](std::shared_ptr& p) { Func tmp(std::move(static_cast(p.get())->function_)); p.reset(); tmp(); }; } Func function_; }; struct item_comp { bool operator()( const std::shared_ptr& a, const std::shared_ptr& b) { return a->priority_ < b->priority_; } }; std::mutex mutex_; std::condition_variable condition_; std::priority_queue< std::shared_ptr, std::vector>, item_comp> queue_; bool stopped_ = false; }; int main() { priority_scheduler sched; auto low = sched.get_executor(0); auto med = sched.get_executor(1); auto high = sched.get_executor(2); dispatch(low, []{ std::cout << "1\n"; }); dispatch(low, []{ std::cout << "11\n"; }); dispatch(med, []{ std::cout << "2\n"; }); dispatch(med, []{ std::cout << "22\n"; }); dispatch(high, []{ std::cout << "3\n"; }); dispatch(high, []{ std::cout << "33\n"; }); dispatch(high, []{ std::cout << "333\n"; }); dispatch(sched.get_executor(-1), [&]{ sched.stop(); }); sched.run(); } asio-1.12.2/src/examples/cpp11/fork/000077500000000000000000000000001340672067200170315ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/fork/daemon.cpp000066400000000000000000000127751340672067200210140ustar00rootroot00000000000000// // daemon.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include using asio::ip::udp; class udp_daytime_server { public: udp_daytime_server(asio::io_context& io_context) : socket_(io_context, {udp::v4(), 13}) { receive(); } private: void receive() { socket_.async_receive_from( asio::buffer(recv_buffer_), remote_endpoint_, [this](std::error_code ec, std::size_t /*n*/) { if (!ec) { using namespace std; // For time_t, time and ctime; time_t now = time(0); std::string message = ctime(&now); std::error_code ignored_ec; socket_.send_to(asio::buffer(message), remote_endpoint_, 0, ignored_ec); } receive(); }); } udp::socket socket_; udp::endpoint remote_endpoint_; std::array recv_buffer_; }; int main() { try { asio::io_context io_context; // Initialise the server before becoming a daemon. If the process is // started from a shell, this means any errors will be reported back to the // user. udp_daytime_server server(io_context); // Register signal handlers so that the daemon may be shut down. You may // also want to register for other signals, such as SIGHUP to trigger a // re-read of a configuration file. asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait( [&](std::error_code /*ec*/, int /*signo*/) { io_context.stop(); }); // Inform the io_context that we are about to become a daemon. The // io_context cleans up any internal resources, such as threads, that may // interfere with forking. io_context.notify_fork(asio::io_context::fork_prepare); // Fork the process and have the parent exit. If the process was started // from a shell, this returns control to the user. Forking a new process is // also a prerequisite for the subsequent call to setsid(). if (pid_t pid = fork()) { if (pid > 0) { // We're in the parent process and need to exit. // // When the exit() function is used, the program terminates without // invoking local variables' destructors. Only global variables are // destroyed. As the io_context object is a local variable, this means // we do not have to call: // // io_context.notify_fork(asio::io_context::fork_parent); // // However, this line should be added before each call to exit() if // using a global io_context object. An additional call: // // io_context.notify_fork(asio::io_context::fork_prepare); // // should also precede the second fork(). exit(0); } else { syslog(LOG_ERR | LOG_USER, "First fork failed: %m"); return 1; } } // Make the process a new session leader. This detaches it from the // terminal. setsid(); // A process inherits its working directory from its parent. This could be // on a mounted filesystem, which means that the running daemon would // prevent this filesystem from being unmounted. Changing to the root // directory avoids this problem. chdir("/"); // The file mode creation mask is also inherited from the parent process. // We don't want to restrict the permissions on files created by the // daemon, so the mask is cleared. umask(0); // A second fork ensures the process cannot acquire a controlling terminal. if (pid_t pid = fork()) { if (pid > 0) { exit(0); } else { syslog(LOG_ERR | LOG_USER, "Second fork failed: %m"); return 1; } } // Close the standard streams. This decouples the daemon from the terminal // that started it. close(0); close(1); close(2); // We don't want the daemon to have any standard input. if (open("/dev/null", O_RDONLY) < 0) { syslog(LOG_ERR | LOG_USER, "Unable to open /dev/null: %m"); return 1; } // Send standard output to a log file. const char* output = "/tmp/asio.daemon.out"; const int flags = O_WRONLY | O_CREAT | O_APPEND; const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; if (open(output, flags, mode) < 0) { syslog(LOG_ERR | LOG_USER, "Unable to open output file %s: %m", output); return 1; } // Also send standard error to the same log file. if (dup(1) < 0) { syslog(LOG_ERR | LOG_USER, "Unable to dup output descriptor: %m"); return 1; } // Inform the io_context that we have finished becoming a daemon. The // io_context uses this opportunity to create any internal file descriptors // that need to be private to the new process. io_context.notify_fork(asio::io_context::fork_child); // The io_context can now be used normally. syslog(LOG_INFO | LOG_USER, "Daemon started"); io_context.run(); syslog(LOG_INFO | LOG_USER, "Daemon stopped"); } catch (std::exception& e) { syslog(LOG_ERR | LOG_USER, "Exception: %s", e.what()); std::cerr << "Exception: " << e.what() << std::endl; } } asio-1.12.2/src/examples/cpp11/fork/process_per_connection.cpp000066400000000000000000000104201340672067200242750ustar00rootroot00000000000000// // process_per_connection.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include using asio::ip::tcp; class server { public: server(asio::io_context& io_context, unsigned short port) : io_context_(io_context), signal_(io_context, SIGCHLD), acceptor_(io_context, {tcp::v4(), port}), socket_(io_context) { wait_for_signal(); accept(); } private: void wait_for_signal() { signal_.async_wait( [this](std::error_code /*ec*/, int /*signo*/) { // Only the parent process should check for this signal. We can // determine whether we are in the parent by checking if the acceptor // is still open. if (acceptor_.is_open()) { // Reap completed child processes so that we don't end up with // zombies. int status = 0; while (waitpid(-1, &status, WNOHANG) > 0) {} wait_for_signal(); } }); } void accept() { acceptor_.async_accept( [this](std::error_code ec, tcp::socket new_socket) { if (!ec) { // Take ownership of the newly accepted socket. socket_ = std::move(new_socket); // Inform the io_context that we are about to fork. The io_context // cleans up any internal resources, such as threads, that may // interfere with forking. io_context_.notify_fork(asio::io_context::fork_prepare); if (fork() == 0) { // Inform the io_context that the fork is finished and that this // is the child process. The io_context uses this opportunity to // create any internal file descriptors that must be private to // the new process. io_context_.notify_fork(asio::io_context::fork_child); // The child won't be accepting new connections, so we can close // the acceptor. It remains open in the parent. acceptor_.close(); // The child process is not interested in processing the SIGCHLD // signal. signal_.cancel(); read(); } else { // Inform the io_context that the fork is finished (or failed) // and that this is the parent process. The io_context uses this // opportunity to recreate any internal resources that were // cleaned up during preparation for the fork. io_context_.notify_fork(asio::io_context::fork_parent); // The parent process can now close the newly accepted socket. It // remains open in the child. socket_.close(); accept(); } } else { std::cerr << "Accept error: " << ec.message() << std::endl; accept(); } }); } void read() { socket_.async_read_some(asio::buffer(data_), [this](std::error_code ec, std::size_t length) { if (!ec) write(length); }); } void write(std::size_t length) { asio::async_write(socket_, asio::buffer(data_, length), [this](std::error_code ec, std::size_t /*length*/) { if (!ec) read(); }); } asio::io_context& io_context_; asio::signal_set signal_; tcp::acceptor acceptor_; tcp::socket socket_; std::array data_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: process_per_connection \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << std::endl; } } asio-1.12.2/src/examples/cpp11/futures/000077500000000000000000000000001340672067200175655ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/futures/daytime_client.cpp000066400000000000000000000045611340672067200232710ustar00rootroot00000000000000// // daytime_client.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::udp; void get_daytime(asio::io_context& io_context, const char* hostname) { try { udp::resolver resolver(io_context); std::future endpoints = resolver.async_resolve( udp::v4(), hostname, "daytime", asio::use_future); // The async_resolve operation above returns the endpoints as a future // value that is not retrieved ... udp::socket socket(io_context, udp::v4()); std::array send_buf = {{ 0 }}; std::future send_length = socket.async_send_to(asio::buffer(send_buf), *endpoints.get().begin(), // ... until here. This call may block. asio::use_future); // Do other things here while the send completes. send_length.get(); // Blocks until the send is complete. Throws any errors. std::array recv_buf; udp::endpoint sender_endpoint; std::future recv_length = socket.async_receive_from( asio::buffer(recv_buf), sender_endpoint, asio::use_future); // Do other things here while the receive completes. std::cout.write( recv_buf.data(), recv_length.get()); // Blocks until receive is complete. } catch (std::system_error& e) { std::cerr << e.what() << std::endl; } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: daytime_client " << std::endl; return 1; } // We run the io_context off in its own thread so that it operates // completely asynchronously with respect to the rest of the program. asio::io_context io_context; auto work = asio::make_work_guard(io_context); std::thread thread([&io_context](){ io_context.run(); }); get_daytime(io_context, argv[1]); io_context.stop(); thread.join(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; } asio-1.12.2/src/examples/cpp11/handler_tracking/000077500000000000000000000000001340672067200213675ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/handler_tracking/custom_tracking.hpp000066400000000000000000000147231340672067200253030ustar00rootroot00000000000000// // custom_tracking.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef CUSTOM_TRACKING_HPP #define CUSTOM_TRACKING_HPP #include #include #include # define ASIO_INHERIT_TRACKED_HANDLER \ : public ::custom_tracking::tracked_handler # define ASIO_ALSO_INHERIT_TRACKED_HANDLER \ , public ::custom_tracking::tracked_handler # define ASIO_HANDLER_TRACKING_INIT \ ::custom_tracking::init() # define ASIO_HANDLER_CREATION(args) \ ::custom_tracking::creation args # define ASIO_HANDLER_COMPLETION(args) \ ::custom_tracking::completion tracked_completion args # define ASIO_HANDLER_INVOCATION_BEGIN(args) \ tracked_completion.invocation_begin args # define ASIO_HANDLER_INVOCATION_END \ tracked_completion.invocation_end() # define ASIO_HANDLER_OPERATION(args) \ ::custom_tracking::operation args # define ASIO_HANDLER_REACTOR_REGISTRATION(args) \ ::custom_tracking::reactor_registration args # define ASIO_HANDLER_REACTOR_DEREGISTRATION(args) \ ::custom_tracking::reactor_deregistration args # define ASIO_HANDLER_REACTOR_READ_EVENT 1 # define ASIO_HANDLER_REACTOR_WRITE_EVENT 2 # define ASIO_HANDLER_REACTOR_ERROR_EVENT 4 # define ASIO_HANDLER_REACTOR_EVENTS(args) \ ::custom_tracking::reactor_events args # define ASIO_HANDLER_REACTOR_OPERATION(args) \ ::custom_tracking::reactor_operation args struct custom_tracking { // Base class for objects containing tracked handlers. struct tracked_handler { std::uintmax_t handler_id_ = 0; // To uniquely identify a handler. std::uintmax_t tree_id_ = 0; // To identify related handlers. const char* object_type_; // The object type associated with the handler. std::uintmax_t native_handle_; // Native handle, if any. }; // Initialise the tracking system. static void init() { } // Record the creation of a tracked handler. static void creation(asio::execution_context& /*ctx*/, tracked_handler& h, const char* object_type, void* /*object*/, std::uintmax_t native_handle, const char* op_name) { // Generate a unique id for the new handler. static std::atomic next_handler_id{1}; h.handler_id_ = next_handler_id++; // Copy the tree identifier forward from the current handler. if (*current_completion()) h.tree_id_ = (*current_completion())->handler_.tree_id_; // Store various attributes of the operation to use in later output. h.object_type_ = object_type; h.native_handle_ = native_handle; std::printf( "Starting operation %s.%s for native_handle = %" PRIuMAX ", handler = %" PRIuMAX ", tree = %" PRIuMAX "\n", object_type, op_name, h.native_handle_, h.handler_id_, h.tree_id_); } struct completion { explicit completion(const tracked_handler& h) : handler_(h), next_(*current_completion()) { *current_completion() = this; } completion(const completion&) = delete; completion& operator=(const completion&) = delete; // Destructor records only when an exception is thrown from the handler, or // if the memory is being freed without the handler having been invoked. ~completion() { *current_completion() = next_; } // Records that handler is to be invoked with the specified arguments. template void invocation_begin(Args&&... /*args*/) { std::printf("Entering handler %" PRIuMAX " in tree %" PRIuMAX "\n", handler_.handler_id_, handler_.tree_id_); } // Record that handler invocation has ended. void invocation_end() { std::printf("Leaving handler %" PRIuMAX " in tree %" PRIuMAX "\n", handler_.handler_id_, handler_.tree_id_); } tracked_handler handler_; // Completions may nest. Here we stash a pointer to the outer completion. completion* next_; }; static completion** current_completion() { static ASIO_THREAD_KEYWORD completion* current = nullptr; return ¤t; } // Record an operation that is not directly associated with a handler. static void operation(asio::execution_context& /*ctx*/, const char* /*object_type*/, void* /*object*/, std::uintmax_t /*native_handle*/, const char* /*op_name*/) { } // Record that a descriptor has been registered with the reactor. static void reactor_registration(asio::execution_context& context, uintmax_t native_handle, uintmax_t registration) { std::printf("Adding to reactor native_handle = %" PRIuMAX ", registration = %" PRIuMAX "\n", native_handle, registration); } // Record that a descriptor has been deregistered from the reactor. static void reactor_deregistration(asio::execution_context& context, uintmax_t native_handle, uintmax_t registration) { std::printf("Removing from reactor native_handle = %" PRIuMAX ", registration = %" PRIuMAX "\n", native_handle, registration); } // Record reactor-based readiness events associated with a descriptor. static void reactor_events(asio::execution_context& context, uintmax_t registration, unsigned events) { std::printf( "Reactor readiness for registration = %" PRIuMAX ", events =%s%s%s\n", registration, (events & ASIO_HANDLER_REACTOR_READ_EVENT) ? " read" : "", (events & ASIO_HANDLER_REACTOR_WRITE_EVENT) ? " write" : "", (events & ASIO_HANDLER_REACTOR_ERROR_EVENT) ? " error" : ""); } // Record a reactor-based operation that is associated with a handler. static void reactor_operation(const tracked_handler& h, const char* op_name, const asio::error_code& ec) { std::printf( "Performed operation %s.%s for native_handle = %" PRIuMAX ", ec = %s:%d\n", h.object_type_, op_name, h.native_handle_, ec.category().name(), ec.value()); } // Record a reactor-based operation that is associated with a handler. static void reactor_operation(const tracked_handler& h, const char* op_name, const asio::error_code& ec, std::size_t bytes_transferred) { std::printf( "Performed operation %s.%s for native_handle = %" PRIuMAX ", ec = %s:%d, n = %" PRIuMAX "\n", h.object_type_, op_name, h.native_handle_, ec.category().name(), ec.value(), static_cast(bytes_transferred)); } }; #endif // CUSTOM_TRACKING_HPP asio-1.12.2/src/examples/cpp11/http/000077500000000000000000000000001340672067200170475ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/http/server/000077500000000000000000000000001340672067200203555ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/http/server/connection.cpp000066400000000000000000000043241340672067200232230ustar00rootroot00000000000000// // connection.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "connection.hpp" #include #include #include "connection_manager.hpp" #include "request_handler.hpp" namespace http { namespace server { connection::connection(asio::ip::tcp::socket socket, connection_manager& manager, request_handler& handler) : socket_(std::move(socket)), connection_manager_(manager), request_handler_(handler) { } void connection::start() { do_read(); } void connection::stop() { socket_.close(); } void connection::do_read() { auto self(shared_from_this()); socket_.async_read_some(asio::buffer(buffer_), [this, self](std::error_code ec, std::size_t bytes_transferred) { if (!ec) { request_parser::result_type result; std::tie(result, std::ignore) = request_parser_.parse( request_, buffer_.data(), buffer_.data() + bytes_transferred); if (result == request_parser::good) { request_handler_.handle_request(request_, reply_); do_write(); } else if (result == request_parser::bad) { reply_ = reply::stock_reply(reply::bad_request); do_write(); } else { do_read(); } } else if (ec != asio::error::operation_aborted) { connection_manager_.stop(shared_from_this()); } }); } void connection::do_write() { auto self(shared_from_this()); asio::async_write(socket_, reply_.to_buffers(), [this, self](std::error_code ec, std::size_t) { if (!ec) { // Initiate graceful connection closure. asio::error_code ignored_ec; socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec); } if (ec != asio::error::operation_aborted) { connection_manager_.stop(shared_from_this()); } }); } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/connection.hpp000066400000000000000000000035501340672067200232300ustar00rootroot00000000000000// // connection.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_CONNECTION_HPP #define HTTP_CONNECTION_HPP #include #include #include #include "reply.hpp" #include "request.hpp" #include "request_handler.hpp" #include "request_parser.hpp" namespace http { namespace server { class connection_manager; /// Represents a single connection from a client. class connection : public std::enable_shared_from_this { public: connection(const connection&) = delete; connection& operator=(const connection&) = delete; /// Construct a connection with the given socket. explicit connection(asio::ip::tcp::socket socket, connection_manager& manager, request_handler& handler); /// Start the first asynchronous operation for the connection. void start(); /// Stop all asynchronous operations associated with the connection. void stop(); private: /// Perform an asynchronous read operation. void do_read(); /// Perform an asynchronous write operation. void do_write(); /// Socket for the connection. asio::ip::tcp::socket socket_; /// The manager for this connection. connection_manager& connection_manager_; /// The handler used to process the incoming request. request_handler& request_handler_; /// Buffer for incoming data. std::array buffer_; /// The incoming request. request request_; /// The parser for the incoming request. request_parser request_parser_; /// The reply to be sent back to the client. reply reply_; }; typedef std::shared_ptr connection_ptr; } // namespace server } // namespace http #endif // HTTP_CONNECTION_HPP asio-1.12.2/src/examples/cpp11/http/server/connection_manager.cpp000066400000000000000000000013571340672067200247200ustar00rootroot00000000000000// // connection_manager.cpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "connection_manager.hpp" namespace http { namespace server { connection_manager::connection_manager() { } void connection_manager::start(connection_ptr c) { connections_.insert(c); c->start(); } void connection_manager::stop(connection_ptr c) { connections_.erase(c); c->stop(); } void connection_manager::stop_all() { for (auto c: connections_) c->stop(); connections_.clear(); } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/connection_manager.hpp000066400000000000000000000022101340672067200247120ustar00rootroot00000000000000// // connection_manager.hpp // ~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_CONNECTION_MANAGER_HPP #define HTTP_CONNECTION_MANAGER_HPP #include #include "connection.hpp" namespace http { namespace server { /// Manages open connections so that they may be cleanly stopped when the server /// needs to shut down. class connection_manager { public: connection_manager(const connection_manager&) = delete; connection_manager& operator=(const connection_manager&) = delete; /// Construct a connection manager. connection_manager(); /// Add the specified connection to the manager and start it. void start(connection_ptr c); /// Stop the specified connection. void stop(connection_ptr c); /// Stop all connections. void stop_all(); private: /// The managed connections. std::set connections_; }; } // namespace server } // namespace http #endif // HTTP_CONNECTION_MANAGER_HPP asio-1.12.2/src/examples/cpp11/http/server/header.hpp000066400000000000000000000007741340672067200223260ustar00rootroot00000000000000// // header.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_HEADER_HPP #define HTTP_HEADER_HPP #include namespace http { namespace server { struct header { std::string name; std::string value; }; } // namespace server } // namespace http #endif // HTTP_HEADER_HPP asio-1.12.2/src/examples/cpp11/http/server/main.cpp000066400000000000000000000017151340672067200220110ustar00rootroot00000000000000// // main.cpp // ~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "server.hpp" int main(int argc, char* argv[]) { try { // Check command line arguments. if (argc != 4) { std::cerr << "Usage: http_server
\n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 80 .\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 80 .\n"; return 1; } // Initialise the server. http::server::server s(argv[1], argv[2], argv[3]); // Run the server until stopped. s.run(); } catch (std::exception& e) { std::cerr << "exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/http/server/mime_types.cpp000066400000000000000000000015241340672067200232360ustar00rootroot00000000000000// // mime_types.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "mime_types.hpp" namespace http { namespace server { namespace mime_types { struct mapping { const char* extension; const char* mime_type; } mappings[] = { { "gif", "image/gif" }, { "htm", "text/html" }, { "html", "text/html" }, { "jpg", "image/jpeg" }, { "png", "image/png" } }; std::string extension_to_type(const std::string& extension) { for (mapping m: mappings) { if (m.extension == extension) { return m.mime_type; } } return "text/plain"; } } // namespace mime_types } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/mime_types.hpp000066400000000000000000000011611340672067200232400ustar00rootroot00000000000000// // mime_types.hpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_MIME_TYPES_HPP #define HTTP_MIME_TYPES_HPP #include namespace http { namespace server { namespace mime_types { /// Convert a file extension into a MIME type. std::string extension_to_type(const std::string& extension); } // namespace mime_types } // namespace server } // namespace http #endif // HTTP_MIME_TYPES_HPP asio-1.12.2/src/examples/cpp11/http/server/reply.cpp000066400000000000000000000156221340672067200222220ustar00rootroot00000000000000// // reply.cpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "reply.hpp" #include namespace http { namespace server { namespace status_strings { const std::string ok = "HTTP/1.0 200 OK\r\n"; const std::string created = "HTTP/1.0 201 Created\r\n"; const std::string accepted = "HTTP/1.0 202 Accepted\r\n"; const std::string no_content = "HTTP/1.0 204 No Content\r\n"; const std::string multiple_choices = "HTTP/1.0 300 Multiple Choices\r\n"; const std::string moved_permanently = "HTTP/1.0 301 Moved Permanently\r\n"; const std::string moved_temporarily = "HTTP/1.0 302 Moved Temporarily\r\n"; const std::string not_modified = "HTTP/1.0 304 Not Modified\r\n"; const std::string bad_request = "HTTP/1.0 400 Bad Request\r\n"; const std::string unauthorized = "HTTP/1.0 401 Unauthorized\r\n"; const std::string forbidden = "HTTP/1.0 403 Forbidden\r\n"; const std::string not_found = "HTTP/1.0 404 Not Found\r\n"; const std::string internal_server_error = "HTTP/1.0 500 Internal Server Error\r\n"; const std::string not_implemented = "HTTP/1.0 501 Not Implemented\r\n"; const std::string bad_gateway = "HTTP/1.0 502 Bad Gateway\r\n"; const std::string service_unavailable = "HTTP/1.0 503 Service Unavailable\r\n"; asio::const_buffer to_buffer(reply::status_type status) { switch (status) { case reply::ok: return asio::buffer(ok); case reply::created: return asio::buffer(created); case reply::accepted: return asio::buffer(accepted); case reply::no_content: return asio::buffer(no_content); case reply::multiple_choices: return asio::buffer(multiple_choices); case reply::moved_permanently: return asio::buffer(moved_permanently); case reply::moved_temporarily: return asio::buffer(moved_temporarily); case reply::not_modified: return asio::buffer(not_modified); case reply::bad_request: return asio::buffer(bad_request); case reply::unauthorized: return asio::buffer(unauthorized); case reply::forbidden: return asio::buffer(forbidden); case reply::not_found: return asio::buffer(not_found); case reply::internal_server_error: return asio::buffer(internal_server_error); case reply::not_implemented: return asio::buffer(not_implemented); case reply::bad_gateway: return asio::buffer(bad_gateway); case reply::service_unavailable: return asio::buffer(service_unavailable); default: return asio::buffer(internal_server_error); } } } // namespace status_strings namespace misc_strings { const char name_value_separator[] = { ':', ' ' }; const char crlf[] = { '\r', '\n' }; } // namespace misc_strings std::vector reply::to_buffers() { std::vector buffers; buffers.push_back(status_strings::to_buffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { header& h = headers[i]; buffers.push_back(asio::buffer(h.name)); buffers.push_back(asio::buffer(misc_strings::name_value_separator)); buffers.push_back(asio::buffer(h.value)); buffers.push_back(asio::buffer(misc_strings::crlf)); } buffers.push_back(asio::buffer(misc_strings::crlf)); buffers.push_back(asio::buffer(content)); return buffers; } namespace stock_replies { const char ok[] = ""; const char created[] = "" "Created" "

201 Created

" ""; const char accepted[] = "" "Accepted" "

202 Accepted

" ""; const char no_content[] = "" "No Content" "

204 Content

" ""; const char multiple_choices[] = "" "Multiple Choices" "

300 Multiple Choices

" ""; const char moved_permanently[] = "" "Moved Permanently" "

301 Moved Permanently

" ""; const char moved_temporarily[] = "" "Moved Temporarily" "

302 Moved Temporarily

" ""; const char not_modified[] = "" "Not Modified" "

304 Not Modified

" ""; const char bad_request[] = "" "Bad Request" "

400 Bad Request

" ""; const char unauthorized[] = "" "Unauthorized" "

401 Unauthorized

" ""; const char forbidden[] = "" "Forbidden" "

403 Forbidden

" ""; const char not_found[] = "" "Not Found" "

404 Not Found

" ""; const char internal_server_error[] = "" "Internal Server Error" "

500 Internal Server Error

" ""; const char not_implemented[] = "" "Not Implemented" "

501 Not Implemented

" ""; const char bad_gateway[] = "" "Bad Gateway" "

502 Bad Gateway

" ""; const char service_unavailable[] = "" "Service Unavailable" "

503 Service Unavailable

" ""; std::string to_string(reply::status_type status) { switch (status) { case reply::ok: return ok; case reply::created: return created; case reply::accepted: return accepted; case reply::no_content: return no_content; case reply::multiple_choices: return multiple_choices; case reply::moved_permanently: return moved_permanently; case reply::moved_temporarily: return moved_temporarily; case reply::not_modified: return not_modified; case reply::bad_request: return bad_request; case reply::unauthorized: return unauthorized; case reply::forbidden: return forbidden; case reply::not_found: return not_found; case reply::internal_server_error: return internal_server_error; case reply::not_implemented: return not_implemented; case reply::bad_gateway: return bad_gateway; case reply::service_unavailable: return service_unavailable; default: return internal_server_error; } } } // namespace stock_replies reply reply::stock_reply(reply::status_type status) { reply rep; rep.status = status; rep.content = stock_replies::to_string(status); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = std::to_string(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = "text/html"; return rep; } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/reply.hpp000066400000000000000000000027331340672067200222260ustar00rootroot00000000000000// // reply.hpp // ~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REPLY_HPP #define HTTP_REPLY_HPP #include #include #include #include "header.hpp" namespace http { namespace server { /// A reply to be sent to a client. struct reply { /// The status of the reply. enum status_type { ok = 200, created = 201, accepted = 202, no_content = 204, multiple_choices = 300, moved_permanently = 301, moved_temporarily = 302, not_modified = 304, bad_request = 400, unauthorized = 401, forbidden = 403, not_found = 404, internal_server_error = 500, not_implemented = 501, bad_gateway = 502, service_unavailable = 503 } status; /// The headers to be included in the reply. std::vector
headers; /// The content to be sent in the reply. std::string content; /// Convert the reply into a vector of buffers. The buffers do not own the /// underlying memory blocks, therefore the reply object must remain valid and /// not be changed until the write operation has completed. std::vector to_buffers(); /// Get a stock reply. static reply stock_reply(status_type status); }; } // namespace server } // namespace http #endif // HTTP_REPLY_HPP asio-1.12.2/src/examples/cpp11/http/server/request.hpp000066400000000000000000000012431340672067200225560ustar00rootroot00000000000000// // request.hpp // ~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REQUEST_HPP #define HTTP_REQUEST_HPP #include #include #include "header.hpp" namespace http { namespace server { /// A request received from a client. struct request { std::string method; std::string uri; int http_version_major; int http_version_minor; std::vector
headers; }; } // namespace server } // namespace http #endif // HTTP_REQUEST_HPP asio-1.12.2/src/examples/cpp11/http/server/request_handler.cpp000066400000000000000000000055321340672067200242530ustar00rootroot00000000000000// // request_handler.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_handler.hpp" #include #include #include #include "mime_types.hpp" #include "reply.hpp" #include "request.hpp" namespace http { namespace server { request_handler::request_handler(const std::string& doc_root) : doc_root_(doc_root) { } void request_handler::handle_request(const request& req, reply& rep) { // Decode url to path. std::string request_path; if (!url_decode(req.uri, request_path)) { rep = reply::stock_reply(reply::bad_request); return; } // Request path must be absolute and not contain "..". if (request_path.empty() || request_path[0] != '/' || request_path.find("..") != std::string::npos) { rep = reply::stock_reply(reply::bad_request); return; } // If path ends in slash (i.e. is a directory) then add "index.html". if (request_path[request_path.size() - 1] == '/') { request_path += "index.html"; } // Determine the file extension. std::size_t last_slash_pos = request_path.find_last_of("/"); std::size_t last_dot_pos = request_path.find_last_of("."); std::string extension; if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos) { extension = request_path.substr(last_dot_pos + 1); } // Open the file to send back. std::string full_path = doc_root_ + request_path; std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary); if (!is) { rep = reply::stock_reply(reply::not_found); return; } // Fill out the reply to be sent to the client. rep.status = reply::ok; char buf[512]; while (is.read(buf, sizeof(buf)).gcount() > 0) rep.content.append(buf, is.gcount()); rep.headers.resize(2); rep.headers[0].name = "Content-Length"; rep.headers[0].value = std::to_string(rep.content.size()); rep.headers[1].name = "Content-Type"; rep.headers[1].value = mime_types::extension_to_type(extension); } bool request_handler::url_decode(const std::string& in, std::string& out) { out.clear(); out.reserve(in.size()); for (std::size_t i = 0; i < in.size(); ++i) { if (in[i] == '%') { if (i + 3 <= in.size()) { int value = 0; std::istringstream is(in.substr(i + 1, 2)); if (is >> std::hex >> value) { out += static_cast(value); i += 2; } else { return false; } } else { return false; } } else if (in[i] == '+') { out += ' '; } else { out += in[i]; } } return true; } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/request_handler.hpp000066400000000000000000000022511340672067200242530ustar00rootroot00000000000000// // request_handler.hpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REQUEST_HANDLER_HPP #define HTTP_REQUEST_HANDLER_HPP #include namespace http { namespace server { struct reply; struct request; /// The common handler for all incoming requests. class request_handler { public: request_handler(const request_handler&) = delete; request_handler& operator=(const request_handler&) = delete; /// Construct with a directory containing files to be served. explicit request_handler(const std::string& doc_root); /// Handle a request and produce a reply. void handle_request(const request& req, reply& rep); private: /// The directory containing the files to be served. std::string doc_root_; /// Perform URL-decoding on a string. Returns false if the encoding was /// invalid. static bool url_decode(const std::string& in, std::string& out); }; } // namespace server } // namespace http #endif // HTTP_REQUEST_HANDLER_HPP asio-1.12.2/src/examples/cpp11/http/server/request_parser.cpp000066400000000000000000000136011340672067200241260ustar00rootroot00000000000000// // request_parser.cpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "request_parser.hpp" #include "request.hpp" namespace http { namespace server { request_parser::request_parser() : state_(method_start) { } void request_parser::reset() { state_ = method_start; } request_parser::result_type request_parser::consume(request& req, char input) { switch (state_) { case method_start: if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return bad; } else { state_ = method; req.method.push_back(input); return indeterminate; } case method: if (input == ' ') { state_ = uri; return indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return bad; } else { req.method.push_back(input); return indeterminate; } case uri: if (input == ' ') { state_ = http_version_h; return indeterminate; } else if (is_ctl(input)) { return bad; } else { req.uri.push_back(input); return indeterminate; } case http_version_h: if (input == 'H') { state_ = http_version_t_1; return indeterminate; } else { return bad; } case http_version_t_1: if (input == 'T') { state_ = http_version_t_2; return indeterminate; } else { return bad; } case http_version_t_2: if (input == 'T') { state_ = http_version_p; return indeterminate; } else { return bad; } case http_version_p: if (input == 'P') { state_ = http_version_slash; return indeterminate; } else { return bad; } case http_version_slash: if (input == '/') { req.http_version_major = 0; req.http_version_minor = 0; state_ = http_version_major_start; return indeterminate; } else { return bad; } case http_version_major_start: if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; state_ = http_version_major; return indeterminate; } else { return bad; } case http_version_major: if (input == '.') { state_ = http_version_minor_start; return indeterminate; } else if (is_digit(input)) { req.http_version_major = req.http_version_major * 10 + input - '0'; return indeterminate; } else { return bad; } case http_version_minor_start: if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; state_ = http_version_minor; return indeterminate; } else { return bad; } case http_version_minor: if (input == '\r') { state_ = expecting_newline_1; return indeterminate; } else if (is_digit(input)) { req.http_version_minor = req.http_version_minor * 10 + input - '0'; return indeterminate; } else { return bad; } case expecting_newline_1: if (input == '\n') { state_ = header_line_start; return indeterminate; } else { return bad; } case header_line_start: if (input == '\r') { state_ = expecting_newline_3; return indeterminate; } else if (!req.headers.empty() && (input == ' ' || input == '\t')) { state_ = header_lws; return indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return bad; } else { req.headers.push_back(header()); req.headers.back().name.push_back(input); state_ = header_name; return indeterminate; } case header_lws: if (input == '\r') { state_ = expecting_newline_2; return indeterminate; } else if (input == ' ' || input == '\t') { return indeterminate; } else if (is_ctl(input)) { return bad; } else { state_ = header_value; req.headers.back().value.push_back(input); return indeterminate; } case header_name: if (input == ':') { state_ = space_before_header_value; return indeterminate; } else if (!is_char(input) || is_ctl(input) || is_tspecial(input)) { return bad; } else { req.headers.back().name.push_back(input); return indeterminate; } case space_before_header_value: if (input == ' ') { state_ = header_value; return indeterminate; } else { return bad; } case header_value: if (input == '\r') { state_ = expecting_newline_2; return indeterminate; } else if (is_ctl(input)) { return bad; } else { req.headers.back().value.push_back(input); return indeterminate; } case expecting_newline_2: if (input == '\n') { state_ = header_line_start; return indeterminate; } else { return bad; } case expecting_newline_3: return (input == '\n') ? good : bad; default: return bad; } } bool request_parser::is_char(int c) { return c >= 0 && c <= 127; } bool request_parser::is_ctl(int c) { return (c >= 0 && c <= 31) || (c == 127); } bool request_parser::is_tspecial(int c) { switch (c) { case '(': case ')': case '<': case '>': case '@': case ',': case ';': case ':': case '\\': case '"': case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': return true; default: return false; } } bool request_parser::is_digit(int c) { return c >= '0' && c <= '9'; } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/request_parser.hpp000066400000000000000000000044441340672067200241400ustar00rootroot00000000000000// // request_parser.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_REQUEST_PARSER_HPP #define HTTP_REQUEST_PARSER_HPP #include namespace http { namespace server { struct request; /// Parser for incoming requests. class request_parser { public: /// Construct ready to parse the request method. request_parser(); /// Reset to initial parser state. void reset(); /// Result of parse. enum result_type { good, bad, indeterminate }; /// Parse some data. The enum return value is good when a complete request has /// been parsed, bad if the data is invalid, indeterminate when more data is /// required. The InputIterator return value indicates how much of the input /// has been consumed. template std::tuple parse(request& req, InputIterator begin, InputIterator end) { while (begin != end) { result_type result = consume(req, *begin++); if (result == good || result == bad) return std::make_tuple(result, begin); } return std::make_tuple(indeterminate, begin); } private: /// Handle the next character of input. result_type consume(request& req, char input); /// Check if a byte is an HTTP character. static bool is_char(int c); /// Check if a byte is an HTTP control character. static bool is_ctl(int c); /// Check if a byte is defined as an HTTP tspecial character. static bool is_tspecial(int c); /// Check if a byte is a digit. static bool is_digit(int c); /// The current state of the parser. enum state { method_start, method, uri, http_version_h, http_version_t_1, http_version_t_2, http_version_p, http_version_slash, http_version_major_start, http_version_major, http_version_minor_start, http_version_minor, expecting_newline_1, header_line_start, header_lws, header_name, space_before_header_value, header_value, expecting_newline_2, expecting_newline_3 } state_; }; } // namespace server } // namespace http #endif // HTTP_REQUEST_PARSER_HPP asio-1.12.2/src/examples/cpp11/http/server/server.cpp000066400000000000000000000051171340672067200223730ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "server.hpp" #include #include namespace http { namespace server { server::server(const std::string& address, const std::string& port, const std::string& doc_root) : io_context_(1), signals_(io_context_), acceptor_(io_context_), connection_manager_(), request_handler_(doc_root) { // Register to handle the signals that indicate when the server should exit. // It is safe to register for the same signal multiple times in a program, // provided all registration for the specified signal is made through Asio. signals_.add(SIGINT); signals_.add(SIGTERM); #if defined(SIGQUIT) signals_.add(SIGQUIT); #endif // defined(SIGQUIT) do_await_stop(); // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR). asio::ip::tcp::resolver resolver(io_context_); asio::ip::tcp::endpoint endpoint = *resolver.resolve(address, port).begin(); acceptor_.open(endpoint.protocol()); acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true)); acceptor_.bind(endpoint); acceptor_.listen(); do_accept(); } void server::run() { // The io_context::run() call will block until all asynchronous operations // have finished. While the server is running, there is always at least one // asynchronous operation outstanding: the asynchronous accept call waiting // for new incoming connections. io_context_.run(); } void server::do_accept() { acceptor_.async_accept( [this](std::error_code ec, asio::ip::tcp::socket socket) { // Check whether the server was stopped by a signal before this // completion handler had a chance to run. if (!acceptor_.is_open()) { return; } if (!ec) { connection_manager_.start(std::make_shared( std::move(socket), connection_manager_, request_handler_)); } do_accept(); }); } void server::do_await_stop() { signals_.async_wait( [this](std::error_code /*ec*/, int /*signo*/) { // The server is stopped by cancelling all outstanding asynchronous // operations. Once all operations have finished the io_context::run() // call will exit. acceptor_.close(); connection_manager_.stop_all(); }); } } // namespace server } // namespace http asio-1.12.2/src/examples/cpp11/http/server/server.hpp000066400000000000000000000031401340672067200223720ustar00rootroot00000000000000// // server.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HTTP_SERVER_HPP #define HTTP_SERVER_HPP #include #include #include "connection.hpp" #include "connection_manager.hpp" #include "request_handler.hpp" namespace http { namespace server { /// The top-level class of the HTTP server. class server { public: server(const server&) = delete; server& operator=(const server&) = delete; /// Construct the server to listen on the specified TCP address and port, and /// serve up files from the given directory. explicit server(const std::string& address, const std::string& port, const std::string& doc_root); /// Run the server's io_context loop. void run(); private: /// Perform an asynchronous accept operation. void do_accept(); /// Wait for a request to stop the server. void do_await_stop(); /// The io_context used to perform asynchronous operations. asio::io_context io_context_; /// The signal_set is used to register for process termination notifications. asio::signal_set signals_; /// Acceptor used to listen for incoming connections. asio::ip::tcp::acceptor acceptor_; /// The connection manager which owns all live connections. connection_manager connection_manager_; /// The handler for all incoming requests. request_handler request_handler_; }; } // namespace server } // namespace http #endif // HTTP_SERVER_HPP asio-1.12.2/src/examples/cpp11/invocation/000077500000000000000000000000001340672067200202415ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/invocation/prioritised_handlers.cpp000066400000000000000000000111111340672067200251550ustar00rootroot00000000000000// // prioritised_handlers.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio.hpp" #include #include #include using asio::ip::tcp; class handler_priority_queue : asio::execution_context { public: template void add(int priority, Function function) { std::unique_ptr handler( new queued_handler( priority, std::move(function))); handlers_.push(std::move(handler)); } void execute_all() { while (!handlers_.empty()) { handlers_.top()->execute(); handlers_.pop(); } } class executor { public: executor(handler_priority_queue& q, int p) : context_(q), priority_(p) { } handler_priority_queue& context() const noexcept { return context_; } template void dispatch(Function f, const Allocator&) const { context_.add(priority_, std::move(f)); } template void post(Function f, const Allocator&) const { context_.add(priority_, std::move(f)); } template void defer(Function f, const Allocator&) const { context_.add(priority_, std::move(f)); } void on_work_started() const noexcept {} void on_work_finished() const noexcept {} bool operator==(const executor& other) const noexcept { return &context_ == &other.context_ && priority_ == other.priority_; } bool operator!=(const executor& other) const noexcept { return !operator==(other); } private: handler_priority_queue& context_; int priority_; }; template asio::executor_binder wrap(int priority, Handler handler) { return asio::bind_executor( executor(*this, priority), std::move(handler)); } private: class queued_handler_base { public: queued_handler_base(int p) : priority_(p) { } virtual ~queued_handler_base() { } virtual void execute() = 0; friend bool operator<(const std::unique_ptr& a, const std::unique_ptr& b) noexcept { return a->priority_ < b->priority_; } private: int priority_; }; template class queued_handler : public queued_handler_base { public: queued_handler(int p, Function f) : queued_handler_base(p), function_(std::move(f)) { } void execute() override { function_(); } private: Function function_; }; std::priority_queue> handlers_; }; //---------------------------------------------------------------------- void high_priority_handler(const asio::error_code& /*ec*/, tcp::socket /*socket*/) { std::cout << "High priority handler\n"; } void middle_priority_handler(const asio::error_code& /*ec*/) { std::cout << "Middle priority handler\n"; } struct low_priority_handler { // Make the handler a move-only type. low_priority_handler() = default; low_priority_handler(const low_priority_handler&) = delete; low_priority_handler(low_priority_handler&&) = default; void operator()() { std::cout << "Low priority handler\n"; } }; int main() { asio::io_context io_context; handler_priority_queue pri_queue; // Post a completion handler to be run immediately. asio::post(io_context, pri_queue.wrap(0, low_priority_handler())); // Start an asynchronous accept that will complete immediately. tcp::endpoint endpoint(asio::ip::address_v4::loopback(), 0); tcp::acceptor acceptor(io_context, endpoint); tcp::socket server_socket(io_context); acceptor.async_accept(pri_queue.wrap(100, high_priority_handler)); tcp::socket client_socket(io_context); client_socket.connect(acceptor.local_endpoint()); // Set a deadline timer to expire immediately. asio::steady_timer timer(io_context); timer.expires_at(asio::steady_timer::clock_type::time_point::min()); timer.async_wait(pri_queue.wrap(42, middle_priority_handler)); while (io_context.run_one()) { // The custom invocation hook adds the handlers to the priority queue // rather than executing them from within the poll_one() call. while (io_context.poll_one()) ; pri_queue.execute_all(); } return 0; } asio-1.12.2/src/examples/cpp11/iostreams/000077500000000000000000000000001340672067200200765ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/iostreams/http_client.cpp000066400000000000000000000050141340672067200231170ustar00rootroot00000000000000// // http_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: http_client \n"; std::cout << "Example:\n"; std::cout << " http_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } asio::ip::tcp::iostream s; // The entire sequence of I/O operations must complete within 60 seconds. // If an expiry occurs, the socket is automatically closed and the stream // becomes bad. s.expires_after(std::chrono::seconds(60)); // Establish a connection to the server. s.connect(argv[1], "http"); if (!s) { std::cout << "Unable to connect: " << s.error().message() << "\n"; return 1; } // Send the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. s << "GET " << argv[2] << " HTTP/1.0\r\n"; s << "Host: " << argv[1] << "\r\n"; s << "Accept: */*\r\n"; s << "Connection: close\r\n\r\n"; // By default, the stream is tied with itself. This means that the stream // automatically flush the buffered output before attempting a read. It is // not necessary not explicitly flush the stream at this point. // Check that response is OK. std::string http_version; s >> http_version; unsigned int status_code; s >> status_code; std::string status_message; std::getline(s, status_message); if (!s || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return 1; } if (status_code != 200) { std::cout << "Response returned with status code " << status_code << "\n"; return 1; } // Process the response headers, which are terminated by a blank line. std::string header; while (std::getline(s, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write the remaining data to output. std::cout << s.rdbuf(); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/local/000077500000000000000000000000001340672067200171625ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/local/connect_pair.cpp000066400000000000000000000056041340672067200223370ustar00rootroot00000000000000// // connect_pair.cpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; class uppercase_filter { public: uppercase_filter(stream_protocol::socket sock) : socket_(std::move(sock)) { read(); } private: void read() { socket_.async_read_some(asio::buffer(data_), [this](std::error_code ec, std::size_t size) { if (!ec) { // Compute result. for (std::size_t i = 0; i < size; ++i) data_[i] = std::toupper(data_[i]); // Send result. write(size); } else { throw asio::system_error(ec); } }); } void write(std::size_t size) { asio::async_write(socket_, asio::buffer(data_, size), [this](std::error_code ec, std::size_t /*size*/) { if (!ec) { // Wait for request. read(); } else { throw asio::system_error(ec); } }); } stream_protocol::socket socket_; std::array data_; }; int main() { try { asio::io_context io_context; // Create a connected pair and pass one end to a filter. stream_protocol::socket socket(io_context); stream_protocol::socket filter_socket(io_context); asio::local::connect_pair(socket, filter_socket); uppercase_filter filter(std::move(filter_socket)); // The io_context runs in a background thread to perform filtering. asio::thread thread( [&io_context]() { try { io_context.run(); } catch (std::exception& e) { std::cerr << "Exception in thread: " << e.what() << "\n"; std::exit(1); } }); for (;;) { // Collect request from user. std::cout << "Enter a string: "; std::string request; std::getline(std::cin, request); // Send request to filter. asio::write(socket, asio::buffer(request)); // Wait for reply from filter. std::vector reply(request.size()); asio::read(socket, asio::buffer(reply)); // Show reply to user. std::cout << "Result: "; std::cout.write(&reply[0], request.size()); std::cout << std::endl; } } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; std::exit(1); } } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp11/local/iostream_client.cpp000066400000000000000000000025311340672067200230500ustar00rootroot00000000000000// // stream_client.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include "asio.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; constexpr std::size_t max_length = 1024; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: iostream_client \n"; return 1; } stream_protocol::endpoint ep(argv[1]); stream_protocol::iostream s(ep); if (!s) { std::cerr << "Unable to connect: " << s.error().message() << std::endl; return 1; } std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t length = std::strlen(request); s << request; char reply[max_length]; s.read(reply, length); std::cout << "Reply is: "; std::cout.write(reply, length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp11/local/stream_client.cpp000066400000000000000000000026261340672067200225250ustar00rootroot00000000000000// // stream_client.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; constexpr std::size_t max_length = 1024; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: stream_client \n"; return 1; } asio::io_context io_context; stream_protocol::socket s(io_context); s.connect(stream_protocol::endpoint(argv[1])); std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = std::strlen(request); asio::write(s, asio::buffer(request, request_length)); char reply[max_length]; size_t reply_length = asio::read(s, asio::buffer(reply, request_length)); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp11/local/stream_server.cpp000066400000000000000000000046041340672067200225530ustar00rootroot00000000000000// // stream_server.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" #if defined(ASIO_HAS_LOCAL_SOCKETS) using asio::local::stream_protocol; class session : public std::enable_shared_from_this { public: session(stream_protocol::socket sock) : socket_(std::move(sock)) { } void start() { do_read(); } private: void do_read() { auto self(shared_from_this()); socket_.async_read_some(asio::buffer(data_), [this, self](std::error_code ec, std::size_t length) { if (!ec) do_write(length); }); } void do_write(std::size_t length) { auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(data_, length), [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec) do_read(); }); } // The socket used to communicate with the client. stream_protocol::socket socket_; // Buffer used to store data received from the client. std::array data_; }; class server { public: server(asio::io_context& io_context, const std::string& file) : acceptor_(io_context, stream_protocol::endpoint(file)) { do_accept(); } private: void do_accept() { acceptor_.async_accept( [this](std::error_code ec, stream_protocol::socket socket) { if (!ec) { std::make_shared(std::move(socket))->start(); } do_accept(); }); } stream_protocol::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: stream_server \n"; std::cerr << "*** WARNING: existing file is removed ***\n"; return 1; } asio::io_context io_context; std::remove(argv[1]); server s(io_context, argv[1]); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } #else // defined(ASIO_HAS_LOCAL_SOCKETS) # error Local sockets not available on this platform. #endif // defined(ASIO_HAS_LOCAL_SOCKETS) asio-1.12.2/src/examples/cpp11/multicast/000077500000000000000000000000001340672067200200755ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/multicast/receiver.cpp000066400000000000000000000041401340672067200224040ustar00rootroot00000000000000// // receiver.cpp // ~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" constexpr short multicast_port = 30001; class receiver { public: receiver(asio::io_context& io_context, const asio::ip::address& listen_address, const asio::ip::address& multicast_address) : socket_(io_context) { // Create the socket so that multiple may be bound to the same address. asio::ip::udp::endpoint listen_endpoint( listen_address, multicast_port); socket_.open(listen_endpoint.protocol()); socket_.set_option(asio::ip::udp::socket::reuse_address(true)); socket_.bind(listen_endpoint); // Join the multicast group. socket_.set_option( asio::ip::multicast::join_group(multicast_address)); do_receive(); } private: void do_receive() { socket_.async_receive_from( asio::buffer(data_), sender_endpoint_, [this](std::error_code ec, std::size_t length) { if (!ec) { std::cout.write(data_.data(), length); std::cout << std::endl; do_receive(); } }); } asio::ip::udp::socket socket_; asio::ip::udp::endpoint sender_endpoint_; std::array data_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: receiver \n"; std::cerr << " For IPv4, try:\n"; std::cerr << " receiver 0.0.0.0 239.255.0.1\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " receiver 0::0 ff31::8000:1234\n"; return 1; } asio::io_context io_context; receiver r(io_context, asio::ip::make_address(argv[1]), asio::ip::make_address(argv[2])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/multicast/sender.cpp000066400000000000000000000037111340672067200220630ustar00rootroot00000000000000// // sender.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" constexpr short multicast_port = 30001; constexpr int max_message_count = 10; class sender { public: sender(asio::io_context& io_context, const asio::ip::address& multicast_address) : endpoint_(multicast_address, multicast_port), socket_(io_context, endpoint_.protocol()), timer_(io_context), message_count_(0) { do_send(); } private: void do_send() { std::ostringstream os; os << "Message " << message_count_++; message_ = os.str(); socket_.async_send_to( asio::buffer(message_), endpoint_, [this](std::error_code ec, std::size_t /*length*/) { if (!ec && message_count_ < max_message_count) do_timeout(); }); } void do_timeout() { timer_.expires_after(std::chrono::seconds(1)); timer_.async_wait( [this](std::error_code ec) { if (!ec) do_send(); }); } private: asio::ip::udp::endpoint endpoint_; asio::ip::udp::socket socket_; asio::steady_timer timer_; int message_count_; std::string message_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: sender \n"; std::cerr << " For IPv4, try:\n"; std::cerr << " sender 239.255.0.1\n"; std::cerr << " For IPv6, try:\n"; std::cerr << " sender ff31::8000:1234\n"; return 1; } asio::io_context io_context; sender s(io_context, asio::ip::make_address(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/nonblocking/000077500000000000000000000000001340672067200203735ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/nonblocking/third_party_lib.cpp000066400000000000000000000124431340672067200242620ustar00rootroot00000000000000// // third_party_lib.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include using asio::ip::tcp; namespace third_party_lib { // Simulation of a third party library that wants to perform read and write // operations directly on a socket. It needs to be polled to determine whether // it requires a read or write operation, and notified when the socket is ready // for reading or writing. class session { public: session(tcp::socket& socket) : socket_(socket) { } // Returns true if the third party library wants to be notified when the // socket is ready for reading. bool want_read() const { return state_ == reading; } // Notify that third party library that it should perform its read operation. void do_read(std::error_code& ec) { if (std::size_t len = socket_.read_some(asio::buffer(data_), ec)) { write_buffer_ = asio::buffer(data_, len); state_ = writing; } } // Returns true if the third party library wants to be notified when the // socket is ready for writing. bool want_write() const { return state_ == writing; } // Notify that third party library that it should perform its write operation. void do_write(std::error_code& ec) { if (std::size_t len = socket_.write_some( asio::buffer(write_buffer_), ec)) { write_buffer_ = write_buffer_ + len; state_ = asio::buffer_size(write_buffer_) > 0 ? writing : reading; } } private: tcp::socket& socket_; enum { reading, writing } state_ = reading; std::array data_; asio::const_buffer write_buffer_; }; } // namespace third_party_lib // The glue between asio's sockets and the third party library. class connection : public std::enable_shared_from_this { public: connection(tcp::socket socket) : socket_(std::move(socket)) { } void start() { // Put the socket into non-blocking mode. socket_.non_blocking(true); do_operations(); } private: void do_operations() { auto self(shared_from_this()); // Start a read operation if the third party library wants one. if (session_impl_.want_read() && !read_in_progress_) { read_in_progress_ = true; socket_.async_wait(tcp::socket::wait_read, [this, self](std::error_code ec) { read_in_progress_ = false; // Notify third party library that it can perform a read. if (!ec) session_impl_.do_read(ec); // The third party library successfully performed a read on the // socket. Start new read or write operations based on what it now // wants. if (!ec || ec == asio::error::would_block) do_operations(); // Otherwise, an error occurred. Closing the socket cancels any // outstanding asynchronous read or write operations. The // connection object will be destroyed automatically once those // outstanding operations complete. else socket_.close(); }); } // Start a write operation if the third party library wants one. if (session_impl_.want_write() && !write_in_progress_) { write_in_progress_ = true; socket_.async_wait(tcp::socket::wait_write, [this, self](std::error_code ec) { write_in_progress_ = false; // Notify third party library that it can perform a write. if (!ec) session_impl_.do_write(ec); // The third party library successfully performed a write on the // socket. Start new read or write operations based on what it now // wants. if (!ec || ec == asio::error::would_block) do_operations(); // Otherwise, an error occurred. Closing the socket cancels any // outstanding asynchronous read or write operations. The // connection object will be destroyed automatically once those // outstanding operations complete. else socket_.close(); }); } } private: tcp::socket socket_; third_party_lib::session session_impl_{socket_}; bool read_in_progress_ = false; bool write_in_progress_ = false; }; class server { public: server(asio::io_context& io_context, unsigned short port) : acceptor_(io_context, {tcp::v4(), port}) { do_accept(); } private: void do_accept() { acceptor_.async_accept( [this](std::error_code ec, tcp::socket socket) { if (!ec) { std::make_shared(std::move(socket))->start(); } do_accept(); }); } tcp::acceptor acceptor_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: third_party_lib \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/operations/000077500000000000000000000000001340672067200202535ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/operations/composed_1.cpp000066400000000000000000000067341340672067200230220ustar00rootroot00000000000000// // composed_1.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include using asio::ip::tcp; //------------------------------------------------------------------------------ // This is the simplest example of a composed asynchronous operation, where we // simply repackage an existing operation. The asynchronous operation // requirements are met by delegating responsibility to the underlying // operation. template auto async_write_message(tcp::socket& socket, const char* message, CompletionToken&& token) // The return type of the initiating function is deduced from the combination // of CompletionToken type and the completion handler's signature. When the // completion token is a simple callback, the return type is void. However, // when the completion token is asio::yield_context (used for stackful // coroutines) the return type would be std::size_t, and when the completion // token is asio::use_future it would be std::future. -> typename asio::async_result< typename std::decay::type, void(std::error_code, std::size_t)>::return_type { // When delegating to the underlying operation we must take care to perfectly // forward the completion token. This ensures that our operation works // correctly with move-only function objects as callbacks, as well as other // completion token types. return asio::async_write(socket, asio::buffer(message, std::strlen(message)), std::forward(token)); } //------------------------------------------------------------------------------ void test_callback() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using a lambda as a callback. async_write_message(socket, "Testing callback\r\n", [](const std::error_code& error, std::size_t n) { if (!error) { std::cout << n << " bytes transferred\n"; } else { std::cout << "Error: " << error.message() << "\n"; } }); io_context.run(); } //------------------------------------------------------------------------------ void test_future() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using the use_future completion token. // This token causes the operation's initiating function to return a future, // which may be used to synchronously wait for the result of the operation. std::future f = async_write_message( socket, "Testing future\r\n", asio::use_future); io_context.run(); try { // Get the result of the operation. std::size_t n = f.get(); std::cout << n << " bytes transferred\n"; } catch (const std::exception& e) { std::cout << "Error: " << e.what() << "\n"; } } //------------------------------------------------------------------------------ int main() { test_callback(); test_future(); } asio-1.12.2/src/examples/cpp11/operations/composed_2.cpp000066400000000000000000000116501340672067200230140ustar00rootroot00000000000000// // composed_2.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include using asio::ip::tcp; //------------------------------------------------------------------------------ // In this composed operation we repackage an existing operation, but with a // different completion handler signature. The asynchronous operation // requirements are met by delegating responsibility to the underlying // operation. template auto async_write_message(tcp::socket& socket, const char* message, CompletionToken&& token) // The return type of the initiating function is deduced from the combination // of CompletionToken type and the completion handler's signature. When the // completion token is a simple callback, the return type is always void. // In this example, when the completion token is asio::yield_context // (used for stackful coroutines) the return type would be also be void, as // there is no non-error argument to the completion handler. When the // completion token is asio::use_future it would be std::future. -> typename asio::async_result< typename std::decay::type, void(std::error_code)>::return_type { // The asio::async_completion object takes the completion token and // from it creates: // // - completion.completion_handler: // A completion handler (i.e. a callback) with the specified signature. // // - completion.result: // An object from which we obtain the result of the initiating function. asio::async_completion completion(token); // The async_write operation has a completion handler signature of: // // void(std::error_code error, std::size n) // // This differs from our operation's signature in that it is also passed the // number of bytes transferred as an argument of type std::size_t. We will // adapt our completion handler to this signature by using std::bind, which // drops the additional argument. // // However, it is essential to the correctness of our composed operation that // we preserve the executor of the user-supplied completion handler. The // std::bind function will not do this for us, so we must do this by first // obtaining the completion handler's associated executor (defaulting to the // I/O executor - in this case the executor of the socket - if the completion // handler does not have its own) ... auto executor = asio::get_associated_executor( completion.completion_handler, socket.get_executor()); // ... and then binding this executor to our adapted completion handler using // the asio::bind_executor function. asio::async_write(socket, asio::buffer(message, std::strlen(message)), asio::bind_executor(executor, std::bind(std::move(completion.completion_handler), std::placeholders::_1))); // Finally, we return the result of the initiating function. return completion.result.get(); } //------------------------------------------------------------------------------ void test_callback() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using a lambda as a callback. async_write_message(socket, "Testing callback\r\n", [](const std::error_code& error) { if (!error) { std::cout << "Message sent\n"; } else { std::cout << "Error: " << error.message() << "\n"; } }); io_context.run(); } //------------------------------------------------------------------------------ void test_future() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using the use_future completion token. // This token causes the operation's initiating function to return a future, // which may be used to synchronously wait for the result of the operation. std::future f = async_write_message( socket, "Testing future\r\n", asio::use_future); io_context.run(); // Get the result of the operation. try { // Get the result of the operation. f.get(); std::cout << "Message sent\n"; } catch (const std::exception& e) { std::cout << "Error: " << e.what() << "\n"; } } //------------------------------------------------------------------------------ int main() { test_callback(); test_future(); } asio-1.12.2/src/examples/cpp11/operations/composed_3.cpp000066400000000000000000000127671340672067200230270ustar00rootroot00000000000000// // composed_3.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include using asio::ip::tcp; //------------------------------------------------------------------------------ // In this composed operation we repackage an existing operation, but with a // different completion handler signature. We will also intercept an empty // message as an invalid argument, and propagate the corresponding error to the // user. The asynchronous operation requirements are met by delegating // responsibility to the underlying operation. template auto async_write_message(tcp::socket& socket, const char* message, CompletionToken&& token) // The return type of the initiating function is deduced from the combination // of CompletionToken type and the completion handler's signature. When the // completion token is a simple callback, the return type is always void. // In this example, when the completion token is asio::yield_context // (used for stackful coroutines) the return type would be also be void, as // there is no non-error argument to the completion handler. When the // completion token is asio::use_future it would be std::future. -> typename asio::async_result< typename std::decay::type, void(std::error_code)>::return_type { // The asio::async_completion object takes the completion token and // from it creates: // // - completion.completion_handler: // A completion handler (i.e. a callback) with the specified signature. // // - completion.result: // An object from which we obtain the result of the initiating function. asio::async_completion completion(token); // If the user passes an empty message, this operation results in an // invalid_argument error. This error is propagated to the user using the // asio::post operation. The async_write operation is used only for // valid input. // // The post operation has a completion handler signature of: // // void() // // and the async_write operation has a completion handler signature of: // // void(std::error_code error, std::size n) // // Both of these operations' completion handler signatures differ from our // operation's completion handler signature. We will adapt our completion // handler to these signatures by using std::bind, which drops the additional // arguments. // // However, it is essential to the correctness of our composed operation that // we preserve the executor of the user-supplied completion handler. The // std::bind function will not do this for us, so we must do this by first // obtaining the completion handler's associated executor (defaulting to the // I/O executor - in this case the executor of the socket - if the completion // handler does not have its own) ... auto executor = asio::get_associated_executor( completion.completion_handler, socket.get_executor()); // ... and then binding it to our adapted completion handlers using the // asio::bind_executor function. std::size_t length = std::strlen(message); if (length == 0) { asio::post( asio::bind_executor(executor, std::bind(std::move(completion.completion_handler), asio::error::invalid_argument))); } else { asio::async_write(socket, asio::buffer(message, length), asio::bind_executor(executor, std::bind(std::move(completion.completion_handler), std::placeholders::_1))); } // Finally, we return the result of the initiating function. return completion.result.get(); } //------------------------------------------------------------------------------ void test_callback() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using a lambda as a callback. async_write_message(socket, "", [](const std::error_code& error) { if (!error) { std::cout << "Message sent\n"; } else { std::cout << "Error: " << error.message() << "\n"; } }); io_context.run(); } //------------------------------------------------------------------------------ void test_future() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using the use_future completion token. // This token causes the operation's initiating function to return a future, // which may be used to synchronously wait for the result of the operation. std::future f = async_write_message( socket, "", asio::use_future); io_context.run(); try { // Get the result of the operation. f.get(); std::cout << "Message sent\n"; } catch (const std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } } //------------------------------------------------------------------------------ int main() { test_callback(); test_future(); } asio-1.12.2/src/examples/cpp11/operations/composed_4.cpp000066400000000000000000000161041340672067200230150ustar00rootroot00000000000000// // composed_4.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include using asio::ip::tcp; //------------------------------------------------------------------------------ // This composed operation automatically serialises a message, using its I/O // streams insertion operator, before sending it on the socket. To do this, it // must allocate a buffer for the encoded message and ensure this buffer's // validity until the underlying async_write operation completes. template auto async_write_message(tcp::socket& socket, const T& message, CompletionToken&& token) // The return type of the initiating function is deduced from the combination // of CompletionToken type and the completion handler's signature. When the // completion token is a simple callback, the return type is always void. // In this example, when the completion token is asio::yield_context // (used for stackful coroutines) the return type would be also be void, as // there is no non-error argument to the completion handler. When the // completion token is asio::use_future it would be std::future. -> typename asio::async_result< typename std::decay::type, void(std::error_code)>::return_type { // Define a type alias for the concrete completion handler, as we will use // the type in several places in the implementation below. using completion_handler_type = typename asio::async_completion::completion_handler_type; // In this example, the composed operation's intermediate completion handler // is implemented as a hand-crafted function object, rather than a lambda. struct intermediate_completion_handler { // The intermediate completion handler holds a reference to the socket so // that it can obtain the I/O executor (see get_executor below). tcp::socket& socket_; // The allocated buffer for the encoded message. The std::unique_ptr smart // pointer is move-only, and as a consequence our intermediate completion // handler is also move-only. std::unique_ptr encoded_message_; // The user-supplied completion handler. completion_handler_type handler_; // The function call operator matches the completion signature of the // async_write operation. void operator()(const std::error_code& error, std::size_t /*n*/) { // Deallocate the encoded message before calling the user-supplied // completion handler. encoded_message_.reset(); // Call the user-supplied handler with the result of the operation. // The arguments must match the completion signature of our composed // operation. handler_(error); } // It is essential to the correctness of our composed operation that we // preserve the executor of the user-supplied completion handler. With a // hand-crafted function object we can do this by defining a nested type // executor_type and member function get_executor. These obtain the // completion handler's associated executor, and default to the I/O // executor - in this case the executor of the socket - if the completion // handler does not have its own. using executor_type = asio::associated_executor_t< completion_handler_type, tcp::socket::executor_type>; executor_type get_executor() const noexcept { return asio::get_associated_executor( handler_, socket_.get_executor()); } // Although not necessary for correctness, we may also preserve the // allocator of the user-supplied completion handler. This is achieved by // defining a nested type allocator_type and member function get_allocator. // These obtain the completion handler's associated allocator, and default // to std::allocator if the completion handler does not have its own. using allocator_type = asio::associated_allocator_t< completion_handler_type, std::allocator>; allocator_type get_allocator() const noexcept { return asio::get_associated_allocator( handler_, std::allocator{}); } }; // The asio::async_completion object takes the completion token and // from it creates: // // - completion.completion_handler: // A completion handler (i.e. a callback) with the specified signature. // // - completion.result: // An object from which we obtain the result of the initiating function. asio::async_completion completion(token); // Encode the message and copy it into an allocated buffer. The buffer will // be maintained for the lifetime of the asynchronous operation. std::ostringstream os; os << message; std::unique_ptr encoded_message(new std::string(os.str())); // Initiate the underlying async_write operation using our intermediate // completion handler. asio::async_write(socket, asio::buffer(*encoded_message), intermediate_completion_handler{socket, std::move(encoded_message), std::move(completion.completion_handler)}); // Finally, we return the result of the initiating function. return completion.result.get(); } //------------------------------------------------------------------------------ void test_callback() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using a lambda as a callback. async_write_message(socket, "Testing callback\r\n", [](const std::error_code& error) { if (!error) { std::cout << "Message sent\n"; } else { std::cout << "Error: " << error.message() << "\n"; } }); io_context.run(); } //------------------------------------------------------------------------------ void test_future() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using the use_future completion token. // This token causes the operation's initiating function to return a future, // which may be used to synchronously wait for the result of the operation. std::future f = async_write_message( socket, "Testing future\r\n", asio::use_future); io_context.run(); try { // Get the result of the operation. f.get(); std::cout << "Message sent\n"; } catch (const std::exception& e) { std::cout << "Error: " << e.what() << "\n"; } } //------------------------------------------------------------------------------ int main() { test_callback(); test_future(); } asio-1.12.2/src/examples/cpp11/operations/composed_5.cpp000066400000000000000000000224471340672067200230250ustar00rootroot00000000000000// // composed_5.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include #include #include using asio::ip::tcp; //------------------------------------------------------------------------------ // This composed operation shows composition of multiple underlying operations. // It automatically serialises a message, using its I/O streams insertion // operator, before sending it N times on the socket. To do this, it must // allocate a buffer for the encoded message and ensure this buffer's validity // until all underlying async_write operation complete. A one second delay is // inserted prior to each write operation, using a steady_timer. template auto async_write_messages(tcp::socket& socket, const T& message, std::size_t repeat_count, CompletionToken&& token) // The return type of the initiating function is deduced from the combination // of CompletionToken type and the completion handler's signature. When the // completion token is a simple callback, the return type is always void. // In this example, when the completion token is asio::yield_context // (used for stackful coroutines) the return type would be also be void, as // there is no non-error argument to the completion handler. When the // completion token is asio::use_future it would be std::future. -> typename asio::async_result< typename std::decay::type, void(std::error_code)>::return_type { // Define a type alias for the concrete completion handler, as we will use // the type in several places in the implementation below. using completion_handler_type = typename asio::async_completion::completion_handler_type; // In this example, the composed operation's intermediate completion handler // is implemented as a hand-crafted function object. struct intermediate_completion_handler { // The intermediate completion handler holds a reference to the socket as // it is used for multiple async_write operations, as well as for obtaining // the I/O executor (see get_executor below). tcp::socket& socket_; // The allocated buffer for the encoded message. The std::unique_ptr smart // pointer is move-only, and as a consequence our intermediate completion // handler is also move-only. std::unique_ptr encoded_message_; // The repeat count remaining. std::size_t repeat_count_; // A steady timer used for introducing a delay. std::unique_ptr delay_timer_; // To manage the cycle between the multiple underlying asychronous // operations, our intermediate completion handler is implemented as a // state machine. enum { starting, waiting, writing } state_; // As our composed operation performs multiple underlying I/O operations, // we should maintain a work object against the I/O executor. This tells // the I/O executor that there is still more work to come in the future. asio::executor_work_guard io_work_; // The user-supplied completion handler, called once only on completion of // the entire composed operation. completion_handler_type handler_; // By having a default value for the second argument, this function call // operator matches the completion signature of both the async_write and // steady_timer::async_wait operations. void operator()(const std::error_code& error, std::size_t = 0) { if (!error) { switch (state_) { case starting: case writing: if (repeat_count_ > 0) { --repeat_count_; state_ = waiting; delay_timer_->expires_after(std::chrono::seconds(1)); delay_timer_->async_wait(std::move(*this)); return; // Composed operation not yet complete. } break; // Composed operation complete, continue below. case waiting: state_ = writing; asio::async_write(socket_, asio::buffer(*encoded_message_), std::move(*this)); return; // Composed operation not yet complete. } } // This point is reached only on completion of the entire composed // operation. // We no longer have any future work coming for the I/O executor. io_work_.reset(); // Deallocate the encoded message before calling the user-supplied // completion handler. encoded_message_.reset(); // Call the user-supplied handler with the result of the operation. handler_(error); } // It is essential to the correctness of our composed operation that we // preserve the executor of the user-supplied completion handler. With a // hand-crafted function object we can do this by defining a nested type // executor_type and member function get_executor. These obtain the // completion handler's associated executor, and default to the I/O // executor - in this case the executor of the socket - if the completion // handler does not have its own. using executor_type = asio::associated_executor_t< completion_handler_type, tcp::socket::executor_type>; executor_type get_executor() const noexcept { return asio::get_associated_executor( handler_, socket_.get_executor()); } // Although not necessary for correctness, we may also preserve the // allocator of the user-supplied completion handler. This is achieved by // defining a nested type allocator_type and member function get_allocator. // These obtain the completion handler's associated allocator, and default // to std::allocator if the completion handler does not have its own. using allocator_type = asio::associated_allocator_t< completion_handler_type, std::allocator>; allocator_type get_allocator() const noexcept { return asio::get_associated_allocator( handler_, std::allocator{}); } }; // The asio::async_completion object takes the completion token and // from it creates: // // - completion.completion_handler: // A completion handler (i.e. a callback) with the specified signature. // // - completion.result: // An object from which we obtain the result of the initiating function. asio::async_completion completion(token); // Encode the message and copy it into an allocated buffer. The buffer will // be maintained for the lifetime of the composed asynchronous operation. std::ostringstream os; os << message; std::unique_ptr encoded_message(new std::string(os.str())); // Create a steady_timer to be used for the delay between messages. std::unique_ptr delay_timer( new asio::steady_timer(socket.get_executor().context())); // Initiate the underlying operations by explicitly calling our intermediate // completion handler's function call operator. intermediate_completion_handler{ socket, std::move(encoded_message), repeat_count, std::move(delay_timer), intermediate_completion_handler::starting, asio::make_work_guard(socket.get_executor()), std::move(completion.completion_handler) }({}); // Finally, we return the result of the initiating function. return completion.result.get(); } //------------------------------------------------------------------------------ void test_callback() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using a lambda as a callback. async_write_messages(socket, "Testing callback\r\n", 5, [](const std::error_code& error) { if (!error) { std::cout << "Messages sent\n"; } else { std::cout << "Error: " << error.message() << "\n"; } }); io_context.run(); } //------------------------------------------------------------------------------ void test_future() { asio::io_context io_context; tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); tcp::socket socket = acceptor.accept(); // Test our asynchronous operation using the use_future completion token. // This token causes the operation's initiating function to return a future, // which may be used to synchronously wait for the result of the operation. std::future f = async_write_messages( socket, "Testing future\r\n", 5, asio::use_future); io_context.run(); try { // Get the result of the operation. f.get(); std::cout << "Messages sent\n"; } catch (const std::exception& e) { std::cout << "Error: " << e.what() << "\n"; } } //------------------------------------------------------------------------------ int main() { test_callback(); test_future(); } asio-1.12.2/src/examples/cpp11/socks4/000077500000000000000000000000001340672067200172765ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/socks4/socks4.hpp000066400000000000000000000056261340672067200212260ustar00rootroot00000000000000// // socks4.hpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef SOCKS4_HPP #define SOCKS4_HPP #include #include #include #include namespace socks4 { const unsigned char version = 0x04; class request { public: enum command_type { connect = 0x01, bind = 0x02 }; request(command_type cmd, const asio::ip::tcp::endpoint& endpoint, const std::string& user_id) : version_(version), command_(cmd), user_id_(user_id), null_byte_(0) { // Only IPv4 is supported by the SOCKS 4 protocol. if (endpoint.protocol() != asio::ip::tcp::v4()) { throw asio::system_error( asio::error::address_family_not_supported); } // Convert port number to network byte order. unsigned short port = endpoint.port(); port_high_byte_ = (port >> 8) & 0xff; port_low_byte_ = port & 0xff; // Save IP address in network byte order. address_ = endpoint.address().to_v4().to_bytes(); } std::array buffers() const { return { { asio::buffer(&version_, 1), asio::buffer(&command_, 1), asio::buffer(&port_high_byte_, 1), asio::buffer(&port_low_byte_, 1), asio::buffer(address_), asio::buffer(user_id_), asio::buffer(&null_byte_, 1) } }; } private: unsigned char version_; unsigned char command_; unsigned char port_high_byte_; unsigned char port_low_byte_; asio::ip::address_v4::bytes_type address_; std::string user_id_; unsigned char null_byte_; }; class reply { public: enum status_type { request_granted = 0x5a, request_failed = 0x5b, request_failed_no_identd = 0x5c, request_failed_bad_user_id = 0x5d }; reply() : null_byte_(0), status_() { } std::array buffers() { return { { asio::buffer(&null_byte_, 1), asio::buffer(&status_, 1), asio::buffer(&port_high_byte_, 1), asio::buffer(&port_low_byte_, 1), asio::buffer(address_) } }; } bool success() const { return null_byte_ == 0 && status_ == request_granted; } unsigned char status() const { return status_; } asio::ip::tcp::endpoint endpoint() const { unsigned short port = port_high_byte_; port = (port << 8) & 0xff00; port = port | port_low_byte_; asio::ip::address_v4 address(address_); return asio::ip::tcp::endpoint(address, port); } private: unsigned char null_byte_; unsigned char status_; unsigned char port_high_byte_; unsigned char port_low_byte_; asio::ip::address_v4::bytes_type address_; }; } // namespace socks4 #endif // SOCKS4_HPP asio-1.12.2/src/examples/cpp11/socks4/sync_client.cpp000066400000000000000000000054241340672067200223210ustar00rootroot00000000000000// // sync_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include "socks4.hpp" using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 4) { std::cout << "Usage: sync_client \n"; std::cout << "Examples:\n"; std::cout << " sync_client 127.0.0.1 1080 chris\n"; std::cout << " sync_client localhost socks chris\n"; return 1; } asio::io_context io_context; // Get a list of endpoints corresponding to the SOCKS 4 server name. tcp::resolver resolver(io_context); auto endpoints = resolver.resolve(argv[1], argv[2]); // Try each endpoint until we successfully establish a connection to the // SOCKS 4 server. tcp::socket socket(io_context); asio::connect(socket, endpoints); // Get an endpoint for the Boost website. This will be passed to the SOCKS // 4 server. Explicitly specify IPv4 since SOCKS 4 does not support IPv6. auto http_endpoint = *resolver.resolve(tcp::v4(), "www.boost.org", "http"); // Send the request to the SOCKS 4 server. socks4::request socks_request( socks4::request::connect, http_endpoint, argv[3]); asio::write(socket, socks_request.buffers()); // Receive a response from the SOCKS 4 server. socks4::reply socks_reply; asio::read(socket, socks_reply.buffers()); // Check whether we successfully negotiated with the SOCKS 4 server. if (!socks_reply.success()) { std::cout << "Connection failed.\n"; std::cout << "status = 0x" << std::hex << socks_reply.status(); return 1; } // Form the HTTP request. We specify the "Connection: close" header so that // the server will close the socket after transmitting the response. This // will allow us to treat all data up until the EOF as the response. std::string request = "GET / HTTP/1.0\r\n" "Host: www.boost.org\r\n" "Accept: */*\r\n" "Connection: close\r\n\r\n"; // Send the HTTP request. asio::write(socket, asio::buffer(request)); // Read until EOF, writing data to output as we go. std::array response; std::error_code error; while (std::size_t s = socket.read_some( asio::buffer(response), error)) std::cout.write(response.data(), s); if (error != asio::error::eof) throw std::system_error(error); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/spawn/000077500000000000000000000000001340672067200172205ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/spawn/echo_server.cpp000066400000000000000000000047301340672067200222340ustar00rootroot00000000000000// // echo_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::tcp; class session : public std::enable_shared_from_this { public: explicit session(tcp::socket socket) : socket_(std::move(socket)), timer_(socket_.get_io_context()), strand_(socket_.get_io_context()) { } void go() { auto self(shared_from_this()); asio::spawn(strand_, [this, self](asio::yield_context yield) { try { char data[128]; for (;;) { timer_.expires_from_now(std::chrono::seconds(10)); std::size_t n = socket_.async_read_some(asio::buffer(data), yield); asio::async_write(socket_, asio::buffer(data, n), yield); } } catch (std::exception& e) { socket_.close(); timer_.cancel(); } }); asio::spawn(strand_, [this, self](asio::yield_context yield) { while (socket_.is_open()) { asio::error_code ignored_ec; timer_.async_wait(yield[ignored_ec]); if (timer_.expires_from_now() <= std::chrono::seconds(0)) socket_.close(); } }); } private: tcp::socket socket_; asio::steady_timer timer_; asio::io_context::strand strand_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: echo_server \n"; return 1; } asio::io_context io_context; asio::spawn(io_context, [&](asio::yield_context yield) { tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), std::atoi(argv[1]))); for (;;) { asio::error_code ec; tcp::socket socket(io_context); acceptor.async_accept(socket, yield[ec]); if (!ec) std::make_shared(std::move(socket))->go(); } }); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/spawn/parallel_grep.cpp000066400000000000000000000043361340672067200225430ustar00rootroot00000000000000// // parallel_grep.cpp // ~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include using asio::dispatch; using asio::spawn; using asio::strand; using asio::thread_pool; using asio::yield_context; int main(int argc, char* argv[]) { try { if (argc < 2) { std::cerr << "Usage: parallel_grep \n"; return 1; } // We use a fixed size pool of threads for reading the input files. The // number of threads is automatically determined based on the number of // CPUs available in the system. thread_pool pool; // To prevent the output from being garbled, we use a strand to synchronise // printing. strand output_strand(pool.get_executor()); // Spawn a new coroutine for each file specified on the command line. std::string search_string = argv[1]; for (int argn = 2; argn < argc; ++argn) { std::string input_file = argv[argn]; spawn(pool, [=](yield_context yield) { std::ifstream is(input_file.c_str()); std::string line; std::size_t line_num = 0; while (std::getline(is, line)) { // If we find a match, send a message to the output. if (line.find(search_string) != std::string::npos) { dispatch(output_strand, [=] { std::cout << input_file << ':' << line << std::endl; }); } // Every so often we yield control to another coroutine. if (++line_num % 10 == 0) post(yield); } }); } // Join the thread pool to wait for all the spawned tasks to complete. pool.join(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/ssl/000077500000000000000000000000001340672067200166715ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/ssl/client.cpp000066400000000000000000000100271340672067200206530ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include "asio.hpp" #include "asio/ssl.hpp" using asio::ip::tcp; using std::placeholders::_1; using std::placeholders::_2; enum { max_length = 1024 }; class client { public: client(asio::io_context& io_context, asio::ssl::context& context, const tcp::resolver::results_type& endpoints) : socket_(io_context, context) { socket_.set_verify_mode(asio::ssl::verify_peer); socket_.set_verify_callback( std::bind(&client::verify_certificate, this, _1, _2)); connect(endpoints); } private: bool verify_certificate(bool preverified, asio::ssl::verify_context& ctx) { // The verify callback can be used to check whether the certificate that is // being presented is valid for the peer. For example, RFC 2818 describes // the steps involved in doing this for HTTPS. Consult the OpenSSL // documentation for more details. Note that the callback is called once // for each certificate in the certificate chain, starting from the root // certificate authority. // In this example we will simply print the certificate's subject name. char subject_name[256]; X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256); std::cout << "Verifying " << subject_name << "\n"; return preverified; } void connect(const tcp::resolver::results_type& endpoints) { asio::async_connect(socket_.lowest_layer(), endpoints, [this](const std::error_code& error, const tcp::endpoint& /*endpoint*/) { if (!error) { handshake(); } else { std::cout << "Connect failed: " << error.message() << "\n"; } }); } void handshake() { socket_.async_handshake(asio::ssl::stream_base::client, [this](const std::error_code& error) { if (!error) { send_request(); } else { std::cout << "Handshake failed: " << error.message() << "\n"; } }); } void send_request() { std::cout << "Enter message: "; std::cin.getline(request_, max_length); size_t request_length = std::strlen(request_); asio::async_write(socket_, asio::buffer(request_, request_length), [this](const std::error_code& error, std::size_t length) { if (!error) { receive_response(length); } else { std::cout << "Write failed: " << error.message() << "\n"; } }); } void receive_response(std::size_t length) { asio::async_read(socket_, asio::buffer(reply_, length), [this](const std::error_code& error, std::size_t length) { if (!error) { std::cout << "Reply: "; std::cout.write(reply_, length); std::cout << "\n"; } else { std::cout << "Read failed: " << error.message() << "\n"; } }); } asio::ssl::stream socket_; char request_[max_length]; char reply_[max_length]; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: client \n"; return 1; } asio::io_context io_context; tcp::resolver resolver(io_context); auto endpoints = resolver.resolve(argv[1], argv[2]); asio::ssl::context ctx(asio::ssl::context::sslv23); ctx.load_verify_file("ca.pem"); client c(io_context, ctx, endpoints); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/ssl/server.cpp000066400000000000000000000056441340672067200207140ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" #include "asio/ssl.hpp" using asio::ip::tcp; class session : public std::enable_shared_from_this { public: session(tcp::socket socket, asio::ssl::context& context) : socket_(std::move(socket), context) { } void start() { do_handshake(); } private: void do_handshake() { auto self(shared_from_this()); socket_.async_handshake(asio::ssl::stream_base::server, [this, self](const std::error_code& error) { if (!error) { do_read(); } }); } void do_read() { auto self(shared_from_this()); socket_.async_read_some(asio::buffer(data_), [this, self](const std::error_code& ec, std::size_t length) { if (!ec) { do_write(length); } }); } void do_write(std::size_t length) { auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(data_, length), [this, self](const std::error_code& ec, std::size_t /*length*/) { if (!ec) { do_read(); } }); } asio::ssl::stream socket_; char data_[1024]; }; class server { public: server(asio::io_context& io_context, unsigned short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), context_(asio::ssl::context::sslv23) { context_.set_options( asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use); context_.set_password_callback(std::bind(&server::get_password, this)); context_.use_certificate_chain_file("server.pem"); context_.use_private_key_file("server.pem", asio::ssl::context::pem); context_.use_tmp_dh_file("dh2048.pem"); do_accept(); } private: std::string get_password() const { return "test"; } void do_accept() { acceptor_.async_accept( [this](const std::error_code& error, tcp::socket socket) { if (!error) { std::make_shared(std::move(socket), context_)->start(); } do_accept(); }); } tcp::acceptor acceptor_; asio::ssl::context context_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; using namespace std; // For atoi. server s(io_context, atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/timeouts/000077500000000000000000000000001340672067200177415ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/timeouts/async_tcp_client.cpp000066400000000000000000000216751340672067200240010ustar00rootroot00000000000000// // async_tcp_client.cpp // ~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/read_until.hpp" #include "asio/steady_timer.hpp" #include "asio/write.hpp" #include #include #include using asio::steady_timer; using asio::ip::tcp; using std::placeholders::_1; using std::placeholders::_2; // // This class manages socket timeouts by applying the concept of a deadline. // Some asynchronous operations are given deadlines by which they must complete. // Deadlines are enforced by an "actor" that persists for the lifetime of the // client object: // // +----------------+ // | | // | check_deadline |<---+ // | | | // +----------------+ | async_wait() // | | // +---------+ // // If the deadline actor determines that the deadline has expired, the socket // is closed and any outstanding operations are consequently cancelled. // // Connection establishment involves trying each endpoint in turn until a // connection is successful, or the available endpoints are exhausted. If the // deadline actor closes the socket, the connect actor is woken up and moves to // the next endpoint. // // +---------------+ // | | // | start_connect |<---+ // | | | // +---------------+ | // | | // async_- | +----------------+ // connect() | | | // +--->| handle_connect | // | | // +----------------+ // : // Once a connection is : // made, the connect : // actor forks in two - : // : // an actor for reading : and an actor for // inbound messages: : sending heartbeats: // : // +------------+ : +-------------+ // | |<- - - - -+- - - - ->| | // | start_read | | start_write |<---+ // | |<---+ | | | // +------------+ | +-------------+ | async_wait() // | | | | // async_- | +-------------+ async_- | +--------------+ // read_- | | | write() | | | // until() +--->| handle_read | +--->| handle_write | // | | | | // +-------------+ +--------------+ // // The input actor reads messages from the socket, where messages are delimited // by the newline character. The deadline for a complete message is 30 seconds. // // The heartbeat actor sends a heartbeat (a message that consists of a single // newline character) every 10 seconds. In this example, no deadline is applied // to message sending. // class client { public: client(asio::io_context& io_context) : socket_(io_context), deadline_(io_context), heartbeat_timer_(io_context) { } // Called by the user of the client class to initiate the connection process. // The endpoints will have been obtained using a tcp::resolver. void start(tcp::resolver::results_type endpoints) { // Start the connect actor. endpoints_ = endpoints; start_connect(endpoints_.begin()); // Start the deadline actor. You will note that we're not setting any // particular deadline here. Instead, the connect and input actors will // update the deadline prior to each asynchronous operation. deadline_.async_wait(std::bind(&client::check_deadline, this)); } // This function terminates all the actors to shut down the connection. It // may be called by the user of the client class, or by the class itself in // response to graceful termination or an unrecoverable error. void stop() { stopped_ = true; std::error_code ignored_error; socket_.close(ignored_error); deadline_.cancel(); heartbeat_timer_.cancel(); } private: void start_connect(tcp::resolver::results_type::iterator endpoint_iter) { if (endpoint_iter != endpoints_.end()) { std::cout << "Trying " << endpoint_iter->endpoint() << "...\n"; // Set a deadline for the connect operation. deadline_.expires_after(std::chrono::seconds(60)); // Start the asynchronous connect operation. socket_.async_connect(endpoint_iter->endpoint(), std::bind(&client::handle_connect, this, _1, endpoint_iter)); } else { // There are no more endpoints to try. Shut down the client. stop(); } } void handle_connect(const std::error_code& error, tcp::resolver::results_type::iterator endpoint_iter) { if (stopped_) return; // The async_connect() function automatically opens the socket at the start // of the asynchronous operation. If the socket is closed at this time then // the timeout handler must have run first. if (!socket_.is_open()) { std::cout << "Connect timed out\n"; // Try the next available endpoint. start_connect(++endpoint_iter); } // Check if the connect operation failed before the deadline expired. else if (error) { std::cout << "Connect error: " << error.message() << "\n"; // We need to close the socket used in the previous connection attempt // before starting a new one. socket_.close(); // Try the next available endpoint. start_connect(++endpoint_iter); } // Otherwise we have successfully established a connection. else { std::cout << "Connected to " << endpoint_iter->endpoint() << "\n"; // Start the input actor. start_read(); // Start the heartbeat actor. start_write(); } } void start_read() { // Set a deadline for the read operation. deadline_.expires_after(std::chrono::seconds(30)); // Start an asynchronous operation to read a newline-delimited message. asio::async_read_until(socket_, asio::dynamic_buffer(input_buffer_), '\n', std::bind(&client::handle_read, this, _1, _2)); } void handle_read(const std::error_code& error, std::size_t n) { if (stopped_) return; if (!error) { // Extract the newline-delimited message from the buffer. std::string line(input_buffer_.substr(0, n - 1)); input_buffer_.erase(0, n); // Empty messages are heartbeats and so ignored. if (!line.empty()) { std::cout << "Received: " << line << "\n"; } start_read(); } else { std::cout << "Error on receive: " << error.message() << "\n"; stop(); } } void start_write() { if (stopped_) return; // Start an asynchronous operation to send a heartbeat message. asio::async_write(socket_, asio::buffer("\n", 1), std::bind(&client::handle_write, this, _1)); } void handle_write(const std::error_code& error) { if (stopped_) return; if (!error) { // Wait 10 seconds before sending the next heartbeat. heartbeat_timer_.expires_after(std::chrono::seconds(10)); heartbeat_timer_.async_wait(std::bind(&client::start_write, this)); } else { std::cout << "Error on heartbeat: " << error.message() << "\n"; stop(); } } void check_deadline() { if (stopped_) return; // Check whether the deadline has passed. We compare the deadline against // the current time since a new asynchronous operation may have moved the // deadline before this actor had a chance to run. if (deadline_.expiry() <= steady_timer::clock_type::now()) { // The deadline has passed. The socket is closed so that any outstanding // asynchronous operations are cancelled. socket_.close(); // There is no longer an active deadline. The expiry is set to the // maximum time point so that the actor takes no action until a new // deadline is set. deadline_.expires_at(steady_timer::time_point::max()); } // Put the actor back to sleep. deadline_.async_wait(std::bind(&client::check_deadline, this)); } private: bool stopped_ = false; tcp::resolver::results_type endpoints_; tcp::socket socket_; std::string input_buffer_; steady_timer deadline_; steady_timer heartbeat_timer_; }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: client \n"; return 1; } asio::io_context io_context; tcp::resolver r(io_context); client c(io_context); c.start(r.resolve(argv[1], argv[2])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/timeouts/blocking_tcp_client.cpp000066400000000000000000000135661340672067200244540ustar00rootroot00000000000000// // blocking_tcp_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/buffer.hpp" #include "asio/connect.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/read_until.hpp" #include "asio/system_error.hpp" #include "asio/write.hpp" #include #include #include using asio::ip::tcp; //---------------------------------------------------------------------- // // This class manages socket timeouts by running the io_context using the timed // io_context::run_for() member function. Each asynchronous operation is given // a timeout within which it must complete. The socket operations themselves // use lambdas as completion handlers. For a given socket operation, the client // object runs the io_context to block thread execution until the operation // completes or the timeout is reached. If the io_context::run_for() function // times out, the socket is closed and the outstanding asynchronous operation // is cancelled. // class client { public: void connect(const std::string& host, const std::string& service, std::chrono::steady_clock::duration timeout) { // Resolve the host name and service to a list of endpoints. auto endpoints = tcp::resolver(io_context_).resolve(host, service); // Start the asynchronous operation itself. The lambda that is used as a // callback will update the error variable when the operation completes. // The blocking_udp_client.cpp example shows how you can use std::bind // rather than a lambda. std::error_code error; asio::async_connect(socket_, endpoints, [&](const std::error_code& result_error, const tcp::endpoint& /*result_endpoint*/) { error = result_error; }); // Run the operation until it completes, or until the timeout. run(timeout); // Determine whether a connection was successfully established. if (error) throw std::system_error(error); } std::string read_line(std::chrono::steady_clock::duration timeout) { // Start the asynchronous operation. The lambda that is used as a callback // will update the error and n variables when the operation completes. The // blocking_udp_client.cpp example shows how you can use std::bind rather // than a lambda. std::error_code error; std::size_t n = 0; asio::async_read_until(socket_, asio::dynamic_buffer(input_buffer_), '\n', [&](const std::error_code& result_error, std::size_t result_n) { error = result_error; n = result_n; }); // Run the operation until it completes, or until the timeout. run(timeout); // Determine whether the read completed successfully. if (error) throw std::system_error(error); std::string line(input_buffer_.substr(0, n - 1)); input_buffer_.erase(0, n); return line; } void write_line(const std::string& line, std::chrono::steady_clock::duration timeout) { std::string data = line + "\n"; // Start the asynchronous operation itself. The lambda that is used as a // callback will update the error variable when the operation completes. // The blocking_udp_client.cpp example shows how you can use std::bind // rather than a lambda. std::error_code error; asio::async_write(socket_, asio::buffer(data), [&](const std::error_code& result_error, std::size_t /*result_n*/) { error = result_error; }); // Run the operation until it completes, or until the timeout. run(timeout); // Determine whether the read completed successfully. if (error) throw std::system_error(error); } private: void run(std::chrono::steady_clock::duration timeout) { // Restart the io_context, as it may have been left in the "stopped" state // by a previous operation. io_context_.restart(); // Block until the asynchronous operation has completed, or timed out. If // the pending asynchronous operation is a composed operation, the deadline // applies to the entire operation, rather than individual operations on // the socket. io_context_.run_for(timeout); // If the asynchronous operation completed successfully then the io_context // would have been stopped due to running out of work. If it was not // stopped, then the io_context::run_for call must have timed out. if (!io_context_.stopped()) { // Close the socket to cancel the outstanding asynchronous operation. socket_.close(); // Run the io_context again until the operation completes. io_context_.run(); } } asio::io_context io_context_; tcp::socket socket_{io_context_}; std::string input_buffer_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc != 4) { std::cerr << "Usage: blocking_tcp_client \n"; return 1; } client c; c.connect(argv[1], argv[2], std::chrono::seconds(10)); auto time_sent = std::chrono::steady_clock::now(); c.write_line(argv[3], std::chrono::seconds(10)); for (;;) { std::string line = c.read_line(std::chrono::seconds(10)); // Keep going until we get back the line that was sent. if (line == argv[3]) break; } auto time_received = std::chrono::steady_clock::now(); std::cout << "Round trip time: "; std::cout << std::chrono::duration_cast< std::chrono::microseconds>( time_received - time_sent).count(); std::cout << " microseconds\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp000066400000000000000000000132501340672067200256420ustar00rootroot00000000000000// // blocking_token_tcp_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/connect.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/read_until.hpp" #include "asio/streambuf.hpp" #include "asio/system_error.hpp" #include "asio/write.hpp" #include #include #include #include using asio::ip::tcp; //---------------------------------------------------------------------- // A custom completion token that makes asynchronous operations behave as // though they are blocking calls with a timeout. struct close_after { close_after(std::chrono::steady_clock::duration t, tcp::socket& s) : timeout_(t), socket_(s) { } // The maximum time to wait for an asynchronous operation to complete. std::chrono::steady_clock::duration timeout_; // The socket to be closed if the operation does not complete in time. tcp::socket& socket_; }; namespace asio { // The async_result template is specialised to allow the close_after token to // be used with asynchronous operations that have a completion signature of // void(error_code, T). Generalising this for all completion signature forms is // left as an exercise for the reader. template class async_result { public: // An asynchronous operation's initiating function automatically creates an // completion_handler_type object from the token. This function object is // then called on completion of the asynchronous operation. class completion_handler_type { public: completion_handler_type(const close_after& token) : token_(token) { } void operator()(const std::error_code& error, T t) { *error_ = error; *t_ = t; } private: friend class async_result; close_after token_; std::error_code* error_; T* t_; }; // The async_result constructor associates the completion handler object with // the result of the initiating function. explicit async_result(completion_handler_type& h) : timeout_(h.token_.timeout_), socket_(h.token_.socket_) { h.error_ = &error_; h.t_ = &t_; } // The return_type typedef determines the result type of the asynchronous // operation's initiating function. typedef T return_type; // The get() function is used to obtain the result of the asynchronous // operation's initiating function. For the close_after completion token, we // use this function to run the io_context until the operation is complete. return_type get() { asio::io_context& io_context = socket_.get_executor().context(); // Restart the io_context, as it may have been left in the "stopped" state // by a previous operation. io_context.restart(); // Block until the asynchronous operation has completed, or timed out. If // the pending asynchronous operation is a composed operation, the deadline // applies to the entire operation, rather than individual operations on // the socket. io_context.run_for(timeout_); // If the asynchronous operation completed successfully then the io_context // would have been stopped due to running out of work. If it was not // stopped, then the io_context::run_for call must have timed out and the // operation is still incomplete. if (!io_context.stopped()) { // Close the socket to cancel the outstanding asynchronous operation. socket_.close(); // Run the io_context again until the operation completes. io_context.run(); } // If the operation failed, throw an exception. Otherwise return the result. return error_ ? throw std::system_error(error_) : t_; } private: std::chrono::steady_clock::duration timeout_; tcp::socket& socket_; std::error_code error_; T t_; }; } // namespace asio //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc != 4) { std::cerr << "Usage: blocking_tcp_client \n"; return 1; } asio::io_context io_context; // Resolve the host name and service to a list of endpoints. auto endpoints = tcp::resolver(io_context).resolve(argv[1], argv[2]); tcp::socket socket(io_context); // Run an asynchronous connect operation with a timeout. asio::async_connect(socket, endpoints, close_after(std::chrono::seconds(10), socket)); auto time_sent = std::chrono::steady_clock::now(); // Run an asynchronous write operation with a timeout. std::string msg = argv[3] + std::string("\n"); asio::async_write(socket, asio::buffer(msg), close_after(std::chrono::seconds(10), socket)); for (std::string input_buffer;;) { // Run an asynchronous read operation with a timeout. std::size_t n = asio::async_read_until(socket, asio::dynamic_buffer(input_buffer), '\n', close_after(std::chrono::seconds(10), socket)); std::string line(input_buffer.substr(0, n - 1)); input_buffer.erase(0, n); // Keep going until we get back the line that was sent. if (line == argv[3]) break; } auto time_received = std::chrono::steady_clock::now(); std::cout << "Round trip time: "; std::cout << std::chrono::duration_cast< std::chrono::microseconds>( time_received - time_sent).count(); std::cout << " microseconds\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/timeouts/blocking_udp_client.cpp000066400000000000000000000103241340672067200244430ustar00rootroot00000000000000// // blocking_udp_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ip/udp.hpp" #include #include #include using asio::ip::udp; using std::placeholders::_1; using std::placeholders::_2; //---------------------------------------------------------------------- // // This class manages socket timeouts by running the io_context using the timed // io_context::run_for() member function. Each asynchronous operation is given // a timeout within which it must complete. The socket operations themselves // use std::bind to specify the completion handler: // // +---------------+ // | | // | receive | // | | // +---------------+ // | // async_- | +----------------+ // receive() | | | // +--->| handle_receive | // | | // +----------------+ // // For a given socket operation, the client object runs the io_context to block // thread execution until the operation completes or the timeout is reached. If // the io_context::run_for() function times out, the socket is closed and the // outstanding asynchronous operation is cancelled. // class client { public: client(const udp::endpoint& listen_endpoint) : socket_(io_context_, listen_endpoint) { } std::size_t receive(const asio::mutable_buffer& buffer, std::chrono::steady_clock::duration timeout, std::error_code& error) { // Start the asynchronous operation. The handle_receive function used as a // callback will update the error and length variables. std::size_t length = 0; socket_.async_receive(asio::buffer(buffer), std::bind(&client::handle_receive, _1, _2, &error, &length)); // Run the operation until it completes, or until the timeout. run(timeout); return length; } private: void run(std::chrono::steady_clock::duration timeout) { // Restart the io_context, as it may have been left in the "stopped" state // by a previous operation. io_context_.restart(); // Block until the asynchronous operation has completed, or timed out. If // the pending asynchronous operation is a composed operation, the deadline // applies to the entire operation, rather than individual operations on // the socket. io_context_.run_for(timeout); // If the asynchronous operation completed successfully then the io_context // would have been stopped due to running out of work. If it was not // stopped, then the io_context::run_for call must have timed out. if (!io_context_.stopped()) { // Cancel the outstanding asynchronous operation. socket_.cancel(); // Run the io_context again until the operation completes. io_context_.run(); } } static void handle_receive( const std::error_code& error, std::size_t length, std::error_code* out_error, std::size_t* out_length) { *out_error = error; *out_length = length; } private: asio::io_context io_context_; udp::socket socket_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { using namespace std; // For atoi. if (argc != 3) { std::cerr << "Usage: blocking_udp_client \n"; return 1; } udp::endpoint listen_endpoint( asio::ip::make_address(argv[1]), std::atoi(argv[2])); client c(listen_endpoint); for (;;) { char data[1024]; std::error_code error; std::size_t n = c.receive(asio::buffer(data), std::chrono::seconds(10), error); if (error) { std::cout << "Receive error: " << error.message() << "\n"; } else { std::cout << "Received: "; std::cout.write(data, n); std::cout << "\n"; } } } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/timeouts/server.cpp000066400000000000000000000306261340672067200217620ustar00rootroot00000000000000// // server.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include "asio/buffer.hpp" #include "asio/io_context.hpp" #include "asio/ip/tcp.hpp" #include "asio/ip/udp.hpp" #include "asio/read_until.hpp" #include "asio/steady_timer.hpp" #include "asio/write.hpp" using asio::steady_timer; using asio::ip::tcp; using asio::ip::udp; //---------------------------------------------------------------------- class subscriber { public: virtual ~subscriber() = default; virtual void deliver(const std::string& msg) = 0; }; typedef std::shared_ptr subscriber_ptr; //---------------------------------------------------------------------- class channel { public: void join(subscriber_ptr subscriber) { subscribers_.insert(subscriber); } void leave(subscriber_ptr subscriber) { subscribers_.erase(subscriber); } void deliver(const std::string& msg) { for (const auto& s : subscribers_) { s->deliver(msg); } } private: std::set subscribers_; }; //---------------------------------------------------------------------- // // This class manages socket timeouts by applying the concept of a deadline. // Some asynchronous operations are given deadlines by which they must complete. // Deadlines are enforced by two "actors" that persist for the lifetime of the // session object, one for input and one for output: // // +----------------+ +----------------+ // | | | | // | check_deadline |<-------+ | check_deadline |<-------+ // | | | | | | // +----------------+ | +----------------+ | // | | | | // async_wait() | +----------------+ async_wait() | +----------------+ // on input | | lambda | on output | | lambda | // deadline +--->| in | deadline +--->| in | // | check_deadline | | check_deadline | // +----------------+ +----------------+ // // If either deadline actor determines that the corresponding deadline has // expired, the socket is closed and any outstanding operations are cancelled. // // The input actor reads messages from the socket, where messages are delimited // by the newline character: // // +-------------+ // | | // | read_line |<----+ // | | | // +-------------+ | // | | // async_- | +-------------+ // read_- | | lambda | // until() +--->| in | // | read_line | // +-------------+ // // The deadline for receiving a complete message is 30 seconds. If a non-empty // message is received, it is delivered to all subscribers. If a heartbeat (a // message that consists of a single newline character) is received, a heartbeat // is enqueued for the client, provided there are no other messages waiting to // be sent. // // The output actor is responsible for sending messages to the client: // // +----------------+ // | |<---------------------+ // | await_output | | // | |<-------+ | // +----------------+ | | // | | | | // | async_- | +----------------+ | // | wait() | | lambda | | // | +->| in | | // | | await_output | | // | +----------------+ | // V | // +--------------+ +--------------+ // | | async_write() | lambda | // | write_line |-------------->| in | // | | | write_line | // +--------------+ +--------------+ // // The output actor first waits for an output message to be enqueued. It does // this by using a steady_timer as an asynchronous condition variable. The // steady_timer will be signalled whenever the output queue is non-empty. // // Once a message is available, it is sent to the client. The deadline for // sending a complete message is 30 seconds. After the message is successfully // sent, the output actor again waits for the output queue to become non-empty. // class tcp_session : public subscriber, public std::enable_shared_from_this { public: tcp_session(tcp::socket socket, channel& ch) : channel_(ch), socket_(std::move(socket)) { input_deadline_.expires_at(steady_timer::time_point::max()); output_deadline_.expires_at(steady_timer::time_point::max()); // The non_empty_output_queue_ steady_timer is set to the maximum time // point whenever the output queue is empty. This ensures that the output // actor stays asleep until a message is put into the queue. non_empty_output_queue_.expires_at(steady_timer::time_point::max()); } // Called by the server object to initiate the four actors. void start() { channel_.join(shared_from_this()); read_line(); check_deadline(input_deadline_); await_output(); check_deadline(output_deadline_); } private: void stop() { channel_.leave(shared_from_this()); std::error_code ignored_error; socket_.close(ignored_error); input_deadline_.cancel(); non_empty_output_queue_.cancel(); output_deadline_.cancel(); } bool stopped() const { return !socket_.is_open(); } void deliver(const std::string& msg) override { output_queue_.push_back(msg + "\n"); // Signal that the output queue contains messages. Modifying the expiry // will wake the output actor, if it is waiting on the timer. non_empty_output_queue_.expires_at(steady_timer::time_point::min()); } void read_line() { // Set a deadline for the read operation. input_deadline_.expires_after(std::chrono::seconds(30)); // Start an asynchronous operation to read a newline-delimited message. auto self(shared_from_this()); asio::async_read_until(socket_, asio::dynamic_buffer(input_buffer_), '\n', [this, self](const std::error_code& error, std::size_t n) { // Check if the session was stopped while the operation was pending. if (stopped()) return; if (!error) { // Extract the newline-delimited message from the buffer. std::string msg(input_buffer_.substr(0, n - 1)); input_buffer_.erase(0, n); if (!msg.empty()) { channel_.deliver(msg); } else { // We received a heartbeat message from the client. If there's // nothing else being sent or ready to be sent, send a heartbeat // right back. if (output_queue_.empty()) { output_queue_.push_back("\n"); // Signal that the output queue contains messages. Modifying // the expiry will wake the output actor, if it is waiting on // the timer. non_empty_output_queue_.expires_at( steady_timer::time_point::min()); } } read_line(); } else { stop(); } }); } void await_output() { auto self(shared_from_this()); non_empty_output_queue_.async_wait( [this, self](const std::error_code& /*error*/) { // Check if the session was stopped while the operation was pending. if (stopped()) return; if (output_queue_.empty()) { // There are no messages that are ready to be sent. The actor goes // to sleep by waiting on the non_empty_output_queue_ timer. When a // new message is added, the timer will be modified and the actor // will wake. non_empty_output_queue_.expires_at(steady_timer::time_point::max()); await_output(); } else { write_line(); } }); } void write_line() { // Set a deadline for the write operation. output_deadline_.expires_after(std::chrono::seconds(30)); // Start an asynchronous operation to send a message. auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(output_queue_.front()), [this, self](const std::error_code& error, std::size_t /*n*/) { // Check if the session was stopped while the operation was pending. if (stopped()) return; if (!error) { output_queue_.pop_front(); await_output(); } else { stop(); } }); } void check_deadline(steady_timer& deadline) { auto self(shared_from_this()); deadline.async_wait( [this, self, &deadline](const std::error_code& /*error*/) { // Check if the session was stopped while the operation was pending. if (stopped()) return; // Check whether the deadline has passed. We compare the deadline // against the current time since a new asynchronous operation may // have moved the deadline before this actor had a chance to run. if (deadline.expiry() <= steady_timer::clock_type::now()) { // The deadline has passed. Stop the session. The other actors will // terminate as soon as possible. stop(); } else { // Put the actor back to sleep. check_deadline(deadline); } }); } channel& channel_; tcp::socket socket_; std::string input_buffer_; steady_timer input_deadline_{socket_.get_executor().context()}; std::deque output_queue_; steady_timer non_empty_output_queue_{socket_.get_executor().context()}; steady_timer output_deadline_{socket_.get_executor().context()}; }; typedef std::shared_ptr tcp_session_ptr; //---------------------------------------------------------------------- class udp_broadcaster : public subscriber { public: udp_broadcaster(asio::io_context& io_context, const udp::endpoint& broadcast_endpoint) : socket_(io_context) { socket_.connect(broadcast_endpoint); socket_.set_option(udp::socket::broadcast(true)); } private: void deliver(const std::string& msg) { std::error_code ignored_error; socket_.send(asio::buffer(msg), 0, ignored_error); } udp::socket socket_; }; //---------------------------------------------------------------------- class server { public: server(asio::io_context& io_context, const tcp::endpoint& listen_endpoint, const udp::endpoint& broadcast_endpoint) : io_context_(io_context), acceptor_(io_context, listen_endpoint) { channel_.join( std::make_shared( io_context_, broadcast_endpoint)); accept(); } private: void accept() { acceptor_.async_accept( [this](const std::error_code& error, tcp::socket socket) { if (!error) { std::make_shared(std::move(socket), channel_)->start(); } accept(); }); } asio::io_context& io_context_; tcp::acceptor acceptor_; channel channel_; }; //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { using namespace std; // For atoi. if (argc != 4) { std::cerr << "Usage: server \n"; return 1; } asio::io_context io_context; tcp::endpoint listen_endpoint(tcp::v4(), atoi(argv[1])); udp::endpoint broadcast_endpoint( asio::ip::make_address(argv[2]), atoi(argv[3])); server s(io_context, listen_endpoint, broadcast_endpoint); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp11/timers/000077500000000000000000000000001340672067200173735ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp11/timers/time_t_timer.cpp000066400000000000000000000062121340672067200225610ustar00rootroot00000000000000// // time_t_timer.cpp // ~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include // A custom implementation of the Clock concept from the standard C++ library. struct time_t_clock { // The duration type. typedef std::chrono::steady_clock::duration duration; // The duration's underlying arithmetic representation. typedef duration::rep rep; // The ratio representing the duration's tick period. typedef duration::period period; // An absolute time point represented using the clock. typedef std::chrono::time_point time_point; // The clock is not monotonically increasing. static constexpr bool is_steady = false; // Get the current time. static time_point now() noexcept { return time_point() + std::chrono::seconds(std::time(0)); } }; // The asio::basic_waitable_timer template accepts an optional WaitTraits // template parameter. The underlying time_t clock has one-second granularity, // so these traits may be customised to reduce the latency between the clock // ticking over and a wait operation's completion. When the timeout is near // (less than one second away) we poll the clock more frequently to detect the // time change closer to when it occurs. The user can select the appropriate // trade off between accuracy and the increased CPU cost of polling. In extreme // cases, a zero duration may be returned to make the timers as accurate as // possible, albeit with 100% CPU usage. struct time_t_wait_traits { // Determine how long until the clock should be next polled to determine // whether the duration has elapsed. static time_t_clock::duration to_wait_duration( const time_t_clock::duration& d) { if (d > std::chrono::seconds(1)) return d - std::chrono::seconds(1); else if (d > std::chrono::seconds(0)) return std::chrono::milliseconds(10); else return std::chrono::seconds(0); } // Determine how long until the clock should be next polled to determine // whether the absoluate time has been reached. static time_t_clock::duration to_wait_duration( const time_t_clock::time_point& t) { return to_wait_duration(t - time_t_clock::now()); } }; typedef asio::basic_waitable_timer< time_t_clock, time_t_wait_traits> time_t_timer; int main() { try { asio::io_context io_context; time_t_timer timer(io_context); timer.expires_after(std::chrono::seconds(5)); std::cout << "Starting synchronous wait\n"; timer.wait(); std::cout << "Finished synchronous wait\n"; timer.expires_after(std::chrono::seconds(5)); std::cout << "Starting asynchronous wait\n"; timer.async_wait( [](const std::error_code& /*error*/) { std::cout << "timeout\n"; }); io_context.run(); std::cout << "Finished asynchronous wait\n"; } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/000077500000000000000000000000001340672067200160735ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp14/Makefile.am000066400000000000000000000032131340672067200201260ustar00rootroot00000000000000AUTOMAKE_OPTIONS = subdir-objects if SEPARATE_COMPILATION noinst_LIBRARIES = libasio.a libasio_a_SOURCES = ../../asio.cpp if HAVE_OPENSSL libasio_a_SOURCES += ../../asio_ssl.cpp endif LDADD = libasio.a endif noinst_PROGRAMS = \ echo/async_tcp_echo_server \ echo/async_udp_echo_server \ echo/blocking_tcp_echo_client \ echo/blocking_tcp_echo_server \ echo/blocking_udp_echo_client \ echo/blocking_udp_echo_server \ executors/actor \ executors/async_1 \ executors/async_2 \ executors/bank_account_1 \ executors/bank_account_2 \ executors/fork_join \ executors/pipeline \ executors/priority_scheduler \ iostreams/http_client AM_CXXFLAGS = -I$(srcdir)/../../../include echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp executors_actor_SOURCES = executors/actor.cpp executors_async_1_SOURCES = executors/async_1.cpp executors_async_2_SOURCES = executors/async_2.cpp executors_bank_account_1_SOURCES = executors/bank_account_1.cpp executors_bank_account_2_SOURCES = executors/bank_account_2.cpp executors_fork_join_SOURCES = executors/fork_join.cpp executors_pipeline_SOURCES = executors/pipeline.cpp executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp iostreams_http_client_SOURCES = iostreams/http_client.cpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/src/examples/cpp14/Makefile.in000066400000000000000000001057011340672067200201440ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp noinst_PROGRAMS = echo/async_tcp_echo_server$(EXEEXT) \ echo/async_udp_echo_server$(EXEEXT) \ echo/blocking_tcp_echo_client$(EXEEXT) \ echo/blocking_tcp_echo_server$(EXEEXT) \ echo/blocking_udp_echo_client$(EXEEXT) \ echo/blocking_udp_echo_server$(EXEEXT) \ executors/actor$(EXEEXT) executors/async_1$(EXEEXT) \ executors/async_2$(EXEEXT) executors/bank_account_1$(EXEEXT) \ executors/bank_account_2$(EXEEXT) executors/fork_join$(EXEEXT) \ executors/pipeline$(EXEEXT) \ executors/priority_scheduler$(EXEEXT) \ iostreams/http_client$(EXEEXT) subdir = src/examples/cpp14 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libasio_a_AR = $(AR) $(ARFLAGS) libasio_a_LIBADD = am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp am__dirstamp = $(am__leading_dot)dirstamp @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT) @SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \ @SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \ @SEPARATE_COMPILATION_TRUE@ $(am__objects_1) libasio_a_OBJECTS = $(am_libasio_a_OBJECTS) am_echo_async_tcp_echo_server_OBJECTS = \ echo/async_tcp_echo_server.$(OBJEXT) echo_async_tcp_echo_server_OBJECTS = \ $(am_echo_async_tcp_echo_server_OBJECTS) echo_async_tcp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_async_tcp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_async_udp_echo_server_OBJECTS = \ echo/async_udp_echo_server.$(OBJEXT) echo_async_udp_echo_server_OBJECTS = \ $(am_echo_async_udp_echo_server_OBJECTS) echo_async_udp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_async_udp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_tcp_echo_client_OBJECTS = \ echo/blocking_tcp_echo_client.$(OBJEXT) echo_blocking_tcp_echo_client_OBJECTS = \ $(am_echo_blocking_tcp_echo_client_OBJECTS) echo_blocking_tcp_echo_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_tcp_echo_server_OBJECTS = \ echo/blocking_tcp_echo_server.$(OBJEXT) echo_blocking_tcp_echo_server_OBJECTS = \ $(am_echo_blocking_tcp_echo_server_OBJECTS) echo_blocking_tcp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_udp_echo_client_OBJECTS = \ echo/blocking_udp_echo_client.$(OBJEXT) echo_blocking_udp_echo_client_OBJECTS = \ $(am_echo_blocking_udp_echo_client_OBJECTS) echo_blocking_udp_echo_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_echo_blocking_udp_echo_server_OBJECTS = \ echo/blocking_udp_echo_server.$(OBJEXT) echo_blocking_udp_echo_server_OBJECTS = \ $(am_echo_blocking_udp_echo_server_OBJECTS) echo_blocking_udp_echo_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_actor_OBJECTS = executors/actor.$(OBJEXT) executors_actor_OBJECTS = $(am_executors_actor_OBJECTS) executors_actor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_actor_DEPENDENCIES = libasio.a am_executors_async_1_OBJECTS = executors/async_1.$(OBJEXT) executors_async_1_OBJECTS = $(am_executors_async_1_OBJECTS) executors_async_1_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_async_1_DEPENDENCIES = libasio.a am_executors_async_2_OBJECTS = executors/async_2.$(OBJEXT) executors_async_2_OBJECTS = $(am_executors_async_2_OBJECTS) executors_async_2_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_async_2_DEPENDENCIES = libasio.a am_executors_bank_account_1_OBJECTS = \ executors/bank_account_1.$(OBJEXT) executors_bank_account_1_OBJECTS = \ $(am_executors_bank_account_1_OBJECTS) executors_bank_account_1_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_bank_account_1_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_bank_account_2_OBJECTS = \ executors/bank_account_2.$(OBJEXT) executors_bank_account_2_OBJECTS = \ $(am_executors_bank_account_2_OBJECTS) executors_bank_account_2_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_bank_account_2_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_fork_join_OBJECTS = executors/fork_join.$(OBJEXT) executors_fork_join_OBJECTS = $(am_executors_fork_join_OBJECTS) executors_fork_join_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_fork_join_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_pipeline_OBJECTS = executors/pipeline.$(OBJEXT) executors_pipeline_OBJECTS = $(am_executors_pipeline_OBJECTS) executors_pipeline_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_pipeline_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_executors_priority_scheduler_OBJECTS = \ executors/priority_scheduler.$(OBJEXT) executors_priority_scheduler_OBJECTS = \ $(am_executors_priority_scheduler_OBJECTS) executors_priority_scheduler_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@executors_priority_scheduler_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_iostreams_http_client_OBJECTS = iostreams/http_client.$(OBJEXT) iostreams_http_client_OBJECTS = $(am_iostreams_http_client_OBJECTS) iostreams_http_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@iostreams_http_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ../../$(DEPDIR)/asio.Po \ ../../$(DEPDIR)/asio_ssl.Po \ echo/$(DEPDIR)/async_tcp_echo_server.Po \ echo/$(DEPDIR)/async_udp_echo_server.Po \ echo/$(DEPDIR)/blocking_tcp_echo_client.Po \ echo/$(DEPDIR)/blocking_tcp_echo_server.Po \ echo/$(DEPDIR)/blocking_udp_echo_client.Po \ echo/$(DEPDIR)/blocking_udp_echo_server.Po \ executors/$(DEPDIR)/actor.Po executors/$(DEPDIR)/async_1.Po \ executors/$(DEPDIR)/async_2.Po \ executors/$(DEPDIR)/bank_account_1.Po \ executors/$(DEPDIR)/bank_account_2.Po \ executors/$(DEPDIR)/fork_join.Po \ executors/$(DEPDIR)/pipeline.Po \ executors/$(DEPDIR)/priority_scheduler.Po \ iostreams/$(DEPDIR)/http_client.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libasio_a_SOURCES) $(echo_async_tcp_echo_server_SOURCES) \ $(echo_async_udp_echo_server_SOURCES) \ $(echo_blocking_tcp_echo_client_SOURCES) \ $(echo_blocking_tcp_echo_server_SOURCES) \ $(echo_blocking_udp_echo_client_SOURCES) \ $(echo_blocking_udp_echo_server_SOURCES) \ $(executors_actor_SOURCES) $(executors_async_1_SOURCES) \ $(executors_async_2_SOURCES) \ $(executors_bank_account_1_SOURCES) \ $(executors_bank_account_2_SOURCES) \ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \ $(executors_priority_scheduler_SOURCES) \ $(iostreams_http_client_SOURCES) DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \ $(echo_async_tcp_echo_server_SOURCES) \ $(echo_async_udp_echo_server_SOURCES) \ $(echo_blocking_tcp_echo_client_SOURCES) \ $(echo_blocking_tcp_echo_server_SOURCES) \ $(echo_blocking_udp_echo_client_SOURCES) \ $(echo_blocking_udp_echo_server_SOURCES) \ $(executors_actor_SOURCES) $(executors_async_1_SOURCES) \ $(executors_async_2_SOURCES) \ $(executors_bank_account_1_SOURCES) \ $(executors_bank_account_2_SOURCES) \ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \ $(executors_priority_scheduler_SOURCES) \ $(iostreams_http_client_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects @SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a @SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \ @SEPARATE_COMPILATION_TRUE@ $(am__append_1) @SEPARATE_COMPILATION_TRUE@LDADD = libasio.a AM_CXXFLAGS = -I$(srcdir)/../../../include echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp executors_actor_SOURCES = executors/actor.cpp executors_async_1_SOURCES = executors/async_1.cpp executors_async_2_SOURCES = executors/async_2.cpp executors_bank_account_1_SOURCES = executors/bank_account_1.cpp executors_bank_account_2_SOURCES = executors/bank_account_2.cpp executors_fork_join_SOURCES = executors/fork_join.cpp executors_pipeline_SOURCES = executors/pipeline.cpp executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp iostreams_http_client_SOURCES = iostreams/http_client.cpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp14/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/examples/cpp14/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) ../../$(am__dirstamp): @$(MKDIR_P) ../.. @: > ../../$(am__dirstamp) ../../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../../$(DEPDIR) @: > ../../$(DEPDIR)/$(am__dirstamp) ../../asio.$(OBJEXT): ../../$(am__dirstamp) \ ../../$(DEPDIR)/$(am__dirstamp) ../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \ ../../$(DEPDIR)/$(am__dirstamp) libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES) $(AM_V_at)-rm -f libasio.a $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD) $(AM_V_at)$(RANLIB) libasio.a echo/$(am__dirstamp): @$(MKDIR_P) echo @: > echo/$(am__dirstamp) echo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) echo/$(DEPDIR) @: > echo/$(DEPDIR)/$(am__dirstamp) echo/async_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/async_tcp_echo_server$(EXEEXT): $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/async_tcp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_LDADD) $(LIBS) echo/async_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/async_udp_echo_server$(EXEEXT): $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/async_udp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_LDADD) $(LIBS) echo/blocking_tcp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_tcp_echo_client$(EXEEXT): $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_client_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_tcp_echo_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_LDADD) $(LIBS) echo/blocking_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_tcp_echo_server$(EXEEXT): $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_tcp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_LDADD) $(LIBS) echo/blocking_udp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_udp_echo_client$(EXEEXT): $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_client_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_udp_echo_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_LDADD) $(LIBS) echo/blocking_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \ echo/$(DEPDIR)/$(am__dirstamp) echo/blocking_udp_echo_server$(EXEEXT): $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp) @rm -f echo/blocking_udp_echo_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_LDADD) $(LIBS) executors/$(am__dirstamp): @$(MKDIR_P) executors @: > executors/$(am__dirstamp) executors/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) executors/$(DEPDIR) @: > executors/$(DEPDIR)/$(am__dirstamp) executors/actor.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/actor$(EXEEXT): $(executors_actor_OBJECTS) $(executors_actor_DEPENDENCIES) $(EXTRA_executors_actor_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/actor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_actor_OBJECTS) $(executors_actor_LDADD) $(LIBS) executors/async_1.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/async_1$(EXEEXT): $(executors_async_1_OBJECTS) $(executors_async_1_DEPENDENCIES) $(EXTRA_executors_async_1_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/async_1$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_async_1_OBJECTS) $(executors_async_1_LDADD) $(LIBS) executors/async_2.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/async_2$(EXEEXT): $(executors_async_2_OBJECTS) $(executors_async_2_DEPENDENCIES) $(EXTRA_executors_async_2_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/async_2$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_async_2_OBJECTS) $(executors_async_2_LDADD) $(LIBS) executors/bank_account_1.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/bank_account_1$(EXEEXT): $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_DEPENDENCIES) $(EXTRA_executors_bank_account_1_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/bank_account_1$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_LDADD) $(LIBS) executors/bank_account_2.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/bank_account_2$(EXEEXT): $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_DEPENDENCIES) $(EXTRA_executors_bank_account_2_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/bank_account_2$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_LDADD) $(LIBS) executors/fork_join.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/fork_join$(EXEEXT): $(executors_fork_join_OBJECTS) $(executors_fork_join_DEPENDENCIES) $(EXTRA_executors_fork_join_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/fork_join$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_fork_join_OBJECTS) $(executors_fork_join_LDADD) $(LIBS) executors/pipeline.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/pipeline$(EXEEXT): $(executors_pipeline_OBJECTS) $(executors_pipeline_DEPENDENCIES) $(EXTRA_executors_pipeline_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/pipeline$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_pipeline_OBJECTS) $(executors_pipeline_LDADD) $(LIBS) executors/priority_scheduler.$(OBJEXT): executors/$(am__dirstamp) \ executors/$(DEPDIR)/$(am__dirstamp) executors/priority_scheduler$(EXEEXT): $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_DEPENDENCIES) $(EXTRA_executors_priority_scheduler_DEPENDENCIES) executors/$(am__dirstamp) @rm -f executors/priority_scheduler$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_LDADD) $(LIBS) iostreams/$(am__dirstamp): @$(MKDIR_P) iostreams @: > iostreams/$(am__dirstamp) iostreams/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) iostreams/$(DEPDIR) @: > iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/http_client.$(OBJEXT): iostreams/$(am__dirstamp) \ iostreams/$(DEPDIR)/$(am__dirstamp) iostreams/http_client$(EXEEXT): $(iostreams_http_client_OBJECTS) $(iostreams_http_client_DEPENDENCIES) $(EXTRA_iostreams_http_client_DEPENDENCIES) iostreams/$(am__dirstamp) @rm -f iostreams/http_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(iostreams_http_client_OBJECTS) $(iostreams_http_client_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../../*.$(OBJEXT) -rm -f echo/*.$(OBJEXT) -rm -f executors/*.$(OBJEXT) -rm -f iostreams/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_tcp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_udp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/actor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/async_1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/async_2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/fork_join.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/pipeline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/priority_scheduler.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/http_client.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../../$(DEPDIR)/$(am__dirstamp) -rm -f ../../$(am__dirstamp) -rm -f echo/$(DEPDIR)/$(am__dirstamp) -rm -f echo/$(am__dirstamp) -rm -f executors/$(DEPDIR)/$(am__dirstamp) -rm -f executors/$(am__dirstamp) -rm -f iostreams/$(DEPDIR)/$(am__dirstamp) -rm -f iostreams/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -f ../../$(DEPDIR)/asio.Po -rm -f ../../$(DEPDIR)/asio_ssl.Po -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po -rm -f executors/$(DEPDIR)/actor.Po -rm -f executors/$(DEPDIR)/async_1.Po -rm -f executors/$(DEPDIR)/async_2.Po -rm -f executors/$(DEPDIR)/bank_account_1.Po -rm -f executors/$(DEPDIR)/bank_account_2.Po -rm -f executors/$(DEPDIR)/fork_join.Po -rm -f executors/$(DEPDIR)/pipeline.Po -rm -f executors/$(DEPDIR)/priority_scheduler.Po -rm -f iostreams/$(DEPDIR)/http_client.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ../../$(DEPDIR)/asio.Po -rm -f ../../$(DEPDIR)/asio_ssl.Po -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po -rm -f executors/$(DEPDIR)/actor.Po -rm -f executors/$(DEPDIR)/async_1.Po -rm -f executors/$(DEPDIR)/async_2.Po -rm -f executors/$(DEPDIR)/bank_account_1.Po -rm -f executors/$(DEPDIR)/bank_account_2.Po -rm -f executors/$(DEPDIR)/fork_join.Po -rm -f executors/$(DEPDIR)/pipeline.Po -rm -f executors/$(DEPDIR)/priority_scheduler.Po -rm -f iostreams/$(DEPDIR)/http_client.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/src/examples/cpp14/echo/000077500000000000000000000000001340672067200170115ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp14/echo/async_tcp_echo_server.cpp000066400000000000000000000042041340672067200240640ustar00rootroot00000000000000// // async_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include using asio::ip::tcp; class session : public std::enable_shared_from_this { public: session(tcp::socket socket) : socket_(std::move(socket)) { } void start() { do_read(); } private: void do_read() { auto self(shared_from_this()); socket_.async_read_some(asio::buffer(data_, max_length), [this, self](std::error_code ec, std::size_t length) { if (!ec) { do_write(length); } }); } void do_write(std::size_t length) { auto self(shared_from_this()); asio::async_write(socket_, asio::buffer(data_, length), [this, self](std::error_code ec, std::size_t /*length*/) { if (!ec) { do_read(); } }); } tcp::socket socket_; enum { max_length = 1024 }; char data_[max_length]; }; class server { public: server(asio::io_context& io_context, short port) : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)), socket_(io_context) { do_accept(); } private: void do_accept() { acceptor_.async_accept(socket_, [this](std::error_code ec) { if (!ec) { std::make_shared(std::move(socket_))->start(); } do_accept(); }); } tcp::acceptor acceptor_; tcp::socket socket_; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_tcp_echo_server \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/echo/async_udp_echo_server.cpp000066400000000000000000000032151340672067200240670ustar00rootroot00000000000000// // async_udp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include using asio::ip::udp; class server { public: server(asio::io_context& io_context, short port) : socket_(io_context, udp::endpoint(udp::v4(), port)) { do_receive(); } void do_receive() { socket_.async_receive_from( asio::buffer(data_, max_length), sender_endpoint_, [this](std::error_code ec, std::size_t bytes_recvd) { if (!ec && bytes_recvd > 0) { do_send(bytes_recvd); } else { do_receive(); } }); } void do_send(std::size_t length) { socket_.async_send_to( asio::buffer(data_, length), sender_endpoint_, [this](std::error_code /*ec*/, std::size_t /*bytes_sent*/) { do_receive(); }); } private: udp::socket socket_; udp::endpoint sender_endpoint_; enum { max_length = 1024 }; char data_[max_length]; }; int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: async_udp_echo_server \n"; return 1; } asio::io_context io_context; server s(io_context, std::atoi(argv[1])); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp000066400000000000000000000024261340672067200245130ustar00rootroot00000000000000// // blocking_tcp_echo_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include "asio.hpp" using asio::ip::tcp; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: blocking_tcp_echo_client \n"; return 1; } asio::io_context io_context; tcp::socket s(io_context); tcp::resolver resolver(io_context); asio::connect(s, resolver.resolve(argv[1], argv[2])); std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = std::strlen(request); asio::write(s, asio::buffer(request, request_length)); char reply[max_length]; size_t reply_length = asio::read(s, asio::buffer(reply, request_length)); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp000066400000000000000000000031331340672067200245370ustar00rootroot00000000000000// // blocking_tcp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include using asio::ip::tcp; const int max_length = 1024; void session(tcp::socket sock) { try { for (;;) { char data[max_length]; std::error_code error; size_t length = sock.read_some(asio::buffer(data), error); if (error == asio::stream_errc::eof) break; // Connection closed cleanly by peer. else if (error) throw std::system_error(error); // Some other error. asio::write(sock, asio::buffer(data, length)); } } catch (std::exception& e) { std::cerr << "Exception in thread: " << e.what() << "\n"; } } void server(asio::io_context& io_context, unsigned short port) { tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port)); for (;;) { tcp::socket sock(io_context); a.accept(sock); std::thread(session, std::move(sock)).detach(); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: blocking_tcp_echo_server \n"; return 1; } asio::io_context io_context; server(io_context, std::atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/echo/blocking_udp_echo_client.cpp000066400000000000000000000026661340672067200245230ustar00rootroot00000000000000// // blocking_udp_echo_client.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include using asio::ip::udp; enum { max_length = 1024 }; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cerr << "Usage: blocking_udp_echo_client \n"; return 1; } asio::io_context io_context; udp::socket s(io_context, udp::endpoint(udp::v4(), 0)); udp::resolver resolver(io_context); udp::endpoint endpoint = *resolver.resolve(udp::v4(), argv[1], argv[2]).begin(); std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = std::strlen(request); s.send_to(asio::buffer(request, request_length), endpoint); char reply[max_length]; udp::endpoint sender_endpoint; size_t reply_length = s.receive_from( asio::buffer(reply, max_length), sender_endpoint); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/echo/blocking_udp_echo_server.cpp000066400000000000000000000022301340672067200245360ustar00rootroot00000000000000// // blocking_udp_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include using asio::ip::udp; enum { max_length = 1024 }; void server(asio::io_context& io_context, unsigned short port) { udp::socket sock(io_context, udp::endpoint(udp::v4(), port)); for (;;) { char data[max_length]; udp::endpoint sender_endpoint; size_t length = sock.receive_from( asio::buffer(data, max_length), sender_endpoint); sock.send_to(asio::buffer(data, length), sender_endpoint); } } int main(int argc, char* argv[]) { try { if (argc != 2) { std::cerr << "Usage: blocking_udp_echo_server \n"; return 1; } asio::io_context io_context; server(io_context, std::atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp14/executors/000077500000000000000000000000001340672067200201145ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp14/executors/actor.cpp000066400000000000000000000165631340672067200217430ustar00rootroot00000000000000#include #include #include #include #include #include #include using asio::defer; using asio::executor; using asio::post; using asio::strand; using asio::system_executor; //------------------------------------------------------------------------------ // A tiny actor framework // ~~~~~~~~~~~~~~~~~~~~~~ class actor; // Used to identify the sender and recipient of messages. typedef actor* actor_address; // Base class for all registered message handlers. class message_handler_base { public: virtual ~message_handler_base() {} // Used to determine which message handlers receive an incoming message. virtual const std::type_info& message_id() const = 0; }; // Base class for a handler for a specific message type. template class message_handler : public message_handler_base { public: // Handle an incoming message. virtual void handle_message(Message msg, actor_address from) = 0; }; // Concrete message handler for a specific message type. template class mf_message_handler : public message_handler { public: // Construct a message handler to invoke the specified member function. mf_message_handler(void (Actor::* mf)(Message, actor_address), Actor* a) : function_(mf), actor_(a) { } // Used to determine which message handlers receive an incoming message. virtual const std::type_info& message_id() const { return typeid(Message); } // Handle an incoming message. virtual void handle_message(Message msg, actor_address from) { (actor_->*function_)(std::move(msg), from); } // Determine whether the message handler represents the specified function. bool is_function(void (Actor::* mf)(Message, actor_address)) const { return mf == function_; } private: void (Actor::* function_)(Message, actor_address); Actor* actor_; }; // Base class for all actors. class actor { public: virtual ~actor() { } // Obtain the actor's address for use as a message sender or recipient. actor_address address() { return this; } // Send a message from one actor to another. template friend void send(Message msg, actor_address from, actor_address to) { // Execute the message handler in the context of the target's executor. post(to->executor_, [=, msg=std::move(msg)] { to->call_handler(std::move(msg), from); }); } protected: // Construct the actor to use the specified executor for all message handlers. actor(executor e) : executor_(std::move(e)) { } // Register a handler for a specific message type. Duplicates are permitted. template void register_handler(void (Actor::* mf)(Message, actor_address)) { handlers_.push_back( std::make_shared>( mf, static_cast(this))); } // Deregister a handler. Removes only the first matching handler. template void deregister_handler(void (Actor::* mf)(Message, actor_address)) { const std::type_info& id = typeid(Message); for (auto iter = handlers_.begin(); iter != handlers_.end(); ++iter) { if ((*iter)->message_id() == id) { auto mh = static_cast*>(iter->get()); if (mh->is_function(mf)) { handlers_.erase(iter); return; } } } } // Send a message from within a message handler. template void tail_send(Message msg, actor_address to) { // Execute the message handler in the context of the target's executor. defer(to->executor_, [=, msg=std::move(msg), from=this] { to->call_handler(std::move(msg), from); }); } private: // Find the matching message handlers, if any, and call them. template void call_handler(Message msg, actor_address from) { const std::type_info& message_id = typeid(Message); for (auto& h: handlers_) { if (h->message_id() == message_id) { auto mh = static_cast*>(h.get()); mh->handle_message(msg, from); } } } // All messages associated with a single actor object should be processed // non-concurrently. We use a strand to ensure non-concurrent execution even // if the underlying executor may use multiple threads. strand executor_; std::vector> handlers_; }; // A concrete actor that allows synchronous message retrieval. template class receiver : public actor { public: receiver() : actor(system_executor()) { register_handler(&receiver::message_handler); } // Block until a message has been received. Message wait() { std::unique_lock lock(mutex_); condition_.wait(lock, [this]{ return !message_queue_.empty(); }); Message msg(std::move(message_queue_.front())); message_queue_.pop_front(); return msg; } private: // Handle a new message by adding it to the queue and waking a waiter. void message_handler(Message msg, actor_address /* from */) { std::lock_guard lock(mutex_); message_queue_.push_back(std::move(msg)); condition_.notify_one(); } std::mutex mutex_; std::condition_variable condition_; std::deque message_queue_; }; //------------------------------------------------------------------------------ #include #include using asio::thread_pool; class member : public actor { public: explicit member(executor e) : actor(std::move(e)) { register_handler(&member::init_handler); } private: void init_handler(actor_address next, actor_address from) { next_ = next; caller_ = from; register_handler(&member::token_handler); deregister_handler(&member::init_handler); } void token_handler(int token, actor_address /*from*/) { int msg(token); actor_address to(caller_); if (token > 0) { msg = token - 1; to = next_; } tail_send(msg, to); } actor_address next_; actor_address caller_; }; int main() { const std::size_t num_threads = 16; const int num_hops = 50000000; const std::size_t num_actors = 503; const int token_value = (num_hops + num_actors - 1) / num_actors; const std::size_t actors_per_thread = num_actors / num_threads; struct single_thread_pool : thread_pool { single_thread_pool() : thread_pool(1) {} }; single_thread_pool pools[num_threads]; std::vector> members(num_actors); receiver rcvr; // Create the member actors. for (std::size_t i = 0; i < num_actors; ++i) members[i] = std::make_shared(pools[(i / actors_per_thread) % num_threads].get_executor()); // Initialise the actors by passing each one the address of the next actor in the ring. for (std::size_t i = num_actors, next_i = 0; i > 0; next_i = --i) send(members[next_i]->address(), rcvr.address(), members[i - 1]->address()); // Send exactly one token to each actor, all with the same initial value, rounding up if required. for (std::size_t i = 0; i < num_actors; ++i) send(token_value, rcvr.address(), members[i]->address()); // Wait for all signal messages, indicating the tokens have all reached zero. for (std::size_t i = 0; i < num_actors; ++i) rcvr.wait(); } asio-1.12.2/src/examples/cpp14/executors/async_1.cpp000066400000000000000000000022151340672067200221550ustar00rootroot00000000000000#include #include #include #include using asio::bind_executor; using asio::dispatch; using asio::make_work_guard; using asio::post; using asio::thread_pool; // A function to asynchronously read a single line from an input stream. template void async_getline(std::istream& is, Handler handler) { // Create executor_work for the handler's associated executor. auto work = make_work_guard(handler); // Post a function object to do the work asynchronously. post([&is, work, handler=std::move(handler)]() mutable { std::string line; std::getline(is, line); // Pass the result to the handler, via the associated executor. dispatch(work.get_executor(), [line=std::move(line), handler=std::move(handler)]() mutable { handler(std::move(line)); }); }); } int main() { thread_pool pool; std::cout << "Enter a line: "; async_getline(std::cin, bind_executor(pool, [](std::string line) { std::cout << "Line: " << line << "\n"; })); pool.join(); } asio-1.12.2/src/examples/cpp14/executors/async_2.cpp000066400000000000000000000035521340672067200221630ustar00rootroot00000000000000#include #include #include #include using asio::bind_executor; using asio::dispatch; using asio::get_associated_executor; using asio::make_work_guard; using asio::post; using asio::thread_pool; // A function to asynchronously read a single line from an input stream. template void async_getline(std::istream& is, Handler handler) { // Create executor_work for the handler's associated executor. auto work = make_work_guard(handler); // Post a function object to do the work asynchronously. post([&is, work, handler=std::move(handler)]() mutable { std::string line; std::getline(is, line); // Pass the result to the handler, via the associated executor. dispatch(work.get_executor(), [line=std::move(line), handler=std::move(handler)]() mutable { handler(std::move(line)); }); }); } // A function to asynchronously read multiple lines from an input stream. template void async_getlines(std::istream& is, std::string init, Handler handler) { // Get the final handler's associated executor. auto ex = get_associated_executor(handler); // Use the associated executor for each operation in the composition. async_getline(is, bind_executor(ex, [&is, lines=std::move(init), handler=std::move(handler)] (std::string line) mutable { if (line.empty()) handler(lines); else async_getlines(is, lines + line + "\n", std::move(handler)); })); } int main() { thread_pool pool; std::cout << "Enter text, terminating with a blank line:\n"; async_getlines(std::cin, "", bind_executor(pool, [](std::string lines) { std::cout << "Lines:\n" << lines << "\n"; })); pool.join(); } asio-1.12.2/src/examples/cpp14/executors/bank_account_1.cpp000066400000000000000000000014431340672067200234710ustar00rootroot00000000000000#include #include #include using asio::post; using asio::thread_pool; // Traditional active object pattern. // Member functions do not block. class bank_account { int balance_ = 0; mutable thread_pool pool_{1}; public: void deposit(int amount) { post(pool_, [=] { balance_ += amount; }); } void withdraw(int amount) { post(pool_, [=] { if (balance_ >= amount) balance_ -= amount; }); } void print_balance() const { post(pool_, [=] { std::cout << "balance = " << balance_ << "\n"; }); } ~bank_account() { pool_.join(); } }; int main() { bank_account acct; acct.deposit(20); acct.withdraw(10); acct.print_balance(); } asio-1.12.2/src/examples/cpp14/executors/bank_account_2.cpp000066400000000000000000000016001340672067200234650ustar00rootroot00000000000000#include #include #include using asio::post; using asio::thread_pool; using asio::use_future; // Traditional active object pattern. // Member functions block until operation is finished. class bank_account { int balance_ = 0; mutable thread_pool pool_{1}; public: void deposit(int amount) { post(pool_, use_future([=] { balance_ += amount; })).get(); } void withdraw(int amount) { post(pool_, use_future([=] { if (balance_ >= amount) balance_ -= amount; })).get(); } int balance() const { return post(pool_, use_future([=] { return balance_; })).get(); } }; int main() { bank_account acct; acct.deposit(20); acct.withdraw(10); std::cout << "balance = " << acct.balance() << "\n"; } asio-1.12.2/src/examples/cpp14/executors/fork_join.cpp000066400000000000000000000204511340672067200226020ustar00rootroot00000000000000#include #include #include #include #include #include #include #include using asio::dispatch; using asio::execution_context; using asio::thread_pool; // A fixed-size thread pool used to implement fork/join semantics. Functions // are scheduled using a simple FIFO queue. Implementing work stealing, or // using a queue based on atomic operations, are left as tasks for the reader. class fork_join_pool : public execution_context { public: // The constructor starts a thread pool with the specified number of threads. // Note that the thread_count is not a fixed limit on the pool's concurrency. // Additional threads may temporarily be added to the pool if they join a // fork_executor. explicit fork_join_pool( std::size_t thread_count = std::thread::hardware_concurrency() * 2) : use_count_(1), threads_(thread_count) { try { // Ask each thread in the pool to dequeue and execute functions until // it is time to shut down, i.e. the use count is zero. for (thread_count_ = 0; thread_count_ < thread_count; ++thread_count_) { dispatch(threads_, [&] { std::unique_lock lock(mutex_); while (use_count_ > 0) if (!execute_next(lock)) condition_.wait(lock); }); } } catch (...) { stop_threads(); threads_.join(); throw; } } // The destructor waits for the pool to finish executing functions. ~fork_join_pool() { stop_threads(); threads_.join(); } private: friend class fork_executor; // The base for all functions that are queued in the pool. struct function_base { std::shared_ptr work_count_; void (*execute_)(std::shared_ptr& p); }; // Execute the next function from the queue, if any. Returns true if a // function was executed, and false if the queue was empty. bool execute_next(std::unique_lock& lock) { if (queue_.empty()) return false; auto p(queue_.front()); queue_.pop(); lock.unlock(); execute(lock, p); return true; } // Execute a function and decrement the outstanding work. void execute(std::unique_lock& lock, std::shared_ptr& p) { std::shared_ptr work_count(std::move(p->work_count_)); try { p->execute_(p); lock.lock(); do_work_finished(work_count); } catch (...) { lock.lock(); do_work_finished(work_count); throw; } } // Increment outstanding work. void do_work_started(const std::shared_ptr& work_count) noexcept { if (++(*work_count) == 1) ++use_count_; } // Decrement outstanding work. Notify waiting threads if we run out. void do_work_finished(const std::shared_ptr& work_count) noexcept { if (--(*work_count) == 0) { --use_count_; condition_.notify_all(); } } // Dispatch a function, executing it immediately if the queue is already // loaded. Otherwise adds the function to the queue and wakes a thread. void do_dispatch(std::shared_ptr p, const std::shared_ptr& work_count) { std::unique_lock lock(mutex_); if (queue_.size() > thread_count_ * 16) { do_work_started(work_count); lock.unlock(); execute(lock, p); } else { queue_.push(p); do_work_started(work_count); condition_.notify_one(); } } // Add a function to the queue and wake a thread. void do_post(std::shared_ptr p, const std::shared_ptr& work_count) { std::lock_guard lock(mutex_); queue_.push(p); do_work_started(work_count); condition_.notify_one(); } // Ask all threads to shut down. void stop_threads() { std::lock_guard lock(mutex_); --use_count_; condition_.notify_all(); } std::mutex mutex_; std::condition_variable condition_; std::queue> queue_; std::size_t use_count_; std::size_t thread_count_; thread_pool threads_; }; // A class that satisfies the Executor requirements. Every function or piece of // work associated with a fork_executor is part of a single, joinable group. class fork_executor { public: fork_executor(fork_join_pool& ctx) : context_(ctx), work_count_(std::make_shared(0)) { } fork_join_pool& context() const noexcept { return context_; } void on_work_started() const noexcept { std::lock_guard lock(context_.mutex_); context_.do_work_started(work_count_); } void on_work_finished() const noexcept { std::lock_guard lock(context_.mutex_); context_.do_work_finished(work_count_); } template void dispatch(Func&& f, const Alloc& a) const { auto p(std::allocate_shared>( typename std::allocator_traits::template rebind_alloc(a), std::move(f), work_count_)); context_.do_dispatch(p, work_count_); } template void post(Func f, const Alloc& a) const { auto p(std::allocate_shared>( typename std::allocator_traits::template rebind_alloc(a), std::move(f), work_count_)); context_.do_post(p, work_count_); } template void defer(Func&& f, const Alloc& a) const { post(std::forward(f), a); } friend bool operator==(const fork_executor& a, const fork_executor& b) noexcept { return a.work_count_ == b.work_count_; } friend bool operator!=(const fork_executor& a, const fork_executor& b) noexcept { return a.work_count_ != b.work_count_; } // Block until all work associated with the executor is complete. While it is // waiting, the thread may be borrowed to execute functions from the queue. void join() const { std::unique_lock lock(context_.mutex_); while (*work_count_ > 0) if (!context_.execute_next(lock)) context_.condition_.wait(lock); } private: template struct function : fork_join_pool::function_base { explicit function(Func f, const std::shared_ptr& w) : function_(std::move(f)) { work_count_ = w; execute_ = [](std::shared_ptr& p) { Func tmp(std::move(static_cast(p.get())->function_)); p.reset(); tmp(); }; } Func function_; }; fork_join_pool& context_; std::shared_ptr work_count_; }; // Helper class to automatically join a fork_executor when exiting a scope. class join_guard { public: explicit join_guard(const fork_executor& ex) : ex_(ex) {} join_guard(const join_guard&) = delete; join_guard(join_guard&&) = delete; ~join_guard() { ex_.join(); } private: fork_executor ex_; }; //------------------------------------------------------------------------------ #include #include #include #include fork_join_pool pool; template void fork_join_sort(Iterator begin, Iterator end) { std::size_t n = end - begin; if (n > 32768) { { fork_executor fork(pool); join_guard join(fork); dispatch(fork, [=]{ fork_join_sort(begin, begin + n / 2); }); dispatch(fork, [=]{ fork_join_sort(begin + n / 2, end); }); } std::inplace_merge(begin, begin + n / 2, end); } else { std::sort(begin, end); } } int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage: fork_join \n"; return 1; } std::vector vec(std::atoll(argv[1])); std::iota(vec.begin(), vec.end(), 0); std::random_device rd; std::mt19937 g(rd()); std::shuffle(vec.begin(), vec.end(), g); std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); fork_join_sort(vec.begin(), vec.end()); std::chrono::steady_clock::duration elapsed = std::chrono::steady_clock::now() - start; std::cout << "sort took "; std::cout << std::chrono::duration_cast(elapsed).count(); std::cout << " microseconds" << std::endl; } asio-1.12.2/src/examples/cpp14/executors/pipeline.cpp000066400000000000000000000155031340672067200224310ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using asio::execution_context; using asio::executor_binder; using asio::get_associated_executor; using asio::post; using asio::system_executor; using asio::use_future; using asio::use_service; // An executor that launches a new thread for each function submitted to it. // This class satisfies the Executor requirements. class thread_executor { private: // Service to track all threads started through a thread_executor. class thread_bag : public execution_context::service { public: typedef thread_bag key_type; explicit thread_bag(execution_context& ctx) : execution_context::service(ctx) { } void add_thread(std::thread&& t) { std::unique_lock lock(mutex_); threads_.push_back(std::move(t)); } private: virtual void shutdown() { for (auto& t : threads_) t.join(); } std::mutex mutex_; std::vector threads_; }; public: execution_context& context() const noexcept { return system_executor().context(); } void on_work_started() const noexcept { // This executor doesn't count work. } void on_work_finished() const noexcept { // This executor doesn't count work. } template void dispatch(Func&& f, const Alloc& a) const { post(std::forward(f), a); } template void post(Func f, const Alloc&) const { thread_bag& bag = use_service(context()); bag.add_thread(std::thread(std::move(f))); } template void defer(Func&& f, const Alloc& a) const { post(std::forward(f), a); } friend bool operator==(const thread_executor&, const thread_executor&) noexcept { return true; } friend bool operator!=(const thread_executor&, const thread_executor&) noexcept { return false; } }; // Base class for all thread-safe queue implementations. class queue_impl_base { template friend class queue_front; template friend class queue_back; std::mutex mutex_; std::condition_variable condition_; bool stop_ = false; }; // Underlying implementation of a thread-safe queue, shared between the // queue_front and queue_back classes. template class queue_impl : public queue_impl_base { template friend class queue_front; template friend class queue_back; std::queue queue_; }; // The front end of a queue between consecutive pipeline stages. template class queue_front { public: typedef T value_type; explicit queue_front(std::shared_ptr> impl) : impl_(impl) { } void push(T t) { std::unique_lock lock(impl_->mutex_); impl_->queue_.push(std::move(t)); impl_->condition_.notify_one(); } void stop() { std::unique_lock lock(impl_->mutex_); impl_->stop_ = true; impl_->condition_.notify_one(); } private: std::shared_ptr> impl_; }; // The back end of a queue between consecutive pipeline stages. template class queue_back { public: typedef T value_type; explicit queue_back(std::shared_ptr> impl) : impl_(impl) { } bool pop(T& t) { std::unique_lock lock(impl_->mutex_); while (impl_->queue_.empty() && !impl_->stop_) impl_->condition_.wait(lock); if (!impl_->queue_.empty()) { t = impl_->queue_.front(); impl_->queue_.pop(); return true; } return false; } private: std::shared_ptr> impl_; }; // Launch the last stage in a pipeline. template std::future pipeline(queue_back in, F f) { // Get the function's associated executor, defaulting to thread_executor. auto ex = get_associated_executor(f, thread_executor()); // Run the function, and as we're the last stage return a future so that the // caller can wait for the pipeline to finish. return post(ex, use_future([in, f = std::move(f)]() mutable { f(in); })); } // Launch an intermediate stage in a pipeline. template std::future pipeline(queue_back in, F f, Tail... t) { // Determine the output queue type. typedef typename executor_binder::second_argument_type::value_type output_value_type; // Create the output queue and its implementation. auto out_impl = std::make_shared>(); queue_front out(out_impl); queue_back next_in(out_impl); // Get the function's associated executor, defaulting to thread_executor. auto ex = get_associated_executor(f, thread_executor()); // Run the function. post(ex, [in, out, f = std::move(f)]() mutable { f(in, out); out.stop(); }); // Launch the rest of the pipeline. return pipeline(next_in, std::move(t)...); } // Launch the first stage in a pipeline. template std::future pipeline(F f, Tail... t) { // Determine the output queue type. typedef typename executor_binder::argument_type::value_type output_value_type; // Create the output queue and its implementation. auto out_impl = std::make_shared>(); queue_front out(out_impl); queue_back next_in(out_impl); // Get the function's associated executor, defaulting to thread_executor. auto ex = get_associated_executor(f, thread_executor()); // Run the function. post(ex, [out, f = std::move(f)]() mutable { f(out); out.stop(); }); // Launch the rest of the pipeline. return pipeline(next_in, std::move(t)...); } //------------------------------------------------------------------------------ #include #include #include using asio::bind_executor; using asio::thread_pool; void reader(queue_front out) { std::string line; while (std::getline(std::cin, line)) out.push(line); } void filter(queue_back in, queue_front out) { std::string line; while (in.pop(line)) if (line.length() > 5) out.push(line); } void upper(queue_back in, queue_front out) { std::string line; while (in.pop(line)) { std::string new_line; for (char c : line) new_line.push_back(std::toupper(c)); out.push(new_line); } } void writer(queue_back in) { std::size_t count = 0; std::string line; while (in.pop(line)) std::cout << count++ << ": " << line << std::endl; } int main() { thread_pool pool; auto f = pipeline(reader, filter, bind_executor(pool, upper), writer); f.wait(); } asio-1.12.2/src/examples/cpp14/executors/priority_scheduler.cpp000066400000000000000000000074471340672067200245530ustar00rootroot00000000000000#include #include #include #include #include #include using asio::dispatch; using asio::execution_context; class priority_scheduler : public execution_context { public: // A class that satisfies the Executor requirements. class executor_type { public: executor_type(priority_scheduler& ctx, int pri) noexcept : context_(ctx), priority_(pri) { } priority_scheduler& context() const noexcept { return context_; } void on_work_started() const noexcept { // This executor doesn't count work. Instead, the scheduler simply runs // until explicitly stopped. } void on_work_finished() const noexcept { // This executor doesn't count work. Instead, the scheduler simply runs // until explicitly stopped. } template void dispatch(Func&& f, const Alloc& a) const { post(std::forward(f), a); } template void post(Func f, const Alloc& a) const { auto p(std::allocate_shared>( typename std::allocator_traits< Alloc>::template rebind_alloc(a), priority_, std::move(f))); std::lock_guard lock(context_.mutex_); context_.queue_.push(p); context_.condition_.notify_one(); } template void defer(Func&& f, const Alloc& a) const { post(std::forward(f), a); } friend bool operator==(const executor_type& a, const executor_type& b) noexcept { return &a.context_ == &b.context_; } friend bool operator!=(const executor_type& a, const executor_type& b) noexcept { return &a.context_ != &b.context_; } private: priority_scheduler& context_; int priority_; }; executor_type get_executor(int pri = 0) noexcept { return executor_type(*const_cast(this), pri); } void run() { std::unique_lock lock(mutex_); for (;;) { condition_.wait(lock, [&]{ return stopped_ || !queue_.empty(); }); if (stopped_) return; auto p(queue_.top()); queue_.pop(); lock.unlock(); p->execute_(p); lock.lock(); } } void stop() { std::lock_guard lock(mutex_); stopped_ = true; condition_.notify_all(); } private: struct item_base { int priority_; void (*execute_)(std::shared_ptr&); }; template struct item : item_base { item(int pri, Func f) : function_(std::move(f)) { priority_ = pri; execute_ = [](std::shared_ptr& p) { Func tmp(std::move(static_cast(p.get())->function_)); p.reset(); tmp(); }; } Func function_; }; struct item_comp { bool operator()( const std::shared_ptr& a, const std::shared_ptr& b) { return a->priority_ < b->priority_; } }; std::mutex mutex_; std::condition_variable condition_; std::priority_queue< std::shared_ptr, std::vector>, item_comp> queue_; bool stopped_ = false; }; int main() { priority_scheduler sched; auto low = sched.get_executor(0); auto med = sched.get_executor(1); auto high = sched.get_executor(2); dispatch(low, []{ std::cout << "1\n"; }); dispatch(low, []{ std::cout << "11\n"; }); dispatch(med, []{ std::cout << "2\n"; }); dispatch(med, []{ std::cout << "22\n"; }); dispatch(high, []{ std::cout << "3\n"; }); dispatch(high, []{ std::cout << "33\n"; }); dispatch(high, []{ std::cout << "333\n"; }); dispatch(sched.get_executor(-1), [&]{ sched.stop(); }); sched.run(); } asio-1.12.2/src/examples/cpp14/iostreams/000077500000000000000000000000001340672067200201015ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp14/iostreams/http_client.cpp000066400000000000000000000050211340672067200231200ustar00rootroot00000000000000// // http_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include using asio::ip::tcp; int main(int argc, char* argv[]) { try { if (argc != 3) { std::cout << "Usage: http_client \n"; std::cout << "Example:\n"; std::cout << " http_client www.boost.org /LICENSE_1_0.txt\n"; return 1; } asio::ip::tcp::iostream s; // The entire sequence of I/O operations must complete within 60 seconds. // If an expiry occurs, the socket is automatically closed and the stream // becomes bad. s.expires_after(std::chrono::seconds(60)); // Establish a connection to the server. s.connect(argv[1], "http"); if (!s) { std::cout << "Unable to connect: " << s.error().message() << "\n"; return 1; } // Send the request. We specify the "Connection: close" header so that the // server will close the socket after transmitting the response. This will // allow us to treat all data up until the EOF as the content. s << "GET " << argv[2] << " HTTP/1.0\r\n"; s << "Host: " << argv[1] << "\r\n"; s << "Accept: */*\r\n"; s << "Connection: close\r\n\r\n"; // By default, the stream is tied with itself. This means that the stream // automatically flush the buffered output before attempting a read. It is // not necessary not explicitly flush the stream at this point. // Check that response is OK. std::string http_version; s >> http_version; unsigned int status_code; s >> status_code; std::string status_message; std::getline(s, status_message); if (!s || http_version.substr(0, 5) != "HTTP/") { std::cout << "Invalid response\n"; return 1; } if (status_code != 200) { std::cout << "Response returned with status code " << status_code << "\n"; return 1; } // Process the response headers, which are terminated by a blank line. std::string header; while (std::getline(s, header) && header != "\r") std::cout << header << "\n"; std::cout << "\n"; // Write the remaining data to output. std::cout << s.rdbuf(); } catch (std::exception& e) { std::cout << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp17/000077500000000000000000000000001340672067200160765ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp17/Makefile.am000066400000000000000000000004021340672067200201260ustar00rootroot00000000000000EXTRA_DIST = \ coroutines_ts/chat_server.cpp \ coroutines_ts/double_buffered_echo_server.cpp \ coroutines_ts/echo_server.cpp \ coroutines_ts/range_based_for.cpp \ coroutines_ts/refactored_echo_server.cpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/src/examples/cpp17/Makefile.in000066400000000000000000000270021340672067200201440ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src/examples/cpp17 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ coroutines_ts/chat_server.cpp \ coroutines_ts/double_buffered_echo_server.cpp \ coroutines_ts/echo_server.cpp \ coroutines_ts/range_based_for.cpp \ coroutines_ts/refactored_echo_server.cpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp17/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/examples/cpp17/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/src/examples/cpp17/coroutines_ts/000077500000000000000000000000001340672067200207765ustar00rootroot00000000000000asio-1.12.2/src/examples/cpp17/coroutines_ts/chat_server.cpp000066400000000000000000000114531340672067200240130ustar00rootroot00000000000000// // chat_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using asio::ip::tcp; using asio::experimental::awaitable; using asio::experimental::co_spawn; using asio::experimental::detached; using asio::experimental::redirect_error; namespace this_coro = asio::experimental::this_coro; //---------------------------------------------------------------------- class chat_participant { public: virtual ~chat_participant() {} virtual void deliver(const std::string& msg) = 0; }; typedef std::shared_ptr chat_participant_ptr; //---------------------------------------------------------------------- class chat_room { public: void join(chat_participant_ptr participant) { participants_.insert(participant); for (auto msg: recent_msgs_) participant->deliver(msg); } void leave(chat_participant_ptr participant) { participants_.erase(participant); } void deliver(const std::string& msg) { recent_msgs_.push_back(msg); while (recent_msgs_.size() > max_recent_msgs) recent_msgs_.pop_front(); for (auto participant: participants_) participant->deliver(msg); } private: std::set participants_; enum { max_recent_msgs = 100 }; std::deque recent_msgs_; }; //---------------------------------------------------------------------- class chat_session : public chat_participant, public std::enable_shared_from_this { public: chat_session(tcp::socket socket, chat_room& room) : socket_(std::move(socket)), timer_(socket_.get_executor().context()), room_(room) { timer_.expires_at(std::chrono::steady_clock::time_point::max()); } void start() { room_.join(shared_from_this()); co_spawn(socket_.get_executor(), [self = shared_from_this()]{ return self->reader(); }, detached); co_spawn(socket_.get_executor(), [self = shared_from_this()]{ return self->writer(); }, detached); } void deliver(const std::string& msg) { write_msgs_.push_back(msg); timer_.cancel_one(); } private: awaitable reader() { auto token = co_await this_coro::token(); try { for (std::string read_msg;;) { std::size_t n = co_await asio::async_read_until(socket_, asio::dynamic_buffer(read_msg, 1024), "\n", token); room_.deliver(read_msg.substr(0, n)); read_msg.erase(0, n); } } catch (std::exception&) { stop(); } } awaitable writer() { auto token = co_await this_coro::token(); try { while (socket_.is_open()) { if (write_msgs_.empty()) { asio::error_code ec; co_await timer_.async_wait(redirect_error(token, ec)); } else { co_await asio::async_write(socket_, asio::buffer(write_msgs_.front()), token); write_msgs_.pop_front(); } } } catch (std::exception&) { stop(); } } void stop() { room_.leave(shared_from_this()); socket_.close(); timer_.cancel(); } tcp::socket socket_; asio::steady_timer timer_; chat_room& room_; std::deque write_msgs_; }; //---------------------------------------------------------------------- awaitable listener(tcp::acceptor acceptor) { auto token = co_await this_coro::token(); chat_room room; for (;;) { std::make_shared( co_await acceptor.async_accept(token), room )->start(); } } //---------------------------------------------------------------------- int main(int argc, char* argv[]) { try { if (argc < 2) { std::cerr << "Usage: chat_server [ ...]\n"; return 1; } asio::io_context io_context(1); for (int i = 1; i < argc; ++i) { unsigned short port = std::atoi(argv[i]); co_spawn(io_context, [&]{ return listener(tcp::acceptor(io_context, {tcp::v4(), port})); }, detached); } asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait([&](auto, auto){ io_context.stop(); }); io_context.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; } asio-1.12.2/src/examples/cpp17/coroutines_ts/double_buffered_echo_server.cpp000066400000000000000000000045001340672067200272010ustar00rootroot00000000000000// // double_buffered_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::tcp; using asio::experimental::co_spawn; using asio::experimental::detached; namespace this_coro = asio::experimental::this_coro; template using awaitable = asio::experimental::awaitable< T, asio::io_context::executor_type>; awaitable echo(tcp::socket s) { auto token = co_await this_coro::token(); try { char data1[1024]; char data2[1024]; char* p1 = data1; char* p2 = data2; // Perform initial read into first buffer. size_t n = co_await s.async_read_some(asio::buffer(p1, 1024), token); for (;;) { // Swap received data to other buffer and initiate write operation. std::swap(p1, p2); auto write_result = asio::async_write(s, asio::buffer(p2, n), token); // Perform next read while write operation is in progress. n = co_await s.async_read_some(asio::buffer(p1, 1024), token); // Wait for write operation to complete before proceeding. co_await write_result; } } catch (std::exception& e) { std::printf("echo Exception: %s\n", e.what()); } } awaitable listener() { auto executor = co_await this_coro::executor(); auto token = co_await this_coro::token(); tcp::acceptor acceptor(executor.context(), {tcp::v4(), 55555}); for (;;) { tcp::socket socket = co_await acceptor.async_accept(token); co_spawn(executor, [socket = std::move(socket)]() mutable { return echo(std::move(socket)); }, detached); } } int main() { try { asio::io_context io_context(1); asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait([&](auto, auto){ io_context.stop(); }); co_spawn(io_context, listener, detached); io_context.run(); } catch (std::exception& e) { std::printf("Exception: %s\n", e.what()); } } asio-1.12.2/src/examples/cpp17/coroutines_ts/echo_server.cpp000066400000000000000000000035751340672067200240200ustar00rootroot00000000000000// // echo_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::tcp; using asio::experimental::co_spawn; using asio::experimental::detached; namespace this_coro = asio::experimental::this_coro; template using awaitable = asio::experimental::awaitable< T, asio::io_context::executor_type>; awaitable echo(tcp::socket socket) { auto token = co_await this_coro::token(); try { char data[1024]; for (;;) { std::size_t n = co_await socket.async_read_some(asio::buffer(data), token); co_await async_write(socket, asio::buffer(data, n), token); } } catch (std::exception& e) { std::printf("echo Exception: %s\n", e.what()); } } awaitable listener() { auto executor = co_await this_coro::executor(); auto token = co_await this_coro::token(); tcp::acceptor acceptor(executor.context(), {tcp::v4(), 55555}); for (;;) { tcp::socket socket = co_await acceptor.async_accept(token); co_spawn(executor, [socket = std::move(socket)]() mutable { return echo(std::move(socket)); }, detached); } } int main() { try { asio::io_context io_context(1); asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait([&](auto, auto){ io_context.stop(); }); co_spawn(io_context, listener, detached); io_context.run(); } catch (std::exception& e) { std::printf("Exception: %s\n", e.what()); } } asio-1.12.2/src/examples/cpp17/coroutines_ts/range_based_for.cpp000066400000000000000000000047031340672067200246060ustar00rootroot00000000000000// // range_based_for.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::tcp; using asio::experimental::awaitable; using asio::experimental::co_spawn; using asio::experimental::detached; namespace this_coro = asio::experimental::this_coro; class connection_iter { friend class connections; tcp::acceptor* acceptor_ = nullptr; tcp::socket socket_; connection_iter(tcp::acceptor& a, tcp::socket s) : acceptor_(&a), socket_(std::move(s)) {} public: tcp::socket operator*() { return std::move(socket_); } awaitable operator++() { auto token = co_await this_coro::token(); socket_ = co_await acceptor_->async_accept(token); } bool operator==(const connection_iter&) const noexcept { return false; } bool operator!=(const connection_iter&) const noexcept { return true; } }; class connections { tcp::acceptor& acceptor_; public: explicit connections(tcp::acceptor& a) : acceptor_(a) {} awaitable begin() { auto token = co_await this_coro::token(); tcp::socket s = co_await acceptor_.async_accept(token); co_return connection_iter(acceptor_, std::move(s)); } connection_iter end() { return connection_iter(acceptor_, tcp::socket(acceptor_.get_executor().context())); } }; awaitable listener(tcp::acceptor acceptor) { auto token = co_await this_coro::token(); for co_await (tcp::socket s : connections(acceptor)) { co_await asio::async_write(s, asio::buffer("hello\r\n", 7), token); } } int main() { try { asio::io_context io_context(1); asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait([&](auto, auto){ io_context.stop(); }); tcp::acceptor acceptor(io_context, {tcp::v4(), 55555}); co_spawn(io_context, [acceptor = std::move(acceptor)]() mutable { return listener(std::move(acceptor)); }, detached); io_context.run(); } catch (std::exception& e) { std::printf("Exception: %s\n", e.what()); } } asio-1.12.2/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp000066400000000000000000000044041340672067200262060ustar00rootroot00000000000000// // refactored_echo_server.cpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include using asio::ip::tcp; using asio::experimental::co_spawn; using asio::experimental::detached; namespace this_coro = asio::experimental::this_coro; template using awaitable = asio::experimental::awaitable< T, asio::io_context::executor_type>; awaitable echo_once(tcp::socket& socket) { auto token = co_await this_coro::token(); char data[128]; std::size_t n = co_await socket.async_read_some(asio::buffer(data), token); co_await async_write(socket, asio::buffer(data, n), token); } awaitable echo(tcp::socket socket) { try { for (;;) { // The asynchronous operations to echo a single chunk of data have been // refactored into a separate function. When this function is called, the // operations are still performed in the context of the current // coroutine, and the behaviour is functionally equivalent. co_await echo_once(socket); } } catch (std::exception& e) { std::printf("echo Exception: %s\n", e.what()); } } awaitable listener() { auto executor = co_await this_coro::executor(); auto token = co_await this_coro::token(); tcp::acceptor acceptor(executor.context(), {tcp::v4(), 55555}); for (;;) { tcp::socket socket = co_await acceptor.async_accept(token); co_spawn(executor, [socket = std::move(socket)]() mutable { return echo(std::move(socket)); }, detached); } } int main() { try { asio::io_context io_context(1); asio::signal_set signals(io_context, SIGINT, SIGTERM); signals.async_wait([&](auto, auto){ io_context.stop(); }); co_spawn(io_context, listener, detached); io_context.run(); } catch (std::exception& e) { std::printf("Exception: %s\n", e.what()); } } asio-1.12.2/src/tests/000077500000000000000000000000001340672067200144705ustar00rootroot00000000000000asio-1.12.2/src/tests/Makefile.am000066400000000000000000000356421340672067200165360ustar00rootroot00000000000000AUTOMAKE_OPTIONS = subdir-objects if SEPARATE_COMPILATION noinst_LIBRARIES = libasio.a libasio_a_SOURCES = ../asio.cpp if HAVE_OPENSSL libasio_a_SOURCES += ../asio_ssl.cpp endif LDADD = libasio.a endif check_PROGRAMS = \ unit/associated_allocator \ unit/associated_executor \ unit/async_result \ unit/basic_datagram_socket \ unit/basic_deadline_timer \ unit/basic_raw_socket \ unit/basic_seq_packet_socket \ unit/basic_serial_port \ unit/basic_signal_set \ unit/basic_socket_acceptor \ unit/basic_stream_socket \ unit/basic_streambuf \ unit/basic_waitable_timer \ unit/bind_executor \ unit/buffered_read_stream \ unit/buffered_stream \ unit/buffered_write_stream \ unit/buffer \ unit/buffers_iterator \ unit/completion_condition \ unit/connect \ unit/coroutine \ unit/datagram_socket_service \ unit/deadline_timer_service \ unit/deadline_timer \ unit/defer \ unit/dispatch \ unit/error \ unit/execution_context \ unit/executor \ unit/executor_work_guard \ unit/generic/basic_endpoint \ unit/generic/datagram_protocol \ unit/generic/raw_protocol \ unit/generic/seq_packet_protocol \ unit/generic/stream_protocol \ unit/high_resolution_timer \ unit/io_context \ unit/ip/address \ unit/ip/address_v4 \ unit/ip/address_v4_iterator \ unit/ip/address_v4_range \ unit/ip/address_v6 \ unit/ip/address_v6_iterator \ unit/ip/address_v6_range \ unit/ip/basic_endpoint \ unit/ip/basic_resolver \ unit/ip/basic_resolver_entry \ unit/ip/basic_resolver_iterator \ unit/ip/basic_resolver_query \ unit/ip/host_name \ unit/ip/icmp \ unit/ip/multicast \ unit/ip/network_v4 \ unit/ip/network_v6 \ unit/ip/resolver_query_base \ unit/ip/resolver_service \ unit/ip/tcp \ unit/ip/udp \ unit/ip/unicast \ unit/ip/v6_only \ unit/is_read_buffered \ unit/is_write_buffered \ unit/local/basic_endpoint \ unit/local/connect_pair \ unit/local/datagram_protocol \ unit/local/stream_protocol \ unit/packaged_task \ unit/placeholders \ unit/posix/basic_descriptor \ unit/posix/basic_stream_descriptor \ unit/posix/descriptor \ unit/posix/descriptor_base \ unit/posix/stream_descriptor \ unit/posix/stream_descriptor_service \ unit/post \ unit/raw_socket_service \ unit/read \ unit/read_at \ unit/read_until \ unit/seq_packet_socket_service \ unit/serial_port \ unit/serial_port_base \ unit/serial_port_service \ unit/signal_set \ unit/signal_set_service \ unit/socket_acceptor_service \ unit/socket_base \ unit/steady_timer \ unit/strand \ unit/stream_socket_service \ unit/streambuf \ unit/system_context \ unit/system_executor \ unit/system_timer \ unit/thread \ unit/time_traits \ unit/ts/buffer \ unit/ts/executor \ unit/ts/internet \ unit/ts/io_context \ unit/ts/net \ unit/ts/netfwd \ unit/ts/socket \ unit/ts/timer \ unit/use_future \ unit/uses_executor \ unit/wait_traits \ unit/waitable_timer_service \ unit/windows/basic_handle \ unit/windows/basic_object_handle \ unit/windows/basic_random_access_handle \ unit/windows/basic_stream_handle \ unit/windows/object_handle \ unit/windows/object_handle_service \ unit/windows/overlapped_handle \ unit/windows/overlapped_ptr \ unit/windows/random_access_handle \ unit/windows/random_access_handle_service \ unit/windows/stream_handle \ unit/windows/stream_handle_service \ unit/write \ unit/write_at if !STANDALONE noinst_PROGRAMS = \ latency/tcp_client \ latency/tcp_server \ latency/udp_client \ latency/udp_server \ performance/client \ performance/server endif if HAVE_OPENSSL check_PROGRAMS += \ unit/ssl/context_base \ unit/ssl/context \ unit/ssl/error \ unit/ssl/rfc2818_verification \ unit/ssl/stream_base \ unit/ssl/stream endif TESTS = \ unit/associated_allocator \ unit/associated_executor \ unit/async_result \ unit/basic_datagram_socket \ unit/basic_deadline_timer \ unit/basic_raw_socket \ unit/basic_seq_packet_socket \ unit/basic_serial_port \ unit/basic_signal_set \ unit/basic_socket_acceptor \ unit/basic_stream_socket \ unit/basic_streambuf \ unit/basic_waitable_timer \ unit/bind_executor \ unit/buffered_read_stream \ unit/buffered_stream \ unit/buffered_write_stream \ unit/buffer \ unit/buffers_iterator \ unit/completion_condition \ unit/connect \ unit/datagram_socket_service \ unit/deadline_timer_service \ unit/deadline_timer \ unit/defer \ unit/dispatch \ unit/error \ unit/execution_context \ unit/executor \ unit/executor_work_guard \ unit/high_resolution_timer \ unit/io_context \ unit/ip/address \ unit/ip/address_v4 \ unit/ip/address_v4_iterator \ unit/ip/address_v4_range \ unit/ip/address_v6 \ unit/ip/address_v6_iterator \ unit/ip/address_v6_range \ unit/ip/basic_endpoint \ unit/ip/basic_resolver \ unit/ip/basic_resolver_entry \ unit/ip/basic_resolver_iterator \ unit/ip/basic_resolver_query \ unit/ip/host_name \ unit/ip/icmp \ unit/ip/multicast \ unit/ip/network_v4 \ unit/ip/network_v6 \ unit/ip/resolver_query_base \ unit/ip/resolver_service \ unit/ip/tcp \ unit/ip/udp \ unit/ip/unicast \ unit/ip/v6_only \ unit/is_read_buffered \ unit/is_write_buffered \ unit/local/basic_endpoint \ unit/local/connect_pair \ unit/local/datagram_protocol \ unit/local/stream_protocol \ unit/packaged_task \ unit/placeholders \ unit/posix/basic_descriptor \ unit/posix/basic_stream_descriptor \ unit/posix/descriptor\ unit/posix/descriptor_base \ unit/posix/stream_descriptor \ unit/posix/stream_descriptor_service \ unit/post \ unit/raw_socket_service \ unit/read \ unit/read_at \ unit/read_until \ unit/seq_packet_socket_service \ unit/serial_port \ unit/serial_port_base \ unit/serial_port_service \ unit/signal_set \ unit/signal_set_service \ unit/socket_acceptor_service \ unit/socket_base \ unit/steady_timer \ unit/strand \ unit/stream_socket_service \ unit/streambuf \ unit/system_context \ unit/system_executor \ unit/system_timer \ unit/thread \ unit/time_traits \ unit/ts/buffer \ unit/ts/executor \ unit/ts/internet \ unit/ts/io_context \ unit/ts/net \ unit/ts/netfwd \ unit/ts/socket \ unit/ts/timer \ unit/use_future \ unit/uses_executor \ unit/wait_traits \ unit/waitable_timer_service \ unit/windows/basic_handle \ unit/windows/basic_object_handle \ unit/windows/basic_random_access_handle \ unit/windows/basic_stream_handle \ unit/windows/object_handle \ unit/windows/object_handle_service \ unit/windows/overlapped_handle \ unit/windows/overlapped_ptr \ unit/windows/random_access_handle \ unit/windows/random_access_handle_service \ unit/windows/stream_handle \ unit/windows/stream_handle_service \ unit/write \ unit/write_at if HAVE_OPENSSL TESTS += \ unit/ssl/context_base \ unit/ssl/context \ unit/ssl/error \ unit/ssl/rfc2818_verification \ unit/ssl/stream_base \ unit/ssl/stream endif noinst_HEADERS = \ latency/high_res_clock.hpp \ unit/unit_test.hpp AM_CXXFLAGS = -I$(srcdir)/../../include if !STANDALONE latency_tcp_client_SOURCES = latency/tcp_client.cpp latency_tcp_server_SOURCES = latency/tcp_server.cpp latency_udp_client_SOURCES = latency/udp_client.cpp latency_udp_server_SOURCES = latency/udp_server.cpp performance_client_SOURCES = performance/client.cpp performance_server_SOURCES = performance/server.cpp endif unit_associated_allocator_SOURCES = unit/associated_allocator.cpp unit_associated_executor_SOURCES = unit/associated_executor.cpp unit_async_result_SOURCES = unit/async_result.cpp unit_basic_datagram_socket_SOURCES = unit/basic_datagram_socket.cpp unit_basic_deadline_timer_SOURCES = unit/basic_deadline_timer.cpp unit_basic_raw_socket_SOURCES = unit/basic_raw_socket.cpp unit_basic_seq_packet_socket_SOURCES = unit/basic_seq_packet_socket.cpp unit_basic_serial_port_SOURCES = unit/basic_serial_port.cpp unit_basic_signal_set_SOURCES = unit/basic_signal_set.cpp unit_basic_socket_acceptor_SOURCES = unit/basic_socket_acceptor.cpp unit_basic_stream_socket_SOURCES = unit/basic_stream_socket.cpp unit_basic_streambuf_SOURCES = unit/basic_streambuf.cpp unit_basic_waitable_timer_SOURCES = unit/basic_waitable_timer.cpp unit_bind_executor_SOURCES = unit/bind_executor.cpp unit_buffer_SOURCES = unit/buffer.cpp unit_buffers_iterator_SOURCES = unit/buffers_iterator.cpp unit_buffered_read_stream_SOURCES = unit/buffered_read_stream.cpp unit_buffered_stream_SOURCES = unit/buffered_stream.cpp unit_buffered_write_stream_SOURCES = unit/buffered_write_stream.cpp unit_completion_condition_SOURCES = unit/completion_condition.cpp unit_connect_SOURCES = unit/connect.cpp unit_coroutine_SOURCES = unit/coroutine.cpp unit_datagram_socket_service_SOURCES = unit/datagram_socket_service.cpp unit_deadline_timer_service_SOURCES = unit/deadline_timer_service.cpp unit_deadline_timer_SOURCES = unit/deadline_timer.cpp unit_defer_SOURCES = unit/defer.cpp unit_dispatch_SOURCES = unit/dispatch.cpp unit_error_SOURCES = unit/error.cpp unit_execution_context_SOURCES = unit/execution_context.cpp unit_executor_SOURCES = unit/executor.cpp unit_executor_work_guard_SOURCES = unit/executor_work_guard.cpp unit_generic_basic_endpoint_SOURCES = unit/generic/basic_endpoint.cpp unit_generic_datagram_protocol_SOURCES = unit/generic/datagram_protocol.cpp unit_generic_raw_protocol_SOURCES = unit/generic/raw_protocol.cpp unit_generic_seq_packet_protocol_SOURCES = unit/generic/seq_packet_protocol.cpp unit_generic_stream_protocol_SOURCES = unit/generic/stream_protocol.cpp unit_high_resolution_timer_SOURCES = unit/high_resolution_timer.cpp unit_io_context_SOURCES = unit/io_context.cpp unit_ip_address_SOURCES = unit/ip/address.cpp unit_ip_address_v4_SOURCES = unit/ip/address_v4.cpp unit_ip_address_v4_iterator_SOURCES = unit/ip/address_v4_iterator.cpp unit_ip_address_v4_range_SOURCES = unit/ip/address_v4_range.cpp unit_ip_address_v6_SOURCES = unit/ip/address_v6.cpp unit_ip_address_v6_iterator_SOURCES = unit/ip/address_v6_iterator.cpp unit_ip_address_v6_range_SOURCES = unit/ip/address_v6_range.cpp unit_ip_basic_endpoint_SOURCES = unit/ip/basic_endpoint.cpp unit_ip_basic_resolver_SOURCES = unit/ip/basic_resolver.cpp unit_ip_basic_resolver_entry_SOURCES = unit/ip/basic_resolver_entry.cpp unit_ip_basic_resolver_iterator_SOURCES = unit/ip/basic_resolver_iterator.cpp unit_ip_basic_resolver_query_SOURCES = unit/ip/basic_resolver_query.cpp unit_ip_host_name_SOURCES = unit/ip/host_name.cpp unit_ip_icmp_SOURCES = unit/ip/icmp.cpp unit_ip_multicast_SOURCES = unit/ip/multicast.cpp unit_ip_network_v4_SOURCES = unit/ip/network_v4.cpp unit_ip_network_v6_SOURCES = unit/ip/network_v6.cpp unit_ip_resolver_query_base_SOURCES = unit/ip/resolver_query_base.cpp unit_ip_resolver_service_SOURCES = unit/ip/resolver_service.cpp unit_ip_tcp_SOURCES = unit/ip/tcp.cpp unit_ip_udp_SOURCES = unit/ip/udp.cpp unit_ip_unicast_SOURCES = unit/ip/unicast.cpp unit_ip_v6_only_SOURCES = unit/ip/v6_only.cpp unit_is_read_buffered_SOURCES = unit/is_read_buffered.cpp unit_is_write_buffered_SOURCES = unit/is_write_buffered.cpp unit_local_basic_endpoint_SOURCES = unit/local/basic_endpoint.cpp unit_local_connect_pair_SOURCES = unit/local/connect_pair.cpp unit_local_datagram_protocol_SOURCES = unit/local/datagram_protocol.cpp unit_local_stream_protocol_SOURCES = unit/local/stream_protocol.cpp unit_packaged_task_SOURCES = unit/packaged_task.cpp unit_placeholders_SOURCES = unit/placeholders.cpp unit_posix_basic_descriptor_SOURCES = unit/posix/basic_descriptor.cpp unit_posix_basic_stream_descriptor_SOURCES = unit/posix/basic_stream_descriptor.cpp unit_posix_descriptor_SOURCES = unit/posix/descriptor.cpp unit_posix_descriptor_base_SOURCES = unit/posix/descriptor_base.cpp unit_posix_stream_descriptor_SOURCES = unit/posix/stream_descriptor.cpp unit_posix_stream_descriptor_service_SOURCES = unit/posix/stream_descriptor_service.cpp unit_post_SOURCES = unit/post.cpp unit_raw_socket_service_SOURCES = unit/raw_socket_service.cpp unit_read_SOURCES = unit/read.cpp unit_read_at_SOURCES = unit/read_at.cpp unit_read_until_SOURCES = unit/read_until.cpp unit_seq_packet_socket_service_SOURCES = unit/seq_packet_socket_service.cpp unit_serial_port_SOURCES = unit/serial_port.cpp unit_serial_port_base_SOURCES = unit/serial_port_base.cpp unit_serial_port_service_SOURCES = unit/serial_port_service.cpp unit_signal_set_SOURCES = unit/signal_set.cpp unit_signal_set_service_SOURCES = unit/signal_set_service.cpp unit_socket_acceptor_service_SOURCES = unit/socket_acceptor_service.cpp unit_socket_base_SOURCES = unit/socket_base.cpp unit_steady_timer_SOURCES = unit/steady_timer.cpp unit_strand_SOURCES = unit/strand.cpp unit_stream_socket_service_SOURCES = unit/stream_socket_service.cpp unit_streambuf_SOURCES = unit/streambuf.cpp unit_system_context_SOURCES = unit/system_context.cpp unit_system_executor_SOURCES = unit/system_executor.cpp unit_system_timer_SOURCES = unit/system_timer.cpp unit_thread_SOURCES = unit/thread.cpp unit_time_traits_SOURCES = unit/time_traits.cpp unit_ts_buffer_SOURCES = unit/ts/buffer.cpp unit_ts_executor_SOURCES = unit/ts/executor.cpp unit_ts_internet_SOURCES = unit/ts/internet.cpp unit_ts_io_context_SOURCES = unit/ts/io_context.cpp unit_ts_net_SOURCES = unit/ts/net.cpp unit_ts_netfwd_SOURCES = unit/ts/netfwd.cpp unit_ts_socket_SOURCES = unit/ts/socket.cpp unit_ts_timer_SOURCES = unit/ts/timer.cpp unit_use_future_SOURCES = unit/use_future.cpp unit_uses_executor_SOURCES = unit/uses_executor.cpp unit_wait_traits_SOURCES = unit/wait_traits.cpp unit_waitable_timer_service_SOURCES = unit/waitable_timer_service.cpp unit_windows_basic_handle_SOURCES = unit/windows/basic_handle.cpp unit_windows_basic_object_handle_SOURCES = unit/windows/basic_object_handle.cpp unit_windows_basic_random_access_handle_SOURCES = unit/windows/basic_random_access_handle.cpp unit_windows_basic_stream_handle_SOURCES = unit/windows/basic_stream_handle.cpp unit_windows_object_handle_SOURCES = unit/windows/object_handle.cpp unit_windows_object_handle_service_SOURCES = unit/windows/object_handle_service.cpp unit_windows_overlapped_handle_SOURCES = unit/windows/overlapped_handle.cpp unit_windows_overlapped_ptr_SOURCES = unit/windows/overlapped_ptr.cpp unit_windows_random_access_handle_SOURCES = unit/windows/random_access_handle.cpp unit_windows_random_access_handle_service_SOURCES = unit/windows/random_access_handle_service.cpp unit_windows_stream_handle_SOURCES = unit/windows/stream_handle.cpp unit_windows_stream_handle_service_SOURCES = unit/windows/stream_handle_service.cpp unit_write_SOURCES = unit/write.cpp unit_write_at_SOURCES = unit/write_at.cpp if HAVE_OPENSSL unit_ssl_context_base_SOURCES = unit/ssl/context_base.cpp unit_ssl_context_SOURCES = unit/ssl/context.cpp unit_ssl_error_SOURCES = unit/ssl/error.cpp unit_ssl_stream_base_SOURCES = unit/ssl/stream_base.cpp unit_ssl_rfc2818_verification_SOURCES = unit/ssl/rfc2818_verification.cpp unit_ssl_stream_SOURCES = unit/ssl/stream.cpp endif EXTRA_DIST = \ latency/allocator.hpp \ performance/handler_allocator.hpp \ unit/archetypes/async_ops.hpp \ unit/archetypes/async_result.hpp \ unit/archetypes/deprecated_async_result.hpp \ unit/archetypes/deprecated_async_ops.hpp \ unit/archetypes/gettable_socket_option.hpp \ unit/archetypes/io_control_command.hpp \ unit/archetypes/settable_socket_option.hpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in asio-1.12.2/src/tests/Makefile.in000066400000000000000000006746261340672067200165620ustar00rootroot00000000000000# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../asio_ssl.cpp check_PROGRAMS = unit/associated_allocator$(EXEEXT) \ unit/associated_executor$(EXEEXT) unit/async_result$(EXEEXT) \ unit/basic_datagram_socket$(EXEEXT) \ unit/basic_deadline_timer$(EXEEXT) \ unit/basic_raw_socket$(EXEEXT) \ unit/basic_seq_packet_socket$(EXEEXT) \ unit/basic_serial_port$(EXEEXT) unit/basic_signal_set$(EXEEXT) \ unit/basic_socket_acceptor$(EXEEXT) \ unit/basic_stream_socket$(EXEEXT) \ unit/basic_streambuf$(EXEEXT) \ unit/basic_waitable_timer$(EXEEXT) unit/bind_executor$(EXEEXT) \ unit/buffered_read_stream$(EXEEXT) \ unit/buffered_stream$(EXEEXT) \ unit/buffered_write_stream$(EXEEXT) unit/buffer$(EXEEXT) \ unit/buffers_iterator$(EXEEXT) \ unit/completion_condition$(EXEEXT) unit/connect$(EXEEXT) \ unit/coroutine$(EXEEXT) unit/datagram_socket_service$(EXEEXT) \ unit/deadline_timer_service$(EXEEXT) \ unit/deadline_timer$(EXEEXT) unit/defer$(EXEEXT) \ unit/dispatch$(EXEEXT) unit/error$(EXEEXT) \ unit/execution_context$(EXEEXT) unit/executor$(EXEEXT) \ unit/executor_work_guard$(EXEEXT) \ unit/generic/basic_endpoint$(EXEEXT) \ unit/generic/datagram_protocol$(EXEEXT) \ unit/generic/raw_protocol$(EXEEXT) \ unit/generic/seq_packet_protocol$(EXEEXT) \ unit/generic/stream_protocol$(EXEEXT) \ unit/high_resolution_timer$(EXEEXT) unit/io_context$(EXEEXT) \ unit/ip/address$(EXEEXT) unit/ip/address_v4$(EXEEXT) \ unit/ip/address_v4_iterator$(EXEEXT) \ unit/ip/address_v4_range$(EXEEXT) unit/ip/address_v6$(EXEEXT) \ unit/ip/address_v6_iterator$(EXEEXT) \ unit/ip/address_v6_range$(EXEEXT) \ unit/ip/basic_endpoint$(EXEEXT) \ unit/ip/basic_resolver$(EXEEXT) \ unit/ip/basic_resolver_entry$(EXEEXT) \ unit/ip/basic_resolver_iterator$(EXEEXT) \ unit/ip/basic_resolver_query$(EXEEXT) \ unit/ip/host_name$(EXEEXT) unit/ip/icmp$(EXEEXT) \ unit/ip/multicast$(EXEEXT) unit/ip/network_v4$(EXEEXT) \ unit/ip/network_v6$(EXEEXT) \ unit/ip/resolver_query_base$(EXEEXT) \ unit/ip/resolver_service$(EXEEXT) unit/ip/tcp$(EXEEXT) \ unit/ip/udp$(EXEEXT) unit/ip/unicast$(EXEEXT) \ unit/ip/v6_only$(EXEEXT) unit/is_read_buffered$(EXEEXT) \ unit/is_write_buffered$(EXEEXT) \ unit/local/basic_endpoint$(EXEEXT) \ unit/local/connect_pair$(EXEEXT) \ unit/local/datagram_protocol$(EXEEXT) \ unit/local/stream_protocol$(EXEEXT) \ unit/packaged_task$(EXEEXT) unit/placeholders$(EXEEXT) \ unit/posix/basic_descriptor$(EXEEXT) \ unit/posix/basic_stream_descriptor$(EXEEXT) \ unit/posix/descriptor$(EXEEXT) \ unit/posix/descriptor_base$(EXEEXT) \ unit/posix/stream_descriptor$(EXEEXT) \ unit/posix/stream_descriptor_service$(EXEEXT) \ unit/post$(EXEEXT) unit/raw_socket_service$(EXEEXT) \ unit/read$(EXEEXT) unit/read_at$(EXEEXT) \ unit/read_until$(EXEEXT) \ unit/seq_packet_socket_service$(EXEEXT) \ unit/serial_port$(EXEEXT) unit/serial_port_base$(EXEEXT) \ unit/serial_port_service$(EXEEXT) unit/signal_set$(EXEEXT) \ unit/signal_set_service$(EXEEXT) \ unit/socket_acceptor_service$(EXEEXT) \ unit/socket_base$(EXEEXT) unit/steady_timer$(EXEEXT) \ unit/strand$(EXEEXT) unit/stream_socket_service$(EXEEXT) \ unit/streambuf$(EXEEXT) unit/system_context$(EXEEXT) \ unit/system_executor$(EXEEXT) unit/system_timer$(EXEEXT) \ unit/thread$(EXEEXT) unit/time_traits$(EXEEXT) \ unit/ts/buffer$(EXEEXT) unit/ts/executor$(EXEEXT) \ unit/ts/internet$(EXEEXT) unit/ts/io_context$(EXEEXT) \ unit/ts/net$(EXEEXT) unit/ts/netfwd$(EXEEXT) \ unit/ts/socket$(EXEEXT) unit/ts/timer$(EXEEXT) \ unit/use_future$(EXEEXT) unit/uses_executor$(EXEEXT) \ unit/wait_traits$(EXEEXT) unit/waitable_timer_service$(EXEEXT) \ unit/windows/basic_handle$(EXEEXT) \ unit/windows/basic_object_handle$(EXEEXT) \ unit/windows/basic_random_access_handle$(EXEEXT) \ unit/windows/basic_stream_handle$(EXEEXT) \ unit/windows/object_handle$(EXEEXT) \ unit/windows/object_handle_service$(EXEEXT) \ unit/windows/overlapped_handle$(EXEEXT) \ unit/windows/overlapped_ptr$(EXEEXT) \ unit/windows/random_access_handle$(EXEEXT) \ unit/windows/random_access_handle_service$(EXEEXT) \ unit/windows/stream_handle$(EXEEXT) \ unit/windows/stream_handle_service$(EXEEXT) \ unit/write$(EXEEXT) unit/write_at$(EXEEXT) $(am__EXEEXT_1) @STANDALONE_FALSE@noinst_PROGRAMS = latency/tcp_client$(EXEEXT) \ @STANDALONE_FALSE@ latency/tcp_server$(EXEEXT) \ @STANDALONE_FALSE@ latency/udp_client$(EXEEXT) \ @STANDALONE_FALSE@ latency/udp_server$(EXEEXT) \ @STANDALONE_FALSE@ performance/client$(EXEEXT) \ @STANDALONE_FALSE@ performance/server$(EXEEXT) @HAVE_OPENSSL_TRUE@am__append_2 = \ @HAVE_OPENSSL_TRUE@ unit/ssl/context_base \ @HAVE_OPENSSL_TRUE@ unit/ssl/context \ @HAVE_OPENSSL_TRUE@ unit/ssl/error \ @HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream_base \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream TESTS = unit/associated_allocator$(EXEEXT) \ unit/associated_executor$(EXEEXT) unit/async_result$(EXEEXT) \ unit/basic_datagram_socket$(EXEEXT) \ unit/basic_deadline_timer$(EXEEXT) \ unit/basic_raw_socket$(EXEEXT) \ unit/basic_seq_packet_socket$(EXEEXT) \ unit/basic_serial_port$(EXEEXT) unit/basic_signal_set$(EXEEXT) \ unit/basic_socket_acceptor$(EXEEXT) \ unit/basic_stream_socket$(EXEEXT) \ unit/basic_streambuf$(EXEEXT) \ unit/basic_waitable_timer$(EXEEXT) unit/bind_executor$(EXEEXT) \ unit/buffered_read_stream$(EXEEXT) \ unit/buffered_stream$(EXEEXT) \ unit/buffered_write_stream$(EXEEXT) unit/buffer$(EXEEXT) \ unit/buffers_iterator$(EXEEXT) \ unit/completion_condition$(EXEEXT) unit/connect$(EXEEXT) \ unit/datagram_socket_service$(EXEEXT) \ unit/deadline_timer_service$(EXEEXT) \ unit/deadline_timer$(EXEEXT) unit/defer$(EXEEXT) \ unit/dispatch$(EXEEXT) unit/error$(EXEEXT) \ unit/execution_context$(EXEEXT) unit/executor$(EXEEXT) \ unit/executor_work_guard$(EXEEXT) \ unit/high_resolution_timer$(EXEEXT) unit/io_context$(EXEEXT) \ unit/ip/address$(EXEEXT) unit/ip/address_v4$(EXEEXT) \ unit/ip/address_v4_iterator$(EXEEXT) \ unit/ip/address_v4_range$(EXEEXT) unit/ip/address_v6$(EXEEXT) \ unit/ip/address_v6_iterator$(EXEEXT) \ unit/ip/address_v6_range$(EXEEXT) \ unit/ip/basic_endpoint$(EXEEXT) \ unit/ip/basic_resolver$(EXEEXT) \ unit/ip/basic_resolver_entry$(EXEEXT) \ unit/ip/basic_resolver_iterator$(EXEEXT) \ unit/ip/basic_resolver_query$(EXEEXT) \ unit/ip/host_name$(EXEEXT) unit/ip/icmp$(EXEEXT) \ unit/ip/multicast$(EXEEXT) unit/ip/network_v4$(EXEEXT) \ unit/ip/network_v6$(EXEEXT) \ unit/ip/resolver_query_base$(EXEEXT) \ unit/ip/resolver_service$(EXEEXT) unit/ip/tcp$(EXEEXT) \ unit/ip/udp$(EXEEXT) unit/ip/unicast$(EXEEXT) \ unit/ip/v6_only$(EXEEXT) unit/is_read_buffered$(EXEEXT) \ unit/is_write_buffered$(EXEEXT) \ unit/local/basic_endpoint$(EXEEXT) \ unit/local/connect_pair$(EXEEXT) \ unit/local/datagram_protocol$(EXEEXT) \ unit/local/stream_protocol$(EXEEXT) \ unit/packaged_task$(EXEEXT) unit/placeholders$(EXEEXT) \ unit/posix/basic_descriptor$(EXEEXT) \ unit/posix/basic_stream_descriptor$(EXEEXT) \ unit/posix/descriptor$(EXEEXT) \ unit/posix/descriptor_base$(EXEEXT) \ unit/posix/stream_descriptor$(EXEEXT) \ unit/posix/stream_descriptor_service$(EXEEXT) \ unit/post$(EXEEXT) unit/raw_socket_service$(EXEEXT) \ unit/read$(EXEEXT) unit/read_at$(EXEEXT) \ unit/read_until$(EXEEXT) \ unit/seq_packet_socket_service$(EXEEXT) \ unit/serial_port$(EXEEXT) unit/serial_port_base$(EXEEXT) \ unit/serial_port_service$(EXEEXT) unit/signal_set$(EXEEXT) \ unit/signal_set_service$(EXEEXT) \ unit/socket_acceptor_service$(EXEEXT) \ unit/socket_base$(EXEEXT) unit/steady_timer$(EXEEXT) \ unit/strand$(EXEEXT) unit/stream_socket_service$(EXEEXT) \ unit/streambuf$(EXEEXT) unit/system_context$(EXEEXT) \ unit/system_executor$(EXEEXT) unit/system_timer$(EXEEXT) \ unit/thread$(EXEEXT) unit/time_traits$(EXEEXT) \ unit/ts/buffer$(EXEEXT) unit/ts/executor$(EXEEXT) \ unit/ts/internet$(EXEEXT) unit/ts/io_context$(EXEEXT) \ unit/ts/net$(EXEEXT) unit/ts/netfwd$(EXEEXT) \ unit/ts/socket$(EXEEXT) unit/ts/timer$(EXEEXT) \ unit/use_future$(EXEEXT) unit/uses_executor$(EXEEXT) \ unit/wait_traits$(EXEEXT) unit/waitable_timer_service$(EXEEXT) \ unit/windows/basic_handle$(EXEEXT) \ unit/windows/basic_object_handle$(EXEEXT) \ unit/windows/basic_random_access_handle$(EXEEXT) \ unit/windows/basic_stream_handle$(EXEEXT) \ unit/windows/object_handle$(EXEEXT) \ unit/windows/object_handle_service$(EXEEXT) \ unit/windows/overlapped_handle$(EXEEXT) \ unit/windows/overlapped_ptr$(EXEEXT) \ unit/windows/random_access_handle$(EXEEXT) \ unit/windows/random_access_handle_service$(EXEEXT) \ unit/windows/stream_handle$(EXEEXT) \ unit/windows/stream_handle_service$(EXEEXT) \ unit/write$(EXEEXT) unit/write_at$(EXEEXT) $(am__EXEEXT_1) @HAVE_OPENSSL_TRUE@am__append_3 = \ @HAVE_OPENSSL_TRUE@ unit/ssl/context_base \ @HAVE_OPENSSL_TRUE@ unit/ssl/context \ @HAVE_OPENSSL_TRUE@ unit/ssl/error \ @HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream_base \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream subdir = src/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HAVE_OPENSSL_TRUE@am__EXEEXT_1 = unit/ssl/context_base$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ unit/ssl/context$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ unit/ssl/error$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream_base$(EXEEXT) \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libasio_a_AR = $(AR) $(ARFLAGS) libasio_a_LIBADD = am__libasio_a_SOURCES_DIST = ../asio.cpp ../asio_ssl.cpp am__dirstamp = $(am__leading_dot)dirstamp @HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../asio_ssl.$(OBJEXT) @SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = ../asio.$(OBJEXT) \ @SEPARATE_COMPILATION_TRUE@ $(am__objects_1) libasio_a_OBJECTS = $(am_libasio_a_OBJECTS) am__latency_tcp_client_SOURCES_DIST = latency/tcp_client.cpp @STANDALONE_FALSE@am_latency_tcp_client_OBJECTS = \ @STANDALONE_FALSE@ latency/tcp_client.$(OBJEXT) latency_tcp_client_OBJECTS = $(am_latency_tcp_client_OBJECTS) latency_tcp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@latency_tcp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__latency_tcp_server_SOURCES_DIST = latency/tcp_server.cpp @STANDALONE_FALSE@am_latency_tcp_server_OBJECTS = \ @STANDALONE_FALSE@ latency/tcp_server.$(OBJEXT) latency_tcp_server_OBJECTS = $(am_latency_tcp_server_OBJECTS) latency_tcp_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@latency_tcp_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__latency_udp_client_SOURCES_DIST = latency/udp_client.cpp @STANDALONE_FALSE@am_latency_udp_client_OBJECTS = \ @STANDALONE_FALSE@ latency/udp_client.$(OBJEXT) latency_udp_client_OBJECTS = $(am_latency_udp_client_OBJECTS) latency_udp_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@latency_udp_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__latency_udp_server_SOURCES_DIST = latency/udp_server.cpp @STANDALONE_FALSE@am_latency_udp_server_OBJECTS = \ @STANDALONE_FALSE@ latency/udp_server.$(OBJEXT) latency_udp_server_OBJECTS = $(am_latency_udp_server_OBJECTS) latency_udp_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@latency_udp_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__performance_client_SOURCES_DIST = performance/client.cpp @STANDALONE_FALSE@am_performance_client_OBJECTS = \ @STANDALONE_FALSE@ performance/client.$(OBJEXT) performance_client_OBJECTS = $(am_performance_client_OBJECTS) performance_client_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@performance_client_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__performance_server_SOURCES_DIST = performance/server.cpp @STANDALONE_FALSE@am_performance_server_OBJECTS = \ @STANDALONE_FALSE@ performance/server.$(OBJEXT) performance_server_OBJECTS = $(am_performance_server_OBJECTS) performance_server_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@performance_server_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_associated_allocator_OBJECTS = \ unit/associated_allocator.$(OBJEXT) unit_associated_allocator_OBJECTS = \ $(am_unit_associated_allocator_OBJECTS) unit_associated_allocator_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_associated_allocator_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_associated_executor_OBJECTS = \ unit/associated_executor.$(OBJEXT) unit_associated_executor_OBJECTS = \ $(am_unit_associated_executor_OBJECTS) unit_associated_executor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_associated_executor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_async_result_OBJECTS = unit/async_result.$(OBJEXT) unit_async_result_OBJECTS = $(am_unit_async_result_OBJECTS) unit_async_result_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_async_result_DEPENDENCIES = libasio.a am_unit_basic_datagram_socket_OBJECTS = \ unit/basic_datagram_socket.$(OBJEXT) unit_basic_datagram_socket_OBJECTS = \ $(am_unit_basic_datagram_socket_OBJECTS) unit_basic_datagram_socket_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_datagram_socket_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_deadline_timer_OBJECTS = \ unit/basic_deadline_timer.$(OBJEXT) unit_basic_deadline_timer_OBJECTS = \ $(am_unit_basic_deadline_timer_OBJECTS) unit_basic_deadline_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_deadline_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_raw_socket_OBJECTS = unit/basic_raw_socket.$(OBJEXT) unit_basic_raw_socket_OBJECTS = $(am_unit_basic_raw_socket_OBJECTS) unit_basic_raw_socket_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_raw_socket_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_seq_packet_socket_OBJECTS = \ unit/basic_seq_packet_socket.$(OBJEXT) unit_basic_seq_packet_socket_OBJECTS = \ $(am_unit_basic_seq_packet_socket_OBJECTS) unit_basic_seq_packet_socket_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_seq_packet_socket_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_serial_port_OBJECTS = unit/basic_serial_port.$(OBJEXT) unit_basic_serial_port_OBJECTS = $(am_unit_basic_serial_port_OBJECTS) unit_basic_serial_port_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_serial_port_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_signal_set_OBJECTS = unit/basic_signal_set.$(OBJEXT) unit_basic_signal_set_OBJECTS = $(am_unit_basic_signal_set_OBJECTS) unit_basic_signal_set_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_signal_set_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_socket_acceptor_OBJECTS = \ unit/basic_socket_acceptor.$(OBJEXT) unit_basic_socket_acceptor_OBJECTS = \ $(am_unit_basic_socket_acceptor_OBJECTS) unit_basic_socket_acceptor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_socket_acceptor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_stream_socket_OBJECTS = \ unit/basic_stream_socket.$(OBJEXT) unit_basic_stream_socket_OBJECTS = \ $(am_unit_basic_stream_socket_OBJECTS) unit_basic_stream_socket_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_stream_socket_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_streambuf_OBJECTS = unit/basic_streambuf.$(OBJEXT) unit_basic_streambuf_OBJECTS = $(am_unit_basic_streambuf_OBJECTS) unit_basic_streambuf_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_streambuf_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_basic_waitable_timer_OBJECTS = \ unit/basic_waitable_timer.$(OBJEXT) unit_basic_waitable_timer_OBJECTS = \ $(am_unit_basic_waitable_timer_OBJECTS) unit_basic_waitable_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_basic_waitable_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_bind_executor_OBJECTS = unit/bind_executor.$(OBJEXT) unit_bind_executor_OBJECTS = $(am_unit_bind_executor_OBJECTS) unit_bind_executor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_bind_executor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_buffer_OBJECTS = unit/buffer.$(OBJEXT) unit_buffer_OBJECTS = $(am_unit_buffer_OBJECTS) unit_buffer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_buffer_DEPENDENCIES = libasio.a am_unit_buffered_read_stream_OBJECTS = \ unit/buffered_read_stream.$(OBJEXT) unit_buffered_read_stream_OBJECTS = \ $(am_unit_buffered_read_stream_OBJECTS) unit_buffered_read_stream_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_buffered_read_stream_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_buffered_stream_OBJECTS = unit/buffered_stream.$(OBJEXT) unit_buffered_stream_OBJECTS = $(am_unit_buffered_stream_OBJECTS) unit_buffered_stream_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_buffered_stream_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_buffered_write_stream_OBJECTS = \ unit/buffered_write_stream.$(OBJEXT) unit_buffered_write_stream_OBJECTS = \ $(am_unit_buffered_write_stream_OBJECTS) unit_buffered_write_stream_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_buffered_write_stream_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_buffers_iterator_OBJECTS = unit/buffers_iterator.$(OBJEXT) unit_buffers_iterator_OBJECTS = $(am_unit_buffers_iterator_OBJECTS) unit_buffers_iterator_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_buffers_iterator_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_completion_condition_OBJECTS = \ unit/completion_condition.$(OBJEXT) unit_completion_condition_OBJECTS = \ $(am_unit_completion_condition_OBJECTS) unit_completion_condition_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_completion_condition_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_connect_OBJECTS = unit/connect.$(OBJEXT) unit_connect_OBJECTS = $(am_unit_connect_OBJECTS) unit_connect_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_connect_DEPENDENCIES = libasio.a am_unit_coroutine_OBJECTS = unit/coroutine.$(OBJEXT) unit_coroutine_OBJECTS = $(am_unit_coroutine_OBJECTS) unit_coroutine_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_coroutine_DEPENDENCIES = libasio.a am_unit_datagram_socket_service_OBJECTS = \ unit/datagram_socket_service.$(OBJEXT) unit_datagram_socket_service_OBJECTS = \ $(am_unit_datagram_socket_service_OBJECTS) unit_datagram_socket_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_datagram_socket_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_deadline_timer_OBJECTS = unit/deadline_timer.$(OBJEXT) unit_deadline_timer_OBJECTS = $(am_unit_deadline_timer_OBJECTS) unit_deadline_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_deadline_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_deadline_timer_service_OBJECTS = \ unit/deadline_timer_service.$(OBJEXT) unit_deadline_timer_service_OBJECTS = \ $(am_unit_deadline_timer_service_OBJECTS) unit_deadline_timer_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_deadline_timer_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_defer_OBJECTS = unit/defer.$(OBJEXT) unit_defer_OBJECTS = $(am_unit_defer_OBJECTS) unit_defer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_defer_DEPENDENCIES = libasio.a am_unit_dispatch_OBJECTS = unit/dispatch.$(OBJEXT) unit_dispatch_OBJECTS = $(am_unit_dispatch_OBJECTS) unit_dispatch_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_dispatch_DEPENDENCIES = libasio.a am_unit_error_OBJECTS = unit/error.$(OBJEXT) unit_error_OBJECTS = $(am_unit_error_OBJECTS) unit_error_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_error_DEPENDENCIES = libasio.a am_unit_execution_context_OBJECTS = unit/execution_context.$(OBJEXT) unit_execution_context_OBJECTS = $(am_unit_execution_context_OBJECTS) unit_execution_context_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_execution_context_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_executor_OBJECTS = unit/executor.$(OBJEXT) unit_executor_OBJECTS = $(am_unit_executor_OBJECTS) unit_executor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_executor_DEPENDENCIES = libasio.a am_unit_executor_work_guard_OBJECTS = \ unit/executor_work_guard.$(OBJEXT) unit_executor_work_guard_OBJECTS = \ $(am_unit_executor_work_guard_OBJECTS) unit_executor_work_guard_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_executor_work_guard_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_generic_basic_endpoint_OBJECTS = \ unit/generic/basic_endpoint.$(OBJEXT) unit_generic_basic_endpoint_OBJECTS = \ $(am_unit_generic_basic_endpoint_OBJECTS) unit_generic_basic_endpoint_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_generic_basic_endpoint_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_generic_datagram_protocol_OBJECTS = \ unit/generic/datagram_protocol.$(OBJEXT) unit_generic_datagram_protocol_OBJECTS = \ $(am_unit_generic_datagram_protocol_OBJECTS) unit_generic_datagram_protocol_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_generic_datagram_protocol_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_generic_raw_protocol_OBJECTS = \ unit/generic/raw_protocol.$(OBJEXT) unit_generic_raw_protocol_OBJECTS = \ $(am_unit_generic_raw_protocol_OBJECTS) unit_generic_raw_protocol_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_generic_raw_protocol_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_generic_seq_packet_protocol_OBJECTS = \ unit/generic/seq_packet_protocol.$(OBJEXT) unit_generic_seq_packet_protocol_OBJECTS = \ $(am_unit_generic_seq_packet_protocol_OBJECTS) unit_generic_seq_packet_protocol_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_generic_seq_packet_protocol_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_generic_stream_protocol_OBJECTS = \ unit/generic/stream_protocol.$(OBJEXT) unit_generic_stream_protocol_OBJECTS = \ $(am_unit_generic_stream_protocol_OBJECTS) unit_generic_stream_protocol_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_generic_stream_protocol_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_high_resolution_timer_OBJECTS = \ unit/high_resolution_timer.$(OBJEXT) unit_high_resolution_timer_OBJECTS = \ $(am_unit_high_resolution_timer_OBJECTS) unit_high_resolution_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_high_resolution_timer_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_io_context_OBJECTS = unit/io_context.$(OBJEXT) unit_io_context_OBJECTS = $(am_unit_io_context_OBJECTS) unit_io_context_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_io_context_DEPENDENCIES = libasio.a am_unit_ip_address_OBJECTS = unit/ip/address.$(OBJEXT) unit_ip_address_OBJECTS = $(am_unit_ip_address_OBJECTS) unit_ip_address_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_DEPENDENCIES = libasio.a am_unit_ip_address_v4_OBJECTS = unit/ip/address_v4.$(OBJEXT) unit_ip_address_v4_OBJECTS = $(am_unit_ip_address_v4_OBJECTS) unit_ip_address_v4_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_v4_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_address_v4_iterator_OBJECTS = \ unit/ip/address_v4_iterator.$(OBJEXT) unit_ip_address_v4_iterator_OBJECTS = \ $(am_unit_ip_address_v4_iterator_OBJECTS) unit_ip_address_v4_iterator_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_v4_iterator_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_address_v4_range_OBJECTS = \ unit/ip/address_v4_range.$(OBJEXT) unit_ip_address_v4_range_OBJECTS = \ $(am_unit_ip_address_v4_range_OBJECTS) unit_ip_address_v4_range_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_v4_range_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_address_v6_OBJECTS = unit/ip/address_v6.$(OBJEXT) unit_ip_address_v6_OBJECTS = $(am_unit_ip_address_v6_OBJECTS) unit_ip_address_v6_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_v6_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_address_v6_iterator_OBJECTS = \ unit/ip/address_v6_iterator.$(OBJEXT) unit_ip_address_v6_iterator_OBJECTS = \ $(am_unit_ip_address_v6_iterator_OBJECTS) unit_ip_address_v6_iterator_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_v6_iterator_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_address_v6_range_OBJECTS = \ unit/ip/address_v6_range.$(OBJEXT) unit_ip_address_v6_range_OBJECTS = \ $(am_unit_ip_address_v6_range_OBJECTS) unit_ip_address_v6_range_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_address_v6_range_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_basic_endpoint_OBJECTS = unit/ip/basic_endpoint.$(OBJEXT) unit_ip_basic_endpoint_OBJECTS = $(am_unit_ip_basic_endpoint_OBJECTS) unit_ip_basic_endpoint_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_basic_endpoint_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_basic_resolver_OBJECTS = unit/ip/basic_resolver.$(OBJEXT) unit_ip_basic_resolver_OBJECTS = $(am_unit_ip_basic_resolver_OBJECTS) unit_ip_basic_resolver_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_basic_resolver_entry_OBJECTS = \ unit/ip/basic_resolver_entry.$(OBJEXT) unit_ip_basic_resolver_entry_OBJECTS = \ $(am_unit_ip_basic_resolver_entry_OBJECTS) unit_ip_basic_resolver_entry_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_entry_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_basic_resolver_iterator_OBJECTS = \ unit/ip/basic_resolver_iterator.$(OBJEXT) unit_ip_basic_resolver_iterator_OBJECTS = \ $(am_unit_ip_basic_resolver_iterator_OBJECTS) unit_ip_basic_resolver_iterator_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_iterator_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_basic_resolver_query_OBJECTS = \ unit/ip/basic_resolver_query.$(OBJEXT) unit_ip_basic_resolver_query_OBJECTS = \ $(am_unit_ip_basic_resolver_query_OBJECTS) unit_ip_basic_resolver_query_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_query_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_host_name_OBJECTS = unit/ip/host_name.$(OBJEXT) unit_ip_host_name_OBJECTS = $(am_unit_ip_host_name_OBJECTS) unit_ip_host_name_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_host_name_DEPENDENCIES = libasio.a am_unit_ip_icmp_OBJECTS = unit/ip/icmp.$(OBJEXT) unit_ip_icmp_OBJECTS = $(am_unit_ip_icmp_OBJECTS) unit_ip_icmp_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_icmp_DEPENDENCIES = libasio.a am_unit_ip_multicast_OBJECTS = unit/ip/multicast.$(OBJEXT) unit_ip_multicast_OBJECTS = $(am_unit_ip_multicast_OBJECTS) unit_ip_multicast_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_multicast_DEPENDENCIES = libasio.a am_unit_ip_network_v4_OBJECTS = unit/ip/network_v4.$(OBJEXT) unit_ip_network_v4_OBJECTS = $(am_unit_ip_network_v4_OBJECTS) unit_ip_network_v4_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_network_v4_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_network_v6_OBJECTS = unit/ip/network_v6.$(OBJEXT) unit_ip_network_v6_OBJECTS = $(am_unit_ip_network_v6_OBJECTS) unit_ip_network_v6_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_network_v6_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_resolver_query_base_OBJECTS = \ unit/ip/resolver_query_base.$(OBJEXT) unit_ip_resolver_query_base_OBJECTS = \ $(am_unit_ip_resolver_query_base_OBJECTS) unit_ip_resolver_query_base_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_resolver_query_base_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_resolver_service_OBJECTS = \ unit/ip/resolver_service.$(OBJEXT) unit_ip_resolver_service_OBJECTS = \ $(am_unit_ip_resolver_service_OBJECTS) unit_ip_resolver_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_resolver_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ip_tcp_OBJECTS = unit/ip/tcp.$(OBJEXT) unit_ip_tcp_OBJECTS = $(am_unit_ip_tcp_OBJECTS) unit_ip_tcp_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_tcp_DEPENDENCIES = libasio.a am_unit_ip_udp_OBJECTS = unit/ip/udp.$(OBJEXT) unit_ip_udp_OBJECTS = $(am_unit_ip_udp_OBJECTS) unit_ip_udp_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_udp_DEPENDENCIES = libasio.a am_unit_ip_unicast_OBJECTS = unit/ip/unicast.$(OBJEXT) unit_ip_unicast_OBJECTS = $(am_unit_ip_unicast_OBJECTS) unit_ip_unicast_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_unicast_DEPENDENCIES = libasio.a am_unit_ip_v6_only_OBJECTS = unit/ip/v6_only.$(OBJEXT) unit_ip_v6_only_OBJECTS = $(am_unit_ip_v6_only_OBJECTS) unit_ip_v6_only_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ip_v6_only_DEPENDENCIES = libasio.a am_unit_is_read_buffered_OBJECTS = unit/is_read_buffered.$(OBJEXT) unit_is_read_buffered_OBJECTS = $(am_unit_is_read_buffered_OBJECTS) unit_is_read_buffered_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_is_read_buffered_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_is_write_buffered_OBJECTS = unit/is_write_buffered.$(OBJEXT) unit_is_write_buffered_OBJECTS = $(am_unit_is_write_buffered_OBJECTS) unit_is_write_buffered_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_is_write_buffered_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_local_basic_endpoint_OBJECTS = \ unit/local/basic_endpoint.$(OBJEXT) unit_local_basic_endpoint_OBJECTS = \ $(am_unit_local_basic_endpoint_OBJECTS) unit_local_basic_endpoint_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_local_basic_endpoint_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_local_connect_pair_OBJECTS = \ unit/local/connect_pair.$(OBJEXT) unit_local_connect_pair_OBJECTS = \ $(am_unit_local_connect_pair_OBJECTS) unit_local_connect_pair_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_local_connect_pair_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_local_datagram_protocol_OBJECTS = \ unit/local/datagram_protocol.$(OBJEXT) unit_local_datagram_protocol_OBJECTS = \ $(am_unit_local_datagram_protocol_OBJECTS) unit_local_datagram_protocol_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_local_datagram_protocol_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_local_stream_protocol_OBJECTS = \ unit/local/stream_protocol.$(OBJEXT) unit_local_stream_protocol_OBJECTS = \ $(am_unit_local_stream_protocol_OBJECTS) unit_local_stream_protocol_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_local_stream_protocol_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_packaged_task_OBJECTS = unit/packaged_task.$(OBJEXT) unit_packaged_task_OBJECTS = $(am_unit_packaged_task_OBJECTS) unit_packaged_task_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_packaged_task_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_placeholders_OBJECTS = unit/placeholders.$(OBJEXT) unit_placeholders_OBJECTS = $(am_unit_placeholders_OBJECTS) unit_placeholders_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_placeholders_DEPENDENCIES = libasio.a am_unit_posix_basic_descriptor_OBJECTS = \ unit/posix/basic_descriptor.$(OBJEXT) unit_posix_basic_descriptor_OBJECTS = \ $(am_unit_posix_basic_descriptor_OBJECTS) unit_posix_basic_descriptor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_posix_basic_descriptor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_posix_basic_stream_descriptor_OBJECTS = \ unit/posix/basic_stream_descriptor.$(OBJEXT) unit_posix_basic_stream_descriptor_OBJECTS = \ $(am_unit_posix_basic_stream_descriptor_OBJECTS) unit_posix_basic_stream_descriptor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_posix_basic_stream_descriptor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_posix_descriptor_OBJECTS = unit/posix/descriptor.$(OBJEXT) unit_posix_descriptor_OBJECTS = $(am_unit_posix_descriptor_OBJECTS) unit_posix_descriptor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_posix_descriptor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_posix_descriptor_base_OBJECTS = \ unit/posix/descriptor_base.$(OBJEXT) unit_posix_descriptor_base_OBJECTS = \ $(am_unit_posix_descriptor_base_OBJECTS) unit_posix_descriptor_base_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_posix_descriptor_base_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_posix_stream_descriptor_OBJECTS = \ unit/posix/stream_descriptor.$(OBJEXT) unit_posix_stream_descriptor_OBJECTS = \ $(am_unit_posix_stream_descriptor_OBJECTS) unit_posix_stream_descriptor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_posix_stream_descriptor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_posix_stream_descriptor_service_OBJECTS = \ unit/posix/stream_descriptor_service.$(OBJEXT) unit_posix_stream_descriptor_service_OBJECTS = \ $(am_unit_posix_stream_descriptor_service_OBJECTS) unit_posix_stream_descriptor_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_posix_stream_descriptor_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_post_OBJECTS = unit/post.$(OBJEXT) unit_post_OBJECTS = $(am_unit_post_OBJECTS) unit_post_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_post_DEPENDENCIES = libasio.a am_unit_raw_socket_service_OBJECTS = \ unit/raw_socket_service.$(OBJEXT) unit_raw_socket_service_OBJECTS = \ $(am_unit_raw_socket_service_OBJECTS) unit_raw_socket_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_raw_socket_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_read_OBJECTS = unit/read.$(OBJEXT) unit_read_OBJECTS = $(am_unit_read_OBJECTS) unit_read_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_read_DEPENDENCIES = libasio.a am_unit_read_at_OBJECTS = unit/read_at.$(OBJEXT) unit_read_at_OBJECTS = $(am_unit_read_at_OBJECTS) unit_read_at_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_read_at_DEPENDENCIES = libasio.a am_unit_read_until_OBJECTS = unit/read_until.$(OBJEXT) unit_read_until_OBJECTS = $(am_unit_read_until_OBJECTS) unit_read_until_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_read_until_DEPENDENCIES = libasio.a am_unit_seq_packet_socket_service_OBJECTS = \ unit/seq_packet_socket_service.$(OBJEXT) unit_seq_packet_socket_service_OBJECTS = \ $(am_unit_seq_packet_socket_service_OBJECTS) unit_seq_packet_socket_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_seq_packet_socket_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_serial_port_OBJECTS = unit/serial_port.$(OBJEXT) unit_serial_port_OBJECTS = $(am_unit_serial_port_OBJECTS) unit_serial_port_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_serial_port_DEPENDENCIES = libasio.a am_unit_serial_port_base_OBJECTS = unit/serial_port_base.$(OBJEXT) unit_serial_port_base_OBJECTS = $(am_unit_serial_port_base_OBJECTS) unit_serial_port_base_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_serial_port_base_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_serial_port_service_OBJECTS = \ unit/serial_port_service.$(OBJEXT) unit_serial_port_service_OBJECTS = \ $(am_unit_serial_port_service_OBJECTS) unit_serial_port_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_serial_port_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_signal_set_OBJECTS = unit/signal_set.$(OBJEXT) unit_signal_set_OBJECTS = $(am_unit_signal_set_OBJECTS) unit_signal_set_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_signal_set_DEPENDENCIES = libasio.a am_unit_signal_set_service_OBJECTS = \ unit/signal_set_service.$(OBJEXT) unit_signal_set_service_OBJECTS = \ $(am_unit_signal_set_service_OBJECTS) unit_signal_set_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_signal_set_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_socket_acceptor_service_OBJECTS = \ unit/socket_acceptor_service.$(OBJEXT) unit_socket_acceptor_service_OBJECTS = \ $(am_unit_socket_acceptor_service_OBJECTS) unit_socket_acceptor_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_socket_acceptor_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_socket_base_OBJECTS = unit/socket_base.$(OBJEXT) unit_socket_base_OBJECTS = $(am_unit_socket_base_OBJECTS) unit_socket_base_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_socket_base_DEPENDENCIES = libasio.a am__unit_ssl_context_SOURCES_DIST = unit/ssl/context.cpp @HAVE_OPENSSL_TRUE@am_unit_ssl_context_OBJECTS = \ @HAVE_OPENSSL_TRUE@ unit/ssl/context.$(OBJEXT) unit_ssl_context_OBJECTS = $(am_unit_ssl_context_OBJECTS) unit_ssl_context_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ssl_context_DEPENDENCIES = libasio.a am__unit_ssl_context_base_SOURCES_DIST = unit/ssl/context_base.cpp @HAVE_OPENSSL_TRUE@am_unit_ssl_context_base_OBJECTS = \ @HAVE_OPENSSL_TRUE@ unit/ssl/context_base.$(OBJEXT) unit_ssl_context_base_OBJECTS = $(am_unit_ssl_context_base_OBJECTS) unit_ssl_context_base_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ssl_context_base_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__unit_ssl_error_SOURCES_DIST = unit/ssl/error.cpp @HAVE_OPENSSL_TRUE@am_unit_ssl_error_OBJECTS = \ @HAVE_OPENSSL_TRUE@ unit/ssl/error.$(OBJEXT) unit_ssl_error_OBJECTS = $(am_unit_ssl_error_OBJECTS) unit_ssl_error_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ssl_error_DEPENDENCIES = libasio.a am__unit_ssl_rfc2818_verification_SOURCES_DIST = \ unit/ssl/rfc2818_verification.cpp @HAVE_OPENSSL_TRUE@am_unit_ssl_rfc2818_verification_OBJECTS = \ @HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification.$(OBJEXT) unit_ssl_rfc2818_verification_OBJECTS = \ $(am_unit_ssl_rfc2818_verification_OBJECTS) unit_ssl_rfc2818_verification_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ssl_rfc2818_verification_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am__unit_ssl_stream_SOURCES_DIST = unit/ssl/stream.cpp @HAVE_OPENSSL_TRUE@am_unit_ssl_stream_OBJECTS = \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream.$(OBJEXT) unit_ssl_stream_OBJECTS = $(am_unit_ssl_stream_OBJECTS) unit_ssl_stream_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ssl_stream_DEPENDENCIES = libasio.a am__unit_ssl_stream_base_SOURCES_DIST = unit/ssl/stream_base.cpp @HAVE_OPENSSL_TRUE@am_unit_ssl_stream_base_OBJECTS = \ @HAVE_OPENSSL_TRUE@ unit/ssl/stream_base.$(OBJEXT) unit_ssl_stream_base_OBJECTS = $(am_unit_ssl_stream_base_OBJECTS) unit_ssl_stream_base_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ssl_stream_base_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_steady_timer_OBJECTS = unit/steady_timer.$(OBJEXT) unit_steady_timer_OBJECTS = $(am_unit_steady_timer_OBJECTS) unit_steady_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_steady_timer_DEPENDENCIES = libasio.a am_unit_strand_OBJECTS = unit/strand.$(OBJEXT) unit_strand_OBJECTS = $(am_unit_strand_OBJECTS) unit_strand_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_strand_DEPENDENCIES = libasio.a am_unit_stream_socket_service_OBJECTS = \ unit/stream_socket_service.$(OBJEXT) unit_stream_socket_service_OBJECTS = \ $(am_unit_stream_socket_service_OBJECTS) unit_stream_socket_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_stream_socket_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_streambuf_OBJECTS = unit/streambuf.$(OBJEXT) unit_streambuf_OBJECTS = $(am_unit_streambuf_OBJECTS) unit_streambuf_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_streambuf_DEPENDENCIES = libasio.a am_unit_system_context_OBJECTS = unit/system_context.$(OBJEXT) unit_system_context_OBJECTS = $(am_unit_system_context_OBJECTS) unit_system_context_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_system_context_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_system_executor_OBJECTS = unit/system_executor.$(OBJEXT) unit_system_executor_OBJECTS = $(am_unit_system_executor_OBJECTS) unit_system_executor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_system_executor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_system_timer_OBJECTS = unit/system_timer.$(OBJEXT) unit_system_timer_OBJECTS = $(am_unit_system_timer_OBJECTS) unit_system_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_system_timer_DEPENDENCIES = libasio.a am_unit_thread_OBJECTS = unit/thread.$(OBJEXT) unit_thread_OBJECTS = $(am_unit_thread_OBJECTS) unit_thread_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_thread_DEPENDENCIES = libasio.a am_unit_time_traits_OBJECTS = unit/time_traits.$(OBJEXT) unit_time_traits_OBJECTS = $(am_unit_time_traits_OBJECTS) unit_time_traits_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_time_traits_DEPENDENCIES = libasio.a am_unit_ts_buffer_OBJECTS = unit/ts/buffer.$(OBJEXT) unit_ts_buffer_OBJECTS = $(am_unit_ts_buffer_OBJECTS) unit_ts_buffer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_buffer_DEPENDENCIES = libasio.a am_unit_ts_executor_OBJECTS = unit/ts/executor.$(OBJEXT) unit_ts_executor_OBJECTS = $(am_unit_ts_executor_OBJECTS) unit_ts_executor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_executor_DEPENDENCIES = libasio.a am_unit_ts_internet_OBJECTS = unit/ts/internet.$(OBJEXT) unit_ts_internet_OBJECTS = $(am_unit_ts_internet_OBJECTS) unit_ts_internet_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_internet_DEPENDENCIES = libasio.a am_unit_ts_io_context_OBJECTS = unit/ts/io_context.$(OBJEXT) unit_ts_io_context_OBJECTS = $(am_unit_ts_io_context_OBJECTS) unit_ts_io_context_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_io_context_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_ts_net_OBJECTS = unit/ts/net.$(OBJEXT) unit_ts_net_OBJECTS = $(am_unit_ts_net_OBJECTS) unit_ts_net_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_net_DEPENDENCIES = libasio.a am_unit_ts_netfwd_OBJECTS = unit/ts/netfwd.$(OBJEXT) unit_ts_netfwd_OBJECTS = $(am_unit_ts_netfwd_OBJECTS) unit_ts_netfwd_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_netfwd_DEPENDENCIES = libasio.a am_unit_ts_socket_OBJECTS = unit/ts/socket.$(OBJEXT) unit_ts_socket_OBJECTS = $(am_unit_ts_socket_OBJECTS) unit_ts_socket_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_socket_DEPENDENCIES = libasio.a am_unit_ts_timer_OBJECTS = unit/ts/timer.$(OBJEXT) unit_ts_timer_OBJECTS = $(am_unit_ts_timer_OBJECTS) unit_ts_timer_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_ts_timer_DEPENDENCIES = libasio.a am_unit_use_future_OBJECTS = unit/use_future.$(OBJEXT) unit_use_future_OBJECTS = $(am_unit_use_future_OBJECTS) unit_use_future_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_use_future_DEPENDENCIES = libasio.a am_unit_uses_executor_OBJECTS = unit/uses_executor.$(OBJEXT) unit_uses_executor_OBJECTS = $(am_unit_uses_executor_OBJECTS) unit_uses_executor_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_uses_executor_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_wait_traits_OBJECTS = unit/wait_traits.$(OBJEXT) unit_wait_traits_OBJECTS = $(am_unit_wait_traits_OBJECTS) unit_wait_traits_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_wait_traits_DEPENDENCIES = libasio.a am_unit_waitable_timer_service_OBJECTS = \ unit/waitable_timer_service.$(OBJEXT) unit_waitable_timer_service_OBJECTS = \ $(am_unit_waitable_timer_service_OBJECTS) unit_waitable_timer_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_waitable_timer_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_basic_handle_OBJECTS = \ unit/windows/basic_handle.$(OBJEXT) unit_windows_basic_handle_OBJECTS = \ $(am_unit_windows_basic_handle_OBJECTS) unit_windows_basic_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_basic_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_basic_object_handle_OBJECTS = \ unit/windows/basic_object_handle.$(OBJEXT) unit_windows_basic_object_handle_OBJECTS = \ $(am_unit_windows_basic_object_handle_OBJECTS) unit_windows_basic_object_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_basic_object_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_basic_random_access_handle_OBJECTS = \ unit/windows/basic_random_access_handle.$(OBJEXT) unit_windows_basic_random_access_handle_OBJECTS = \ $(am_unit_windows_basic_random_access_handle_OBJECTS) unit_windows_basic_random_access_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_basic_random_access_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_basic_stream_handle_OBJECTS = \ unit/windows/basic_stream_handle.$(OBJEXT) unit_windows_basic_stream_handle_OBJECTS = \ $(am_unit_windows_basic_stream_handle_OBJECTS) unit_windows_basic_stream_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_basic_stream_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_object_handle_OBJECTS = \ unit/windows/object_handle.$(OBJEXT) unit_windows_object_handle_OBJECTS = \ $(am_unit_windows_object_handle_OBJECTS) unit_windows_object_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_object_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_object_handle_service_OBJECTS = \ unit/windows/object_handle_service.$(OBJEXT) unit_windows_object_handle_service_OBJECTS = \ $(am_unit_windows_object_handle_service_OBJECTS) unit_windows_object_handle_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_object_handle_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_overlapped_handle_OBJECTS = \ unit/windows/overlapped_handle.$(OBJEXT) unit_windows_overlapped_handle_OBJECTS = \ $(am_unit_windows_overlapped_handle_OBJECTS) unit_windows_overlapped_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_overlapped_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_overlapped_ptr_OBJECTS = \ unit/windows/overlapped_ptr.$(OBJEXT) unit_windows_overlapped_ptr_OBJECTS = \ $(am_unit_windows_overlapped_ptr_OBJECTS) unit_windows_overlapped_ptr_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_overlapped_ptr_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_random_access_handle_OBJECTS = \ unit/windows/random_access_handle.$(OBJEXT) unit_windows_random_access_handle_OBJECTS = \ $(am_unit_windows_random_access_handle_OBJECTS) unit_windows_random_access_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_random_access_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_random_access_handle_service_OBJECTS = \ unit/windows/random_access_handle_service.$(OBJEXT) unit_windows_random_access_handle_service_OBJECTS = \ $(am_unit_windows_random_access_handle_service_OBJECTS) unit_windows_random_access_handle_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_random_access_handle_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_stream_handle_OBJECTS = \ unit/windows/stream_handle.$(OBJEXT) unit_windows_stream_handle_OBJECTS = \ $(am_unit_windows_stream_handle_OBJECTS) unit_windows_stream_handle_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_stream_handle_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_windows_stream_handle_service_OBJECTS = \ unit/windows/stream_handle_service.$(OBJEXT) unit_windows_stream_handle_service_OBJECTS = \ $(am_unit_windows_stream_handle_service_OBJECTS) unit_windows_stream_handle_service_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_windows_stream_handle_service_DEPENDENCIES = \ @SEPARATE_COMPILATION_TRUE@ libasio.a am_unit_write_OBJECTS = unit/write.$(OBJEXT) unit_write_OBJECTS = $(am_unit_write_OBJECTS) unit_write_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_write_DEPENDENCIES = libasio.a am_unit_write_at_OBJECTS = unit/write_at.$(OBJEXT) unit_write_at_OBJECTS = $(am_unit_write_at_OBJECTS) unit_write_at_LDADD = $(LDADD) @SEPARATE_COMPILATION_TRUE@unit_write_at_DEPENDENCIES = libasio.a AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ../$(DEPDIR)/asio.Po ../$(DEPDIR)/asio_ssl.Po \ latency/$(DEPDIR)/tcp_client.Po \ latency/$(DEPDIR)/tcp_server.Po \ latency/$(DEPDIR)/udp_client.Po \ latency/$(DEPDIR)/udp_server.Po \ performance/$(DEPDIR)/client.Po \ performance/$(DEPDIR)/server.Po \ unit/$(DEPDIR)/associated_allocator.Po \ unit/$(DEPDIR)/associated_executor.Po \ unit/$(DEPDIR)/async_result.Po \ unit/$(DEPDIR)/basic_datagram_socket.Po \ unit/$(DEPDIR)/basic_deadline_timer.Po \ unit/$(DEPDIR)/basic_raw_socket.Po \ unit/$(DEPDIR)/basic_seq_packet_socket.Po \ unit/$(DEPDIR)/basic_serial_port.Po \ unit/$(DEPDIR)/basic_signal_set.Po \ unit/$(DEPDIR)/basic_socket_acceptor.Po \ unit/$(DEPDIR)/basic_stream_socket.Po \ unit/$(DEPDIR)/basic_streambuf.Po \ unit/$(DEPDIR)/basic_waitable_timer.Po \ unit/$(DEPDIR)/bind_executor.Po unit/$(DEPDIR)/buffer.Po \ unit/$(DEPDIR)/buffered_read_stream.Po \ unit/$(DEPDIR)/buffered_stream.Po \ unit/$(DEPDIR)/buffered_write_stream.Po \ unit/$(DEPDIR)/buffers_iterator.Po \ unit/$(DEPDIR)/completion_condition.Po \ unit/$(DEPDIR)/connect.Po unit/$(DEPDIR)/coroutine.Po \ unit/$(DEPDIR)/datagram_socket_service.Po \ unit/$(DEPDIR)/deadline_timer.Po \ unit/$(DEPDIR)/deadline_timer_service.Po \ unit/$(DEPDIR)/defer.Po unit/$(DEPDIR)/dispatch.Po \ unit/$(DEPDIR)/error.Po unit/$(DEPDIR)/execution_context.Po \ unit/$(DEPDIR)/executor.Po \ unit/$(DEPDIR)/executor_work_guard.Po \ unit/$(DEPDIR)/high_resolution_timer.Po \ unit/$(DEPDIR)/io_context.Po \ unit/$(DEPDIR)/is_read_buffered.Po \ unit/$(DEPDIR)/is_write_buffered.Po \ unit/$(DEPDIR)/packaged_task.Po unit/$(DEPDIR)/placeholders.Po \ unit/$(DEPDIR)/post.Po unit/$(DEPDIR)/raw_socket_service.Po \ unit/$(DEPDIR)/read.Po unit/$(DEPDIR)/read_at.Po \ unit/$(DEPDIR)/read_until.Po \ unit/$(DEPDIR)/seq_packet_socket_service.Po \ unit/$(DEPDIR)/serial_port.Po \ unit/$(DEPDIR)/serial_port_base.Po \ unit/$(DEPDIR)/serial_port_service.Po \ unit/$(DEPDIR)/signal_set.Po \ unit/$(DEPDIR)/signal_set_service.Po \ unit/$(DEPDIR)/socket_acceptor_service.Po \ unit/$(DEPDIR)/socket_base.Po unit/$(DEPDIR)/steady_timer.Po \ unit/$(DEPDIR)/strand.Po \ unit/$(DEPDIR)/stream_socket_service.Po \ unit/$(DEPDIR)/streambuf.Po unit/$(DEPDIR)/system_context.Po \ unit/$(DEPDIR)/system_executor.Po \ unit/$(DEPDIR)/system_timer.Po unit/$(DEPDIR)/thread.Po \ unit/$(DEPDIR)/time_traits.Po unit/$(DEPDIR)/use_future.Po \ unit/$(DEPDIR)/uses_executor.Po unit/$(DEPDIR)/wait_traits.Po \ unit/$(DEPDIR)/waitable_timer_service.Po \ unit/$(DEPDIR)/write.Po unit/$(DEPDIR)/write_at.Po \ unit/generic/$(DEPDIR)/basic_endpoint.Po \ unit/generic/$(DEPDIR)/datagram_protocol.Po \ unit/generic/$(DEPDIR)/raw_protocol.Po \ unit/generic/$(DEPDIR)/seq_packet_protocol.Po \ unit/generic/$(DEPDIR)/stream_protocol.Po \ unit/ip/$(DEPDIR)/address.Po unit/ip/$(DEPDIR)/address_v4.Po \ unit/ip/$(DEPDIR)/address_v4_iterator.Po \ unit/ip/$(DEPDIR)/address_v4_range.Po \ unit/ip/$(DEPDIR)/address_v6.Po \ unit/ip/$(DEPDIR)/address_v6_iterator.Po \ unit/ip/$(DEPDIR)/address_v6_range.Po \ unit/ip/$(DEPDIR)/basic_endpoint.Po \ unit/ip/$(DEPDIR)/basic_resolver.Po \ unit/ip/$(DEPDIR)/basic_resolver_entry.Po \ unit/ip/$(DEPDIR)/basic_resolver_iterator.Po \ unit/ip/$(DEPDIR)/basic_resolver_query.Po \ unit/ip/$(DEPDIR)/host_name.Po unit/ip/$(DEPDIR)/icmp.Po \ unit/ip/$(DEPDIR)/multicast.Po unit/ip/$(DEPDIR)/network_v4.Po \ unit/ip/$(DEPDIR)/network_v6.Po \ unit/ip/$(DEPDIR)/resolver_query_base.Po \ unit/ip/$(DEPDIR)/resolver_service.Po unit/ip/$(DEPDIR)/tcp.Po \ unit/ip/$(DEPDIR)/udp.Po unit/ip/$(DEPDIR)/unicast.Po \ unit/ip/$(DEPDIR)/v6_only.Po \ unit/local/$(DEPDIR)/basic_endpoint.Po \ unit/local/$(DEPDIR)/connect_pair.Po \ unit/local/$(DEPDIR)/datagram_protocol.Po \ unit/local/$(DEPDIR)/stream_protocol.Po \ unit/posix/$(DEPDIR)/basic_descriptor.Po \ unit/posix/$(DEPDIR)/basic_stream_descriptor.Po \ unit/posix/$(DEPDIR)/descriptor.Po \ unit/posix/$(DEPDIR)/descriptor_base.Po \ unit/posix/$(DEPDIR)/stream_descriptor.Po \ unit/posix/$(DEPDIR)/stream_descriptor_service.Po \ unit/ssl/$(DEPDIR)/context.Po \ unit/ssl/$(DEPDIR)/context_base.Po unit/ssl/$(DEPDIR)/error.Po \ unit/ssl/$(DEPDIR)/rfc2818_verification.Po \ unit/ssl/$(DEPDIR)/stream.Po unit/ssl/$(DEPDIR)/stream_base.Po \ unit/ts/$(DEPDIR)/buffer.Po unit/ts/$(DEPDIR)/executor.Po \ unit/ts/$(DEPDIR)/internet.Po unit/ts/$(DEPDIR)/io_context.Po \ unit/ts/$(DEPDIR)/net.Po unit/ts/$(DEPDIR)/netfwd.Po \ unit/ts/$(DEPDIR)/socket.Po unit/ts/$(DEPDIR)/timer.Po \ unit/windows/$(DEPDIR)/basic_handle.Po \ unit/windows/$(DEPDIR)/basic_object_handle.Po \ unit/windows/$(DEPDIR)/basic_random_access_handle.Po \ unit/windows/$(DEPDIR)/basic_stream_handle.Po \ unit/windows/$(DEPDIR)/object_handle.Po \ unit/windows/$(DEPDIR)/object_handle_service.Po \ unit/windows/$(DEPDIR)/overlapped_handle.Po \ unit/windows/$(DEPDIR)/overlapped_ptr.Po \ unit/windows/$(DEPDIR)/random_access_handle.Po \ unit/windows/$(DEPDIR)/random_access_handle_service.Po \ unit/windows/$(DEPDIR)/stream_handle.Po \ unit/windows/$(DEPDIR)/stream_handle_service.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libasio_a_SOURCES) $(latency_tcp_client_SOURCES) \ $(latency_tcp_server_SOURCES) $(latency_udp_client_SOURCES) \ $(latency_udp_server_SOURCES) $(performance_client_SOURCES) \ $(performance_server_SOURCES) \ $(unit_associated_allocator_SOURCES) \ $(unit_associated_executor_SOURCES) \ $(unit_async_result_SOURCES) \ $(unit_basic_datagram_socket_SOURCES) \ $(unit_basic_deadline_timer_SOURCES) \ $(unit_basic_raw_socket_SOURCES) \ $(unit_basic_seq_packet_socket_SOURCES) \ $(unit_basic_serial_port_SOURCES) \ $(unit_basic_signal_set_SOURCES) \ $(unit_basic_socket_acceptor_SOURCES) \ $(unit_basic_stream_socket_SOURCES) \ $(unit_basic_streambuf_SOURCES) \ $(unit_basic_waitable_timer_SOURCES) \ $(unit_bind_executor_SOURCES) $(unit_buffer_SOURCES) \ $(unit_buffered_read_stream_SOURCES) \ $(unit_buffered_stream_SOURCES) \ $(unit_buffered_write_stream_SOURCES) \ $(unit_buffers_iterator_SOURCES) \ $(unit_completion_condition_SOURCES) $(unit_connect_SOURCES) \ $(unit_coroutine_SOURCES) \ $(unit_datagram_socket_service_SOURCES) \ $(unit_deadline_timer_SOURCES) \ $(unit_deadline_timer_service_SOURCES) $(unit_defer_SOURCES) \ $(unit_dispatch_SOURCES) $(unit_error_SOURCES) \ $(unit_execution_context_SOURCES) $(unit_executor_SOURCES) \ $(unit_executor_work_guard_SOURCES) \ $(unit_generic_basic_endpoint_SOURCES) \ $(unit_generic_datagram_protocol_SOURCES) \ $(unit_generic_raw_protocol_SOURCES) \ $(unit_generic_seq_packet_protocol_SOURCES) \ $(unit_generic_stream_protocol_SOURCES) \ $(unit_high_resolution_timer_SOURCES) \ $(unit_io_context_SOURCES) $(unit_ip_address_SOURCES) \ $(unit_ip_address_v4_SOURCES) \ $(unit_ip_address_v4_iterator_SOURCES) \ $(unit_ip_address_v4_range_SOURCES) \ $(unit_ip_address_v6_SOURCES) \ $(unit_ip_address_v6_iterator_SOURCES) \ $(unit_ip_address_v6_range_SOURCES) \ $(unit_ip_basic_endpoint_SOURCES) \ $(unit_ip_basic_resolver_SOURCES) \ $(unit_ip_basic_resolver_entry_SOURCES) \ $(unit_ip_basic_resolver_iterator_SOURCES) \ $(unit_ip_basic_resolver_query_SOURCES) \ $(unit_ip_host_name_SOURCES) $(unit_ip_icmp_SOURCES) \ $(unit_ip_multicast_SOURCES) $(unit_ip_network_v4_SOURCES) \ $(unit_ip_network_v6_SOURCES) \ $(unit_ip_resolver_query_base_SOURCES) \ $(unit_ip_resolver_service_SOURCES) $(unit_ip_tcp_SOURCES) \ $(unit_ip_udp_SOURCES) $(unit_ip_unicast_SOURCES) \ $(unit_ip_v6_only_SOURCES) $(unit_is_read_buffered_SOURCES) \ $(unit_is_write_buffered_SOURCES) \ $(unit_local_basic_endpoint_SOURCES) \ $(unit_local_connect_pair_SOURCES) \ $(unit_local_datagram_protocol_SOURCES) \ $(unit_local_stream_protocol_SOURCES) \ $(unit_packaged_task_SOURCES) $(unit_placeholders_SOURCES) \ $(unit_posix_basic_descriptor_SOURCES) \ $(unit_posix_basic_stream_descriptor_SOURCES) \ $(unit_posix_descriptor_SOURCES) \ $(unit_posix_descriptor_base_SOURCES) \ $(unit_posix_stream_descriptor_SOURCES) \ $(unit_posix_stream_descriptor_service_SOURCES) \ $(unit_post_SOURCES) $(unit_raw_socket_service_SOURCES) \ $(unit_read_SOURCES) $(unit_read_at_SOURCES) \ $(unit_read_until_SOURCES) \ $(unit_seq_packet_socket_service_SOURCES) \ $(unit_serial_port_SOURCES) $(unit_serial_port_base_SOURCES) \ $(unit_serial_port_service_SOURCES) $(unit_signal_set_SOURCES) \ $(unit_signal_set_service_SOURCES) \ $(unit_socket_acceptor_service_SOURCES) \ $(unit_socket_base_SOURCES) $(unit_ssl_context_SOURCES) \ $(unit_ssl_context_base_SOURCES) $(unit_ssl_error_SOURCES) \ $(unit_ssl_rfc2818_verification_SOURCES) \ $(unit_ssl_stream_SOURCES) $(unit_ssl_stream_base_SOURCES) \ $(unit_steady_timer_SOURCES) $(unit_strand_SOURCES) \ $(unit_stream_socket_service_SOURCES) \ $(unit_streambuf_SOURCES) $(unit_system_context_SOURCES) \ $(unit_system_executor_SOURCES) $(unit_system_timer_SOURCES) \ $(unit_thread_SOURCES) $(unit_time_traits_SOURCES) \ $(unit_ts_buffer_SOURCES) $(unit_ts_executor_SOURCES) \ $(unit_ts_internet_SOURCES) $(unit_ts_io_context_SOURCES) \ $(unit_ts_net_SOURCES) $(unit_ts_netfwd_SOURCES) \ $(unit_ts_socket_SOURCES) $(unit_ts_timer_SOURCES) \ $(unit_use_future_SOURCES) $(unit_uses_executor_SOURCES) \ $(unit_wait_traits_SOURCES) \ $(unit_waitable_timer_service_SOURCES) \ $(unit_windows_basic_handle_SOURCES) \ $(unit_windows_basic_object_handle_SOURCES) \ $(unit_windows_basic_random_access_handle_SOURCES) \ $(unit_windows_basic_stream_handle_SOURCES) \ $(unit_windows_object_handle_SOURCES) \ $(unit_windows_object_handle_service_SOURCES) \ $(unit_windows_overlapped_handle_SOURCES) \ $(unit_windows_overlapped_ptr_SOURCES) \ $(unit_windows_random_access_handle_SOURCES) \ $(unit_windows_random_access_handle_service_SOURCES) \ $(unit_windows_stream_handle_SOURCES) \ $(unit_windows_stream_handle_service_SOURCES) \ $(unit_write_SOURCES) $(unit_write_at_SOURCES) DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \ $(am__latency_tcp_client_SOURCES_DIST) \ $(am__latency_tcp_server_SOURCES_DIST) \ $(am__latency_udp_client_SOURCES_DIST) \ $(am__latency_udp_server_SOURCES_DIST) \ $(am__performance_client_SOURCES_DIST) \ $(am__performance_server_SOURCES_DIST) \ $(unit_associated_allocator_SOURCES) \ $(unit_associated_executor_SOURCES) \ $(unit_async_result_SOURCES) \ $(unit_basic_datagram_socket_SOURCES) \ $(unit_basic_deadline_timer_SOURCES) \ $(unit_basic_raw_socket_SOURCES) \ $(unit_basic_seq_packet_socket_SOURCES) \ $(unit_basic_serial_port_SOURCES) \ $(unit_basic_signal_set_SOURCES) \ $(unit_basic_socket_acceptor_SOURCES) \ $(unit_basic_stream_socket_SOURCES) \ $(unit_basic_streambuf_SOURCES) \ $(unit_basic_waitable_timer_SOURCES) \ $(unit_bind_executor_SOURCES) $(unit_buffer_SOURCES) \ $(unit_buffered_read_stream_SOURCES) \ $(unit_buffered_stream_SOURCES) \ $(unit_buffered_write_stream_SOURCES) \ $(unit_buffers_iterator_SOURCES) \ $(unit_completion_condition_SOURCES) $(unit_connect_SOURCES) \ $(unit_coroutine_SOURCES) \ $(unit_datagram_socket_service_SOURCES) \ $(unit_deadline_timer_SOURCES) \ $(unit_deadline_timer_service_SOURCES) $(unit_defer_SOURCES) \ $(unit_dispatch_SOURCES) $(unit_error_SOURCES) \ $(unit_execution_context_SOURCES) $(unit_executor_SOURCES) \ $(unit_executor_work_guard_SOURCES) \ $(unit_generic_basic_endpoint_SOURCES) \ $(unit_generic_datagram_protocol_SOURCES) \ $(unit_generic_raw_protocol_SOURCES) \ $(unit_generic_seq_packet_protocol_SOURCES) \ $(unit_generic_stream_protocol_SOURCES) \ $(unit_high_resolution_timer_SOURCES) \ $(unit_io_context_SOURCES) $(unit_ip_address_SOURCES) \ $(unit_ip_address_v4_SOURCES) \ $(unit_ip_address_v4_iterator_SOURCES) \ $(unit_ip_address_v4_range_SOURCES) \ $(unit_ip_address_v6_SOURCES) \ $(unit_ip_address_v6_iterator_SOURCES) \ $(unit_ip_address_v6_range_SOURCES) \ $(unit_ip_basic_endpoint_SOURCES) \ $(unit_ip_basic_resolver_SOURCES) \ $(unit_ip_basic_resolver_entry_SOURCES) \ $(unit_ip_basic_resolver_iterator_SOURCES) \ $(unit_ip_basic_resolver_query_SOURCES) \ $(unit_ip_host_name_SOURCES) $(unit_ip_icmp_SOURCES) \ $(unit_ip_multicast_SOURCES) $(unit_ip_network_v4_SOURCES) \ $(unit_ip_network_v6_SOURCES) \ $(unit_ip_resolver_query_base_SOURCES) \ $(unit_ip_resolver_service_SOURCES) $(unit_ip_tcp_SOURCES) \ $(unit_ip_udp_SOURCES) $(unit_ip_unicast_SOURCES) \ $(unit_ip_v6_only_SOURCES) $(unit_is_read_buffered_SOURCES) \ $(unit_is_write_buffered_SOURCES) \ $(unit_local_basic_endpoint_SOURCES) \ $(unit_local_connect_pair_SOURCES) \ $(unit_local_datagram_protocol_SOURCES) \ $(unit_local_stream_protocol_SOURCES) \ $(unit_packaged_task_SOURCES) $(unit_placeholders_SOURCES) \ $(unit_posix_basic_descriptor_SOURCES) \ $(unit_posix_basic_stream_descriptor_SOURCES) \ $(unit_posix_descriptor_SOURCES) \ $(unit_posix_descriptor_base_SOURCES) \ $(unit_posix_stream_descriptor_SOURCES) \ $(unit_posix_stream_descriptor_service_SOURCES) \ $(unit_post_SOURCES) $(unit_raw_socket_service_SOURCES) \ $(unit_read_SOURCES) $(unit_read_at_SOURCES) \ $(unit_read_until_SOURCES) \ $(unit_seq_packet_socket_service_SOURCES) \ $(unit_serial_port_SOURCES) $(unit_serial_port_base_SOURCES) \ $(unit_serial_port_service_SOURCES) $(unit_signal_set_SOURCES) \ $(unit_signal_set_service_SOURCES) \ $(unit_socket_acceptor_service_SOURCES) \ $(unit_socket_base_SOURCES) \ $(am__unit_ssl_context_SOURCES_DIST) \ $(am__unit_ssl_context_base_SOURCES_DIST) \ $(am__unit_ssl_error_SOURCES_DIST) \ $(am__unit_ssl_rfc2818_verification_SOURCES_DIST) \ $(am__unit_ssl_stream_SOURCES_DIST) \ $(am__unit_ssl_stream_base_SOURCES_DIST) \ $(unit_steady_timer_SOURCES) $(unit_strand_SOURCES) \ $(unit_stream_socket_service_SOURCES) \ $(unit_streambuf_SOURCES) $(unit_system_context_SOURCES) \ $(unit_system_executor_SOURCES) $(unit_system_timer_SOURCES) \ $(unit_thread_SOURCES) $(unit_time_traits_SOURCES) \ $(unit_ts_buffer_SOURCES) $(unit_ts_executor_SOURCES) \ $(unit_ts_internet_SOURCES) $(unit_ts_io_context_SOURCES) \ $(unit_ts_net_SOURCES) $(unit_ts_netfwd_SOURCES) \ $(unit_ts_socket_SOURCES) $(unit_ts_timer_SOURCES) \ $(unit_use_future_SOURCES) $(unit_uses_executor_SOURCES) \ $(unit_wait_traits_SOURCES) \ $(unit_waitable_timer_service_SOURCES) \ $(unit_windows_basic_handle_SOURCES) \ $(unit_windows_basic_object_handle_SOURCES) \ $(unit_windows_basic_random_access_handle_SOURCES) \ $(unit_windows_basic_stream_handle_SOURCES) \ $(unit_windows_object_handle_SOURCES) \ $(unit_windows_object_handle_service_SOURCES) \ $(unit_windows_overlapped_handle_SOURCES) \ $(unit_windows_overlapped_ptr_SOURCES) \ $(unit_windows_random_access_handle_SOURCES) \ $(unit_windows_random_access_handle_service_SOURCES) \ $(unit_windows_stream_handle_SOURCES) \ $(unit_windows_stream_handle_service_SOURCES) \ $(unit_write_SOURCES) $(unit_write_at_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = subdir-objects @SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a @SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../asio.cpp \ @SEPARATE_COMPILATION_TRUE@ $(am__append_1) @SEPARATE_COMPILATION_TRUE@LDADD = libasio.a noinst_HEADERS = \ latency/high_res_clock.hpp \ unit/unit_test.hpp AM_CXXFLAGS = -I$(srcdir)/../../include @STANDALONE_FALSE@latency_tcp_client_SOURCES = latency/tcp_client.cpp @STANDALONE_FALSE@latency_tcp_server_SOURCES = latency/tcp_server.cpp @STANDALONE_FALSE@latency_udp_client_SOURCES = latency/udp_client.cpp @STANDALONE_FALSE@latency_udp_server_SOURCES = latency/udp_server.cpp @STANDALONE_FALSE@performance_client_SOURCES = performance/client.cpp @STANDALONE_FALSE@performance_server_SOURCES = performance/server.cpp unit_associated_allocator_SOURCES = unit/associated_allocator.cpp unit_associated_executor_SOURCES = unit/associated_executor.cpp unit_async_result_SOURCES = unit/async_result.cpp unit_basic_datagram_socket_SOURCES = unit/basic_datagram_socket.cpp unit_basic_deadline_timer_SOURCES = unit/basic_deadline_timer.cpp unit_basic_raw_socket_SOURCES = unit/basic_raw_socket.cpp unit_basic_seq_packet_socket_SOURCES = unit/basic_seq_packet_socket.cpp unit_basic_serial_port_SOURCES = unit/basic_serial_port.cpp unit_basic_signal_set_SOURCES = unit/basic_signal_set.cpp unit_basic_socket_acceptor_SOURCES = unit/basic_socket_acceptor.cpp unit_basic_stream_socket_SOURCES = unit/basic_stream_socket.cpp unit_basic_streambuf_SOURCES = unit/basic_streambuf.cpp unit_basic_waitable_timer_SOURCES = unit/basic_waitable_timer.cpp unit_bind_executor_SOURCES = unit/bind_executor.cpp unit_buffer_SOURCES = unit/buffer.cpp unit_buffers_iterator_SOURCES = unit/buffers_iterator.cpp unit_buffered_read_stream_SOURCES = unit/buffered_read_stream.cpp unit_buffered_stream_SOURCES = unit/buffered_stream.cpp unit_buffered_write_stream_SOURCES = unit/buffered_write_stream.cpp unit_completion_condition_SOURCES = unit/completion_condition.cpp unit_connect_SOURCES = unit/connect.cpp unit_coroutine_SOURCES = unit/coroutine.cpp unit_datagram_socket_service_SOURCES = unit/datagram_socket_service.cpp unit_deadline_timer_service_SOURCES = unit/deadline_timer_service.cpp unit_deadline_timer_SOURCES = unit/deadline_timer.cpp unit_defer_SOURCES = unit/defer.cpp unit_dispatch_SOURCES = unit/dispatch.cpp unit_error_SOURCES = unit/error.cpp unit_execution_context_SOURCES = unit/execution_context.cpp unit_executor_SOURCES = unit/executor.cpp unit_executor_work_guard_SOURCES = unit/executor_work_guard.cpp unit_generic_basic_endpoint_SOURCES = unit/generic/basic_endpoint.cpp unit_generic_datagram_protocol_SOURCES = unit/generic/datagram_protocol.cpp unit_generic_raw_protocol_SOURCES = unit/generic/raw_protocol.cpp unit_generic_seq_packet_protocol_SOURCES = unit/generic/seq_packet_protocol.cpp unit_generic_stream_protocol_SOURCES = unit/generic/stream_protocol.cpp unit_high_resolution_timer_SOURCES = unit/high_resolution_timer.cpp unit_io_context_SOURCES = unit/io_context.cpp unit_ip_address_SOURCES = unit/ip/address.cpp unit_ip_address_v4_SOURCES = unit/ip/address_v4.cpp unit_ip_address_v4_iterator_SOURCES = unit/ip/address_v4_iterator.cpp unit_ip_address_v4_range_SOURCES = unit/ip/address_v4_range.cpp unit_ip_address_v6_SOURCES = unit/ip/address_v6.cpp unit_ip_address_v6_iterator_SOURCES = unit/ip/address_v6_iterator.cpp unit_ip_address_v6_range_SOURCES = unit/ip/address_v6_range.cpp unit_ip_basic_endpoint_SOURCES = unit/ip/basic_endpoint.cpp unit_ip_basic_resolver_SOURCES = unit/ip/basic_resolver.cpp unit_ip_basic_resolver_entry_SOURCES = unit/ip/basic_resolver_entry.cpp unit_ip_basic_resolver_iterator_SOURCES = unit/ip/basic_resolver_iterator.cpp unit_ip_basic_resolver_query_SOURCES = unit/ip/basic_resolver_query.cpp unit_ip_host_name_SOURCES = unit/ip/host_name.cpp unit_ip_icmp_SOURCES = unit/ip/icmp.cpp unit_ip_multicast_SOURCES = unit/ip/multicast.cpp unit_ip_network_v4_SOURCES = unit/ip/network_v4.cpp unit_ip_network_v6_SOURCES = unit/ip/network_v6.cpp unit_ip_resolver_query_base_SOURCES = unit/ip/resolver_query_base.cpp unit_ip_resolver_service_SOURCES = unit/ip/resolver_service.cpp unit_ip_tcp_SOURCES = unit/ip/tcp.cpp unit_ip_udp_SOURCES = unit/ip/udp.cpp unit_ip_unicast_SOURCES = unit/ip/unicast.cpp unit_ip_v6_only_SOURCES = unit/ip/v6_only.cpp unit_is_read_buffered_SOURCES = unit/is_read_buffered.cpp unit_is_write_buffered_SOURCES = unit/is_write_buffered.cpp unit_local_basic_endpoint_SOURCES = unit/local/basic_endpoint.cpp unit_local_connect_pair_SOURCES = unit/local/connect_pair.cpp unit_local_datagram_protocol_SOURCES = unit/local/datagram_protocol.cpp unit_local_stream_protocol_SOURCES = unit/local/stream_protocol.cpp unit_packaged_task_SOURCES = unit/packaged_task.cpp unit_placeholders_SOURCES = unit/placeholders.cpp unit_posix_basic_descriptor_SOURCES = unit/posix/basic_descriptor.cpp unit_posix_basic_stream_descriptor_SOURCES = unit/posix/basic_stream_descriptor.cpp unit_posix_descriptor_SOURCES = unit/posix/descriptor.cpp unit_posix_descriptor_base_SOURCES = unit/posix/descriptor_base.cpp unit_posix_stream_descriptor_SOURCES = unit/posix/stream_descriptor.cpp unit_posix_stream_descriptor_service_SOURCES = unit/posix/stream_descriptor_service.cpp unit_post_SOURCES = unit/post.cpp unit_raw_socket_service_SOURCES = unit/raw_socket_service.cpp unit_read_SOURCES = unit/read.cpp unit_read_at_SOURCES = unit/read_at.cpp unit_read_until_SOURCES = unit/read_until.cpp unit_seq_packet_socket_service_SOURCES = unit/seq_packet_socket_service.cpp unit_serial_port_SOURCES = unit/serial_port.cpp unit_serial_port_base_SOURCES = unit/serial_port_base.cpp unit_serial_port_service_SOURCES = unit/serial_port_service.cpp unit_signal_set_SOURCES = unit/signal_set.cpp unit_signal_set_service_SOURCES = unit/signal_set_service.cpp unit_socket_acceptor_service_SOURCES = unit/socket_acceptor_service.cpp unit_socket_base_SOURCES = unit/socket_base.cpp unit_steady_timer_SOURCES = unit/steady_timer.cpp unit_strand_SOURCES = unit/strand.cpp unit_stream_socket_service_SOURCES = unit/stream_socket_service.cpp unit_streambuf_SOURCES = unit/streambuf.cpp unit_system_context_SOURCES = unit/system_context.cpp unit_system_executor_SOURCES = unit/system_executor.cpp unit_system_timer_SOURCES = unit/system_timer.cpp unit_thread_SOURCES = unit/thread.cpp unit_time_traits_SOURCES = unit/time_traits.cpp unit_ts_buffer_SOURCES = unit/ts/buffer.cpp unit_ts_executor_SOURCES = unit/ts/executor.cpp unit_ts_internet_SOURCES = unit/ts/internet.cpp unit_ts_io_context_SOURCES = unit/ts/io_context.cpp unit_ts_net_SOURCES = unit/ts/net.cpp unit_ts_netfwd_SOURCES = unit/ts/netfwd.cpp unit_ts_socket_SOURCES = unit/ts/socket.cpp unit_ts_timer_SOURCES = unit/ts/timer.cpp unit_use_future_SOURCES = unit/use_future.cpp unit_uses_executor_SOURCES = unit/uses_executor.cpp unit_wait_traits_SOURCES = unit/wait_traits.cpp unit_waitable_timer_service_SOURCES = unit/waitable_timer_service.cpp unit_windows_basic_handle_SOURCES = unit/windows/basic_handle.cpp unit_windows_basic_object_handle_SOURCES = unit/windows/basic_object_handle.cpp unit_windows_basic_random_access_handle_SOURCES = unit/windows/basic_random_access_handle.cpp unit_windows_basic_stream_handle_SOURCES = unit/windows/basic_stream_handle.cpp unit_windows_object_handle_SOURCES = unit/windows/object_handle.cpp unit_windows_object_handle_service_SOURCES = unit/windows/object_handle_service.cpp unit_windows_overlapped_handle_SOURCES = unit/windows/overlapped_handle.cpp unit_windows_overlapped_ptr_SOURCES = unit/windows/overlapped_ptr.cpp unit_windows_random_access_handle_SOURCES = unit/windows/random_access_handle.cpp unit_windows_random_access_handle_service_SOURCES = unit/windows/random_access_handle_service.cpp unit_windows_stream_handle_SOURCES = unit/windows/stream_handle.cpp unit_windows_stream_handle_service_SOURCES = unit/windows/stream_handle_service.cpp unit_write_SOURCES = unit/write.cpp unit_write_at_SOURCES = unit/write_at.cpp @HAVE_OPENSSL_TRUE@unit_ssl_context_base_SOURCES = unit/ssl/context_base.cpp @HAVE_OPENSSL_TRUE@unit_ssl_context_SOURCES = unit/ssl/context.cpp @HAVE_OPENSSL_TRUE@unit_ssl_error_SOURCES = unit/ssl/error.cpp @HAVE_OPENSSL_TRUE@unit_ssl_stream_base_SOURCES = unit/ssl/stream_base.cpp @HAVE_OPENSSL_TRUE@unit_ssl_rfc2818_verification_SOURCES = unit/ssl/rfc2818_verification.cpp @HAVE_OPENSSL_TRUE@unit_ssl_stream_SOURCES = unit/ssl/stream.cpp EXTRA_DIST = \ latency/allocator.hpp \ performance/handler_allocator.hpp \ unit/archetypes/async_ops.hpp \ unit/archetypes/async_result.hpp \ unit/archetypes/deprecated_async_result.hpp \ unit/archetypes/deprecated_async_ops.hpp \ unit/archetypes/gettable_socket_option.hpp \ unit/archetypes/io_control_command.hpp \ unit/archetypes/settable_socket_option.hpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .cpp .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/tests/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) ../$(am__dirstamp): @$(MKDIR_P) .. @: > ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) ../$(DEPDIR) @: > ../$(DEPDIR)/$(am__dirstamp) ../asio.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) ../asio_ssl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp) libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES) $(AM_V_at)-rm -f libasio.a $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD) $(AM_V_at)$(RANLIB) libasio.a latency/$(am__dirstamp): @$(MKDIR_P) latency @: > latency/$(am__dirstamp) latency/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) latency/$(DEPDIR) @: > latency/$(DEPDIR)/$(am__dirstamp) latency/tcp_client.$(OBJEXT): latency/$(am__dirstamp) \ latency/$(DEPDIR)/$(am__dirstamp) latency/tcp_client$(EXEEXT): $(latency_tcp_client_OBJECTS) $(latency_tcp_client_DEPENDENCIES) $(EXTRA_latency_tcp_client_DEPENDENCIES) latency/$(am__dirstamp) @rm -f latency/tcp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(latency_tcp_client_OBJECTS) $(latency_tcp_client_LDADD) $(LIBS) latency/tcp_server.$(OBJEXT): latency/$(am__dirstamp) \ latency/$(DEPDIR)/$(am__dirstamp) latency/tcp_server$(EXEEXT): $(latency_tcp_server_OBJECTS) $(latency_tcp_server_DEPENDENCIES) $(EXTRA_latency_tcp_server_DEPENDENCIES) latency/$(am__dirstamp) @rm -f latency/tcp_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(latency_tcp_server_OBJECTS) $(latency_tcp_server_LDADD) $(LIBS) latency/udp_client.$(OBJEXT): latency/$(am__dirstamp) \ latency/$(DEPDIR)/$(am__dirstamp) latency/udp_client$(EXEEXT): $(latency_udp_client_OBJECTS) $(latency_udp_client_DEPENDENCIES) $(EXTRA_latency_udp_client_DEPENDENCIES) latency/$(am__dirstamp) @rm -f latency/udp_client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(latency_udp_client_OBJECTS) $(latency_udp_client_LDADD) $(LIBS) latency/udp_server.$(OBJEXT): latency/$(am__dirstamp) \ latency/$(DEPDIR)/$(am__dirstamp) latency/udp_server$(EXEEXT): $(latency_udp_server_OBJECTS) $(latency_udp_server_DEPENDENCIES) $(EXTRA_latency_udp_server_DEPENDENCIES) latency/$(am__dirstamp) @rm -f latency/udp_server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(latency_udp_server_OBJECTS) $(latency_udp_server_LDADD) $(LIBS) performance/$(am__dirstamp): @$(MKDIR_P) performance @: > performance/$(am__dirstamp) performance/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) performance/$(DEPDIR) @: > performance/$(DEPDIR)/$(am__dirstamp) performance/client.$(OBJEXT): performance/$(am__dirstamp) \ performance/$(DEPDIR)/$(am__dirstamp) performance/client$(EXEEXT): $(performance_client_OBJECTS) $(performance_client_DEPENDENCIES) $(EXTRA_performance_client_DEPENDENCIES) performance/$(am__dirstamp) @rm -f performance/client$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(performance_client_OBJECTS) $(performance_client_LDADD) $(LIBS) performance/server.$(OBJEXT): performance/$(am__dirstamp) \ performance/$(DEPDIR)/$(am__dirstamp) performance/server$(EXEEXT): $(performance_server_OBJECTS) $(performance_server_DEPENDENCIES) $(EXTRA_performance_server_DEPENDENCIES) performance/$(am__dirstamp) @rm -f performance/server$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(performance_server_OBJECTS) $(performance_server_LDADD) $(LIBS) unit/$(am__dirstamp): @$(MKDIR_P) unit @: > unit/$(am__dirstamp) unit/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/$(DEPDIR) @: > unit/$(DEPDIR)/$(am__dirstamp) unit/associated_allocator.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/associated_allocator$(EXEEXT): $(unit_associated_allocator_OBJECTS) $(unit_associated_allocator_DEPENDENCIES) $(EXTRA_unit_associated_allocator_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/associated_allocator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_associated_allocator_OBJECTS) $(unit_associated_allocator_LDADD) $(LIBS) unit/associated_executor.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/associated_executor$(EXEEXT): $(unit_associated_executor_OBJECTS) $(unit_associated_executor_DEPENDENCIES) $(EXTRA_unit_associated_executor_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/associated_executor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_associated_executor_OBJECTS) $(unit_associated_executor_LDADD) $(LIBS) unit/async_result.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/async_result$(EXEEXT): $(unit_async_result_OBJECTS) $(unit_async_result_DEPENDENCIES) $(EXTRA_unit_async_result_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/async_result$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_async_result_OBJECTS) $(unit_async_result_LDADD) $(LIBS) unit/basic_datagram_socket.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_datagram_socket$(EXEEXT): $(unit_basic_datagram_socket_OBJECTS) $(unit_basic_datagram_socket_DEPENDENCIES) $(EXTRA_unit_basic_datagram_socket_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_datagram_socket$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_datagram_socket_OBJECTS) $(unit_basic_datagram_socket_LDADD) $(LIBS) unit/basic_deadline_timer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_deadline_timer$(EXEEXT): $(unit_basic_deadline_timer_OBJECTS) $(unit_basic_deadline_timer_DEPENDENCIES) $(EXTRA_unit_basic_deadline_timer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_deadline_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_deadline_timer_OBJECTS) $(unit_basic_deadline_timer_LDADD) $(LIBS) unit/basic_raw_socket.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_raw_socket$(EXEEXT): $(unit_basic_raw_socket_OBJECTS) $(unit_basic_raw_socket_DEPENDENCIES) $(EXTRA_unit_basic_raw_socket_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_raw_socket$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_raw_socket_OBJECTS) $(unit_basic_raw_socket_LDADD) $(LIBS) unit/basic_seq_packet_socket.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_seq_packet_socket$(EXEEXT): $(unit_basic_seq_packet_socket_OBJECTS) $(unit_basic_seq_packet_socket_DEPENDENCIES) $(EXTRA_unit_basic_seq_packet_socket_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_seq_packet_socket$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_seq_packet_socket_OBJECTS) $(unit_basic_seq_packet_socket_LDADD) $(LIBS) unit/basic_serial_port.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_serial_port$(EXEEXT): $(unit_basic_serial_port_OBJECTS) $(unit_basic_serial_port_DEPENDENCIES) $(EXTRA_unit_basic_serial_port_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_serial_port$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_serial_port_OBJECTS) $(unit_basic_serial_port_LDADD) $(LIBS) unit/basic_signal_set.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_signal_set$(EXEEXT): $(unit_basic_signal_set_OBJECTS) $(unit_basic_signal_set_DEPENDENCIES) $(EXTRA_unit_basic_signal_set_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_signal_set$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_signal_set_OBJECTS) $(unit_basic_signal_set_LDADD) $(LIBS) unit/basic_socket_acceptor.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_socket_acceptor$(EXEEXT): $(unit_basic_socket_acceptor_OBJECTS) $(unit_basic_socket_acceptor_DEPENDENCIES) $(EXTRA_unit_basic_socket_acceptor_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_socket_acceptor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_socket_acceptor_OBJECTS) $(unit_basic_socket_acceptor_LDADD) $(LIBS) unit/basic_stream_socket.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_stream_socket$(EXEEXT): $(unit_basic_stream_socket_OBJECTS) $(unit_basic_stream_socket_DEPENDENCIES) $(EXTRA_unit_basic_stream_socket_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_stream_socket$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_stream_socket_OBJECTS) $(unit_basic_stream_socket_LDADD) $(LIBS) unit/basic_streambuf.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_streambuf$(EXEEXT): $(unit_basic_streambuf_OBJECTS) $(unit_basic_streambuf_DEPENDENCIES) $(EXTRA_unit_basic_streambuf_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_streambuf$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_streambuf_OBJECTS) $(unit_basic_streambuf_LDADD) $(LIBS) unit/basic_waitable_timer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/basic_waitable_timer$(EXEEXT): $(unit_basic_waitable_timer_OBJECTS) $(unit_basic_waitable_timer_DEPENDENCIES) $(EXTRA_unit_basic_waitable_timer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/basic_waitable_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_waitable_timer_OBJECTS) $(unit_basic_waitable_timer_LDADD) $(LIBS) unit/bind_executor.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/bind_executor$(EXEEXT): $(unit_bind_executor_OBJECTS) $(unit_bind_executor_DEPENDENCIES) $(EXTRA_unit_bind_executor_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/bind_executor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_bind_executor_OBJECTS) $(unit_bind_executor_LDADD) $(LIBS) unit/buffer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/buffer$(EXEEXT): $(unit_buffer_OBJECTS) $(unit_buffer_DEPENDENCIES) $(EXTRA_unit_buffer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/buffer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_buffer_OBJECTS) $(unit_buffer_LDADD) $(LIBS) unit/buffered_read_stream.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/buffered_read_stream$(EXEEXT): $(unit_buffered_read_stream_OBJECTS) $(unit_buffered_read_stream_DEPENDENCIES) $(EXTRA_unit_buffered_read_stream_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/buffered_read_stream$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_buffered_read_stream_OBJECTS) $(unit_buffered_read_stream_LDADD) $(LIBS) unit/buffered_stream.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/buffered_stream$(EXEEXT): $(unit_buffered_stream_OBJECTS) $(unit_buffered_stream_DEPENDENCIES) $(EXTRA_unit_buffered_stream_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/buffered_stream$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_buffered_stream_OBJECTS) $(unit_buffered_stream_LDADD) $(LIBS) unit/buffered_write_stream.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/buffered_write_stream$(EXEEXT): $(unit_buffered_write_stream_OBJECTS) $(unit_buffered_write_stream_DEPENDENCIES) $(EXTRA_unit_buffered_write_stream_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/buffered_write_stream$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_buffered_write_stream_OBJECTS) $(unit_buffered_write_stream_LDADD) $(LIBS) unit/buffers_iterator.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/buffers_iterator$(EXEEXT): $(unit_buffers_iterator_OBJECTS) $(unit_buffers_iterator_DEPENDENCIES) $(EXTRA_unit_buffers_iterator_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/buffers_iterator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_buffers_iterator_OBJECTS) $(unit_buffers_iterator_LDADD) $(LIBS) unit/completion_condition.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/completion_condition$(EXEEXT): $(unit_completion_condition_OBJECTS) $(unit_completion_condition_DEPENDENCIES) $(EXTRA_unit_completion_condition_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/completion_condition$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_completion_condition_OBJECTS) $(unit_completion_condition_LDADD) $(LIBS) unit/connect.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/connect$(EXEEXT): $(unit_connect_OBJECTS) $(unit_connect_DEPENDENCIES) $(EXTRA_unit_connect_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/connect$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_connect_OBJECTS) $(unit_connect_LDADD) $(LIBS) unit/coroutine.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/coroutine$(EXEEXT): $(unit_coroutine_OBJECTS) $(unit_coroutine_DEPENDENCIES) $(EXTRA_unit_coroutine_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/coroutine$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_coroutine_OBJECTS) $(unit_coroutine_LDADD) $(LIBS) unit/datagram_socket_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/datagram_socket_service$(EXEEXT): $(unit_datagram_socket_service_OBJECTS) $(unit_datagram_socket_service_DEPENDENCIES) $(EXTRA_unit_datagram_socket_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/datagram_socket_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_datagram_socket_service_OBJECTS) $(unit_datagram_socket_service_LDADD) $(LIBS) unit/deadline_timer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/deadline_timer$(EXEEXT): $(unit_deadline_timer_OBJECTS) $(unit_deadline_timer_DEPENDENCIES) $(EXTRA_unit_deadline_timer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/deadline_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_deadline_timer_OBJECTS) $(unit_deadline_timer_LDADD) $(LIBS) unit/deadline_timer_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/deadline_timer_service$(EXEEXT): $(unit_deadline_timer_service_OBJECTS) $(unit_deadline_timer_service_DEPENDENCIES) $(EXTRA_unit_deadline_timer_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/deadline_timer_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_deadline_timer_service_OBJECTS) $(unit_deadline_timer_service_LDADD) $(LIBS) unit/defer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/defer$(EXEEXT): $(unit_defer_OBJECTS) $(unit_defer_DEPENDENCIES) $(EXTRA_unit_defer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/defer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_defer_OBJECTS) $(unit_defer_LDADD) $(LIBS) unit/dispatch.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/dispatch$(EXEEXT): $(unit_dispatch_OBJECTS) $(unit_dispatch_DEPENDENCIES) $(EXTRA_unit_dispatch_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/dispatch$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_dispatch_OBJECTS) $(unit_dispatch_LDADD) $(LIBS) unit/error.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/error$(EXEEXT): $(unit_error_OBJECTS) $(unit_error_DEPENDENCIES) $(EXTRA_unit_error_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/error$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_error_OBJECTS) $(unit_error_LDADD) $(LIBS) unit/execution_context.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/execution_context$(EXEEXT): $(unit_execution_context_OBJECTS) $(unit_execution_context_DEPENDENCIES) $(EXTRA_unit_execution_context_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/execution_context$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_context_OBJECTS) $(unit_execution_context_LDADD) $(LIBS) unit/executor.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/executor$(EXEEXT): $(unit_executor_OBJECTS) $(unit_executor_DEPENDENCIES) $(EXTRA_unit_executor_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/executor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_executor_OBJECTS) $(unit_executor_LDADD) $(LIBS) unit/executor_work_guard.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/executor_work_guard$(EXEEXT): $(unit_executor_work_guard_OBJECTS) $(unit_executor_work_guard_DEPENDENCIES) $(EXTRA_unit_executor_work_guard_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/executor_work_guard$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_executor_work_guard_OBJECTS) $(unit_executor_work_guard_LDADD) $(LIBS) unit/generic/$(am__dirstamp): @$(MKDIR_P) unit/generic @: > unit/generic/$(am__dirstamp) unit/generic/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/generic/$(DEPDIR) @: > unit/generic/$(DEPDIR)/$(am__dirstamp) unit/generic/basic_endpoint.$(OBJEXT): unit/generic/$(am__dirstamp) \ unit/generic/$(DEPDIR)/$(am__dirstamp) unit/generic/basic_endpoint$(EXEEXT): $(unit_generic_basic_endpoint_OBJECTS) $(unit_generic_basic_endpoint_DEPENDENCIES) $(EXTRA_unit_generic_basic_endpoint_DEPENDENCIES) unit/generic/$(am__dirstamp) @rm -f unit/generic/basic_endpoint$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_basic_endpoint_OBJECTS) $(unit_generic_basic_endpoint_LDADD) $(LIBS) unit/generic/datagram_protocol.$(OBJEXT): \ unit/generic/$(am__dirstamp) \ unit/generic/$(DEPDIR)/$(am__dirstamp) unit/generic/datagram_protocol$(EXEEXT): $(unit_generic_datagram_protocol_OBJECTS) $(unit_generic_datagram_protocol_DEPENDENCIES) $(EXTRA_unit_generic_datagram_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp) @rm -f unit/generic/datagram_protocol$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_datagram_protocol_OBJECTS) $(unit_generic_datagram_protocol_LDADD) $(LIBS) unit/generic/raw_protocol.$(OBJEXT): unit/generic/$(am__dirstamp) \ unit/generic/$(DEPDIR)/$(am__dirstamp) unit/generic/raw_protocol$(EXEEXT): $(unit_generic_raw_protocol_OBJECTS) $(unit_generic_raw_protocol_DEPENDENCIES) $(EXTRA_unit_generic_raw_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp) @rm -f unit/generic/raw_protocol$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_raw_protocol_OBJECTS) $(unit_generic_raw_protocol_LDADD) $(LIBS) unit/generic/seq_packet_protocol.$(OBJEXT): \ unit/generic/$(am__dirstamp) \ unit/generic/$(DEPDIR)/$(am__dirstamp) unit/generic/seq_packet_protocol$(EXEEXT): $(unit_generic_seq_packet_protocol_OBJECTS) $(unit_generic_seq_packet_protocol_DEPENDENCIES) $(EXTRA_unit_generic_seq_packet_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp) @rm -f unit/generic/seq_packet_protocol$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_seq_packet_protocol_OBJECTS) $(unit_generic_seq_packet_protocol_LDADD) $(LIBS) unit/generic/stream_protocol.$(OBJEXT): unit/generic/$(am__dirstamp) \ unit/generic/$(DEPDIR)/$(am__dirstamp) unit/generic/stream_protocol$(EXEEXT): $(unit_generic_stream_protocol_OBJECTS) $(unit_generic_stream_protocol_DEPENDENCIES) $(EXTRA_unit_generic_stream_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp) @rm -f unit/generic/stream_protocol$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_stream_protocol_OBJECTS) $(unit_generic_stream_protocol_LDADD) $(LIBS) unit/high_resolution_timer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/high_resolution_timer$(EXEEXT): $(unit_high_resolution_timer_OBJECTS) $(unit_high_resolution_timer_DEPENDENCIES) $(EXTRA_unit_high_resolution_timer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/high_resolution_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_high_resolution_timer_OBJECTS) $(unit_high_resolution_timer_LDADD) $(LIBS) unit/io_context.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/io_context$(EXEEXT): $(unit_io_context_OBJECTS) $(unit_io_context_DEPENDENCIES) $(EXTRA_unit_io_context_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/io_context$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_io_context_OBJECTS) $(unit_io_context_LDADD) $(LIBS) unit/ip/$(am__dirstamp): @$(MKDIR_P) unit/ip @: > unit/ip/$(am__dirstamp) unit/ip/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/ip/$(DEPDIR) @: > unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address$(EXEEXT): $(unit_ip_address_OBJECTS) $(unit_ip_address_DEPENDENCIES) $(EXTRA_unit_ip_address_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_OBJECTS) $(unit_ip_address_LDADD) $(LIBS) unit/ip/address_v4.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address_v4$(EXEEXT): $(unit_ip_address_v4_OBJECTS) $(unit_ip_address_v4_DEPENDENCIES) $(EXTRA_unit_ip_address_v4_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address_v4$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v4_OBJECTS) $(unit_ip_address_v4_LDADD) $(LIBS) unit/ip/address_v4_iterator.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address_v4_iterator$(EXEEXT): $(unit_ip_address_v4_iterator_OBJECTS) $(unit_ip_address_v4_iterator_DEPENDENCIES) $(EXTRA_unit_ip_address_v4_iterator_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address_v4_iterator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v4_iterator_OBJECTS) $(unit_ip_address_v4_iterator_LDADD) $(LIBS) unit/ip/address_v4_range.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address_v4_range$(EXEEXT): $(unit_ip_address_v4_range_OBJECTS) $(unit_ip_address_v4_range_DEPENDENCIES) $(EXTRA_unit_ip_address_v4_range_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address_v4_range$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v4_range_OBJECTS) $(unit_ip_address_v4_range_LDADD) $(LIBS) unit/ip/address_v6.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address_v6$(EXEEXT): $(unit_ip_address_v6_OBJECTS) $(unit_ip_address_v6_DEPENDENCIES) $(EXTRA_unit_ip_address_v6_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address_v6$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v6_OBJECTS) $(unit_ip_address_v6_LDADD) $(LIBS) unit/ip/address_v6_iterator.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address_v6_iterator$(EXEEXT): $(unit_ip_address_v6_iterator_OBJECTS) $(unit_ip_address_v6_iterator_DEPENDENCIES) $(EXTRA_unit_ip_address_v6_iterator_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address_v6_iterator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v6_iterator_OBJECTS) $(unit_ip_address_v6_iterator_LDADD) $(LIBS) unit/ip/address_v6_range.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/address_v6_range$(EXEEXT): $(unit_ip_address_v6_range_OBJECTS) $(unit_ip_address_v6_range_DEPENDENCIES) $(EXTRA_unit_ip_address_v6_range_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/address_v6_range$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v6_range_OBJECTS) $(unit_ip_address_v6_range_LDADD) $(LIBS) unit/ip/basic_endpoint.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/basic_endpoint$(EXEEXT): $(unit_ip_basic_endpoint_OBJECTS) $(unit_ip_basic_endpoint_DEPENDENCIES) $(EXTRA_unit_ip_basic_endpoint_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/basic_endpoint$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_endpoint_OBJECTS) $(unit_ip_basic_endpoint_LDADD) $(LIBS) unit/ip/basic_resolver.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/basic_resolver$(EXEEXT): $(unit_ip_basic_resolver_OBJECTS) $(unit_ip_basic_resolver_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/basic_resolver$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_OBJECTS) $(unit_ip_basic_resolver_LDADD) $(LIBS) unit/ip/basic_resolver_entry.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/basic_resolver_entry$(EXEEXT): $(unit_ip_basic_resolver_entry_OBJECTS) $(unit_ip_basic_resolver_entry_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_entry_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/basic_resolver_entry$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_entry_OBJECTS) $(unit_ip_basic_resolver_entry_LDADD) $(LIBS) unit/ip/basic_resolver_iterator.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/basic_resolver_iterator$(EXEEXT): $(unit_ip_basic_resolver_iterator_OBJECTS) $(unit_ip_basic_resolver_iterator_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_iterator_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/basic_resolver_iterator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_iterator_OBJECTS) $(unit_ip_basic_resolver_iterator_LDADD) $(LIBS) unit/ip/basic_resolver_query.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/basic_resolver_query$(EXEEXT): $(unit_ip_basic_resolver_query_OBJECTS) $(unit_ip_basic_resolver_query_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_query_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/basic_resolver_query$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_query_OBJECTS) $(unit_ip_basic_resolver_query_LDADD) $(LIBS) unit/ip/host_name.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/host_name$(EXEEXT): $(unit_ip_host_name_OBJECTS) $(unit_ip_host_name_DEPENDENCIES) $(EXTRA_unit_ip_host_name_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/host_name$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_host_name_OBJECTS) $(unit_ip_host_name_LDADD) $(LIBS) unit/ip/icmp.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/icmp$(EXEEXT): $(unit_ip_icmp_OBJECTS) $(unit_ip_icmp_DEPENDENCIES) $(EXTRA_unit_ip_icmp_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/icmp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_icmp_OBJECTS) $(unit_ip_icmp_LDADD) $(LIBS) unit/ip/multicast.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/multicast$(EXEEXT): $(unit_ip_multicast_OBJECTS) $(unit_ip_multicast_DEPENDENCIES) $(EXTRA_unit_ip_multicast_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/multicast$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_multicast_OBJECTS) $(unit_ip_multicast_LDADD) $(LIBS) unit/ip/network_v4.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/network_v4$(EXEEXT): $(unit_ip_network_v4_OBJECTS) $(unit_ip_network_v4_DEPENDENCIES) $(EXTRA_unit_ip_network_v4_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/network_v4$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_network_v4_OBJECTS) $(unit_ip_network_v4_LDADD) $(LIBS) unit/ip/network_v6.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/network_v6$(EXEEXT): $(unit_ip_network_v6_OBJECTS) $(unit_ip_network_v6_DEPENDENCIES) $(EXTRA_unit_ip_network_v6_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/network_v6$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_network_v6_OBJECTS) $(unit_ip_network_v6_LDADD) $(LIBS) unit/ip/resolver_query_base.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/resolver_query_base$(EXEEXT): $(unit_ip_resolver_query_base_OBJECTS) $(unit_ip_resolver_query_base_DEPENDENCIES) $(EXTRA_unit_ip_resolver_query_base_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/resolver_query_base$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_resolver_query_base_OBJECTS) $(unit_ip_resolver_query_base_LDADD) $(LIBS) unit/ip/resolver_service.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/resolver_service$(EXEEXT): $(unit_ip_resolver_service_OBJECTS) $(unit_ip_resolver_service_DEPENDENCIES) $(EXTRA_unit_ip_resolver_service_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/resolver_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_resolver_service_OBJECTS) $(unit_ip_resolver_service_LDADD) $(LIBS) unit/ip/tcp.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/tcp$(EXEEXT): $(unit_ip_tcp_OBJECTS) $(unit_ip_tcp_DEPENDENCIES) $(EXTRA_unit_ip_tcp_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/tcp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_tcp_OBJECTS) $(unit_ip_tcp_LDADD) $(LIBS) unit/ip/udp.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/udp$(EXEEXT): $(unit_ip_udp_OBJECTS) $(unit_ip_udp_DEPENDENCIES) $(EXTRA_unit_ip_udp_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/udp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_udp_OBJECTS) $(unit_ip_udp_LDADD) $(LIBS) unit/ip/unicast.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/unicast$(EXEEXT): $(unit_ip_unicast_OBJECTS) $(unit_ip_unicast_DEPENDENCIES) $(EXTRA_unit_ip_unicast_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/unicast$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_unicast_OBJECTS) $(unit_ip_unicast_LDADD) $(LIBS) unit/ip/v6_only.$(OBJEXT): unit/ip/$(am__dirstamp) \ unit/ip/$(DEPDIR)/$(am__dirstamp) unit/ip/v6_only$(EXEEXT): $(unit_ip_v6_only_OBJECTS) $(unit_ip_v6_only_DEPENDENCIES) $(EXTRA_unit_ip_v6_only_DEPENDENCIES) unit/ip/$(am__dirstamp) @rm -f unit/ip/v6_only$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_v6_only_OBJECTS) $(unit_ip_v6_only_LDADD) $(LIBS) unit/is_read_buffered.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/is_read_buffered$(EXEEXT): $(unit_is_read_buffered_OBJECTS) $(unit_is_read_buffered_DEPENDENCIES) $(EXTRA_unit_is_read_buffered_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/is_read_buffered$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_is_read_buffered_OBJECTS) $(unit_is_read_buffered_LDADD) $(LIBS) unit/is_write_buffered.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/is_write_buffered$(EXEEXT): $(unit_is_write_buffered_OBJECTS) $(unit_is_write_buffered_DEPENDENCIES) $(EXTRA_unit_is_write_buffered_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/is_write_buffered$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_is_write_buffered_OBJECTS) $(unit_is_write_buffered_LDADD) $(LIBS) unit/local/$(am__dirstamp): @$(MKDIR_P) unit/local @: > unit/local/$(am__dirstamp) unit/local/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/local/$(DEPDIR) @: > unit/local/$(DEPDIR)/$(am__dirstamp) unit/local/basic_endpoint.$(OBJEXT): unit/local/$(am__dirstamp) \ unit/local/$(DEPDIR)/$(am__dirstamp) unit/local/basic_endpoint$(EXEEXT): $(unit_local_basic_endpoint_OBJECTS) $(unit_local_basic_endpoint_DEPENDENCIES) $(EXTRA_unit_local_basic_endpoint_DEPENDENCIES) unit/local/$(am__dirstamp) @rm -f unit/local/basic_endpoint$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_local_basic_endpoint_OBJECTS) $(unit_local_basic_endpoint_LDADD) $(LIBS) unit/local/connect_pair.$(OBJEXT): unit/local/$(am__dirstamp) \ unit/local/$(DEPDIR)/$(am__dirstamp) unit/local/connect_pair$(EXEEXT): $(unit_local_connect_pair_OBJECTS) $(unit_local_connect_pair_DEPENDENCIES) $(EXTRA_unit_local_connect_pair_DEPENDENCIES) unit/local/$(am__dirstamp) @rm -f unit/local/connect_pair$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_local_connect_pair_OBJECTS) $(unit_local_connect_pair_LDADD) $(LIBS) unit/local/datagram_protocol.$(OBJEXT): unit/local/$(am__dirstamp) \ unit/local/$(DEPDIR)/$(am__dirstamp) unit/local/datagram_protocol$(EXEEXT): $(unit_local_datagram_protocol_OBJECTS) $(unit_local_datagram_protocol_DEPENDENCIES) $(EXTRA_unit_local_datagram_protocol_DEPENDENCIES) unit/local/$(am__dirstamp) @rm -f unit/local/datagram_protocol$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_local_datagram_protocol_OBJECTS) $(unit_local_datagram_protocol_LDADD) $(LIBS) unit/local/stream_protocol.$(OBJEXT): unit/local/$(am__dirstamp) \ unit/local/$(DEPDIR)/$(am__dirstamp) unit/local/stream_protocol$(EXEEXT): $(unit_local_stream_protocol_OBJECTS) $(unit_local_stream_protocol_DEPENDENCIES) $(EXTRA_unit_local_stream_protocol_DEPENDENCIES) unit/local/$(am__dirstamp) @rm -f unit/local/stream_protocol$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_local_stream_protocol_OBJECTS) $(unit_local_stream_protocol_LDADD) $(LIBS) unit/packaged_task.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/packaged_task$(EXEEXT): $(unit_packaged_task_OBJECTS) $(unit_packaged_task_DEPENDENCIES) $(EXTRA_unit_packaged_task_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/packaged_task$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_packaged_task_OBJECTS) $(unit_packaged_task_LDADD) $(LIBS) unit/placeholders.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/placeholders$(EXEEXT): $(unit_placeholders_OBJECTS) $(unit_placeholders_DEPENDENCIES) $(EXTRA_unit_placeholders_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/placeholders$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_placeholders_OBJECTS) $(unit_placeholders_LDADD) $(LIBS) unit/posix/$(am__dirstamp): @$(MKDIR_P) unit/posix @: > unit/posix/$(am__dirstamp) unit/posix/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/posix/$(DEPDIR) @: > unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/basic_descriptor.$(OBJEXT): unit/posix/$(am__dirstamp) \ unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/basic_descriptor$(EXEEXT): $(unit_posix_basic_descriptor_OBJECTS) $(unit_posix_basic_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_basic_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp) @rm -f unit/posix/basic_descriptor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_basic_descriptor_OBJECTS) $(unit_posix_basic_descriptor_LDADD) $(LIBS) unit/posix/basic_stream_descriptor.$(OBJEXT): \ unit/posix/$(am__dirstamp) \ unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/basic_stream_descriptor$(EXEEXT): $(unit_posix_basic_stream_descriptor_OBJECTS) $(unit_posix_basic_stream_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_basic_stream_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp) @rm -f unit/posix/basic_stream_descriptor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_basic_stream_descriptor_OBJECTS) $(unit_posix_basic_stream_descriptor_LDADD) $(LIBS) unit/posix/descriptor.$(OBJEXT): unit/posix/$(am__dirstamp) \ unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/descriptor$(EXEEXT): $(unit_posix_descriptor_OBJECTS) $(unit_posix_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp) @rm -f unit/posix/descriptor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_descriptor_OBJECTS) $(unit_posix_descriptor_LDADD) $(LIBS) unit/posix/descriptor_base.$(OBJEXT): unit/posix/$(am__dirstamp) \ unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/descriptor_base$(EXEEXT): $(unit_posix_descriptor_base_OBJECTS) $(unit_posix_descriptor_base_DEPENDENCIES) $(EXTRA_unit_posix_descriptor_base_DEPENDENCIES) unit/posix/$(am__dirstamp) @rm -f unit/posix/descriptor_base$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_descriptor_base_OBJECTS) $(unit_posix_descriptor_base_LDADD) $(LIBS) unit/posix/stream_descriptor.$(OBJEXT): unit/posix/$(am__dirstamp) \ unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/stream_descriptor$(EXEEXT): $(unit_posix_stream_descriptor_OBJECTS) $(unit_posix_stream_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_stream_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp) @rm -f unit/posix/stream_descriptor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_stream_descriptor_OBJECTS) $(unit_posix_stream_descriptor_LDADD) $(LIBS) unit/posix/stream_descriptor_service.$(OBJEXT): \ unit/posix/$(am__dirstamp) \ unit/posix/$(DEPDIR)/$(am__dirstamp) unit/posix/stream_descriptor_service$(EXEEXT): $(unit_posix_stream_descriptor_service_OBJECTS) $(unit_posix_stream_descriptor_service_DEPENDENCIES) $(EXTRA_unit_posix_stream_descriptor_service_DEPENDENCIES) unit/posix/$(am__dirstamp) @rm -f unit/posix/stream_descriptor_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_stream_descriptor_service_OBJECTS) $(unit_posix_stream_descriptor_service_LDADD) $(LIBS) unit/post.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/post$(EXEEXT): $(unit_post_OBJECTS) $(unit_post_DEPENDENCIES) $(EXTRA_unit_post_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/post$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_post_OBJECTS) $(unit_post_LDADD) $(LIBS) unit/raw_socket_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/raw_socket_service$(EXEEXT): $(unit_raw_socket_service_OBJECTS) $(unit_raw_socket_service_DEPENDENCIES) $(EXTRA_unit_raw_socket_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/raw_socket_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_raw_socket_service_OBJECTS) $(unit_raw_socket_service_LDADD) $(LIBS) unit/read.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/read$(EXEEXT): $(unit_read_OBJECTS) $(unit_read_DEPENDENCIES) $(EXTRA_unit_read_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/read$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_read_OBJECTS) $(unit_read_LDADD) $(LIBS) unit/read_at.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/read_at$(EXEEXT): $(unit_read_at_OBJECTS) $(unit_read_at_DEPENDENCIES) $(EXTRA_unit_read_at_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/read_at$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_read_at_OBJECTS) $(unit_read_at_LDADD) $(LIBS) unit/read_until.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/read_until$(EXEEXT): $(unit_read_until_OBJECTS) $(unit_read_until_DEPENDENCIES) $(EXTRA_unit_read_until_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/read_until$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_read_until_OBJECTS) $(unit_read_until_LDADD) $(LIBS) unit/seq_packet_socket_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/seq_packet_socket_service$(EXEEXT): $(unit_seq_packet_socket_service_OBJECTS) $(unit_seq_packet_socket_service_DEPENDENCIES) $(EXTRA_unit_seq_packet_socket_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/seq_packet_socket_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_seq_packet_socket_service_OBJECTS) $(unit_seq_packet_socket_service_LDADD) $(LIBS) unit/serial_port.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/serial_port$(EXEEXT): $(unit_serial_port_OBJECTS) $(unit_serial_port_DEPENDENCIES) $(EXTRA_unit_serial_port_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/serial_port$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_serial_port_OBJECTS) $(unit_serial_port_LDADD) $(LIBS) unit/serial_port_base.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/serial_port_base$(EXEEXT): $(unit_serial_port_base_OBJECTS) $(unit_serial_port_base_DEPENDENCIES) $(EXTRA_unit_serial_port_base_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/serial_port_base$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_serial_port_base_OBJECTS) $(unit_serial_port_base_LDADD) $(LIBS) unit/serial_port_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/serial_port_service$(EXEEXT): $(unit_serial_port_service_OBJECTS) $(unit_serial_port_service_DEPENDENCIES) $(EXTRA_unit_serial_port_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/serial_port_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_serial_port_service_OBJECTS) $(unit_serial_port_service_LDADD) $(LIBS) unit/signal_set.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/signal_set$(EXEEXT): $(unit_signal_set_OBJECTS) $(unit_signal_set_DEPENDENCIES) $(EXTRA_unit_signal_set_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/signal_set$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_signal_set_OBJECTS) $(unit_signal_set_LDADD) $(LIBS) unit/signal_set_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/signal_set_service$(EXEEXT): $(unit_signal_set_service_OBJECTS) $(unit_signal_set_service_DEPENDENCIES) $(EXTRA_unit_signal_set_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/signal_set_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_signal_set_service_OBJECTS) $(unit_signal_set_service_LDADD) $(LIBS) unit/socket_acceptor_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/socket_acceptor_service$(EXEEXT): $(unit_socket_acceptor_service_OBJECTS) $(unit_socket_acceptor_service_DEPENDENCIES) $(EXTRA_unit_socket_acceptor_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/socket_acceptor_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_socket_acceptor_service_OBJECTS) $(unit_socket_acceptor_service_LDADD) $(LIBS) unit/socket_base.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/socket_base$(EXEEXT): $(unit_socket_base_OBJECTS) $(unit_socket_base_DEPENDENCIES) $(EXTRA_unit_socket_base_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/socket_base$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_socket_base_OBJECTS) $(unit_socket_base_LDADD) $(LIBS) unit/ssl/$(am__dirstamp): @$(MKDIR_P) unit/ssl @: > unit/ssl/$(am__dirstamp) unit/ssl/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/ssl/$(DEPDIR) @: > unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/context.$(OBJEXT): unit/ssl/$(am__dirstamp) \ unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/context$(EXEEXT): $(unit_ssl_context_OBJECTS) $(unit_ssl_context_DEPENDENCIES) $(EXTRA_unit_ssl_context_DEPENDENCIES) unit/ssl/$(am__dirstamp) @rm -f unit/ssl/context$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_context_OBJECTS) $(unit_ssl_context_LDADD) $(LIBS) unit/ssl/context_base.$(OBJEXT): unit/ssl/$(am__dirstamp) \ unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/context_base$(EXEEXT): $(unit_ssl_context_base_OBJECTS) $(unit_ssl_context_base_DEPENDENCIES) $(EXTRA_unit_ssl_context_base_DEPENDENCIES) unit/ssl/$(am__dirstamp) @rm -f unit/ssl/context_base$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_context_base_OBJECTS) $(unit_ssl_context_base_LDADD) $(LIBS) unit/ssl/error.$(OBJEXT): unit/ssl/$(am__dirstamp) \ unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/error$(EXEEXT): $(unit_ssl_error_OBJECTS) $(unit_ssl_error_DEPENDENCIES) $(EXTRA_unit_ssl_error_DEPENDENCIES) unit/ssl/$(am__dirstamp) @rm -f unit/ssl/error$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_error_OBJECTS) $(unit_ssl_error_LDADD) $(LIBS) unit/ssl/rfc2818_verification.$(OBJEXT): unit/ssl/$(am__dirstamp) \ unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/rfc2818_verification$(EXEEXT): $(unit_ssl_rfc2818_verification_OBJECTS) $(unit_ssl_rfc2818_verification_DEPENDENCIES) $(EXTRA_unit_ssl_rfc2818_verification_DEPENDENCIES) unit/ssl/$(am__dirstamp) @rm -f unit/ssl/rfc2818_verification$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_rfc2818_verification_OBJECTS) $(unit_ssl_rfc2818_verification_LDADD) $(LIBS) unit/ssl/stream.$(OBJEXT): unit/ssl/$(am__dirstamp) \ unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/stream$(EXEEXT): $(unit_ssl_stream_OBJECTS) $(unit_ssl_stream_DEPENDENCIES) $(EXTRA_unit_ssl_stream_DEPENDENCIES) unit/ssl/$(am__dirstamp) @rm -f unit/ssl/stream$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_stream_OBJECTS) $(unit_ssl_stream_LDADD) $(LIBS) unit/ssl/stream_base.$(OBJEXT): unit/ssl/$(am__dirstamp) \ unit/ssl/$(DEPDIR)/$(am__dirstamp) unit/ssl/stream_base$(EXEEXT): $(unit_ssl_stream_base_OBJECTS) $(unit_ssl_stream_base_DEPENDENCIES) $(EXTRA_unit_ssl_stream_base_DEPENDENCIES) unit/ssl/$(am__dirstamp) @rm -f unit/ssl/stream_base$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_stream_base_OBJECTS) $(unit_ssl_stream_base_LDADD) $(LIBS) unit/steady_timer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/steady_timer$(EXEEXT): $(unit_steady_timer_OBJECTS) $(unit_steady_timer_DEPENDENCIES) $(EXTRA_unit_steady_timer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/steady_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_steady_timer_OBJECTS) $(unit_steady_timer_LDADD) $(LIBS) unit/strand.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/strand$(EXEEXT): $(unit_strand_OBJECTS) $(unit_strand_DEPENDENCIES) $(EXTRA_unit_strand_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/strand$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_strand_OBJECTS) $(unit_strand_LDADD) $(LIBS) unit/stream_socket_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/stream_socket_service$(EXEEXT): $(unit_stream_socket_service_OBJECTS) $(unit_stream_socket_service_DEPENDENCIES) $(EXTRA_unit_stream_socket_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/stream_socket_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_stream_socket_service_OBJECTS) $(unit_stream_socket_service_LDADD) $(LIBS) unit/streambuf.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/streambuf$(EXEEXT): $(unit_streambuf_OBJECTS) $(unit_streambuf_DEPENDENCIES) $(EXTRA_unit_streambuf_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/streambuf$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_streambuf_OBJECTS) $(unit_streambuf_LDADD) $(LIBS) unit/system_context.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/system_context$(EXEEXT): $(unit_system_context_OBJECTS) $(unit_system_context_DEPENDENCIES) $(EXTRA_unit_system_context_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/system_context$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_system_context_OBJECTS) $(unit_system_context_LDADD) $(LIBS) unit/system_executor.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/system_executor$(EXEEXT): $(unit_system_executor_OBJECTS) $(unit_system_executor_DEPENDENCIES) $(EXTRA_unit_system_executor_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/system_executor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_system_executor_OBJECTS) $(unit_system_executor_LDADD) $(LIBS) unit/system_timer.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/system_timer$(EXEEXT): $(unit_system_timer_OBJECTS) $(unit_system_timer_DEPENDENCIES) $(EXTRA_unit_system_timer_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/system_timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_system_timer_OBJECTS) $(unit_system_timer_LDADD) $(LIBS) unit/thread.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/thread$(EXEEXT): $(unit_thread_OBJECTS) $(unit_thread_DEPENDENCIES) $(EXTRA_unit_thread_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/thread$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_thread_OBJECTS) $(unit_thread_LDADD) $(LIBS) unit/time_traits.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/time_traits$(EXEEXT): $(unit_time_traits_OBJECTS) $(unit_time_traits_DEPENDENCIES) $(EXTRA_unit_time_traits_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/time_traits$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_time_traits_OBJECTS) $(unit_time_traits_LDADD) $(LIBS) unit/ts/$(am__dirstamp): @$(MKDIR_P) unit/ts @: > unit/ts/$(am__dirstamp) unit/ts/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/ts/$(DEPDIR) @: > unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/buffer.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/buffer$(EXEEXT): $(unit_ts_buffer_OBJECTS) $(unit_ts_buffer_DEPENDENCIES) $(EXTRA_unit_ts_buffer_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/buffer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_buffer_OBJECTS) $(unit_ts_buffer_LDADD) $(LIBS) unit/ts/executor.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/executor$(EXEEXT): $(unit_ts_executor_OBJECTS) $(unit_ts_executor_DEPENDENCIES) $(EXTRA_unit_ts_executor_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/executor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_executor_OBJECTS) $(unit_ts_executor_LDADD) $(LIBS) unit/ts/internet.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/internet$(EXEEXT): $(unit_ts_internet_OBJECTS) $(unit_ts_internet_DEPENDENCIES) $(EXTRA_unit_ts_internet_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/internet$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_internet_OBJECTS) $(unit_ts_internet_LDADD) $(LIBS) unit/ts/io_context.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/io_context$(EXEEXT): $(unit_ts_io_context_OBJECTS) $(unit_ts_io_context_DEPENDENCIES) $(EXTRA_unit_ts_io_context_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/io_context$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_io_context_OBJECTS) $(unit_ts_io_context_LDADD) $(LIBS) unit/ts/net.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/net$(EXEEXT): $(unit_ts_net_OBJECTS) $(unit_ts_net_DEPENDENCIES) $(EXTRA_unit_ts_net_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/net$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_net_OBJECTS) $(unit_ts_net_LDADD) $(LIBS) unit/ts/netfwd.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/netfwd$(EXEEXT): $(unit_ts_netfwd_OBJECTS) $(unit_ts_netfwd_DEPENDENCIES) $(EXTRA_unit_ts_netfwd_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/netfwd$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_netfwd_OBJECTS) $(unit_ts_netfwd_LDADD) $(LIBS) unit/ts/socket.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/socket$(EXEEXT): $(unit_ts_socket_OBJECTS) $(unit_ts_socket_DEPENDENCIES) $(EXTRA_unit_ts_socket_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/socket$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_socket_OBJECTS) $(unit_ts_socket_LDADD) $(LIBS) unit/ts/timer.$(OBJEXT): unit/ts/$(am__dirstamp) \ unit/ts/$(DEPDIR)/$(am__dirstamp) unit/ts/timer$(EXEEXT): $(unit_ts_timer_OBJECTS) $(unit_ts_timer_DEPENDENCIES) $(EXTRA_unit_ts_timer_DEPENDENCIES) unit/ts/$(am__dirstamp) @rm -f unit/ts/timer$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_timer_OBJECTS) $(unit_ts_timer_LDADD) $(LIBS) unit/use_future.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/use_future$(EXEEXT): $(unit_use_future_OBJECTS) $(unit_use_future_DEPENDENCIES) $(EXTRA_unit_use_future_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/use_future$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_use_future_OBJECTS) $(unit_use_future_LDADD) $(LIBS) unit/uses_executor.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/uses_executor$(EXEEXT): $(unit_uses_executor_OBJECTS) $(unit_uses_executor_DEPENDENCIES) $(EXTRA_unit_uses_executor_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/uses_executor$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_uses_executor_OBJECTS) $(unit_uses_executor_LDADD) $(LIBS) unit/wait_traits.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/wait_traits$(EXEEXT): $(unit_wait_traits_OBJECTS) $(unit_wait_traits_DEPENDENCIES) $(EXTRA_unit_wait_traits_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/wait_traits$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_wait_traits_OBJECTS) $(unit_wait_traits_LDADD) $(LIBS) unit/waitable_timer_service.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/waitable_timer_service$(EXEEXT): $(unit_waitable_timer_service_OBJECTS) $(unit_waitable_timer_service_DEPENDENCIES) $(EXTRA_unit_waitable_timer_service_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/waitable_timer_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_waitable_timer_service_OBJECTS) $(unit_waitable_timer_service_LDADD) $(LIBS) unit/windows/$(am__dirstamp): @$(MKDIR_P) unit/windows @: > unit/windows/$(am__dirstamp) unit/windows/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) unit/windows/$(DEPDIR) @: > unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/basic_handle.$(OBJEXT): unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/basic_handle$(EXEEXT): $(unit_windows_basic_handle_OBJECTS) $(unit_windows_basic_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/basic_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_handle_OBJECTS) $(unit_windows_basic_handle_LDADD) $(LIBS) unit/windows/basic_object_handle.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/basic_object_handle$(EXEEXT): $(unit_windows_basic_object_handle_OBJECTS) $(unit_windows_basic_object_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_object_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/basic_object_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_object_handle_OBJECTS) $(unit_windows_basic_object_handle_LDADD) $(LIBS) unit/windows/basic_random_access_handle.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/basic_random_access_handle$(EXEEXT): $(unit_windows_basic_random_access_handle_OBJECTS) $(unit_windows_basic_random_access_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_random_access_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/basic_random_access_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_random_access_handle_OBJECTS) $(unit_windows_basic_random_access_handle_LDADD) $(LIBS) unit/windows/basic_stream_handle.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/basic_stream_handle$(EXEEXT): $(unit_windows_basic_stream_handle_OBJECTS) $(unit_windows_basic_stream_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_stream_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/basic_stream_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_stream_handle_OBJECTS) $(unit_windows_basic_stream_handle_LDADD) $(LIBS) unit/windows/object_handle.$(OBJEXT): unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/object_handle$(EXEEXT): $(unit_windows_object_handle_OBJECTS) $(unit_windows_object_handle_DEPENDENCIES) $(EXTRA_unit_windows_object_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/object_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_object_handle_OBJECTS) $(unit_windows_object_handle_LDADD) $(LIBS) unit/windows/object_handle_service.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/object_handle_service$(EXEEXT): $(unit_windows_object_handle_service_OBJECTS) $(unit_windows_object_handle_service_DEPENDENCIES) $(EXTRA_unit_windows_object_handle_service_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/object_handle_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_object_handle_service_OBJECTS) $(unit_windows_object_handle_service_LDADD) $(LIBS) unit/windows/overlapped_handle.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/overlapped_handle$(EXEEXT): $(unit_windows_overlapped_handle_OBJECTS) $(unit_windows_overlapped_handle_DEPENDENCIES) $(EXTRA_unit_windows_overlapped_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/overlapped_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_overlapped_handle_OBJECTS) $(unit_windows_overlapped_handle_LDADD) $(LIBS) unit/windows/overlapped_ptr.$(OBJEXT): unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/overlapped_ptr$(EXEEXT): $(unit_windows_overlapped_ptr_OBJECTS) $(unit_windows_overlapped_ptr_DEPENDENCIES) $(EXTRA_unit_windows_overlapped_ptr_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/overlapped_ptr$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_overlapped_ptr_OBJECTS) $(unit_windows_overlapped_ptr_LDADD) $(LIBS) unit/windows/random_access_handle.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/random_access_handle$(EXEEXT): $(unit_windows_random_access_handle_OBJECTS) $(unit_windows_random_access_handle_DEPENDENCIES) $(EXTRA_unit_windows_random_access_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/random_access_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_random_access_handle_OBJECTS) $(unit_windows_random_access_handle_LDADD) $(LIBS) unit/windows/random_access_handle_service.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/random_access_handle_service$(EXEEXT): $(unit_windows_random_access_handle_service_OBJECTS) $(unit_windows_random_access_handle_service_DEPENDENCIES) $(EXTRA_unit_windows_random_access_handle_service_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/random_access_handle_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_random_access_handle_service_OBJECTS) $(unit_windows_random_access_handle_service_LDADD) $(LIBS) unit/windows/stream_handle.$(OBJEXT): unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/stream_handle$(EXEEXT): $(unit_windows_stream_handle_OBJECTS) $(unit_windows_stream_handle_DEPENDENCIES) $(EXTRA_unit_windows_stream_handle_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/stream_handle$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_stream_handle_OBJECTS) $(unit_windows_stream_handle_LDADD) $(LIBS) unit/windows/stream_handle_service.$(OBJEXT): \ unit/windows/$(am__dirstamp) \ unit/windows/$(DEPDIR)/$(am__dirstamp) unit/windows/stream_handle_service$(EXEEXT): $(unit_windows_stream_handle_service_OBJECTS) $(unit_windows_stream_handle_service_DEPENDENCIES) $(EXTRA_unit_windows_stream_handle_service_DEPENDENCIES) unit/windows/$(am__dirstamp) @rm -f unit/windows/stream_handle_service$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_stream_handle_service_OBJECTS) $(unit_windows_stream_handle_service_LDADD) $(LIBS) unit/write.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/write$(EXEEXT): $(unit_write_OBJECTS) $(unit_write_DEPENDENCIES) $(EXTRA_unit_write_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/write$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_write_OBJECTS) $(unit_write_LDADD) $(LIBS) unit/write_at.$(OBJEXT): unit/$(am__dirstamp) \ unit/$(DEPDIR)/$(am__dirstamp) unit/write_at$(EXEEXT): $(unit_write_at_OBJECTS) $(unit_write_at_DEPENDENCIES) $(EXTRA_unit_write_at_DEPENDENCIES) unit/$(am__dirstamp) @rm -f unit/write_at$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(unit_write_at_OBJECTS) $(unit_write_at_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f ../*.$(OBJEXT) -rm -f latency/*.$(OBJEXT) -rm -f performance/*.$(OBJEXT) -rm -f unit/*.$(OBJEXT) -rm -f unit/generic/*.$(OBJEXT) -rm -f unit/ip/*.$(OBJEXT) -rm -f unit/local/*.$(OBJEXT) -rm -f unit/posix/*.$(OBJEXT) -rm -f unit/ssl/*.$(OBJEXT) -rm -f unit/ts/*.$(OBJEXT) -rm -f unit/windows/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/tcp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/tcp_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/udp_client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/udp_server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@performance/$(DEPDIR)/client.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@performance/$(DEPDIR)/server.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associated_allocator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associated_executor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/async_result.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_datagram_socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_deadline_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_raw_socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_seq_packet_socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_serial_port.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_signal_set.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_socket_acceptor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_stream_socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_streambuf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_waitable_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/bind_executor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffered_read_stream.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffered_stream.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffered_write_stream.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffers_iterator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/completion_condition.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/connect.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/coroutine.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/datagram_socket_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/deadline_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/deadline_timer_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/defer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/dispatch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/execution_context.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/executor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/executor_work_guard.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/high_resolution_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/io_context.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/is_read_buffered.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/is_write_buffered.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/packaged_task.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/placeholders.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/post.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/raw_socket_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/read.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/read_at.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/read_until.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/seq_packet_socket_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/serial_port.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/serial_port_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/serial_port_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/signal_set.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/signal_set_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/socket_acceptor_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/socket_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/steady_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/strand.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/stream_socket_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/streambuf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/system_context.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/system_executor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/system_timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/thread.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/time_traits.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/use_future.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/uses_executor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/wait_traits.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/waitable_timer_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/write.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/write_at.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/basic_endpoint.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/datagram_protocol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/raw_protocol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/seq_packet_protocol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/stream_protocol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v4_iterator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v4_range.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v6.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v6_iterator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v6_range.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_endpoint.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver_entry.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver_iterator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver_query.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/host_name.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/icmp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/multicast.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/network_v4.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/network_v6.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/resolver_query_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/resolver_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/tcp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/udp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/unicast.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/v6_only.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/basic_endpoint.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/connect_pair.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/datagram_protocol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/stream_protocol.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/basic_descriptor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/basic_stream_descriptor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/descriptor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/descriptor_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/stream_descriptor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/stream_descriptor_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/context.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/context_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/error.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/rfc2818_verification.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/stream.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/stream_base.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/buffer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/executor.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/internet.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/io_context.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/net.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/netfwd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/socket.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_object_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_random_access_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_stream_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/object_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/object_handle_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/overlapped_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/overlapped_ptr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/random_access_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/random_access_handle_service.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/stream_handle.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/stream_handle_service.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? unit/associated_allocator.log: unit/associated_allocator$(EXEEXT) @p='unit/associated_allocator$(EXEEXT)'; \ b='unit/associated_allocator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/associated_executor.log: unit/associated_executor$(EXEEXT) @p='unit/associated_executor$(EXEEXT)'; \ b='unit/associated_executor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/async_result.log: unit/async_result$(EXEEXT) @p='unit/async_result$(EXEEXT)'; \ b='unit/async_result'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_datagram_socket.log: unit/basic_datagram_socket$(EXEEXT) @p='unit/basic_datagram_socket$(EXEEXT)'; \ b='unit/basic_datagram_socket'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_deadline_timer.log: unit/basic_deadline_timer$(EXEEXT) @p='unit/basic_deadline_timer$(EXEEXT)'; \ b='unit/basic_deadline_timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_raw_socket.log: unit/basic_raw_socket$(EXEEXT) @p='unit/basic_raw_socket$(EXEEXT)'; \ b='unit/basic_raw_socket'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_seq_packet_socket.log: unit/basic_seq_packet_socket$(EXEEXT) @p='unit/basic_seq_packet_socket$(EXEEXT)'; \ b='unit/basic_seq_packet_socket'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_serial_port.log: unit/basic_serial_port$(EXEEXT) @p='unit/basic_serial_port$(EXEEXT)'; \ b='unit/basic_serial_port'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_signal_set.log: unit/basic_signal_set$(EXEEXT) @p='unit/basic_signal_set$(EXEEXT)'; \ b='unit/basic_signal_set'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_socket_acceptor.log: unit/basic_socket_acceptor$(EXEEXT) @p='unit/basic_socket_acceptor$(EXEEXT)'; \ b='unit/basic_socket_acceptor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_stream_socket.log: unit/basic_stream_socket$(EXEEXT) @p='unit/basic_stream_socket$(EXEEXT)'; \ b='unit/basic_stream_socket'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_streambuf.log: unit/basic_streambuf$(EXEEXT) @p='unit/basic_streambuf$(EXEEXT)'; \ b='unit/basic_streambuf'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/basic_waitable_timer.log: unit/basic_waitable_timer$(EXEEXT) @p='unit/basic_waitable_timer$(EXEEXT)'; \ b='unit/basic_waitable_timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/bind_executor.log: unit/bind_executor$(EXEEXT) @p='unit/bind_executor$(EXEEXT)'; \ b='unit/bind_executor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/buffered_read_stream.log: unit/buffered_read_stream$(EXEEXT) @p='unit/buffered_read_stream$(EXEEXT)'; \ b='unit/buffered_read_stream'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/buffered_stream.log: unit/buffered_stream$(EXEEXT) @p='unit/buffered_stream$(EXEEXT)'; \ b='unit/buffered_stream'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/buffered_write_stream.log: unit/buffered_write_stream$(EXEEXT) @p='unit/buffered_write_stream$(EXEEXT)'; \ b='unit/buffered_write_stream'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/buffer.log: unit/buffer$(EXEEXT) @p='unit/buffer$(EXEEXT)'; \ b='unit/buffer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/buffers_iterator.log: unit/buffers_iterator$(EXEEXT) @p='unit/buffers_iterator$(EXEEXT)'; \ b='unit/buffers_iterator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/completion_condition.log: unit/completion_condition$(EXEEXT) @p='unit/completion_condition$(EXEEXT)'; \ b='unit/completion_condition'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/connect.log: unit/connect$(EXEEXT) @p='unit/connect$(EXEEXT)'; \ b='unit/connect'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/datagram_socket_service.log: unit/datagram_socket_service$(EXEEXT) @p='unit/datagram_socket_service$(EXEEXT)'; \ b='unit/datagram_socket_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/deadline_timer_service.log: unit/deadline_timer_service$(EXEEXT) @p='unit/deadline_timer_service$(EXEEXT)'; \ b='unit/deadline_timer_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/deadline_timer.log: unit/deadline_timer$(EXEEXT) @p='unit/deadline_timer$(EXEEXT)'; \ b='unit/deadline_timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/defer.log: unit/defer$(EXEEXT) @p='unit/defer$(EXEEXT)'; \ b='unit/defer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/dispatch.log: unit/dispatch$(EXEEXT) @p='unit/dispatch$(EXEEXT)'; \ b='unit/dispatch'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/error.log: unit/error$(EXEEXT) @p='unit/error$(EXEEXT)'; \ b='unit/error'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/execution_context.log: unit/execution_context$(EXEEXT) @p='unit/execution_context$(EXEEXT)'; \ b='unit/execution_context'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/executor.log: unit/executor$(EXEEXT) @p='unit/executor$(EXEEXT)'; \ b='unit/executor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/executor_work_guard.log: unit/executor_work_guard$(EXEEXT) @p='unit/executor_work_guard$(EXEEXT)'; \ b='unit/executor_work_guard'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/high_resolution_timer.log: unit/high_resolution_timer$(EXEEXT) @p='unit/high_resolution_timer$(EXEEXT)'; \ b='unit/high_resolution_timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/io_context.log: unit/io_context$(EXEEXT) @p='unit/io_context$(EXEEXT)'; \ b='unit/io_context'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address.log: unit/ip/address$(EXEEXT) @p='unit/ip/address$(EXEEXT)'; \ b='unit/ip/address'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address_v4.log: unit/ip/address_v4$(EXEEXT) @p='unit/ip/address_v4$(EXEEXT)'; \ b='unit/ip/address_v4'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address_v4_iterator.log: unit/ip/address_v4_iterator$(EXEEXT) @p='unit/ip/address_v4_iterator$(EXEEXT)'; \ b='unit/ip/address_v4_iterator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address_v4_range.log: unit/ip/address_v4_range$(EXEEXT) @p='unit/ip/address_v4_range$(EXEEXT)'; \ b='unit/ip/address_v4_range'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address_v6.log: unit/ip/address_v6$(EXEEXT) @p='unit/ip/address_v6$(EXEEXT)'; \ b='unit/ip/address_v6'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address_v6_iterator.log: unit/ip/address_v6_iterator$(EXEEXT) @p='unit/ip/address_v6_iterator$(EXEEXT)'; \ b='unit/ip/address_v6_iterator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/address_v6_range.log: unit/ip/address_v6_range$(EXEEXT) @p='unit/ip/address_v6_range$(EXEEXT)'; \ b='unit/ip/address_v6_range'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/basic_endpoint.log: unit/ip/basic_endpoint$(EXEEXT) @p='unit/ip/basic_endpoint$(EXEEXT)'; \ b='unit/ip/basic_endpoint'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/basic_resolver.log: unit/ip/basic_resolver$(EXEEXT) @p='unit/ip/basic_resolver$(EXEEXT)'; \ b='unit/ip/basic_resolver'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/basic_resolver_entry.log: unit/ip/basic_resolver_entry$(EXEEXT) @p='unit/ip/basic_resolver_entry$(EXEEXT)'; \ b='unit/ip/basic_resolver_entry'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/basic_resolver_iterator.log: unit/ip/basic_resolver_iterator$(EXEEXT) @p='unit/ip/basic_resolver_iterator$(EXEEXT)'; \ b='unit/ip/basic_resolver_iterator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/basic_resolver_query.log: unit/ip/basic_resolver_query$(EXEEXT) @p='unit/ip/basic_resolver_query$(EXEEXT)'; \ b='unit/ip/basic_resolver_query'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/host_name.log: unit/ip/host_name$(EXEEXT) @p='unit/ip/host_name$(EXEEXT)'; \ b='unit/ip/host_name'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/icmp.log: unit/ip/icmp$(EXEEXT) @p='unit/ip/icmp$(EXEEXT)'; \ b='unit/ip/icmp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/multicast.log: unit/ip/multicast$(EXEEXT) @p='unit/ip/multicast$(EXEEXT)'; \ b='unit/ip/multicast'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/network_v4.log: unit/ip/network_v4$(EXEEXT) @p='unit/ip/network_v4$(EXEEXT)'; \ b='unit/ip/network_v4'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/network_v6.log: unit/ip/network_v6$(EXEEXT) @p='unit/ip/network_v6$(EXEEXT)'; \ b='unit/ip/network_v6'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/resolver_query_base.log: unit/ip/resolver_query_base$(EXEEXT) @p='unit/ip/resolver_query_base$(EXEEXT)'; \ b='unit/ip/resolver_query_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/resolver_service.log: unit/ip/resolver_service$(EXEEXT) @p='unit/ip/resolver_service$(EXEEXT)'; \ b='unit/ip/resolver_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/tcp.log: unit/ip/tcp$(EXEEXT) @p='unit/ip/tcp$(EXEEXT)'; \ b='unit/ip/tcp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/udp.log: unit/ip/udp$(EXEEXT) @p='unit/ip/udp$(EXEEXT)'; \ b='unit/ip/udp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/unicast.log: unit/ip/unicast$(EXEEXT) @p='unit/ip/unicast$(EXEEXT)'; \ b='unit/ip/unicast'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ip/v6_only.log: unit/ip/v6_only$(EXEEXT) @p='unit/ip/v6_only$(EXEEXT)'; \ b='unit/ip/v6_only'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/is_read_buffered.log: unit/is_read_buffered$(EXEEXT) @p='unit/is_read_buffered$(EXEEXT)'; \ b='unit/is_read_buffered'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/is_write_buffered.log: unit/is_write_buffered$(EXEEXT) @p='unit/is_write_buffered$(EXEEXT)'; \ b='unit/is_write_buffered'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/local/basic_endpoint.log: unit/local/basic_endpoint$(EXEEXT) @p='unit/local/basic_endpoint$(EXEEXT)'; \ b='unit/local/basic_endpoint'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/local/connect_pair.log: unit/local/connect_pair$(EXEEXT) @p='unit/local/connect_pair$(EXEEXT)'; \ b='unit/local/connect_pair'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/local/datagram_protocol.log: unit/local/datagram_protocol$(EXEEXT) @p='unit/local/datagram_protocol$(EXEEXT)'; \ b='unit/local/datagram_protocol'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/local/stream_protocol.log: unit/local/stream_protocol$(EXEEXT) @p='unit/local/stream_protocol$(EXEEXT)'; \ b='unit/local/stream_protocol'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/packaged_task.log: unit/packaged_task$(EXEEXT) @p='unit/packaged_task$(EXEEXT)'; \ b='unit/packaged_task'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/placeholders.log: unit/placeholders$(EXEEXT) @p='unit/placeholders$(EXEEXT)'; \ b='unit/placeholders'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/posix/basic_descriptor.log: unit/posix/basic_descriptor$(EXEEXT) @p='unit/posix/basic_descriptor$(EXEEXT)'; \ b='unit/posix/basic_descriptor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/posix/basic_stream_descriptor.log: unit/posix/basic_stream_descriptor$(EXEEXT) @p='unit/posix/basic_stream_descriptor$(EXEEXT)'; \ b='unit/posix/basic_stream_descriptor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/posix/descriptor.log: unit/posix/descriptor$(EXEEXT) @p='unit/posix/descriptor$(EXEEXT)'; \ b='unit/posix/descriptor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/posix/descriptor_base.log: unit/posix/descriptor_base$(EXEEXT) @p='unit/posix/descriptor_base$(EXEEXT)'; \ b='unit/posix/descriptor_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/posix/stream_descriptor.log: unit/posix/stream_descriptor$(EXEEXT) @p='unit/posix/stream_descriptor$(EXEEXT)'; \ b='unit/posix/stream_descriptor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/posix/stream_descriptor_service.log: unit/posix/stream_descriptor_service$(EXEEXT) @p='unit/posix/stream_descriptor_service$(EXEEXT)'; \ b='unit/posix/stream_descriptor_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/post.log: unit/post$(EXEEXT) @p='unit/post$(EXEEXT)'; \ b='unit/post'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/raw_socket_service.log: unit/raw_socket_service$(EXEEXT) @p='unit/raw_socket_service$(EXEEXT)'; \ b='unit/raw_socket_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/read.log: unit/read$(EXEEXT) @p='unit/read$(EXEEXT)'; \ b='unit/read'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/read_at.log: unit/read_at$(EXEEXT) @p='unit/read_at$(EXEEXT)'; \ b='unit/read_at'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/read_until.log: unit/read_until$(EXEEXT) @p='unit/read_until$(EXEEXT)'; \ b='unit/read_until'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/seq_packet_socket_service.log: unit/seq_packet_socket_service$(EXEEXT) @p='unit/seq_packet_socket_service$(EXEEXT)'; \ b='unit/seq_packet_socket_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/serial_port.log: unit/serial_port$(EXEEXT) @p='unit/serial_port$(EXEEXT)'; \ b='unit/serial_port'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/serial_port_base.log: unit/serial_port_base$(EXEEXT) @p='unit/serial_port_base$(EXEEXT)'; \ b='unit/serial_port_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/serial_port_service.log: unit/serial_port_service$(EXEEXT) @p='unit/serial_port_service$(EXEEXT)'; \ b='unit/serial_port_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/signal_set.log: unit/signal_set$(EXEEXT) @p='unit/signal_set$(EXEEXT)'; \ b='unit/signal_set'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/signal_set_service.log: unit/signal_set_service$(EXEEXT) @p='unit/signal_set_service$(EXEEXT)'; \ b='unit/signal_set_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/socket_acceptor_service.log: unit/socket_acceptor_service$(EXEEXT) @p='unit/socket_acceptor_service$(EXEEXT)'; \ b='unit/socket_acceptor_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/socket_base.log: unit/socket_base$(EXEEXT) @p='unit/socket_base$(EXEEXT)'; \ b='unit/socket_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/steady_timer.log: unit/steady_timer$(EXEEXT) @p='unit/steady_timer$(EXEEXT)'; \ b='unit/steady_timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/strand.log: unit/strand$(EXEEXT) @p='unit/strand$(EXEEXT)'; \ b='unit/strand'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/stream_socket_service.log: unit/stream_socket_service$(EXEEXT) @p='unit/stream_socket_service$(EXEEXT)'; \ b='unit/stream_socket_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/streambuf.log: unit/streambuf$(EXEEXT) @p='unit/streambuf$(EXEEXT)'; \ b='unit/streambuf'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/system_context.log: unit/system_context$(EXEEXT) @p='unit/system_context$(EXEEXT)'; \ b='unit/system_context'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/system_executor.log: unit/system_executor$(EXEEXT) @p='unit/system_executor$(EXEEXT)'; \ b='unit/system_executor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/system_timer.log: unit/system_timer$(EXEEXT) @p='unit/system_timer$(EXEEXT)'; \ b='unit/system_timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/thread.log: unit/thread$(EXEEXT) @p='unit/thread$(EXEEXT)'; \ b='unit/thread'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/time_traits.log: unit/time_traits$(EXEEXT) @p='unit/time_traits$(EXEEXT)'; \ b='unit/time_traits'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/buffer.log: unit/ts/buffer$(EXEEXT) @p='unit/ts/buffer$(EXEEXT)'; \ b='unit/ts/buffer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/executor.log: unit/ts/executor$(EXEEXT) @p='unit/ts/executor$(EXEEXT)'; \ b='unit/ts/executor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/internet.log: unit/ts/internet$(EXEEXT) @p='unit/ts/internet$(EXEEXT)'; \ b='unit/ts/internet'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/io_context.log: unit/ts/io_context$(EXEEXT) @p='unit/ts/io_context$(EXEEXT)'; \ b='unit/ts/io_context'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/net.log: unit/ts/net$(EXEEXT) @p='unit/ts/net$(EXEEXT)'; \ b='unit/ts/net'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/netfwd.log: unit/ts/netfwd$(EXEEXT) @p='unit/ts/netfwd$(EXEEXT)'; \ b='unit/ts/netfwd'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/socket.log: unit/ts/socket$(EXEEXT) @p='unit/ts/socket$(EXEEXT)'; \ b='unit/ts/socket'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ts/timer.log: unit/ts/timer$(EXEEXT) @p='unit/ts/timer$(EXEEXT)'; \ b='unit/ts/timer'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/use_future.log: unit/use_future$(EXEEXT) @p='unit/use_future$(EXEEXT)'; \ b='unit/use_future'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/uses_executor.log: unit/uses_executor$(EXEEXT) @p='unit/uses_executor$(EXEEXT)'; \ b='unit/uses_executor'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/wait_traits.log: unit/wait_traits$(EXEEXT) @p='unit/wait_traits$(EXEEXT)'; \ b='unit/wait_traits'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/waitable_timer_service.log: unit/waitable_timer_service$(EXEEXT) @p='unit/waitable_timer_service$(EXEEXT)'; \ b='unit/waitable_timer_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/basic_handle.log: unit/windows/basic_handle$(EXEEXT) @p='unit/windows/basic_handle$(EXEEXT)'; \ b='unit/windows/basic_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/basic_object_handle.log: unit/windows/basic_object_handle$(EXEEXT) @p='unit/windows/basic_object_handle$(EXEEXT)'; \ b='unit/windows/basic_object_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/basic_random_access_handle.log: unit/windows/basic_random_access_handle$(EXEEXT) @p='unit/windows/basic_random_access_handle$(EXEEXT)'; \ b='unit/windows/basic_random_access_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/basic_stream_handle.log: unit/windows/basic_stream_handle$(EXEEXT) @p='unit/windows/basic_stream_handle$(EXEEXT)'; \ b='unit/windows/basic_stream_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/object_handle.log: unit/windows/object_handle$(EXEEXT) @p='unit/windows/object_handle$(EXEEXT)'; \ b='unit/windows/object_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/object_handle_service.log: unit/windows/object_handle_service$(EXEEXT) @p='unit/windows/object_handle_service$(EXEEXT)'; \ b='unit/windows/object_handle_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/overlapped_handle.log: unit/windows/overlapped_handle$(EXEEXT) @p='unit/windows/overlapped_handle$(EXEEXT)'; \ b='unit/windows/overlapped_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/overlapped_ptr.log: unit/windows/overlapped_ptr$(EXEEXT) @p='unit/windows/overlapped_ptr$(EXEEXT)'; \ b='unit/windows/overlapped_ptr'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/random_access_handle.log: unit/windows/random_access_handle$(EXEEXT) @p='unit/windows/random_access_handle$(EXEEXT)'; \ b='unit/windows/random_access_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/random_access_handle_service.log: unit/windows/random_access_handle_service$(EXEEXT) @p='unit/windows/random_access_handle_service$(EXEEXT)'; \ b='unit/windows/random_access_handle_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/stream_handle.log: unit/windows/stream_handle$(EXEEXT) @p='unit/windows/stream_handle$(EXEEXT)'; \ b='unit/windows/stream_handle'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/windows/stream_handle_service.log: unit/windows/stream_handle_service$(EXEEXT) @p='unit/windows/stream_handle_service$(EXEEXT)'; \ b='unit/windows/stream_handle_service'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/write.log: unit/write$(EXEEXT) @p='unit/write$(EXEEXT)'; \ b='unit/write'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/write_at.log: unit/write_at$(EXEEXT) @p='unit/write_at$(EXEEXT)'; \ b='unit/write_at'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ssl/context_base.log: unit/ssl/context_base$(EXEEXT) @p='unit/ssl/context_base$(EXEEXT)'; \ b='unit/ssl/context_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ssl/context.log: unit/ssl/context$(EXEEXT) @p='unit/ssl/context$(EXEEXT)'; \ b='unit/ssl/context'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ssl/error.log: unit/ssl/error$(EXEEXT) @p='unit/ssl/error$(EXEEXT)'; \ b='unit/ssl/error'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ssl/rfc2818_verification.log: unit/ssl/rfc2818_verification$(EXEEXT) @p='unit/ssl/rfc2818_verification$(EXEEXT)'; \ b='unit/ssl/rfc2818_verification'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ssl/stream_base.log: unit/ssl/stream_base$(EXEEXT) @p='unit/ssl/stream_base$(EXEEXT)'; \ b='unit/ssl/stream_base'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) unit/ssl/stream.log: unit/ssl/stream$(EXEEXT) @p='unit/ssl/stream$(EXEEXT)'; \ b='unit/ssl/stream'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f ../$(DEPDIR)/$(am__dirstamp) -rm -f ../$(am__dirstamp) -rm -f latency/$(DEPDIR)/$(am__dirstamp) -rm -f latency/$(am__dirstamp) -rm -f performance/$(DEPDIR)/$(am__dirstamp) -rm -f performance/$(am__dirstamp) -rm -f unit/$(DEPDIR)/$(am__dirstamp) -rm -f unit/$(am__dirstamp) -rm -f unit/generic/$(DEPDIR)/$(am__dirstamp) -rm -f unit/generic/$(am__dirstamp) -rm -f unit/ip/$(DEPDIR)/$(am__dirstamp) -rm -f unit/ip/$(am__dirstamp) -rm -f unit/local/$(DEPDIR)/$(am__dirstamp) -rm -f unit/local/$(am__dirstamp) -rm -f unit/posix/$(DEPDIR)/$(am__dirstamp) -rm -f unit/posix/$(am__dirstamp) -rm -f unit/ssl/$(DEPDIR)/$(am__dirstamp) -rm -f unit/ssl/$(am__dirstamp) -rm -f unit/ts/$(DEPDIR)/$(am__dirstamp) -rm -f unit/ts/$(am__dirstamp) -rm -f unit/windows/$(DEPDIR)/$(am__dirstamp) -rm -f unit/windows/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-noinstLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ../$(DEPDIR)/asio.Po -rm -f ../$(DEPDIR)/asio_ssl.Po -rm -f latency/$(DEPDIR)/tcp_client.Po -rm -f latency/$(DEPDIR)/tcp_server.Po -rm -f latency/$(DEPDIR)/udp_client.Po -rm -f latency/$(DEPDIR)/udp_server.Po -rm -f performance/$(DEPDIR)/client.Po -rm -f performance/$(DEPDIR)/server.Po -rm -f unit/$(DEPDIR)/associated_allocator.Po -rm -f unit/$(DEPDIR)/associated_executor.Po -rm -f unit/$(DEPDIR)/async_result.Po -rm -f unit/$(DEPDIR)/basic_datagram_socket.Po -rm -f unit/$(DEPDIR)/basic_deadline_timer.Po -rm -f unit/$(DEPDIR)/basic_raw_socket.Po -rm -f unit/$(DEPDIR)/basic_seq_packet_socket.Po -rm -f unit/$(DEPDIR)/basic_serial_port.Po -rm -f unit/$(DEPDIR)/basic_signal_set.Po -rm -f unit/$(DEPDIR)/basic_socket_acceptor.Po -rm -f unit/$(DEPDIR)/basic_stream_socket.Po -rm -f unit/$(DEPDIR)/basic_streambuf.Po -rm -f unit/$(DEPDIR)/basic_waitable_timer.Po -rm -f unit/$(DEPDIR)/bind_executor.Po -rm -f unit/$(DEPDIR)/buffer.Po -rm -f unit/$(DEPDIR)/buffered_read_stream.Po -rm -f unit/$(DEPDIR)/buffered_stream.Po -rm -f unit/$(DEPDIR)/buffered_write_stream.Po -rm -f unit/$(DEPDIR)/buffers_iterator.Po -rm -f unit/$(DEPDIR)/completion_condition.Po -rm -f unit/$(DEPDIR)/connect.Po -rm -f unit/$(DEPDIR)/coroutine.Po -rm -f unit/$(DEPDIR)/datagram_socket_service.Po -rm -f unit/$(DEPDIR)/deadline_timer.Po -rm -f unit/$(DEPDIR)/deadline_timer_service.Po -rm -f unit/$(DEPDIR)/defer.Po -rm -f unit/$(DEPDIR)/dispatch.Po -rm -f unit/$(DEPDIR)/error.Po -rm -f unit/$(DEPDIR)/execution_context.Po -rm -f unit/$(DEPDIR)/executor.Po -rm -f unit/$(DEPDIR)/executor_work_guard.Po -rm -f unit/$(DEPDIR)/high_resolution_timer.Po -rm -f unit/$(DEPDIR)/io_context.Po -rm -f unit/$(DEPDIR)/is_read_buffered.Po -rm -f unit/$(DEPDIR)/is_write_buffered.Po -rm -f unit/$(DEPDIR)/packaged_task.Po -rm -f unit/$(DEPDIR)/placeholders.Po -rm -f unit/$(DEPDIR)/post.Po -rm -f unit/$(DEPDIR)/raw_socket_service.Po -rm -f unit/$(DEPDIR)/read.Po -rm -f unit/$(DEPDIR)/read_at.Po -rm -f unit/$(DEPDIR)/read_until.Po -rm -f unit/$(DEPDIR)/seq_packet_socket_service.Po -rm -f unit/$(DEPDIR)/serial_port.Po -rm -f unit/$(DEPDIR)/serial_port_base.Po -rm -f unit/$(DEPDIR)/serial_port_service.Po -rm -f unit/$(DEPDIR)/signal_set.Po -rm -f unit/$(DEPDIR)/signal_set_service.Po -rm -f unit/$(DEPDIR)/socket_acceptor_service.Po -rm -f unit/$(DEPDIR)/socket_base.Po -rm -f unit/$(DEPDIR)/steady_timer.Po -rm -f unit/$(DEPDIR)/strand.Po -rm -f unit/$(DEPDIR)/stream_socket_service.Po -rm -f unit/$(DEPDIR)/streambuf.Po -rm -f unit/$(DEPDIR)/system_context.Po -rm -f unit/$(DEPDIR)/system_executor.Po -rm -f unit/$(DEPDIR)/system_timer.Po -rm -f unit/$(DEPDIR)/thread.Po -rm -f unit/$(DEPDIR)/time_traits.Po -rm -f unit/$(DEPDIR)/use_future.Po -rm -f unit/$(DEPDIR)/uses_executor.Po -rm -f unit/$(DEPDIR)/wait_traits.Po -rm -f unit/$(DEPDIR)/waitable_timer_service.Po -rm -f unit/$(DEPDIR)/write.Po -rm -f unit/$(DEPDIR)/write_at.Po -rm -f unit/generic/$(DEPDIR)/basic_endpoint.Po -rm -f unit/generic/$(DEPDIR)/datagram_protocol.Po -rm -f unit/generic/$(DEPDIR)/raw_protocol.Po -rm -f unit/generic/$(DEPDIR)/seq_packet_protocol.Po -rm -f unit/generic/$(DEPDIR)/stream_protocol.Po -rm -f unit/ip/$(DEPDIR)/address.Po -rm -f unit/ip/$(DEPDIR)/address_v4.Po -rm -f unit/ip/$(DEPDIR)/address_v4_iterator.Po -rm -f unit/ip/$(DEPDIR)/address_v4_range.Po -rm -f unit/ip/$(DEPDIR)/address_v6.Po -rm -f unit/ip/$(DEPDIR)/address_v6_iterator.Po -rm -f unit/ip/$(DEPDIR)/address_v6_range.Po -rm -f unit/ip/$(DEPDIR)/basic_endpoint.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver_entry.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver_iterator.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver_query.Po -rm -f unit/ip/$(DEPDIR)/host_name.Po -rm -f unit/ip/$(DEPDIR)/icmp.Po -rm -f unit/ip/$(DEPDIR)/multicast.Po -rm -f unit/ip/$(DEPDIR)/network_v4.Po -rm -f unit/ip/$(DEPDIR)/network_v6.Po -rm -f unit/ip/$(DEPDIR)/resolver_query_base.Po -rm -f unit/ip/$(DEPDIR)/resolver_service.Po -rm -f unit/ip/$(DEPDIR)/tcp.Po -rm -f unit/ip/$(DEPDIR)/udp.Po -rm -f unit/ip/$(DEPDIR)/unicast.Po -rm -f unit/ip/$(DEPDIR)/v6_only.Po -rm -f unit/local/$(DEPDIR)/basic_endpoint.Po -rm -f unit/local/$(DEPDIR)/connect_pair.Po -rm -f unit/local/$(DEPDIR)/datagram_protocol.Po -rm -f unit/local/$(DEPDIR)/stream_protocol.Po -rm -f unit/posix/$(DEPDIR)/basic_descriptor.Po -rm -f unit/posix/$(DEPDIR)/basic_stream_descriptor.Po -rm -f unit/posix/$(DEPDIR)/descriptor.Po -rm -f unit/posix/$(DEPDIR)/descriptor_base.Po -rm -f unit/posix/$(DEPDIR)/stream_descriptor.Po -rm -f unit/posix/$(DEPDIR)/stream_descriptor_service.Po -rm -f unit/ssl/$(DEPDIR)/context.Po -rm -f unit/ssl/$(DEPDIR)/context_base.Po -rm -f unit/ssl/$(DEPDIR)/error.Po -rm -f unit/ssl/$(DEPDIR)/rfc2818_verification.Po -rm -f unit/ssl/$(DEPDIR)/stream.Po -rm -f unit/ssl/$(DEPDIR)/stream_base.Po -rm -f unit/ts/$(DEPDIR)/buffer.Po -rm -f unit/ts/$(DEPDIR)/executor.Po -rm -f unit/ts/$(DEPDIR)/internet.Po -rm -f unit/ts/$(DEPDIR)/io_context.Po -rm -f unit/ts/$(DEPDIR)/net.Po -rm -f unit/ts/$(DEPDIR)/netfwd.Po -rm -f unit/ts/$(DEPDIR)/socket.Po -rm -f unit/ts/$(DEPDIR)/timer.Po -rm -f unit/windows/$(DEPDIR)/basic_handle.Po -rm -f unit/windows/$(DEPDIR)/basic_object_handle.Po -rm -f unit/windows/$(DEPDIR)/basic_random_access_handle.Po -rm -f unit/windows/$(DEPDIR)/basic_stream_handle.Po -rm -f unit/windows/$(DEPDIR)/object_handle.Po -rm -f unit/windows/$(DEPDIR)/object_handle_service.Po -rm -f unit/windows/$(DEPDIR)/overlapped_handle.Po -rm -f unit/windows/$(DEPDIR)/overlapped_ptr.Po -rm -f unit/windows/$(DEPDIR)/random_access_handle.Po -rm -f unit/windows/$(DEPDIR)/random_access_handle_service.Po -rm -f unit/windows/$(DEPDIR)/stream_handle.Po -rm -f unit/windows/$(DEPDIR)/stream_handle_service.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ../$(DEPDIR)/asio.Po -rm -f ../$(DEPDIR)/asio_ssl.Po -rm -f latency/$(DEPDIR)/tcp_client.Po -rm -f latency/$(DEPDIR)/tcp_server.Po -rm -f latency/$(DEPDIR)/udp_client.Po -rm -f latency/$(DEPDIR)/udp_server.Po -rm -f performance/$(DEPDIR)/client.Po -rm -f performance/$(DEPDIR)/server.Po -rm -f unit/$(DEPDIR)/associated_allocator.Po -rm -f unit/$(DEPDIR)/associated_executor.Po -rm -f unit/$(DEPDIR)/async_result.Po -rm -f unit/$(DEPDIR)/basic_datagram_socket.Po -rm -f unit/$(DEPDIR)/basic_deadline_timer.Po -rm -f unit/$(DEPDIR)/basic_raw_socket.Po -rm -f unit/$(DEPDIR)/basic_seq_packet_socket.Po -rm -f unit/$(DEPDIR)/basic_serial_port.Po -rm -f unit/$(DEPDIR)/basic_signal_set.Po -rm -f unit/$(DEPDIR)/basic_socket_acceptor.Po -rm -f unit/$(DEPDIR)/basic_stream_socket.Po -rm -f unit/$(DEPDIR)/basic_streambuf.Po -rm -f unit/$(DEPDIR)/basic_waitable_timer.Po -rm -f unit/$(DEPDIR)/bind_executor.Po -rm -f unit/$(DEPDIR)/buffer.Po -rm -f unit/$(DEPDIR)/buffered_read_stream.Po -rm -f unit/$(DEPDIR)/buffered_stream.Po -rm -f unit/$(DEPDIR)/buffered_write_stream.Po -rm -f unit/$(DEPDIR)/buffers_iterator.Po -rm -f unit/$(DEPDIR)/completion_condition.Po -rm -f unit/$(DEPDIR)/connect.Po -rm -f unit/$(DEPDIR)/coroutine.Po -rm -f unit/$(DEPDIR)/datagram_socket_service.Po -rm -f unit/$(DEPDIR)/deadline_timer.Po -rm -f unit/$(DEPDIR)/deadline_timer_service.Po -rm -f unit/$(DEPDIR)/defer.Po -rm -f unit/$(DEPDIR)/dispatch.Po -rm -f unit/$(DEPDIR)/error.Po -rm -f unit/$(DEPDIR)/execution_context.Po -rm -f unit/$(DEPDIR)/executor.Po -rm -f unit/$(DEPDIR)/executor_work_guard.Po -rm -f unit/$(DEPDIR)/high_resolution_timer.Po -rm -f unit/$(DEPDIR)/io_context.Po -rm -f unit/$(DEPDIR)/is_read_buffered.Po -rm -f unit/$(DEPDIR)/is_write_buffered.Po -rm -f unit/$(DEPDIR)/packaged_task.Po -rm -f unit/$(DEPDIR)/placeholders.Po -rm -f unit/$(DEPDIR)/post.Po -rm -f unit/$(DEPDIR)/raw_socket_service.Po -rm -f unit/$(DEPDIR)/read.Po -rm -f unit/$(DEPDIR)/read_at.Po -rm -f unit/$(DEPDIR)/read_until.Po -rm -f unit/$(DEPDIR)/seq_packet_socket_service.Po -rm -f unit/$(DEPDIR)/serial_port.Po -rm -f unit/$(DEPDIR)/serial_port_base.Po -rm -f unit/$(DEPDIR)/serial_port_service.Po -rm -f unit/$(DEPDIR)/signal_set.Po -rm -f unit/$(DEPDIR)/signal_set_service.Po -rm -f unit/$(DEPDIR)/socket_acceptor_service.Po -rm -f unit/$(DEPDIR)/socket_base.Po -rm -f unit/$(DEPDIR)/steady_timer.Po -rm -f unit/$(DEPDIR)/strand.Po -rm -f unit/$(DEPDIR)/stream_socket_service.Po -rm -f unit/$(DEPDIR)/streambuf.Po -rm -f unit/$(DEPDIR)/system_context.Po -rm -f unit/$(DEPDIR)/system_executor.Po -rm -f unit/$(DEPDIR)/system_timer.Po -rm -f unit/$(DEPDIR)/thread.Po -rm -f unit/$(DEPDIR)/time_traits.Po -rm -f unit/$(DEPDIR)/use_future.Po -rm -f unit/$(DEPDIR)/uses_executor.Po -rm -f unit/$(DEPDIR)/wait_traits.Po -rm -f unit/$(DEPDIR)/waitable_timer_service.Po -rm -f unit/$(DEPDIR)/write.Po -rm -f unit/$(DEPDIR)/write_at.Po -rm -f unit/generic/$(DEPDIR)/basic_endpoint.Po -rm -f unit/generic/$(DEPDIR)/datagram_protocol.Po -rm -f unit/generic/$(DEPDIR)/raw_protocol.Po -rm -f unit/generic/$(DEPDIR)/seq_packet_protocol.Po -rm -f unit/generic/$(DEPDIR)/stream_protocol.Po -rm -f unit/ip/$(DEPDIR)/address.Po -rm -f unit/ip/$(DEPDIR)/address_v4.Po -rm -f unit/ip/$(DEPDIR)/address_v4_iterator.Po -rm -f unit/ip/$(DEPDIR)/address_v4_range.Po -rm -f unit/ip/$(DEPDIR)/address_v6.Po -rm -f unit/ip/$(DEPDIR)/address_v6_iterator.Po -rm -f unit/ip/$(DEPDIR)/address_v6_range.Po -rm -f unit/ip/$(DEPDIR)/basic_endpoint.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver_entry.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver_iterator.Po -rm -f unit/ip/$(DEPDIR)/basic_resolver_query.Po -rm -f unit/ip/$(DEPDIR)/host_name.Po -rm -f unit/ip/$(DEPDIR)/icmp.Po -rm -f unit/ip/$(DEPDIR)/multicast.Po -rm -f unit/ip/$(DEPDIR)/network_v4.Po -rm -f unit/ip/$(DEPDIR)/network_v6.Po -rm -f unit/ip/$(DEPDIR)/resolver_query_base.Po -rm -f unit/ip/$(DEPDIR)/resolver_service.Po -rm -f unit/ip/$(DEPDIR)/tcp.Po -rm -f unit/ip/$(DEPDIR)/udp.Po -rm -f unit/ip/$(DEPDIR)/unicast.Po -rm -f unit/ip/$(DEPDIR)/v6_only.Po -rm -f unit/local/$(DEPDIR)/basic_endpoint.Po -rm -f unit/local/$(DEPDIR)/connect_pair.Po -rm -f unit/local/$(DEPDIR)/datagram_protocol.Po -rm -f unit/local/$(DEPDIR)/stream_protocol.Po -rm -f unit/posix/$(DEPDIR)/basic_descriptor.Po -rm -f unit/posix/$(DEPDIR)/basic_stream_descriptor.Po -rm -f unit/posix/$(DEPDIR)/descriptor.Po -rm -f unit/posix/$(DEPDIR)/descriptor_base.Po -rm -f unit/posix/$(DEPDIR)/stream_descriptor.Po -rm -f unit/posix/$(DEPDIR)/stream_descriptor_service.Po -rm -f unit/ssl/$(DEPDIR)/context.Po -rm -f unit/ssl/$(DEPDIR)/context_base.Po -rm -f unit/ssl/$(DEPDIR)/error.Po -rm -f unit/ssl/$(DEPDIR)/rfc2818_verification.Po -rm -f unit/ssl/$(DEPDIR)/stream.Po -rm -f unit/ssl/$(DEPDIR)/stream_base.Po -rm -f unit/ts/$(DEPDIR)/buffer.Po -rm -f unit/ts/$(DEPDIR)/executor.Po -rm -f unit/ts/$(DEPDIR)/internet.Po -rm -f unit/ts/$(DEPDIR)/io_context.Po -rm -f unit/ts/$(DEPDIR)/net.Po -rm -f unit/ts/$(DEPDIR)/netfwd.Po -rm -f unit/ts/$(DEPDIR)/socket.Po -rm -f unit/ts/$(DEPDIR)/timer.Po -rm -f unit/windows/$(DEPDIR)/basic_handle.Po -rm -f unit/windows/$(DEPDIR)/basic_object_handle.Po -rm -f unit/windows/$(DEPDIR)/basic_random_access_handle.Po -rm -f unit/windows/$(DEPDIR)/basic_stream_handle.Po -rm -f unit/windows/$(DEPDIR)/object_handle.Po -rm -f unit/windows/$(DEPDIR)/object_handle_service.Po -rm -f unit/windows/$(DEPDIR)/overlapped_handle.Po -rm -f unit/windows/$(DEPDIR)/overlapped_ptr.Po -rm -f unit/windows/$(DEPDIR)/random_access_handle.Po -rm -f unit/windows/$(DEPDIR)/random_access_handle_service.Po -rm -f unit/windows/$(DEPDIR)/stream_handle.Po -rm -f unit/windows/$(DEPDIR)/stream_handle_service.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ check-am clean clean-checkPROGRAMS clean-generic \ clean-noinstLIBRARIES clean-noinstPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: asio-1.12.2/src/tests/latency/000077500000000000000000000000001340672067200161275ustar00rootroot00000000000000asio-1.12.2/src/tests/latency/allocator.hpp000066400000000000000000000020671340672067200206250ustar00rootroot00000000000000// // allocator.hpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ALLOCATOR_HPP #define ALLOCATOR_HPP #include // Represents a single connection from a client. class allocator { public: allocator() : in_use_(false) { } void* allocate(std::size_t n) { if (in_use_ || n >= 1024) return ::operator new(n); in_use_ = true; return static_cast(&space_); } void deallocate(void* p) { if (p != static_cast(&space_)) ::operator delete(p); else in_use_ = false; } private: allocator(const allocator&); allocator& operator=(const allocator&); // Whether the reusable memory space is currently in use. bool in_use_; // The reusable memory space made available by the allocator. boost::aligned_storage<1024>::type space_; }; #endif // ALLOCATOR_HPP asio-1.12.2/src/tests/latency/high_res_clock.hpp000066400000000000000000000022241340672067200216030ustar00rootroot00000000000000// // high_res_clock.hpp // ~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef HIGH_RES_CLOCK_HPP #define HIGH_RES_CLOCK_HPP #include #include #if defined(ASIO_WINDOWS) inline boost::uint64_t high_res_clock() { LARGE_INTEGER i; QueryPerformanceCounter(&i); return i.QuadPart; } #elif defined(__GNUC__) && defined(__x86_64__) inline boost::uint64_t high_res_clock() { unsigned long low, high; __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)); return (((boost::uint64_t)high) << 32) | low; } #else #include inline boost::uint64_t high_res_clock() { boost::posix_time::ptime now = boost::posix_time::microsec_clock::universal_time(); boost::posix_time::ptime epoch( boost::gregorian::date(1970, 1, 1), boost::posix_time::seconds(0)); return (now - epoch).total_microseconds(); } #endif #endif // HIGH_RES_CLOCK_HPP asio-1.12.2/src/tests/latency/tcp_client.cpp000066400000000000000000000075221340672067200207650ustar00rootroot00000000000000// // tcp_client.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include #include "high_res_clock.hpp" using asio::ip::tcp; using boost::posix_time::ptime; using boost::posix_time::microsec_clock; const int num_samples = 100000; struct transfer_all { typedef std::size_t result_type; std::size_t operator()(const asio::error_code& ec, std::size_t) { return (ec && ec != asio::error::would_block) ? 0 : ~0; } }; int main(int argc, char* argv[]) { if (argc != 6) { std::fprintf(stderr, "Usage: tcp_client " " {spin|block}\n"); return 1; } const char* ip = argv[1]; unsigned short port = static_cast(std::atoi(argv[2])); int num_connections = std::atoi(argv[3]); std::size_t buf_size = static_cast(std::atoi(argv[4])); bool spin = (std::strcmp(argv[5], "spin") == 0); asio::io_context io_context; std::vector > sockets; for (int i = 0; i < num_connections; ++i) { boost::shared_ptr s(new tcp::socket(io_context)); tcp::endpoint target(asio::ip::make_address(ip), port); s->connect(target); s->set_option(tcp::no_delay(true)); if (spin) { s->non_blocking(true); } sockets.push_back(s); } std::vector write_buf(buf_size); std::vector read_buf(buf_size); ptime start = microsec_clock::universal_time(); boost::uint64_t start_hr = high_res_clock(); boost::uint64_t samples[num_samples]; for (int i = 0; i < num_samples; ++i) { tcp::socket& socket = *sockets[i % num_connections]; boost::uint64_t t = high_res_clock(); asio::error_code ec; asio::write(socket, asio::buffer(write_buf), transfer_all(), ec); asio::read(socket, asio::buffer(read_buf), transfer_all(), ec); samples[i] = high_res_clock() - t; } ptime stop = microsec_clock::universal_time(); boost::uint64_t stop_hr = high_res_clock(); boost::uint64_t elapsed_usec = (stop - start).total_microseconds(); boost::uint64_t elapsed_hr = stop_hr - start_hr; double scale = 1.0 * elapsed_usec / elapsed_hr; std::sort(samples, samples + num_samples); std::printf(" 0.0%%\t%f\n", samples[0] * scale); std::printf(" 0.1%%\t%f\n", samples[num_samples / 1000 - 1] * scale); std::printf(" 1.0%%\t%f\n", samples[num_samples / 100 - 1] * scale); std::printf(" 10.0%%\t%f\n", samples[num_samples / 10 - 1] * scale); std::printf(" 20.0%%\t%f\n", samples[num_samples * 2 / 10 - 1] * scale); std::printf(" 30.0%%\t%f\n", samples[num_samples * 3 / 10 - 1] * scale); std::printf(" 40.0%%\t%f\n", samples[num_samples * 4 / 10 - 1] * scale); std::printf(" 50.0%%\t%f\n", samples[num_samples * 5 / 10 - 1] * scale); std::printf(" 60.0%%\t%f\n", samples[num_samples * 6 / 10 - 1] * scale); std::printf(" 70.0%%\t%f\n", samples[num_samples * 7 / 10 - 1] * scale); std::printf(" 80.0%%\t%f\n", samples[num_samples * 8 / 10 - 1] * scale); std::printf(" 90.0%%\t%f\n", samples[num_samples * 9 / 10 - 1] * scale); std::printf(" 99.0%%\t%f\n", samples[num_samples * 99 / 100 - 1] * scale); std::printf(" 99.9%%\t%f\n", samples[num_samples * 999 / 1000 - 1] * scale); std::printf("100.0%%\t%f\n", samples[num_samples - 1] * scale); double total = 0.0; for (int i = 0; i < num_samples; ++i) total += samples[i] * scale; std::printf(" mean\t%f\n", total / num_samples); } asio-1.12.2/src/tests/latency/tcp_server.cpp000066400000000000000000000046151340672067200210150ustar00rootroot00000000000000// // tcp_server.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include #include using asio::ip::tcp; #include class tcp_server : asio::coroutine { public: tcp_server(tcp::acceptor& acceptor, std::size_t buf_size) : acceptor_(acceptor), socket_(acceptor_.get_executor().context()), buffer_(buf_size) { } void operator()(asio::error_code ec, std::size_t n = 0) { reenter (this) for (;;) { yield acceptor_.async_accept(socket_, ref(this)); while (!ec) { yield asio::async_read(socket_, asio::buffer(buffer_), ref(this)); if (!ec) { for (std::size_t i = 0; i < n; ++i) buffer_[i] = ~buffer_[i]; yield asio::async_write(socket_, asio::buffer(buffer_), ref(this)); } } socket_.close(); } } struct ref { explicit ref(tcp_server* p) : p_(p) { } void operator()(asio::error_code ec, std::size_t n = 0) { (*p_)(ec, n); } private: tcp_server* p_; }; private: tcp::acceptor& acceptor_; tcp::socket socket_; std::vector buffer_; tcp::endpoint sender_; }; #include int main(int argc, char* argv[]) { if (argc != 5) { std::fprintf(stderr, "Usage: tcp_server " " {spin|block}\n"); return 1; } unsigned short port = static_cast(std::atoi(argv[1])); int max_connections = std::atoi(argv[2]); std::size_t buf_size = std::atoi(argv[3]); bool spin = (std::strcmp(argv[4], "spin") == 0); asio::io_context io_context(1); tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port)); std::vector > servers; for (int i = 0; i < max_connections; ++i) { boost::shared_ptr s(new tcp_server(acceptor, buf_size)); servers.push_back(s); (*s)(asio::error_code()); } if (spin) for (;;) io_context.poll(); else io_context.run(); } asio-1.12.2/src/tests/latency/udp_client.cpp000066400000000000000000000070271340672067200207670ustar00rootroot00000000000000// // udp_client.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include "high_res_clock.hpp" using asio::ip::udp; using boost::posix_time::ptime; using boost::posix_time::microsec_clock; const int num_samples = 100000; int main(int argc, char* argv[]) { if (argc != 6) { std::fprintf(stderr, "Usage: udp_client " " {spin|block}\n"); return 1; } const char* ip = argv[1]; unsigned short first_port = static_cast(std::atoi(argv[2])); unsigned short num_ports = static_cast(std::atoi(argv[3])); std::size_t buf_size = static_cast(std::atoi(argv[4])); bool spin = (std::strcmp(argv[5], "spin") == 0); asio::io_context io_context; udp::socket socket(io_context, udp::endpoint(udp::v4(), 0)); if (spin) { socket.non_blocking(true); } udp::endpoint target(asio::ip::make_address(ip), first_port); unsigned short last_port = first_port + num_ports - 1; std::vector write_buf(buf_size); std::vector read_buf(buf_size); ptime start = microsec_clock::universal_time(); boost::uint64_t start_hr = high_res_clock(); boost::uint64_t samples[num_samples]; for (int i = 0; i < num_samples; ++i) { boost::uint64_t t = high_res_clock(); asio::error_code ec; socket.send_to(asio::buffer(write_buf), target, 0, ec); do socket.receive(asio::buffer(read_buf), 0, ec); while (ec == asio::error::would_block); samples[i] = high_res_clock() - t; if (target.port() == last_port) target.port(first_port); else target.port(target.port() + 1); } ptime stop = microsec_clock::universal_time(); boost::uint64_t stop_hr = high_res_clock(); boost::uint64_t elapsed_usec = (stop - start).total_microseconds(); boost::uint64_t elapsed_hr = stop_hr - start_hr; double scale = 1.0 * elapsed_usec / elapsed_hr; std::sort(samples, samples + num_samples); std::printf(" 0.0%%\t%f\n", samples[0] * scale); std::printf(" 0.1%%\t%f\n", samples[num_samples / 1000 - 1] * scale); std::printf(" 1.0%%\t%f\n", samples[num_samples / 100 - 1] * scale); std::printf(" 10.0%%\t%f\n", samples[num_samples / 10 - 1] * scale); std::printf(" 20.0%%\t%f\n", samples[num_samples * 2 / 10 - 1] * scale); std::printf(" 30.0%%\t%f\n", samples[num_samples * 3 / 10 - 1] * scale); std::printf(" 40.0%%\t%f\n", samples[num_samples * 4 / 10 - 1] * scale); std::printf(" 50.0%%\t%f\n", samples[num_samples * 5 / 10 - 1] * scale); std::printf(" 60.0%%\t%f\n", samples[num_samples * 6 / 10 - 1] * scale); std::printf(" 70.0%%\t%f\n", samples[num_samples * 7 / 10 - 1] * scale); std::printf(" 80.0%%\t%f\n", samples[num_samples * 8 / 10 - 1] * scale); std::printf(" 90.0%%\t%f\n", samples[num_samples * 9 / 10 - 1] * scale); std::printf(" 99.0%%\t%f\n", samples[num_samples * 99 / 100 - 1] * scale); std::printf(" 99.9%%\t%f\n", samples[num_samples * 999 / 1000 - 1] * scale); std::printf("100.0%%\t%f\n", samples[num_samples - 1] * scale); double total = 0.0; for (int i = 0; i < num_samples; ++i) total += samples[i] * scale; std::printf(" mean\t%f\n", total / num_samples); } asio-1.12.2/src/tests/latency/udp_server.cpp000066400000000000000000000053651340672067200210220ustar00rootroot00000000000000// // udp_server.cpp // ~~~~~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include #include #include #include #include #include #include #include "allocator.hpp" using asio::ip::udp; #include class udp_server : asio::coroutine { public: udp_server(asio::io_context& io_context, unsigned short port, std::size_t buf_size) : socket_(io_context, udp::endpoint(udp::v4(), port)), buffer_(buf_size) { } void operator()(asio::error_code ec, std::size_t n = 0) { reenter (this) for (;;) { yield socket_.async_receive_from( asio::buffer(buffer_), sender_, ref(this)); if (!ec) { for (std::size_t i = 0; i < n; ++i) buffer_[i] = ~buffer_[i]; socket_.send_to(asio::buffer(buffer_, n), sender_, 0, ec); } } } friend void* asio_handler_allocate(std::size_t n, udp_server* s) { return s->allocator_.allocate(n); } friend void asio_handler_deallocate(void* p, std::size_t, udp_server* s) { s->allocator_.deallocate(p); } struct ref { explicit ref(udp_server* p) : p_(p) { } void operator()(asio::error_code ec, std::size_t n = 0) { (*p_)(ec, n); } private: udp_server* p_; friend void* asio_handler_allocate(std::size_t n, ref* r) { return asio_handler_allocate(n, r->p_); } friend void asio_handler_deallocate(void* p, std::size_t n, ref* r) { asio_handler_deallocate(p, n, r->p_); } }; private: udp::socket socket_; std::vector buffer_; udp::endpoint sender_; allocator allocator_; }; #include int main(int argc, char* argv[]) { if (argc != 5) { std::fprintf(stderr, "Usage: udp_server " " {spin|block}\n"); return 1; } unsigned short first_port = static_cast(std::atoi(argv[1])); unsigned short num_ports = static_cast(std::atoi(argv[2])); std::size_t buf_size = std::atoi(argv[3]); bool spin = (std::strcmp(argv[4], "spin") == 0); asio::io_context io_context(1); std::vector > servers; for (unsigned short i = 0; i < num_ports; ++i) { unsigned short port = first_port + i; boost::shared_ptr s(new udp_server(io_context, port, buf_size)); servers.push_back(s); (*s)(asio::error_code()); } if (spin) for (;;) io_context.poll(); else io_context.run(); } asio-1.12.2/src/tests/performance/000077500000000000000000000000001340672067200167715ustar00rootroot00000000000000asio-1.12.2/src/tests/performance/client.cpp000066400000000000000000000163451340672067200207640ustar00rootroot00000000000000// // client.cpp // ~~~~~~~~~~ // // Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "asio.hpp" #include #include #include #include #include #include #include "handler_allocator.hpp" class stats { public: stats() : mutex_(), total_bytes_written_(0), total_bytes_read_(0) { } void add(size_t bytes_written, size_t bytes_read) { asio::detail::mutex::scoped_lock lock(mutex_); total_bytes_written_ += bytes_written; total_bytes_read_ += bytes_read; } void print() { asio::detail::mutex::scoped_lock lock(mutex_); std::cout << total_bytes_written_ << " total bytes written\n"; std::cout << total_bytes_read_ << " total bytes read\n"; } private: asio::detail::mutex mutex_; size_t total_bytes_written_; size_t total_bytes_read_; }; class session { public: session(asio::io_context& ioc, size_t block_size, stats& s) : strand_(ioc), socket_(ioc), block_size_(block_size), read_data_(new char[block_size]), read_data_length_(0), write_data_(new char[block_size]), unwritten_count_(0), bytes_written_(0), bytes_read_(0), stats_(s) { for (size_t i = 0; i < block_size_; ++i) write_data_[i] = static_cast(i % 128); } ~session() { stats_.add(bytes_written_, bytes_read_); delete[] read_data_; delete[] write_data_; } void start(asio::ip::tcp::resolver::results_type endpoints) { asio::async_connect(socket_, endpoints, asio::bind_executor(strand_, boost::bind(&session::handle_connect, this, asio::placeholders::error))); } void stop() { asio::post(strand_, boost::bind(&session::close_socket, this)); } private: void handle_connect(const asio::error_code& err) { if (!err) { asio::error_code set_option_err; asio::ip::tcp::no_delay no_delay(true); socket_.set_option(no_delay, set_option_err); if (!set_option_err) { ++unwritten_count_; async_write(socket_, asio::buffer(write_data_, block_size_), asio::bind_executor(strand_, make_custom_alloc_handler(write_allocator_, boost::bind(&session::handle_write, this, asio::placeholders::error, asio::placeholders::bytes_transferred)))); socket_.async_read_some(asio::buffer(read_data_, block_size_), asio::bind_executor(strand_, make_custom_alloc_handler(read_allocator_, boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)))); } } } void handle_read(const asio::error_code& err, size_t length) { if (!err) { bytes_read_ += length; read_data_length_ = length; ++unwritten_count_; if (unwritten_count_ == 1) { std::swap(read_data_, write_data_); async_write(socket_, asio::buffer(write_data_, read_data_length_), asio::bind_executor(strand_, make_custom_alloc_handler(write_allocator_, boost::bind(&session::handle_write, this, asio::placeholders::error, asio::placeholders::bytes_transferred)))); socket_.async_read_some(asio::buffer(read_data_, block_size_), asio::bind_executor(strand_, make_custom_alloc_handler(read_allocator_, boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)))); } } } void handle_write(const asio::error_code& err, size_t length) { if (!err && length > 0) { bytes_written_ += length; --unwritten_count_; if (unwritten_count_ == 1) { std::swap(read_data_, write_data_); async_write(socket_, asio::buffer(write_data_, read_data_length_), asio::bind_executor(strand_, make_custom_alloc_handler(write_allocator_, boost::bind(&session::handle_write, this, asio::placeholders::error, asio::placeholders::bytes_transferred)))); socket_.async_read_some(asio::buffer(read_data_, block_size_), asio::bind_executor(strand_, make_custom_alloc_handler(read_allocator_, boost::bind(&session::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)))); } } } void close_socket() { socket_.close(); } private: asio::io_context::strand strand_; asio::ip::tcp::socket socket_; size_t block_size_; char* read_data_; size_t read_data_length_; char* write_data_; int unwritten_count_; size_t bytes_written_; size_t bytes_read_; stats& stats_; handler_allocator read_allocator_; handler_allocator write_allocator_; }; class client { public: client(asio::io_context& ioc, const asio::ip::tcp::resolver::results_type endpoints, size_t block_size, size_t session_count, int timeout) : io_context_(ioc), stop_timer_(ioc), sessions_(), stats_() { stop_timer_.expires_after(asio::chrono::seconds(timeout)); stop_timer_.async_wait(boost::bind(&client::handle_timeout, this)); for (size_t i = 0; i < session_count; ++i) { session* new_session = new session(io_context_, block_size, stats_); new_session->start(endpoints); sessions_.push_back(new_session); } } ~client() { while (!sessions_.empty()) { delete sessions_.front(); sessions_.pop_front(); } stats_.print(); } void handle_timeout() { std::for_each(sessions_.begin(), sessions_.end(), boost::mem_fn(&session::stop)); } private: asio::io_context& io_context_; asio::steady_timer stop_timer_; std::list sessions_; stats stats_; }; int main(int argc, char* argv[]) { try { if (argc != 7) { std::cerr << "Usage: client "; std::cerr << "