mirror of
https://github.com/westonrobot/ugv_sdk
synced 2023-04-08 06:32:14 +08:00
initial comit, ported scout_sdk and added hunter support
This commit is contained in:
89
.gitignore
vendored
89
.gitignore
vendored
@@ -1,5 +1,39 @@
|
|||||||
# Prerequisites
|
# build
|
||||||
*.d
|
*/Debug
|
||||||
|
build
|
||||||
|
*/build
|
||||||
|
cmake-build-debug
|
||||||
|
cmake-build-release/
|
||||||
|
|
||||||
|
# Temp files
|
||||||
|
*~
|
||||||
|
*/~
|
||||||
|
*/*.*~
|
||||||
|
*.m~
|
||||||
|
*.DS_Store
|
||||||
|
|
||||||
|
# log
|
||||||
|
*.log
|
||||||
|
#*.data
|
||||||
|
|
||||||
|
# Doxygen
|
||||||
|
docs/doxygen/html/
|
||||||
|
docs/doxygen/latex
|
||||||
|
|
||||||
|
# Qt Creator
|
||||||
|
pc/visualization/CMakeLists.txt.user
|
||||||
|
|
||||||
|
# VS Code
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# CLion
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# LCM
|
||||||
|
src/lcmtypes/c
|
||||||
|
src/lcmtypes/cpp
|
||||||
|
src/lcmtypes/java
|
||||||
|
src/lcmtypes/python
|
||||||
|
|
||||||
# Compiled Object files
|
# Compiled Object files
|
||||||
*.slo
|
*.slo
|
||||||
@@ -12,21 +46,56 @@
|
|||||||
*.pch
|
*.pch
|
||||||
|
|
||||||
# Compiled Dynamic libraries
|
# Compiled Dynamic libraries
|
||||||
*.so
|
#*.so
|
||||||
*.dylib
|
#*.dylib
|
||||||
*.dll
|
#*.dll
|
||||||
|
|
||||||
# Fortran module files
|
# Fortran module files
|
||||||
*.mod
|
*.mod
|
||||||
*.smod
|
|
||||||
|
|
||||||
# Compiled Static libraries
|
# Compiled Static libraries
|
||||||
*.lai
|
#*.lai
|
||||||
*.la
|
#*.la
|
||||||
*.a
|
#*.a
|
||||||
*.lib
|
#*.lib
|
||||||
|
|
||||||
# Executables
|
# Executables
|
||||||
*.exe
|
*.exe
|
||||||
*.out
|
*.out
|
||||||
*.app
|
*.app
|
||||||
|
|
||||||
|
# Vim
|
||||||
|
tags
|
||||||
|
*/tags
|
||||||
|
*.swp
|
||||||
|
*/*.swp
|
||||||
|
|
||||||
|
# vscode
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# Python
|
||||||
|
*.pyc
|
||||||
|
__pycache__
|
||||||
|
|
||||||
|
##---------------------------------------------------
|
||||||
|
## Remove autosaves generated by the Matlab editor
|
||||||
|
## We have git for backups!
|
||||||
|
##---------------------------------------------------
|
||||||
|
|
||||||
|
# Windows default autosave extension
|
||||||
|
*.asv
|
||||||
|
|
||||||
|
# OSX / *nix default autosave extension
|
||||||
|
*.m~
|
||||||
|
|
||||||
|
# Compiled MEX binaries (all platforms)
|
||||||
|
*.mex*
|
||||||
|
|
||||||
|
# Simulink Code Generation
|
||||||
|
slprj/
|
||||||
|
|
||||||
|
# Session info
|
||||||
|
octave-workspace
|
||||||
|
|
||||||
|
# Simulink autosave extension
|
||||||
|
.autosave
|
||||||
|
|||||||
26
CHANGELOG.md
Normal file
26
CHANGELOG.md
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# Changelog for scout_sdk
|
||||||
|
|
||||||
|
## 0.4 (2019-09-15)
|
||||||
|
------------------
|
||||||
|
* Unified implementation of UART/CAN for firmware and SDK
|
||||||
|
* Improvements of code organization
|
||||||
|
* Contributors: Ruixiang Du
|
||||||
|
|
||||||
|
## 0.3 (2019-08-02)
|
||||||
|
------------------
|
||||||
|
* Added full UART support
|
||||||
|
* Contributors: Ruixiang Du
|
||||||
|
|
||||||
|
## 0.2 (2019-06-14)
|
||||||
|
------------------
|
||||||
|
* Deprecated initial serial interface support (new one under development)
|
||||||
|
* Added full CAN support
|
||||||
|
* Improved multi-threading implementation
|
||||||
|
* Contributors: Ruixiang Du
|
||||||
|
|
||||||
|
## 0.1 (2019-05-07)
|
||||||
|
------------------
|
||||||
|
|
||||||
|
* Added basic serial communication support
|
||||||
|
* Provided C++ interface, ROS/LCM demo
|
||||||
|
* Contributors: Ruixiang Du
|
||||||
54
CMakeLists.txt
Executable file
54
CMakeLists.txt
Executable file
@@ -0,0 +1,54 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.1.0)
|
||||||
|
project(scout_sdk)
|
||||||
|
|
||||||
|
# generate symbols for IDE indexer
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
set(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/devel)
|
||||||
|
|
||||||
|
## Set compiler to use c++ 11 features
|
||||||
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
|
## Put all binary files into /bin and libraries into /lib
|
||||||
|
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
|
||||||
|
set(ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
|
||||||
|
|
||||||
|
## Use GNUInstallDirs to install libraries into correct
|
||||||
|
# locations on all platforms.
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
## Chosse build type
|
||||||
|
set(CMAKE_BUILD_TYPE Release)
|
||||||
|
# set(CMAKE_BUILD_TYPE Debug)
|
||||||
|
|
||||||
|
set(default_build_type "Release")
|
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
|
||||||
|
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
|
||||||
|
STRING "Choose the type of build." FORCE)
|
||||||
|
# Set the possible values of build type for cmake-gui
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||||
|
"Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
## Optionally built modules: ON/OFF
|
||||||
|
set(BUILD_TESTS OFF)
|
||||||
|
set(BUILD_MONITOR ON)
|
||||||
|
|
||||||
|
# Disable monitor if ncurses library is not found
|
||||||
|
set(CURSES_NEED_NCURSES TRUE)
|
||||||
|
find_package(Curses QUIET)
|
||||||
|
|
||||||
|
if(BUILD_MONITOR AND NOT CURSES_FOUND)
|
||||||
|
set(BUILD_MONITOR OFF)
|
||||||
|
message(STATUS "Monitor app will not be built due to missing ncurses library, try: sudo apt install libncurses5-dev")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
## Add source directories
|
||||||
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if(BUILD_TESTS)
|
||||||
|
add_subdirectory(unit_tests)
|
||||||
|
endif()
|
||||||
131
README.md
Executable file
131
README.md
Executable file
@@ -0,0 +1,131 @@
|
|||||||
|
# SDK for AgileX Scout Mobile Base
|
||||||
|
|
||||||
|
Copyright (c) 2019 [WestonRobot](https://www.westonrobot.com/)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This software packages provides a C++ interface to communicate with the Scout mobile base, for sending commands to the robot and acquiring the latest robot state. The SDK works on both x86 and ARM platforms.
|
||||||
|
|
||||||
|
Generally, you only need to instantiate an object of "class ScoutBase", then use the object to programmatically control the robot. Internally, class ScoutBase manages two background threads, one to process CAN/UART messages of the robot state and accordingly update state variables in the ScoutState data structure, and the other to maintain a 50Hz loop and send the latest command to the robot base. User can iteratively perform tasks in the main thread and check the robot state or set control commands.
|
||||||
|
|
||||||
|
Refer to "src/apps/scout_demo" for an example.
|
||||||
|
|
||||||
|
## Package Structure
|
||||||
|
|
||||||
|
* apps: demo to illustrate how to use the SDK, scout_monitor is a TUI application to monitor states of Scout
|
||||||
|
* async_io: manages raw data communication with robot
|
||||||
|
* scout_sdk/scout_protocol: encoding and decoding of Scout UART/CAN protocols
|
||||||
|
* scout_sdk/scout_base: interface to send command to robot and receive robot state
|
||||||
|
* unit_tests: for unit tests only (not required otherwise)
|
||||||
|
|
||||||
|
## Setup CAN-To-USB adapter
|
||||||
|
|
||||||
|
1. Enable gs_usb kernel module
|
||||||
|
```
|
||||||
|
$ sudo modprobe gs_usb
|
||||||
|
```
|
||||||
|
2. Bringup can device
|
||||||
|
```
|
||||||
|
$ sudo ip link set can0 up type can bitrate 500000
|
||||||
|
```
|
||||||
|
3. If no error occured during the previous steps, you should be able to see the can device now by using command
|
||||||
|
```
|
||||||
|
$ ifconfig -a
|
||||||
|
```
|
||||||
|
4. Install and use can-utils to test the hardware
|
||||||
|
```
|
||||||
|
$ sudo apt install can-utils
|
||||||
|
```
|
||||||
|
5. Testing command
|
||||||
|
```
|
||||||
|
# receiving data from can0
|
||||||
|
$ candump can0
|
||||||
|
# send data to can0
|
||||||
|
$ cansend can0 001#1122334455667788
|
||||||
|
```
|
||||||
|
|
||||||
|
Two scripts inside the "./scripts" folder are provided for easy setup. You can run "./setup_can2usb.bash" for the first-time setup and run "./bringup_can2usb.bash" to bring up the device each time you unplug and re-plug the adapter.
|
||||||
|
|
||||||
|
### Setup UART
|
||||||
|
|
||||||
|
Generally your UART2USB cable should be automatically recognized as "/dev/ttyUSB0" or something similar and ready for use. If you get the error "... permission denied ..." when trying to open the port, you need to grant access of the port to your user accout:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo usermod -a -G dialout $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
You need to re-login to get the change to take effect.
|
||||||
|
|
||||||
|
## Build SDK
|
||||||
|
|
||||||
|
Install compile tools
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install build-essential cmake
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to build the TUI monitor tool, install libncurses
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install libncurses5-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Configure and build
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd scout_sdk
|
||||||
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake ..
|
||||||
|
$ make
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run Demo Apps
|
||||||
|
|
||||||
|
The demo code expects one parameter for the CAN bus mode.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./app_scout_demo can0
|
||||||
|
```
|
||||||
|
|
||||||
|
Both the port name and baud rate need to be provided when using the RS232 interface.
|
||||||
|
|
||||||
|
```
|
||||||
|
$./app_scout_demo /dev/ttyUSB0 115200
|
||||||
|
```
|
||||||
|
|
||||||
|
If you've installed "libncurses5-dev" and built "app_scout_monitor", you can run it in a similar way:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ./app_scout_monitor can0
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```
|
||||||
|
$./app_scout_monitor /dev/ttyUSB0 115200
|
||||||
|
```
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
<!--
|
||||||
|
1. The CAN interface requires the hardware to appear as a CAN device in the system. You can use the command "ifconfig" to check the interface status. For example, you may see something like
|
||||||
|
|
||||||
|
```
|
||||||
|
can1: flags=193<UP,RUNNING,NOARP> mtu 16
|
||||||
|
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
|
||||||
|
RX packets 4751634 bytes 38013072 (36.2 MiB)
|
||||||
|
RX errors 0 dropped 0 overruns 0 frame 0
|
||||||
|
TX packets 126269 bytes 1010152 (986.4 KiB)
|
||||||
|
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
|
||||||
|
device interrupt 43
|
||||||
|
```
|
||||||
|
|
||||||
|
If you use your own CAN-to-USB adapter, make sure it supports slcan or can be brought up as a native CAN device. Some adapters may use a custom-defined protocol and appear as a serial device in Linux. In such a case, you will have to translate the byte stream between CAN and UART by yourself. It would be difficult for us to provide support for them since not all manufacturers define this protocol in the same way.
|
||||||
|
|
||||||
|
1. Release v0.1 of this SDK provided a serial interface to talk with the robot. Front/rear light on the robot cannot be controlled and only a small subset of all robot states can be acquired through that interface. Full support of the serial interface is still under development and requires additional work on both the SDK and firmware sides.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
* [CAN command reference in Linux](https://wiki.rdu.im/_pages/Notes/Embedded-System/Linux/can-bus-in-linux.html)
|
||||||
BIN
docs/SCOUT_UserManual_v1.2.10_S.pdf
Normal file
BIN
docs/SCOUT_UserManual_v1.2.10_S.pdf
Normal file
Binary file not shown.
BIN
docs/misc/SCOUT_UserManual_v1.2.8_CN.pdf
Normal file
BIN
docs/misc/SCOUT_UserManual_v1.2.8_CN.pdf
Normal file
Binary file not shown.
23
docs/misc/beaglebone_black_can_cape.md
Normal file
23
docs/misc/beaglebone_black_can_cape.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Setup CAN on Beaglebone Black
|
||||||
|
|
||||||
|
CAN/RS485 Cape: https://item.taobao.com/item.htm?spm=a1z09.2.0.0.68b02e8d02l2uT&id=42637485181&_u=a4mg52ma183
|
||||||
|
|
||||||
|
* Install latest Debian image from offical site
|
||||||
|
* Build and install overlays
|
||||||
|
```
|
||||||
|
$ sudo apt install device-tree-compiler
|
||||||
|
$ git clone https://github.com/beagleboard/bb.org-overlays
|
||||||
|
$ cd ./bb.org-overlays/
|
||||||
|
$ ./install.sh
|
||||||
|
```
|
||||||
|
* Edit /boot/uEnv.txt
|
||||||
|
```
|
||||||
|
# 1. Add the following overlay
|
||||||
|
###Custom Cape
|
||||||
|
dtb_overlay=/lib/firmware/BB-CAN1-00A0.dtbo
|
||||||
|
|
||||||
|
# 2. Disable auto loading of virutal capes (uncomment the two lines)
|
||||||
|
disable_uboot_overlay_video=1
|
||||||
|
disable_uboot_overlay_audio=1
|
||||||
|
```
|
||||||
|
* Reboot the system
|
||||||
51
docs/misc/beaglebone_ros_install.md
Normal file
51
docs/misc/beaglebone_ros_install.md
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
```
|
||||||
|
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu stretch main" > /etc/apt/sources.list.d/ros-latest.list'
|
||||||
|
$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
|
||||||
|
$ sudo apt-get update
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt-get install -y python-pip python-setuptools python-yaml python-distribute python-docutils python-dateutil python-six
|
||||||
|
$ sudo pip install rosdep rosinstall_generator wstool rosinstall
|
||||||
|
$ sudo apt-get install -y \
|
||||||
|
libconsole-bridge-dev liblz4-dev checkinstall cmake \
|
||||||
|
python-empy python-nose libbz2-dev \
|
||||||
|
libboost-test-dev libboost-dev libboost-program-options-dev \
|
||||||
|
libboost-regex-dev libboost-signals-dev \
|
||||||
|
libtinyxml-dev libboost-filesystem-dev libxml2-dev \
|
||||||
|
libgtest-dev libpoco-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo rosdep init
|
||||||
|
$ rosdep update
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rosinstall_generator ros_comm --rosdistro melodic --deps --tar > melodic-ros_comm.rosinstall
|
||||||
|
$ wstool init -j1 src melodic-ros_comm.rosinstall
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ # rosdep install --from-paths src --ignore-src --rosdistro melodic -y
|
||||||
|
$ sudo ./src/catkin/bin/catkin_make_isolated --install --install-space /opt/ros/melodic -DCMAKE_BUILD_TYPE=Release
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ source /opt/ros/melodic/setup.bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Additional runtime dependencies:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install -y python-defusedxml python-netifaces
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
|
||||||
|
```
|
||||||
|
|
||||||
|
Reference:
|
||||||
|
|
||||||
|
* [1] https://machinekoder.com/ros-with-debian-stretch-on-the-beaglebone-black-green-blue/
|
||||||
|
* [2] http://wiki.ros.org/melodic/Installation/Source
|
||||||
2248
docs/misc/can_msg.txt
Normal file
2248
docs/misc/can_msg.txt
Normal file
File diff suppressed because it is too large
Load Diff
36
docs/misc/check_endianness.md
Normal file
36
docs/misc/check_endianness.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
On a Big Endian-System (Solaris on SPARC)
|
||||||
|
|
||||||
|
```
|
||||||
|
$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
|
||||||
|
0
|
||||||
|
```
|
||||||
|
On a little endian system (Linux on x86)
|
||||||
|
```
|
||||||
|
$ echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6
|
||||||
|
1
|
||||||
|
```
|
||||||
|
The solution above is clever and works great for Linux *86 and Solaris Sparc.
|
||||||
|
|
||||||
|
I needed a shell-only (no Perl) solution that also worked on AIX/Power and HPUX/Itanium. Unfortunately the last two don't play nice: AIX reports "6" and HPUX gives an empty line.
|
||||||
|
|
||||||
|
Using your solution, I was able to craft something that worked on all these Unix systems:
|
||||||
|
```
|
||||||
|
$ echo I | tr -d [:space:] | od -to2 | head -n1 | awk '{print $2}' | cut -c6
|
||||||
|
```
|
||||||
|
Regarding the Python solution someone posted, it does not work in Jython because the JVM treats everything as Big. If anyone can get it to work in Jython, please post!
|
||||||
|
|
||||||
|
Also, I found this, which explains the endianness of various platforms. Some hardware can operate in either mode depending on what the O/S selects: http://labs.hoffmanlabs.com/node/544
|
||||||
|
|
||||||
|
If you're going to use awk this line can be simplified to:
|
||||||
|
```
|
||||||
|
echo -n I | od -to2 | awk '{ print substr($2,6,1); exit}'
|
||||||
|
```
|
||||||
|
For small Linux boxes that don't have 'od' (say OpenWrt) then try 'hexdump':
|
||||||
|
```
|
||||||
|
echo -n I | hexdump -o | awk '{ print substr($2,6,1); exit}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Reference:
|
||||||
|
|
||||||
|
* [1] https://serverfault.com/questions/163487/how-to-tell-if-a-linux-system-is-big-endian-or-little-endian
|
||||||
|
* [2] https://wiki.rdu.im/_pages/Knowledge-Base/Computing/Computing.html
|
||||||
55
docs/misc/commands.md
Normal file
55
docs/misc/commands.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# Commands
|
||||||
|
|
||||||
|
## Create gif animation using "imagemagick"
|
||||||
|
|
||||||
|
```
|
||||||
|
$ convert -delay 120 -loop 0 *.png animated.gif
|
||||||
|
```
|
||||||
|
|
||||||
|
## Get statistics of the code base
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install cloc
|
||||||
|
$ cd ~/Workspace/librav/src
|
||||||
|
$ cloc --exclude-dir=cmake,lcmtypes,third_party .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Create a pair of VSP’s
|
||||||
|
|
||||||
|
```
|
||||||
|
$ socat -d -d pty,raw,echo=0 pty,raw,echo=0
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat nmea_test.txt > /dev/pts/6
|
||||||
|
```
|
||||||
|
|
||||||
|
## git subtree
|
||||||
|
|
||||||
|
Adding the sub-project as a remote
|
||||||
|
```
|
||||||
|
$ git remote add -f [remote-name] [remote-url]
|
||||||
|
$ git subtree add --prefix [sub-project-name] [remote-name] [branch-name] --squash
|
||||||
|
```
|
||||||
|
|
||||||
|
Update the sub-project
|
||||||
|
```
|
||||||
|
$ git fetch [remote-name] [branch-name]
|
||||||
|
$ git subtree pull --prefix [sub-project-name] [remote-name] [branch-name] --squash
|
||||||
|
```
|
||||||
|
|
||||||
|
Push to remote
|
||||||
|
```
|
||||||
|
$ git subtree push --prefix=[sub-project-name] [remote-name] [branch-name]
|
||||||
|
```
|
||||||
|
|
||||||
|
Firmware branch update
|
||||||
|
```
|
||||||
|
$ git fetch fw_origin pios_pixcar
|
||||||
|
$ git subtree pull --prefix firmware fw_origin pios_pixcar --squash
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
* [Git subtree: the alternative to Git submodule](https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree)
|
||||||
|
* [Virtual serial port: socat](https://justcheckingonall.wordpress.com/2009/06/09/howto-vsp-socat/)
|
||||||
12
docs/misc/jetson_tx2_can.md
Normal file
12
docs/misc/jetson_tx2_can.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Enable CAN on Jetson TX2
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo modprobe can
|
||||||
|
$ sudo modprobe mttcan
|
||||||
|
$ sudo ip link set can0 type can bitrate 500000
|
||||||
|
$ sudo ip link set up can0
|
||||||
|
```
|
||||||
|
|
||||||
|
Reference:
|
||||||
|
|
||||||
|
* https://devtalk.nvidia.com/default/topic/1006762/jetson-tx2/how-can-i-use-can-bus-in-tx2-/post/5166583/#5166583
|
||||||
1
docs/misc/release_checklist.md
Normal file
1
docs/misc/release_checklist.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
* Disable tests to keep minimal dependency by default
|
||||||
BIN
docs/misc/scout_interface.png
Executable file
BIN
docs/misc/scout_interface.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
BIN
docs/misc/scout_monitor_tool.gif
Normal file
BIN
docs/misc/scout_monitor_tool.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 540 KiB |
7
docs/misc/test_can_msg.txt
Normal file
7
docs/misc/test_can_msg.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
can1 131 [8] 00 00 00 00 00 00 E4 1E
|
||||||
|
can1 141 [8] 00 00 00 02 0E 00 E3 3D
|
||||||
|
can1 151 [8] 01 00 00 EF 00 3C E5 6B
|
||||||
|
can1 200 [8] 00 00 00 00 00 00 EA F4
|
||||||
|
can1 201 [8] 00 00 00 00 00 00 EA F5
|
||||||
|
can1 202 [8] 00 00 00 00 00 00 EA F6
|
||||||
|
can1 203 [8] 00 00 00 00 00 00 EA F7
|
||||||
4
scripts/bringup_can2usb.bash
Executable file
4
scripts/bringup_can2usb.bash
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# bring up can interface
|
||||||
|
sudo ip link set can0 up type can bitrate 500000
|
||||||
10
scripts/setup_can2usb.bash
Executable file
10
scripts/setup_can2usb.bash
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# enable kernel module: gs_usb
|
||||||
|
sudo modprobe gs_usb
|
||||||
|
|
||||||
|
# bring up can interface
|
||||||
|
sudo ip link set can0 up type can bitrate 500000
|
||||||
|
|
||||||
|
# install can utils
|
||||||
|
sudo apt install -y can-utils
|
||||||
5
src/CMakeLists.txt
Executable file
5
src/CMakeLists.txt
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
# Add source directories
|
||||||
|
add_subdirectory(apps)
|
||||||
|
add_subdirectory(async_io)
|
||||||
|
add_subdirectory(hunter_sdk)
|
||||||
|
add_subdirectory(scout_sdk)
|
||||||
16
src/apps/CMakeLists.txt
Executable file
16
src/apps/CMakeLists.txt
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
# Dependency libraries
|
||||||
|
#find_package(LIBRARY_NAME REQUIRED)
|
||||||
|
|
||||||
|
# tests
|
||||||
|
add_executable(app_scout_demo scout_demo/scout_demo.cpp)
|
||||||
|
target_link_libraries(app_scout_demo scoutbase)
|
||||||
|
|
||||||
|
add_executable(app_scout_discharge scout_demo/scout_discharge.cpp)
|
||||||
|
target_link_libraries(app_scout_discharge scoutbase)
|
||||||
|
|
||||||
|
add_executable(app_hunter_demo hunter_demo/hunter_demo.cpp)
|
||||||
|
target_link_libraries(app_hunter_demo hunterbase)
|
||||||
|
|
||||||
|
if(BUILD_MONITOR)
|
||||||
|
add_subdirectory(scout_monitor)
|
||||||
|
endif()
|
||||||
99
src/apps/hunter_demo/hunter_demo.cpp
Normal file
99
src/apps/hunter_demo/hunter_demo.cpp
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
/*
|
||||||
|
* demo_hunter_can.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 12, 2019 05:03
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hunter_base/hunter_base.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
std::string device_name;
|
||||||
|
int32_t baud_rate = 0;
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
std::cout << "Specified CAN: " << device_name << std::endl;
|
||||||
|
}
|
||||||
|
else if (argc == 3)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
baud_rate = std::stol(argv[2]);
|
||||||
|
std::cout << "Specified serial: " << device_name << "@" << baud_rate << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Usage: app_scout_demo <interface>" << std::endl
|
||||||
|
<< "Example 1: ./app_scout_demo can0" << std::endl
|
||||||
|
<< "Example 2: ./app_scout_demo /dev/ttyUSB0 115200" << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
HunterBase scout;
|
||||||
|
scout.Connect(device_name, baud_rate);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
// motion control
|
||||||
|
if (count < 5)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.2, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.2, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 10)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.8, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.8, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 15)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 1.5, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(1.5, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 20)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 1.0, 0.5" << std::endl;
|
||||||
|
scout.SetMotionCommand(1.0, 0.5);
|
||||||
|
}
|
||||||
|
else if (count < 25)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.0, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.0, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 30)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: -0.5, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(-0.5, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 35)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: -1.0, -0.5" << std::endl;
|
||||||
|
scout.SetMotionCommand(-1.0, -0.5);
|
||||||
|
}
|
||||||
|
else if (count < 40)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.0, 0, Light: breath" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto state = scout.GetHunterState();
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
std::cout << "count: " << count << std::endl;
|
||||||
|
std::cout << "control mode: " << static_cast<int>(state.control_mode) << " , base state: " << static_cast<int>(state.base_state) << std::endl;
|
||||||
|
std::cout << "battery voltage: " << state.battery_voltage << std::endl;
|
||||||
|
std::cout << "velocity (linear, angular): " << state.linear_velocity << ", " << state.angular_velocity << std::endl;
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
116
src/apps/scout_demo/scout_demo.cpp
Normal file
116
src/apps/scout_demo/scout_demo.cpp
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
/*
|
||||||
|
* demo_scout_can.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 12, 2019 05:03
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "scout_base/scout_base.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
std::string device_name;
|
||||||
|
int32_t baud_rate = 0;
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
std::cout << "Specified CAN: " << device_name << std::endl;
|
||||||
|
}
|
||||||
|
else if (argc == 3)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
baud_rate = std::stol(argv[2]);
|
||||||
|
std::cout << "Specified serial: " << device_name << "@" << baud_rate << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Usage: app_scout_demo <interface>" << std::endl
|
||||||
|
<< "Example 1: ./app_scout_demo can0" << std::endl
|
||||||
|
<< "Example 2: ./app_scout_demo /dev/ttyUSB0 115200" << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScoutBase scout;
|
||||||
|
scout.Connect(device_name, baud_rate);
|
||||||
|
|
||||||
|
// light control
|
||||||
|
std::cout << "Light: const off" << std::endl;
|
||||||
|
scout.SetLightCommand({ScoutLightCmd::LightMode::CONST_OFF, 0, ScoutLightCmd::LightMode::CONST_OFF, 0});
|
||||||
|
sleep(3);
|
||||||
|
std::cout << "Light: const on" << std::endl;
|
||||||
|
scout.SetLightCommand({ScoutLightCmd::LightMode::CONST_ON, 0, ScoutLightCmd::LightMode::CONST_ON, 0});
|
||||||
|
sleep(3);
|
||||||
|
std::cout << "Light: breath" << std::endl;
|
||||||
|
scout.SetLightCommand({ScoutLightCmd::LightMode::BREATH, 0, ScoutLightCmd::LightMode::BREATH, 0});
|
||||||
|
sleep(3);
|
||||||
|
std::cout << "Light: custom 90-80" << std::endl;
|
||||||
|
scout.SetLightCommand({ScoutLightCmd::LightMode::CUSTOM, 90, ScoutLightCmd::LightMode::CUSTOM, 80});
|
||||||
|
sleep(3);
|
||||||
|
std::cout << "Light: diabled cmd control" << std::endl;
|
||||||
|
scout.DisableLightCmdControl();
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
// motion control
|
||||||
|
if (count < 5)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.2, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.2, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 10)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.8, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.8, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 15)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 1.5, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(1.5, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 20)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 1.0, 0.5" << std::endl;
|
||||||
|
scout.SetMotionCommand(1.0, 0.5);
|
||||||
|
}
|
||||||
|
else if (count < 25)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.0, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.0, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 30)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: -0.5, 0" << std::endl;
|
||||||
|
scout.SetMotionCommand(-0.5, 0.0);
|
||||||
|
}
|
||||||
|
else if (count < 35)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: -1.0, -0.5" << std::endl;
|
||||||
|
scout.SetMotionCommand(-1.0, -0.5);
|
||||||
|
}
|
||||||
|
else if (count < 40)
|
||||||
|
{
|
||||||
|
std::cout << "Motor: 0.0, 0, Light: breath" << std::endl;
|
||||||
|
scout.SetMotionCommand(0.0, 0.0);
|
||||||
|
scout.SetLightCommand({ScoutLightCmd::LightMode::BREATH, 0, ScoutLightCmd::LightMode::BREATH, 0});
|
||||||
|
}
|
||||||
|
|
||||||
|
auto state = scout.GetScoutState();
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
std::cout << "count: " << count << std::endl;
|
||||||
|
std::cout << "control mode: " << static_cast<int>(state.control_mode) << " , base state: " << static_cast<int>(state.base_state) << std::endl;
|
||||||
|
std::cout << "battery voltage: " << state.battery_voltage << std::endl;
|
||||||
|
std::cout << "velocity (linear, angular): " << state.linear_velocity << ", " << state.angular_velocity << std::endl;
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
74
src/apps/scout_demo/scout_discharge.cpp
Normal file
74
src/apps/scout_demo/scout_discharge.cpp
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* demo_scout_can.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 12, 2019 05:03
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "scout_base/scout_base.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
std::string device_name;
|
||||||
|
int32_t baud_rate = 0;
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
std::cout << "Specified CAN: " << device_name << std::endl;
|
||||||
|
}
|
||||||
|
else if (argc == 3)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
baud_rate = std::stol(argv[2]);
|
||||||
|
std::cout << "Specified serial: " << device_name << "@" << baud_rate << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Usage: app_scout_monitor <interface>" << std::endl
|
||||||
|
<< "Example 1: ./app_scout_demo can0" << std::endl
|
||||||
|
<< "Example 2: ./app_scout_demo /dev/ttyUSB0 115200" << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScoutBase scout;
|
||||||
|
scout.Connect(device_name, baud_rate);
|
||||||
|
|
||||||
|
// light control
|
||||||
|
std::cout << "Light: const on" << std::endl;
|
||||||
|
scout.SetLightCommand({ScoutLightCmd::LightMode::CONST_ON, 0, ScoutLightCmd::LightMode::CONST_ON, 0});
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
auto state = scout.GetScoutState();
|
||||||
|
|
||||||
|
if (state.battery_voltage >= 22.5)
|
||||||
|
{
|
||||||
|
scout.SetMotionCommand(1.35, 0);
|
||||||
|
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
std::cout << "-------> discharging <--------" << std::endl;
|
||||||
|
std::cout << "elapsed time: " << count / 60 << " minutes " << count % 60 << " seconds" << std::endl;
|
||||||
|
std::cout << "control mode: " << static_cast<int>(state.control_mode) << " , base state: " << static_cast<int>(state.base_state) << std::endl;
|
||||||
|
std::cout << "battery voltage: " << state.battery_voltage << std::endl;
|
||||||
|
std::cout << "velocity (linear, angular): " << state.linear_velocity << ", " << state.angular_velocity << std::endl;
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scout.SetMotionCommand(0, 0);
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
std::cout << "discharge stopped at: " << state.battery_voltage << " V" << std::endl;
|
||||||
|
std::cout << "-------------------------------" << std::endl;
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
24
src/apps/scout_monitor/CMakeLists.txt
Normal file
24
src/apps/scout_monitor/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Dependency libraries
|
||||||
|
set(CURSES_NEED_NCURSES TRUE)
|
||||||
|
find_package(Curses REQUIRED)
|
||||||
|
|
||||||
|
# Add libraries
|
||||||
|
set(SCOUT_MONITOR_SRC
|
||||||
|
src/nshapes.cpp
|
||||||
|
src/ncolors.cpp
|
||||||
|
src/scout_monitor.cpp
|
||||||
|
)
|
||||||
|
add_library(monitor STATIC ${SCOUT_MONITOR_SRC})
|
||||||
|
target_link_libraries(monitor scoutbase ${CURSES_LIBRARIES})
|
||||||
|
target_include_directories(monitor PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${CURSES_INCLUDE_DIR}>
|
||||||
|
$<INSTALL_INTERFACE:include>
|
||||||
|
PRIVATE src)
|
||||||
|
|
||||||
|
add_subdirectory(app)
|
||||||
|
|
||||||
|
# Add executables
|
||||||
|
if(BUILD_TESTS)
|
||||||
|
add_subdirectory(tests)
|
||||||
|
endif()
|
||||||
3
src/apps/scout_monitor/app/CMakeLists.txt
Normal file
3
src/apps/scout_monitor/app/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Add executables
|
||||||
|
add_executable(app_scout_monitor app_scout_monitor.cpp)
|
||||||
|
target_link_libraries(app_scout_monitor monitor)
|
||||||
40
src/apps/scout_monitor/app/app_scout_monitor.cpp
Normal file
40
src/apps/scout_monitor/app/app_scout_monitor.cpp
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "monitor/scout_monitor.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
std::string device_name;
|
||||||
|
int32_t baud_rate = 0;
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
std::cout << "Specified CAN: " << device_name << std::endl;
|
||||||
|
}
|
||||||
|
else if (argc == 3)
|
||||||
|
{
|
||||||
|
device_name = {argv[1]};
|
||||||
|
baud_rate = std::stol(argv[2]);
|
||||||
|
std::cout << "Specified serial: " << device_name << "@" << baud_rate << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Usage: app_scout_monitor <interface>" << std::endl
|
||||||
|
<< "Example 1: ./app_scout_monitor can1" << std::endl
|
||||||
|
<< "Example 2: ./app_scout_monitor /dev/ttyUSB0 115200" << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScoutMonitor monitor;
|
||||||
|
monitor.Run(device_name, baud_rate);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
src/apps/scout_monitor/color_demo.png
Normal file
BIN
src/apps/scout_monitor/color_demo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 85 KiB |
67
src/apps/scout_monitor/include/monitor/ncolors.hpp
Normal file
67
src/apps/scout_monitor/include/monitor/ncolors.hpp
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* ncolors.hpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 20, 2019 06:22
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Original source: https://www.linuxjournal.com/content/about-ncurses-colors-0
|
||||||
|
* This copy is based on the original implementation, modified and
|
||||||
|
* maintained by Ruixiang.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2018 Jim Hall
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NCOLORS_HPP
|
||||||
|
#define NCOLORS_HPP
|
||||||
|
|
||||||
|
#include <ncurses.h>
|
||||||
|
|
||||||
|
namespace wescore
|
||||||
|
{
|
||||||
|
struct NColors
|
||||||
|
{
|
||||||
|
enum BackgroundColor
|
||||||
|
{
|
||||||
|
BLACK = 0,
|
||||||
|
BLUE,
|
||||||
|
GREEN,
|
||||||
|
CYAN,
|
||||||
|
RED,
|
||||||
|
MAGENTA,
|
||||||
|
YELLOW,
|
||||||
|
WHITE
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ForegroundColor
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
BLACK = 0,
|
||||||
|
BLUE,
|
||||||
|
GREEN,
|
||||||
|
CYAN,
|
||||||
|
RED,
|
||||||
|
MAGENTA,
|
||||||
|
YELLOW,
|
||||||
|
WHITE,*/
|
||||||
|
BRIGHT_BLACK = 8,
|
||||||
|
BRIGHT_BLUE,
|
||||||
|
BRIGHT_GREEN,
|
||||||
|
BRIGHT_CYAN,
|
||||||
|
BRIGHT_RED,
|
||||||
|
BRIGHT_MAGENTA,
|
||||||
|
BRIGHT_YELLOW,
|
||||||
|
BRIGHT_WHITE
|
||||||
|
};
|
||||||
|
|
||||||
|
static void InitColors();
|
||||||
|
|
||||||
|
static void SetColor(int fg, int bg = BLACK);
|
||||||
|
static void UnsetColor(int fg, int bg = BLACK);
|
||||||
|
|
||||||
|
static void WSetColor(WINDOW *win, int fg, int bg = BLACK);
|
||||||
|
static void WUnsetColor(WINDOW *win, int fg, int bg = BLACK);
|
||||||
|
};
|
||||||
|
} // namespace wescore
|
||||||
|
|
||||||
|
#endif /* NCOLORS_HPP */
|
||||||
24
src/apps/scout_monitor/include/monitor/nshapes.hpp
Normal file
24
src/apps/scout_monitor/include/monitor/nshapes.hpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* nshapes.hpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 20, 2019 06:21
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NSHAPES_HPP
|
||||||
|
#define NSHAPES_HPP
|
||||||
|
|
||||||
|
#include <ncurses.h>
|
||||||
|
|
||||||
|
namespace wescore
|
||||||
|
{
|
||||||
|
struct NShapes
|
||||||
|
{
|
||||||
|
static void DrawRectangle(int tl_y, int tl_x, int br_y, int br_x);
|
||||||
|
static void WDrawRectangle(WINDOW *win, int tl_y, int tl_x, int br_y, int br_x);
|
||||||
|
};
|
||||||
|
} // namespace wescore
|
||||||
|
|
||||||
|
#endif /* NSHAPES_HPP */
|
||||||
78
src/apps/scout_monitor/include/monitor/scout_monitor.hpp
Normal file
78
src/apps/scout_monitor/include/monitor/scout_monitor.hpp
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* scout_monitor.hpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 12, 2019 01:19
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SCOUT_MONITOR_HPP
|
||||||
|
#define SCOUT_MONITOR_HPP
|
||||||
|
|
||||||
|
#include "scout_base/scout_base.hpp"
|
||||||
|
|
||||||
|
#include <ncurses.h>
|
||||||
|
|
||||||
|
namespace wescore
|
||||||
|
{
|
||||||
|
class ScoutMonitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScoutMonitor();
|
||||||
|
~ScoutMonitor();
|
||||||
|
|
||||||
|
void Run(std::string device_name = "", int32_t baud_rate = 0);
|
||||||
|
void Terminate() { keep_running_ = false; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool keep_running_ = true;
|
||||||
|
bool test_mode_ = true;
|
||||||
|
|
||||||
|
int term_sx_ = -1;
|
||||||
|
int term_sy_ = -1;
|
||||||
|
|
||||||
|
WINDOW *body_info_win_;
|
||||||
|
int bi_win_sx_;
|
||||||
|
int bi_win_sy_;
|
||||||
|
int bi_origin_x_;
|
||||||
|
int bi_origin_y_;
|
||||||
|
|
||||||
|
WINDOW *system_info_win_;
|
||||||
|
int si_win_sx_;
|
||||||
|
int si_win_sy_;
|
||||||
|
int si_origin_x_;
|
||||||
|
int si_origin_y_;
|
||||||
|
|
||||||
|
WINDOW *scout_cmd_win_;
|
||||||
|
|
||||||
|
ScoutBase scout_base_;
|
||||||
|
ScoutState scout_state_;
|
||||||
|
|
||||||
|
const int linear_axis_length_ = 5;
|
||||||
|
const int angular_axis_length_ = 5;
|
||||||
|
|
||||||
|
const int vehicle_fp_offset_x_ = 9;
|
||||||
|
const int vehicle_fp_offset_y_ = 9;
|
||||||
|
|
||||||
|
bool resizing_detected_;
|
||||||
|
|
||||||
|
void UpdateAll();
|
||||||
|
void ClearAll();
|
||||||
|
|
||||||
|
void CalcDimensions();
|
||||||
|
void HandleResizing();
|
||||||
|
|
||||||
|
void SetTestStateData();
|
||||||
|
void ShowVehicleState(int y, int x);
|
||||||
|
void ShowStatusItemName(int y, int x, std::string name);
|
||||||
|
void ShowFault(int y, int x, bool no_fault);
|
||||||
|
void ShowMotorInfo(int y, int x, double cur, int rpm, int temp, bool is_right);
|
||||||
|
|
||||||
|
void UpdateScoutBodyInfo();
|
||||||
|
void UpdateScoutSystemInfo();
|
||||||
|
void UpdateScoutCmdWindow();
|
||||||
|
};
|
||||||
|
} // namespace wescore
|
||||||
|
|
||||||
|
#endif /* SCOUT_MONITOR_HPP */
|
||||||
114
src/apps/scout_monitor/src/ncolors.cpp
Normal file
114
src/apps/scout_monitor/src/ncolors.cpp
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* ncolors.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 20, 2019 06:22
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "monitor/ncolors.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
int IsBold(int fg)
|
||||||
|
{
|
||||||
|
/* return the intensity bit */
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 1 << 3;
|
||||||
|
return (i & fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ColorNum(int fg, int bg)
|
||||||
|
{
|
||||||
|
int B, bbb, ffff;
|
||||||
|
|
||||||
|
B = 1 << 7;
|
||||||
|
bbb = (7 & bg) << 4;
|
||||||
|
ffff = 7 & fg;
|
||||||
|
|
||||||
|
return (B | bbb | ffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
short CursorColor(int fg)
|
||||||
|
{
|
||||||
|
switch (7 & fg)
|
||||||
|
{ /* RGB */
|
||||||
|
case 0: /* 000 */
|
||||||
|
return (COLOR_BLACK);
|
||||||
|
case 1: /* 001 */
|
||||||
|
return (COLOR_BLUE);
|
||||||
|
case 2: /* 010 */
|
||||||
|
return (COLOR_GREEN);
|
||||||
|
case 3: /* 011 */
|
||||||
|
return (COLOR_CYAN);
|
||||||
|
case 4: /* 100 */
|
||||||
|
return (COLOR_RED);
|
||||||
|
case 5: /* 101 */
|
||||||
|
return (COLOR_MAGENTA);
|
||||||
|
case 6: /* 110 */
|
||||||
|
return (COLOR_YELLOW);
|
||||||
|
case 7: /* 111 */
|
||||||
|
return (COLOR_WHITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace wescore
|
||||||
|
{
|
||||||
|
void NColors::InitColors()
|
||||||
|
{
|
||||||
|
if (has_colors() != FALSE)
|
||||||
|
start_color();
|
||||||
|
else
|
||||||
|
std::cerr << "Your terminal does not support color" << std::endl;
|
||||||
|
|
||||||
|
int fg, bg;
|
||||||
|
int colorpair;
|
||||||
|
|
||||||
|
for (bg = 0; bg <= 7; bg++)
|
||||||
|
{
|
||||||
|
for (fg = 0; fg <= 7; fg++)
|
||||||
|
{
|
||||||
|
colorpair = ColorNum(fg, bg);
|
||||||
|
init_pair(colorpair, CursorColor(fg), CursorColor(bg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NColors::SetColor(int fg, int bg)
|
||||||
|
{
|
||||||
|
// set the color pair (ColorNum) and bold/bright (A_BOLD)
|
||||||
|
attron(COLOR_PAIR(ColorNum(fg, bg)));
|
||||||
|
if (IsBold(fg))
|
||||||
|
attron(A_BOLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NColors::UnsetColor(int fg, int bg)
|
||||||
|
{
|
||||||
|
// unset the color pair (ColorNum) and bold/bright (A_BOLD)
|
||||||
|
attroff(COLOR_PAIR(ColorNum(fg, bg)));
|
||||||
|
if (IsBold(fg))
|
||||||
|
attroff(A_BOLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NColors::WSetColor(WINDOW *win, int fg, int bg)
|
||||||
|
{
|
||||||
|
// set the color pair (ColorNum) and bold/bright (A_BOLD)
|
||||||
|
wattron(win, COLOR_PAIR(ColorNum(fg, bg)));
|
||||||
|
if (IsBold(fg))
|
||||||
|
wattron(win, A_BOLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NColors::WUnsetColor(WINDOW *win, int fg, int bg)
|
||||||
|
{
|
||||||
|
// unset the color pair (ColorNum) and bold/bright (A_BOLD)
|
||||||
|
wattroff(win, COLOR_PAIR(ColorNum(fg, bg)));
|
||||||
|
if (IsBold(fg))
|
||||||
|
wattroff(win, A_BOLD);
|
||||||
|
}
|
||||||
|
} // namespace wescore
|
||||||
41
src/apps/scout_monitor/src/nshapes.cpp
Normal file
41
src/apps/scout_monitor/src/nshapes.cpp
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* nshapers.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 20, 2019 06:21
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "monitor/nshapes.hpp"
|
||||||
|
|
||||||
|
namespace wescore
|
||||||
|
{
|
||||||
|
void NShapes::DrawRectangle(int tl_y, int tl_x, int br_y, int br_x)
|
||||||
|
{
|
||||||
|
for (int i = tl_y; i <= br_y; ++i)
|
||||||
|
{
|
||||||
|
mvprintw(i, tl_x, "|");
|
||||||
|
mvprintw(i, br_x, "|");
|
||||||
|
}
|
||||||
|
for (int i = tl_x; i <= br_x; ++i)
|
||||||
|
{
|
||||||
|
mvprintw(tl_y, i, "-");
|
||||||
|
mvprintw(br_y, i, "-");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NShapes::WDrawRectangle(WINDOW *win, int tl_y, int tl_x, int br_y, int br_x)
|
||||||
|
{
|
||||||
|
for (int i = tl_y; i <= br_y; ++i)
|
||||||
|
{
|
||||||
|
mvwprintw(win, i, tl_x, "|");
|
||||||
|
mvwprintw(win, i, br_x, "|");
|
||||||
|
}
|
||||||
|
for (int i = tl_x; i <= br_x; ++i)
|
||||||
|
{
|
||||||
|
mvwprintw(win, tl_y, i, "-");
|
||||||
|
mvwprintw(win, br_y, i, "-");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace wescore
|
||||||
658
src/apps/scout_monitor/src/scout_monitor.cpp
Normal file
658
src/apps/scout_monitor/src/scout_monitor.cpp
Normal file
@@ -0,0 +1,658 @@
|
|||||||
|
/*
|
||||||
|
* scout_monitor.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 12, 2019 01:19
|
||||||
|
* Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2019 Ruixiang Du (rdu)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Coordinate System:
|
||||||
|
*
|
||||||
|
* o --------------------> x
|
||||||
|
* |
|
||||||
|
* |
|
||||||
|
* |
|
||||||
|
* |
|
||||||
|
* |
|
||||||
|
* |
|
||||||
|
* v
|
||||||
|
* y
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "monitor/scout_monitor.hpp"
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <ratio>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "monitor/nshapes.hpp"
|
||||||
|
#include "monitor/ncolors.hpp"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// reference: https://thispointer.com/c-convert-double-to-string-and-manage-precision-scientific-notation/
|
||||||
|
std::string ConvertFloatToString(double vel, int digit_num = 3)
|
||||||
|
{
|
||||||
|
std::ostringstream streamObj;
|
||||||
|
streamObj << std::fixed;
|
||||||
|
streamObj << std::setprecision(digit_num);
|
||||||
|
streamObj << vel;
|
||||||
|
return streamObj.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// source: https://github.com/rxdu/stopwatch
|
||||||
|
struct StopWatch
|
||||||
|
{
|
||||||
|
using Clock = std::chrono::high_resolution_clock;
|
||||||
|
using time_point = typename Clock::time_point;
|
||||||
|
using duration = typename Clock::duration;
|
||||||
|
|
||||||
|
StopWatch() { tic_point = Clock::now(); };
|
||||||
|
|
||||||
|
time_point tic_point;
|
||||||
|
|
||||||
|
void tic()
|
||||||
|
{
|
||||||
|
tic_point = Clock::now();
|
||||||
|
};
|
||||||
|
|
||||||
|
double toc()
|
||||||
|
{
|
||||||
|
return std::chrono::duration_cast<std::chrono::microseconds>(Clock::now() - tic_point).count() / 1000000.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// for different precisions
|
||||||
|
double stoc()
|
||||||
|
{
|
||||||
|
return std::chrono::duration_cast<std::chrono::seconds>(Clock::now() - tic_point).count();
|
||||||
|
};
|
||||||
|
|
||||||
|
double mtoc()
|
||||||
|
{
|
||||||
|
return std::chrono::duration_cast<std::chrono::milliseconds>(Clock::now() - tic_point).count();
|
||||||
|
};
|
||||||
|
|
||||||
|
double utoc()
|
||||||
|
{
|
||||||
|
return std::chrono::duration_cast<std::chrono::microseconds>(Clock::now() - tic_point).count();
|
||||||
|
};
|
||||||
|
|
||||||
|
double ntoc()
|
||||||
|
{
|
||||||
|
return std::chrono::duration_cast<std::chrono::nanoseconds>(Clock::now() - tic_point).count();
|
||||||
|
};
|
||||||
|
|
||||||
|
// you have to call tic() before calling this function
|
||||||
|
void sleep_until_ms(int64_t period_ms)
|
||||||
|
{
|
||||||
|
int64_t duration = period_ms - std::chrono::duration_cast<std::chrono::milliseconds>(Clock::now() - tic_point).count();
|
||||||
|
|
||||||
|
if (duration > 0)
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(duration));
|
||||||
|
};
|
||||||
|
|
||||||
|
void sleep_until_us(int64_t period_us)
|
||||||
|
{
|
||||||
|
int64_t duration = period_us - std::chrono::duration_cast<std::chrono::microseconds>(Clock::now() - tic_point).count();
|
||||||
|
|
||||||
|
if (duration > 0)
|
||||||
|
std::this_thread::sleep_for(std::chrono::microseconds(duration));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
namespace wescore
|
||||||
|
{
|
||||||
|
ScoutMonitor::ScoutMonitor()
|
||||||
|
{
|
||||||
|
// init ncurses
|
||||||
|
initscr();
|
||||||
|
// raw();
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
nonl();
|
||||||
|
curs_set(FALSE);
|
||||||
|
intrflush(stdscr, FALSE);
|
||||||
|
keypad(stdscr, TRUE);
|
||||||
|
|
||||||
|
CalcDimensions();
|
||||||
|
|
||||||
|
// setup sub-windows
|
||||||
|
body_info_win_ = newwin(bi_win_sy_, bi_win_sx_, bi_origin_y_, bi_origin_x_);
|
||||||
|
system_info_win_ = newwin(si_win_sy_, si_win_sx_, si_origin_y_, si_origin_x_);
|
||||||
|
|
||||||
|
scout_state_.linear_velocity = 0;
|
||||||
|
scout_state_.angular_velocity = 0;
|
||||||
|
|
||||||
|
NColors::InitColors();
|
||||||
|
}
|
||||||
|
|
||||||
|
ScoutMonitor::~ScoutMonitor()
|
||||||
|
{
|
||||||
|
delwin(body_info_win_);
|
||||||
|
delwin(system_info_win_);
|
||||||
|
endwin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::UpdateAll()
|
||||||
|
{
|
||||||
|
ClearAll();
|
||||||
|
|
||||||
|
CalcDimensions();
|
||||||
|
if (resizing_detected_)
|
||||||
|
HandleResizing();
|
||||||
|
|
||||||
|
UpdateScoutBodyInfo();
|
||||||
|
UpdateScoutSystemInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::SetTestStateData()
|
||||||
|
{
|
||||||
|
scout_state_.base_state = BASE_STATE_NORMAL;
|
||||||
|
scout_state_.battery_voltage = 28.5;
|
||||||
|
|
||||||
|
scout_state_.linear_velocity = 1.234;
|
||||||
|
scout_state_.angular_velocity = -0.6853;
|
||||||
|
|
||||||
|
// scout_state_.fault_code |= FAULT_MOTOR_DRV_OVERHEAT_W;
|
||||||
|
// scout_state_.fault_code |= FAULT_MOTOR_OVERCURRENT_W;
|
||||||
|
// scout_state_.fault_code |= FAULT_MOTOR_DRV_OVERHEAT_F;
|
||||||
|
// scout_state_.fault_code |= FAULT_MOTOR_OVERCURRENT_F;
|
||||||
|
// scout_state_.fault_code |= FAULT_BAT_UNDER_VOL_W;
|
||||||
|
// scout_state_.fault_code |= FAULT_BAT_UNDER_VOL_F;
|
||||||
|
scout_state_.fault_code = 0x0000;
|
||||||
|
// scout_state_.fault_code = 0xffff;
|
||||||
|
|
||||||
|
// scout_state_.front_light_state.mode = CONST_ON;
|
||||||
|
scout_state_.front_light_state.mode = LIGHT_MODE_CUSTOM;
|
||||||
|
scout_state_.front_light_state.custom_value = 50;
|
||||||
|
|
||||||
|
scout_state_.rear_light_state.mode = LIGHT_MODE_CONST_ON;
|
||||||
|
|
||||||
|
scout_state_.motor_states[0].current = 10.1;
|
||||||
|
scout_state_.motor_states[0].rpm = 2000;
|
||||||
|
scout_state_.motor_states[0].temperature = 35;
|
||||||
|
|
||||||
|
scout_state_.motor_states[1].current = 10.1;
|
||||||
|
scout_state_.motor_states[1].rpm = 2000;
|
||||||
|
scout_state_.motor_states[1].temperature = 35;
|
||||||
|
|
||||||
|
scout_state_.motor_states[2].current = 10.1;
|
||||||
|
scout_state_.motor_states[2].rpm = 2000;
|
||||||
|
scout_state_.motor_states[2].temperature = 35;
|
||||||
|
|
||||||
|
scout_state_.motor_states[3].current = 10.1;
|
||||||
|
scout_state_.motor_states[3].rpm = 2000;
|
||||||
|
scout_state_.motor_states[3].temperature = 35;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::Run(std::string device_name, int32_t baud_rate)
|
||||||
|
{
|
||||||
|
if (device_name != "")
|
||||||
|
test_mode_ = false;
|
||||||
|
|
||||||
|
if (test_mode_)
|
||||||
|
SetTestStateData();
|
||||||
|
else
|
||||||
|
scout_base_.Connect(device_name, baud_rate);
|
||||||
|
|
||||||
|
StopWatch sw;
|
||||||
|
while (keep_running_)
|
||||||
|
{
|
||||||
|
// label starting point of iteration
|
||||||
|
sw.tic();
|
||||||
|
|
||||||
|
// query for latest robot state
|
||||||
|
if (!test_mode_)
|
||||||
|
scout_state_ = scout_base_.GetScoutState();
|
||||||
|
|
||||||
|
// update window contents
|
||||||
|
UpdateAll();
|
||||||
|
|
||||||
|
// manage window refresh rate
|
||||||
|
sw.sleep_until_ms(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::CalcDimensions()
|
||||||
|
{
|
||||||
|
int sy, sx;
|
||||||
|
getmaxyx(stdscr, sy, sx);
|
||||||
|
|
||||||
|
if (sy != term_sy_ || sx != term_sx_)
|
||||||
|
{
|
||||||
|
resizing_detected_ = true;
|
||||||
|
|
||||||
|
term_sy_ = sy;
|
||||||
|
term_sx_ = sx;
|
||||||
|
|
||||||
|
bi_win_sy_ = term_sy_;
|
||||||
|
bi_win_sx_ = term_sx_ * 15 / 24;
|
||||||
|
bi_origin_y_ = 0;
|
||||||
|
bi_origin_x_ = 0;
|
||||||
|
|
||||||
|
si_win_sy_ = term_sy_;
|
||||||
|
si_win_sx_ = term_sx_ * 9 / 24;
|
||||||
|
si_origin_y_ = 0;
|
||||||
|
si_origin_x_ = bi_win_sx_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::HandleResizing()
|
||||||
|
{
|
||||||
|
delwin(body_info_win_);
|
||||||
|
delwin(system_info_win_);
|
||||||
|
|
||||||
|
body_info_win_ = newwin(bi_win_sy_, bi_win_sx_, bi_origin_y_, bi_origin_x_);
|
||||||
|
system_info_win_ = newwin(si_win_sy_, si_win_sx_, si_origin_y_, si_origin_x_);
|
||||||
|
|
||||||
|
resizing_detected_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::ClearAll()
|
||||||
|
{
|
||||||
|
wclear(body_info_win_);
|
||||||
|
wclear(system_info_win_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::ShowVehicleState(int y, int x)
|
||||||
|
{
|
||||||
|
// show linear velocity
|
||||||
|
const int linear_axis_x = x + vehicle_fp_offset_x_;
|
||||||
|
const int linear_axis_tip_y = y + 2;
|
||||||
|
const int linear_axis_origin_y = linear_axis_tip_y + linear_axis_length_;
|
||||||
|
const int linear_axis_negative_y = linear_axis_origin_y + linear_axis_length_ + 1;
|
||||||
|
mvwprintw(body_info_win_, linear_axis_tip_y - 1, linear_axis_x, "^");
|
||||||
|
for (int i = linear_axis_tip_y; i < linear_axis_origin_y; ++i)
|
||||||
|
mvwprintw(body_info_win_, i, linear_axis_x, "-");
|
||||||
|
mvwprintw(body_info_win_, linear_axis_origin_y, linear_axis_x, "x");
|
||||||
|
for (int i = linear_axis_origin_y + 1; i < linear_axis_negative_y; ++i)
|
||||||
|
mvwprintw(body_info_win_, i, linear_axis_x, "-");
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y, linear_axis_x, "v");
|
||||||
|
double linear_percentage = scout_state_.linear_velocity / ScoutMotionCmd::max_linear_velocity;
|
||||||
|
int linear_bars = std::abs(static_cast<int>(linear_percentage * 5)) + 1;
|
||||||
|
if (std::abs(scout_state_.linear_velocity) < 0.001)
|
||||||
|
linear_bars = 0;
|
||||||
|
if (linear_bars > 5)
|
||||||
|
linear_bars = 5;
|
||||||
|
if (scout_state_.linear_velocity > 0)
|
||||||
|
{
|
||||||
|
for (int i = linear_axis_origin_y - linear_bars; i < linear_axis_origin_y; ++i)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(body_info_win_, NColors::BLACK, NColors::CYAN);
|
||||||
|
mvwprintw(body_info_win_, i, linear_axis_x, "-");
|
||||||
|
NColors::WUnsetColor(body_info_win_, NColors::BLACK, NColors::CYAN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (scout_state_.linear_velocity < 0)
|
||||||
|
{
|
||||||
|
for (int i = linear_axis_origin_y + linear_bars; i > linear_axis_origin_y; --i)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(body_info_win_, NColors::BLACK, NColors::CYAN);
|
||||||
|
mvwprintw(body_info_win_, i, linear_axis_x, "-");
|
||||||
|
NColors::WUnsetColor(body_info_win_, NColors::BLACK, NColors::CYAN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// show angular velocity
|
||||||
|
const int angular_axis_y = linear_axis_origin_y;
|
||||||
|
const int angular_axis_origin_x = linear_axis_x;
|
||||||
|
const int angular_axis_positive_x = angular_axis_origin_x + angular_axis_length_ + 1;
|
||||||
|
const int angular_axis_negative_x = angular_axis_origin_x - angular_axis_length_;
|
||||||
|
mvwprintw(body_info_win_, angular_axis_y, angular_axis_negative_x - 1, "<");
|
||||||
|
for (int i = angular_axis_negative_x; i < angular_axis_origin_x; ++i)
|
||||||
|
mvwprintw(body_info_win_, angular_axis_y, i, "-");
|
||||||
|
mvwprintw(body_info_win_, linear_axis_origin_y, linear_axis_x, "x");
|
||||||
|
for (int i = angular_axis_origin_x + 1; i < angular_axis_positive_x; ++i)
|
||||||
|
mvwprintw(body_info_win_, angular_axis_y, i, "-");
|
||||||
|
mvwprintw(body_info_win_, angular_axis_y, angular_axis_positive_x, ">");
|
||||||
|
|
||||||
|
double angular_percentage = scout_state_.angular_velocity / ScoutMotionCmd::max_angular_velocity;
|
||||||
|
int angular_bars = std::abs(static_cast<int>(angular_percentage * 5)) + 1;
|
||||||
|
if (std::abs(scout_state_.angular_velocity) < 0.001)
|
||||||
|
angular_bars = 0;
|
||||||
|
if (angular_bars > 5)
|
||||||
|
angular_bars = 5;
|
||||||
|
if (scout_state_.angular_velocity < 0)
|
||||||
|
{
|
||||||
|
for (int i = angular_axis_origin_x + angular_bars; i > angular_axis_origin_x; --i)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(body_info_win_, NColors::BLACK, NColors::MAGENTA);
|
||||||
|
mvwprintw(body_info_win_, angular_axis_y, i, "-");
|
||||||
|
NColors::WUnsetColor(body_info_win_, NColors::BLACK, NColors::MAGENTA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (scout_state_.angular_velocity > 0)
|
||||||
|
{
|
||||||
|
for (int i = angular_axis_origin_x - angular_bars; i < angular_axis_origin_x; ++i)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(body_info_win_, NColors::BLACK, NColors::MAGENTA);
|
||||||
|
mvwprintw(body_info_win_, angular_axis_y, i, "-");
|
||||||
|
NColors::WUnsetColor(body_info_win_, NColors::BLACK, NColors::MAGENTA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// show velocity values
|
||||||
|
std::string linear_vel_str = "linear : " + ConvertFloatToString(scout_state_.linear_velocity);
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 2, angular_axis_negative_x - 2, linear_vel_str.c_str());
|
||||||
|
|
||||||
|
std::string angular_vel_str = "angular: " + ConvertFloatToString(scout_state_.angular_velocity);
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 3, angular_axis_negative_x - 2, angular_vel_str.c_str());
|
||||||
|
|
||||||
|
// show vehicle base
|
||||||
|
NShapes::WDrawRectangle(body_info_win_, linear_axis_tip_y - 2, angular_axis_negative_x - 4,
|
||||||
|
linear_axis_negative_y + 4, angular_axis_positive_x + 3);
|
||||||
|
|
||||||
|
// show vehicle wheels
|
||||||
|
NShapes::WDrawRectangle(body_info_win_, linear_axis_tip_y - 1, angular_axis_negative_x - 9,
|
||||||
|
linear_axis_tip_y + 4, angular_axis_negative_x - 5);
|
||||||
|
NShapes::WDrawRectangle(body_info_win_, linear_axis_negative_y - 2, angular_axis_negative_x - 9,
|
||||||
|
linear_axis_negative_y + 3, angular_axis_negative_x - 5);
|
||||||
|
NShapes::WDrawRectangle(body_info_win_, linear_axis_tip_y - 1, angular_axis_positive_x + 4,
|
||||||
|
linear_axis_tip_y + 4, angular_axis_positive_x + 8);
|
||||||
|
NShapes::WDrawRectangle(body_info_win_, linear_axis_negative_y - 2, angular_axis_positive_x + 4,
|
||||||
|
linear_axis_negative_y + 3, angular_axis_positive_x + 8);
|
||||||
|
|
||||||
|
// front right motor
|
||||||
|
ShowMotorInfo(linear_axis_tip_y - 1, angular_axis_positive_x + 4, scout_state_.motor_states[0].current,
|
||||||
|
scout_state_.motor_states[0].rpm, scout_state_.motor_states[0].temperature, true);
|
||||||
|
// front left motor
|
||||||
|
ShowMotorInfo(linear_axis_tip_y - 1, angular_axis_negative_x - 9, scout_state_.motor_states[1].current,
|
||||||
|
scout_state_.motor_states[1].rpm, scout_state_.motor_states[1].temperature, false);
|
||||||
|
// rear left motor
|
||||||
|
ShowMotorInfo(linear_axis_negative_y - 2, angular_axis_negative_x - 9, scout_state_.motor_states[2].current,
|
||||||
|
scout_state_.motor_states[2].rpm, scout_state_.motor_states[2].temperature, false);
|
||||||
|
// rear right motor
|
||||||
|
ShowMotorInfo(linear_axis_negative_y - 2, angular_axis_positive_x + 4, scout_state_.motor_states[3].current,
|
||||||
|
scout_state_.motor_states[3].rpm, scout_state_.motor_states[3].temperature, true);
|
||||||
|
|
||||||
|
// show vehicle lights
|
||||||
|
std::string front_mode_str = "Mode: ";
|
||||||
|
if (scout_state_.front_light_state.mode == LIGHT_MODE_CONST_ON)
|
||||||
|
front_mode_str += "ON";
|
||||||
|
else if (scout_state_.front_light_state.mode == LIGHT_MODE_CONST_OFF)
|
||||||
|
front_mode_str += "OFF";
|
||||||
|
else if (scout_state_.front_light_state.mode == LIGHT_MODE_BREATH)
|
||||||
|
front_mode_str += "BREATH";
|
||||||
|
else if (scout_state_.front_light_state.mode == LIGHT_MODE_CUSTOM)
|
||||||
|
front_mode_str += "CUSTOM";
|
||||||
|
mvwprintw(body_info_win_, linear_axis_tip_y - 4, angular_axis_origin_x - 13, front_mode_str.c_str());
|
||||||
|
std::string front_custom_str = "Custom: " + ConvertFloatToString(scout_state_.front_light_state.custom_value, 0);
|
||||||
|
mvwprintw(body_info_win_, linear_axis_tip_y - 4, angular_axis_origin_x + 3, front_custom_str.c_str());
|
||||||
|
if (scout_state_.front_light_state.mode != LIGHT_MODE_CONST_OFF &&
|
||||||
|
!(scout_state_.front_light_state.mode == LIGHT_MODE_CUSTOM && scout_state_.front_light_state.custom_value == 0))
|
||||||
|
{
|
||||||
|
NColors::WSetColor(body_info_win_, NColors::BRIGHT_YELLOW);
|
||||||
|
for (int i = angular_axis_origin_x - 5; i < angular_axis_origin_x - 1; ++i)
|
||||||
|
mvwprintw(body_info_win_, linear_axis_tip_y - 3, i, "v");
|
||||||
|
mvwprintw(body_info_win_, linear_axis_tip_y - 3, angular_axis_origin_x, "v");
|
||||||
|
for (int i = angular_axis_origin_x + 2; i <= angular_axis_origin_x + 5; ++i)
|
||||||
|
mvwprintw(body_info_win_, linear_axis_tip_y - 3, i, "v");
|
||||||
|
NColors::WUnsetColor(body_info_win_, NColors::BRIGHT_YELLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string rear_mode_str = "Mode: ";
|
||||||
|
if (scout_state_.rear_light_state.mode == LIGHT_MODE_CONST_ON)
|
||||||
|
rear_mode_str += "ON";
|
||||||
|
else if (scout_state_.rear_light_state.mode == LIGHT_MODE_CONST_OFF)
|
||||||
|
rear_mode_str += "OFF";
|
||||||
|
else if (scout_state_.rear_light_state.mode == LIGHT_MODE_BREATH)
|
||||||
|
rear_mode_str += "BREATH";
|
||||||
|
else if (scout_state_.rear_light_state.mode == LIGHT_MODE_CUSTOM)
|
||||||
|
rear_mode_str += "CUSTOM";
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 6, angular_axis_origin_x - 13, rear_mode_str.c_str());
|
||||||
|
std::string rear_custom_str = "Custom: " + ConvertFloatToString(scout_state_.rear_light_state.custom_value, 0);
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 6, angular_axis_origin_x + 3, rear_custom_str.c_str());
|
||||||
|
if (scout_state_.rear_light_state.mode != LIGHT_MODE_CONST_OFF &&
|
||||||
|
!(scout_state_.rear_light_state.mode == LIGHT_MODE_CUSTOM && scout_state_.rear_light_state.custom_value == 0))
|
||||||
|
{
|
||||||
|
NColors::WSetColor(body_info_win_, NColors::BRIGHT_RED);
|
||||||
|
for (int i = angular_axis_origin_x - 5; i < angular_axis_origin_x - 1; ++i)
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 5, i, "^");
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 5, angular_axis_origin_x, "^");
|
||||||
|
for (int i = angular_axis_origin_x + 2; i <= angular_axis_origin_x + 5; ++i)
|
||||||
|
mvwprintw(body_info_win_, linear_axis_negative_y + 5, i, "^");
|
||||||
|
NColors::WUnsetColor(body_info_win_, NColors::BRIGHT_RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::UpdateScoutBodyInfo()
|
||||||
|
{
|
||||||
|
// for (int i = 0; i < bi_win_sx_; i++)
|
||||||
|
// mvwprintw(body_info_win_, bi_win_sy_ - 1, i, "-");
|
||||||
|
|
||||||
|
ShowVehicleState(bi_win_sy_ / 2 - vehicle_fp_offset_y_, bi_win_sx_ / 2 - vehicle_fp_offset_x_);
|
||||||
|
|
||||||
|
wrefresh(body_info_win_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::UpdateScoutSystemInfo()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < si_win_sy_; i++)
|
||||||
|
mvwprintw(system_info_win_, i, 0, "|");
|
||||||
|
|
||||||
|
const int state_title_col = (si_win_sx_ - 24) / 2;
|
||||||
|
const int state_value_col = state_title_col + 20;
|
||||||
|
const int state_div_col = state_value_col - 2;
|
||||||
|
|
||||||
|
// system state
|
||||||
|
const int sec1 = static_cast<int>(std::round((si_win_sy_ - 20) / 2.0));
|
||||||
|
ShowStatusItemName(sec1, state_title_col, "System state");
|
||||||
|
|
||||||
|
if (scout_state_.base_state == BASE_STATE_NORMAL)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::GREEN);
|
||||||
|
mvwprintw(system_info_win_, sec1, state_value_col, "NORMAL");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::GREEN);
|
||||||
|
}
|
||||||
|
else if (scout_state_.base_state == BASE_STATE_ESTOP)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
mvwprintw(system_info_win_, sec1, state_value_col, "ESTOP");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
}
|
||||||
|
else if (scout_state_.base_state == BASE_STATE_EXCEPTION)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::RED);
|
||||||
|
mvwprintw(system_info_win_, sec1, state_value_col, "EXCEPT");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::RED);
|
||||||
|
}
|
||||||
|
|
||||||
|
// control mode
|
||||||
|
ShowStatusItemName(sec1 + 1, state_title_col, "Control mode");
|
||||||
|
if (scout_state_.control_mode == CTRL_MODE_REMOTE)
|
||||||
|
mvwprintw(system_info_win_, sec1 + 1, state_value_col, "REMOTE");
|
||||||
|
else if (scout_state_.control_mode == CTRL_MODE_CMD_CAN)
|
||||||
|
mvwprintw(system_info_win_, sec1 + 1, state_value_col, "CMD");
|
||||||
|
else if (scout_state_.control_mode == CTRL_MODE_CMD_UART)
|
||||||
|
mvwprintw(system_info_win_, sec1 + 1, state_value_col, "CMD");
|
||||||
|
// mvwprintw(system_info_win_, sec1 + 1, state_value_col, std::to_string(scout_state_.control_mode).c_str());
|
||||||
|
|
||||||
|
// battery voltage
|
||||||
|
ShowStatusItemName(sec1 + 2, state_title_col, "Battery voltage");
|
||||||
|
std::string bat_vol_str = ConvertFloatToString(scout_state_.battery_voltage, 1) + " v";
|
||||||
|
mvwprintw(system_info_win_, sec1 + 2, state_value_col, bat_vol_str.c_str());
|
||||||
|
|
||||||
|
const int fault_col_1 = state_value_col;
|
||||||
|
const int fault_col_2 = fault_col_1 + 2;
|
||||||
|
const int fault_col_3 = fault_col_2 + 2;
|
||||||
|
|
||||||
|
const int sec2 = sec1 + 4;
|
||||||
|
mvwprintw(system_info_win_, sec2, state_title_col, "System faults");
|
||||||
|
|
||||||
|
// motor driver over heat;
|
||||||
|
ShowStatusItemName(sec2 + 1, state_title_col, "-Drv over-heat");
|
||||||
|
if ((scout_state_.fault_code & FAULT_MOTOR_DRV_OVERHEAT_W) == 0 &&
|
||||||
|
(scout_state_.fault_code & FAULT_MOTOR_DRV_OVERHEAT_F) == 0)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::GREEN);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 1, fault_col_1, "N");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (scout_state_.fault_code & FAULT_MOTOR_DRV_OVERHEAT_W)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 1, fault_col_2, "W");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
}
|
||||||
|
if (scout_state_.fault_code & FAULT_MOTOR_DRV_OVERHEAT_F)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::RED);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 1, fault_col_3, "P");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// motor driver over current
|
||||||
|
ShowStatusItemName(sec2 + 2, state_title_col, "-Mt over-current");
|
||||||
|
if ((scout_state_.fault_code & FAULT_MOTOR_OVERCURRENT_W) == 0 &&
|
||||||
|
(scout_state_.fault_code & FAULT_MOTOR_OVERCURRENT_F) == 0)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::GREEN);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 2, fault_col_1, "N");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (scout_state_.fault_code & FAULT_MOTOR_OVERCURRENT_W)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 2, fault_col_2, "W");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
}
|
||||||
|
if (scout_state_.fault_code & FAULT_MOTOR_OVERCURRENT_F)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::RED);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 2, fault_col_3, "P");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// battery under voltage
|
||||||
|
ShowStatusItemName(sec2 + 3, state_title_col, "-Bat under volt");
|
||||||
|
if ((scout_state_.fault_code & FAULT_BAT_UNDER_VOL_W) == 0 &&
|
||||||
|
(scout_state_.fault_code & FAULT_BAT_UNDER_VOL_F) == 0)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::GREEN);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 3, fault_col_1, "N");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (scout_state_.fault_code & FAULT_BAT_UNDER_VOL_W)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 3, fault_col_2, "W");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
}
|
||||||
|
if (scout_state_.fault_code & FAULT_BAT_UNDER_VOL_F)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::RED);
|
||||||
|
mvwprintw(system_info_win_, sec2 + 3, fault_col_3, "F");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// battery over voltage
|
||||||
|
ShowStatusItemName(sec2 + 4, state_title_col, "-Bat over volt");
|
||||||
|
ShowFault(sec2 + 4, fault_col_1, (scout_state_.fault_code & FAULT_BAT_OVER_VOL_F) == 0);
|
||||||
|
|
||||||
|
ShowStatusItemName(sec2 + 5, state_title_col, "-RC signal loss");
|
||||||
|
ShowFault(sec2 + 5, fault_col_1, (scout_state_.fault_code & FAULT_RC_SIGNAL_LOSS) == 0);
|
||||||
|
|
||||||
|
const int sec3 = sec2 + 7;
|
||||||
|
mvwprintw(system_info_win_, sec3, state_title_col, "Comm faults");
|
||||||
|
|
||||||
|
// CAN cmd checksum
|
||||||
|
ShowStatusItemName(sec3 + 1, state_title_col, "-CAN cmd checksum");
|
||||||
|
ShowFault(sec3 + 1, fault_col_1, (scout_state_.fault_code & FAULT_CAN_CHECKSUM_ERROR) == 0);
|
||||||
|
|
||||||
|
// motor comm
|
||||||
|
ShowStatusItemName(sec3 + 2, state_title_col, "-Motor 1 comm");
|
||||||
|
ShowFault(sec3 + 2, fault_col_1, (scout_state_.fault_code & FAULT_MOTOR1_COMM_F) == 0);
|
||||||
|
|
||||||
|
ShowStatusItemName(sec3 + 3, state_title_col, "-Motor 2 comm");
|
||||||
|
ShowFault(sec3 + 3, fault_col_1, (scout_state_.fault_code & FAULT_MOTOR2_COMM_F) == 0);
|
||||||
|
|
||||||
|
ShowStatusItemName(sec3 + 4, state_title_col, "-Motor 3 comm");
|
||||||
|
ShowFault(sec3 + 4, fault_col_1, (scout_state_.fault_code & FAULT_MOTOR3_COMM_F) == 0);
|
||||||
|
|
||||||
|
ShowStatusItemName(sec3 + 5, state_title_col, "-Motor 4 comm");
|
||||||
|
ShowFault(sec3 + 5, fault_col_1, (scout_state_.fault_code & FAULT_MOTOR4_COMM_F) == 0);
|
||||||
|
|
||||||
|
const int sec4 = sec3 + 8;
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::GREEN);
|
||||||
|
mvwprintw(system_info_win_, sec4, state_title_col + 1, "N: Normal");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::GREEN);
|
||||||
|
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
mvwprintw(system_info_win_, sec4, state_title_col + 12, "W: Warning");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::YELLOW);
|
||||||
|
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::RED);
|
||||||
|
mvwprintw(system_info_win_, sec4 + 1, state_title_col + 1, "F: Fault P: Protection");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::RED);
|
||||||
|
|
||||||
|
wrefresh(system_info_win_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::ShowStatusItemName(int y, int x, std::string name)
|
||||||
|
{
|
||||||
|
const int state_value_col = x + 20;
|
||||||
|
const int state_div_col = state_value_col - 2;
|
||||||
|
|
||||||
|
mvwprintw(system_info_win_, y, x, name.c_str());
|
||||||
|
mvwprintw(system_info_win_, y, state_div_col, ":");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScoutMonitor::ShowFault(int y, int x, bool no_fault)
|
||||||
|
{
|
||||||
|
const int fault_col_1 = x;
|
||||||
|
const int fault_col_2 = x + 2;
|
||||||
|
const int fault_col_3 = fault_col_2 + 2;
|
||||||
|
|
||||||
|
if (no_fault)
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::GREEN);
|
||||||
|
mvwprintw(system_info_win_, y, fault_col_1, "N");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::GREEN);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NColors::WSetColor(system_info_win_, NColors::RED);
|
||||||
|
mvwprintw(system_info_win_, y, fault_col_3, "F");
|
||||||
|
NColors::WUnsetColor(system_info_win_, NColors::RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// (y,x): position of the top left point of corresponding wheel
|
||||||
|
void ScoutMonitor::ShowMotorInfo(int y, int x, double cur, int rpm, int temp, bool is_right)
|
||||||
|
{
|
||||||
|
int col_title = x;
|
||||||
|
if (is_right)
|
||||||
|
col_title += 6;
|
||||||
|
else
|
||||||
|
col_title -= 9;
|
||||||
|
|
||||||
|
std::string cur_str = "CUR:" + ConvertFloatToString(cur, 1);
|
||||||
|
mvwprintw(body_info_win_, y + 1, col_title, cur_str.c_str());
|
||||||
|
|
||||||
|
std::string rpm_str = "RPM:" + ConvertFloatToString(rpm, 0);
|
||||||
|
mvwprintw(body_info_win_, y + 2, col_title, rpm_str.c_str());
|
||||||
|
|
||||||
|
std::string temp_str = "TMP:" + ConvertFloatToString(temp, 0);
|
||||||
|
mvwprintw(body_info_win_, y + 3, col_title, temp_str.c_str());
|
||||||
|
}
|
||||||
|
} // namespace wescore
|
||||||
15
src/apps/scout_monitor/tests/CMakeLists.txt
Normal file
15
src/apps/scout_monitor/tests/CMakeLists.txt
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Add executables
|
||||||
|
add_executable(test_scout_monitor test_scout_monitor.cpp)
|
||||||
|
target_link_libraries(test_scout_monitor monitor)
|
||||||
|
|
||||||
|
add_executable(test_scout_monitor_virtual test_scout_monitor_virtual.cpp)
|
||||||
|
target_link_libraries(test_scout_monitor_virtual monitor)
|
||||||
|
|
||||||
|
# add_executable(test_ncurses test_ncurses.cpp)
|
||||||
|
# target_link_libraries(test_ncurses monitor)
|
||||||
|
|
||||||
|
# add_executable(test_ncolor test_ncolor.c)
|
||||||
|
# target_link_libraries(test_ncolor monitor)
|
||||||
|
|
||||||
|
# add_executable(test_ncolor2 test_ncolor2.cpp)
|
||||||
|
# target_link_libraries(test_ncolor2 monitor)
|
||||||
158
src/apps/scout_monitor/tests/test_ncolor.c
Normal file
158
src/apps/scout_monitor/tests/test_ncolor.c
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
/* color-demo.c */
|
||||||
|
// source: https://www.linuxjournal.com/content/about-ncurses-colors-0
|
||||||
|
|
||||||
|
#include <curses.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int is_bold(int fg);
|
||||||
|
void init_colorpairs(void);
|
||||||
|
short curs_color(int fg);
|
||||||
|
int colornum(int fg, int bg);
|
||||||
|
void setcolor(int fg, int bg);
|
||||||
|
void unsetcolor(int fg, int bg);
|
||||||
|
|
||||||
|
void init_colorpairs(void)
|
||||||
|
{
|
||||||
|
int fg, bg;
|
||||||
|
int colorpair;
|
||||||
|
|
||||||
|
for (bg = 0; bg <= 7; bg++)
|
||||||
|
{
|
||||||
|
for (fg = 0; fg <= 7; fg++)
|
||||||
|
{
|
||||||
|
colorpair = colornum(fg, bg);
|
||||||
|
init_pair(colorpair, curs_color(fg), curs_color(bg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
short curs_color(int fg)
|
||||||
|
{
|
||||||
|
switch (7 & fg)
|
||||||
|
{ /* RGB */
|
||||||
|
case 0: /* 000 */
|
||||||
|
return (COLOR_BLACK);
|
||||||
|
case 1: /* 001 */
|
||||||
|
return (COLOR_BLUE);
|
||||||
|
case 2: /* 010 */
|
||||||
|
return (COLOR_GREEN);
|
||||||
|
case 3: /* 011 */
|
||||||
|
return (COLOR_CYAN);
|
||||||
|
case 4: /* 100 */
|
||||||
|
return (COLOR_RED);
|
||||||
|
case 5: /* 101 */
|
||||||
|
return (COLOR_MAGENTA);
|
||||||
|
case 6: /* 110 */
|
||||||
|
return (COLOR_YELLOW);
|
||||||
|
case 7: /* 111 */
|
||||||
|
return (COLOR_WHITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int colornum(int fg, int bg)
|
||||||
|
{
|
||||||
|
int B, bbb, ffff;
|
||||||
|
|
||||||
|
B = 1 << 7;
|
||||||
|
bbb = (7 & bg) << 4;
|
||||||
|
ffff = 7 & fg;
|
||||||
|
|
||||||
|
return (B | bbb | ffff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setcolor(int fg, int bg)
|
||||||
|
{
|
||||||
|
/* set the color pair (colornum) and bold/bright (A_BOLD) */
|
||||||
|
|
||||||
|
attron(COLOR_PAIR(colornum(fg, bg)));
|
||||||
|
if (is_bold(fg))
|
||||||
|
{
|
||||||
|
attron(A_BOLD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void unsetcolor(int fg, int bg)
|
||||||
|
{
|
||||||
|
/* unset the color pair (colornum) and
|
||||||
|
bold/bright (A_BOLD) */
|
||||||
|
|
||||||
|
attroff(COLOR_PAIR(colornum(fg, bg)));
|
||||||
|
if (is_bold(fg))
|
||||||
|
{
|
||||||
|
attroff(A_BOLD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_bold(int fg)
|
||||||
|
{
|
||||||
|
/* return the intensity bit */
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = 1 << 3;
|
||||||
|
return (i & fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int fg, bg;
|
||||||
|
|
||||||
|
/* initialize curses */
|
||||||
|
|
||||||
|
initscr();
|
||||||
|
keypad(stdscr, TRUE);
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
|
||||||
|
/* initialize colors */
|
||||||
|
|
||||||
|
if (has_colors() == FALSE)
|
||||||
|
{
|
||||||
|
endwin();
|
||||||
|
puts("Your terminal does not support color");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
start_color();
|
||||||
|
init_colorpairs();
|
||||||
|
|
||||||
|
/* draw test pattern */
|
||||||
|
|
||||||
|
if ((LINES < 24) || (COLS < 80))
|
||||||
|
{
|
||||||
|
endwin();
|
||||||
|
puts("Your terminal needs to be at least 80x24");
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
mvaddstr(0, 35, "COLOR DEMO");
|
||||||
|
mvaddstr(2, 0, "low intensity text colors (0-7)");
|
||||||
|
mvaddstr(12, 0, "high intensity text colors (8-15)");
|
||||||
|
|
||||||
|
for (bg = 0; bg <= 7; bg++)
|
||||||
|
{
|
||||||
|
for (fg = 0; fg <= 7; fg++)
|
||||||
|
{
|
||||||
|
setcolor(fg, bg);
|
||||||
|
mvaddstr(fg + 3, bg * 10, "...test...");
|
||||||
|
unsetcolor(fg, bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (fg = 8; fg <= 15; fg++)
|
||||||
|
{
|
||||||
|
setcolor(fg, bg);
|
||||||
|
mvaddstr(fg + 5, bg * 10, "...test...");
|
||||||
|
unsetcolor(fg, bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mvaddstr(LINES - 1, 0, "press any key to quit");
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
|
||||||
|
getch();
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
65
src/apps/scout_monitor/tests/test_ncolor2.cpp
Normal file
65
src/apps/scout_monitor/tests/test_ncolor2.cpp
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#include "monitor/ncolors.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int fg, bg;
|
||||||
|
|
||||||
|
/* initialize curses */
|
||||||
|
|
||||||
|
initscr();
|
||||||
|
keypad(stdscr, TRUE);
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
|
||||||
|
/* initialize colors */
|
||||||
|
|
||||||
|
if (has_colors() == FALSE)
|
||||||
|
{
|
||||||
|
endwin();
|
||||||
|
puts("Your terminal does not support color");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
NColors::InitColors();
|
||||||
|
|
||||||
|
/* draw test pattern */
|
||||||
|
|
||||||
|
if ((LINES < 24) || (COLS < 80))
|
||||||
|
{
|
||||||
|
endwin();
|
||||||
|
puts("Your terminal needs to be at least 80x24");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
mvaddstr(0, 35, "COLOR DEMO");
|
||||||
|
mvaddstr(2, 0, "low intensity text colors (0-7)");
|
||||||
|
mvaddstr(12, 0, "high intensity text colors (8-15)");
|
||||||
|
|
||||||
|
for (bg = 0; bg <= 7; bg++)
|
||||||
|
{
|
||||||
|
for (fg = 0; fg <= 7; fg++)
|
||||||
|
{
|
||||||
|
NColors::SetColor(fg, bg);
|
||||||
|
mvaddstr(fg + 3, bg * 10, "...test...");
|
||||||
|
NColors::UnsetColor(fg, bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (fg = 8; fg <= 15; fg++)
|
||||||
|
{
|
||||||
|
NColors::SetColor(fg, bg);
|
||||||
|
mvaddstr(fg + 5, bg * 10, "...test...");
|
||||||
|
NColors::UnsetColor(fg, bg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mvaddstr(LINES - 1, 0, "press any key to quit");
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
|
||||||
|
getch();
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
118
src/apps/scout_monitor/tests/test_ncurses.cpp
Normal file
118
src/apps/scout_monitor/tests/test_ncurses.cpp
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
#include <panel.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define NLINES 10
|
||||||
|
#define NCOLS 40
|
||||||
|
|
||||||
|
void init_wins(WINDOW **wins, int n);
|
||||||
|
void win_show(WINDOW *win, char *label, int label_color);
|
||||||
|
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{ WINDOW *my_wins[3];
|
||||||
|
PANEL *my_panels[3];
|
||||||
|
PANEL *top;
|
||||||
|
int ch;
|
||||||
|
|
||||||
|
/* Initialize curses */
|
||||||
|
initscr();
|
||||||
|
start_color();
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
keypad(stdscr, TRUE);
|
||||||
|
|
||||||
|
/* Initialize all the colors */
|
||||||
|
init_pair(1, COLOR_RED, COLOR_BLACK);
|
||||||
|
init_pair(2, COLOR_GREEN, COLOR_BLACK);
|
||||||
|
init_pair(3, COLOR_BLUE, COLOR_BLACK);
|
||||||
|
init_pair(4, COLOR_CYAN, COLOR_BLACK);
|
||||||
|
|
||||||
|
init_wins(my_wins, 3);
|
||||||
|
|
||||||
|
/* Attach a panel to each window */ /* Order is bottom up */
|
||||||
|
my_panels[0] = new_panel(my_wins[0]); /* Push 0, order: stdscr-0 */
|
||||||
|
my_panels[1] = new_panel(my_wins[1]); /* Push 1, order: stdscr-0-1 */
|
||||||
|
my_panels[2] = new_panel(my_wins[2]); /* Push 2, order: stdscr-0-1-2 */
|
||||||
|
|
||||||
|
/* Set up the user pointers to the next panel */
|
||||||
|
set_panel_userptr(my_panels[0], my_panels[1]);
|
||||||
|
set_panel_userptr(my_panels[1], my_panels[2]);
|
||||||
|
set_panel_userptr(my_panels[2], my_panels[0]);
|
||||||
|
|
||||||
|
/* Update the stacking order. 2nd panel will be on top */
|
||||||
|
update_panels();
|
||||||
|
|
||||||
|
/* Show it on the screen */
|
||||||
|
attron(COLOR_PAIR(4));
|
||||||
|
mvprintw(LINES - 2, 0, "Use tab to browse through the windows (F1 to Exit)");
|
||||||
|
attroff(COLOR_PAIR(4));
|
||||||
|
doupdate();
|
||||||
|
|
||||||
|
top = my_panels[2];
|
||||||
|
while((ch = getch()) != KEY_F(1))
|
||||||
|
{ switch(ch)
|
||||||
|
{ case 9:
|
||||||
|
top = (PANEL *)panel_userptr(top);
|
||||||
|
top_panel(top);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
update_panels();
|
||||||
|
doupdate();
|
||||||
|
}
|
||||||
|
endwin();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Put all the windows */
|
||||||
|
void init_wins(WINDOW **wins, int n)
|
||||||
|
{ int x, y, i;
|
||||||
|
char label[80];
|
||||||
|
|
||||||
|
y = 2;
|
||||||
|
x = 10;
|
||||||
|
for(i = 0; i < n; ++i)
|
||||||
|
{ wins[i] = newwin(NLINES, NCOLS, y, x);
|
||||||
|
sprintf(label, "Window Number %d", i + 1);
|
||||||
|
win_show(wins[i], label, i + 1);
|
||||||
|
y += 3;
|
||||||
|
x += 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show the window with a border and a label */
|
||||||
|
void win_show(WINDOW *win, char *label, int label_color)
|
||||||
|
{ int startx, starty, height, width;
|
||||||
|
|
||||||
|
getbegyx(win, starty, startx);
|
||||||
|
getmaxyx(win, height, width);
|
||||||
|
|
||||||
|
box(win, 0, 0);
|
||||||
|
mvwaddch(win, 2, 0, ACS_LTEE);
|
||||||
|
mvwhline(win, 2, 1, ACS_HLINE, width - 2);
|
||||||
|
mvwaddch(win, 2, width - 1, ACS_RTEE);
|
||||||
|
|
||||||
|
print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color)
|
||||||
|
{ int length, x, y;
|
||||||
|
float temp;
|
||||||
|
|
||||||
|
if(win == NULL)
|
||||||
|
win = stdscr;
|
||||||
|
getyx(win, y, x);
|
||||||
|
if(startx != 0)
|
||||||
|
x = startx;
|
||||||
|
if(starty != 0)
|
||||||
|
y = starty;
|
||||||
|
if(width == 0)
|
||||||
|
width = 80;
|
||||||
|
|
||||||
|
length = strlen(string);
|
||||||
|
temp = (width - length)/ 2;
|
||||||
|
x = startx + (int)temp;
|
||||||
|
wattron(win, color);
|
||||||
|
mvwprintw(win, y, x, "%s", string);
|
||||||
|
wattroff(win, color);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
33
src/apps/scout_monitor/tests/test_scout_monitor.cpp
Normal file
33
src/apps/scout_monitor/tests/test_scout_monitor.cpp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "monitor/scout_monitor.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
ScoutMonitor monitor;
|
||||||
|
|
||||||
|
void SignalHandler(int s)
|
||||||
|
{
|
||||||
|
printf("Caught signal %d\n", s);
|
||||||
|
monitor.Terminate();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct sigaction sigIntHandler;
|
||||||
|
sigIntHandler.sa_handler = SignalHandler;
|
||||||
|
sigemptyset(&sigIntHandler.sa_mask);
|
||||||
|
sigIntHandler.sa_flags = 0;
|
||||||
|
sigaction(SIGINT, &sigIntHandler, NULL);
|
||||||
|
|
||||||
|
std::cout << "scout monitor started" << std::endl;
|
||||||
|
monitor.Run("can1");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
33
src/apps/scout_monitor/tests/test_scout_monitor_virtual.cpp
Normal file
33
src/apps/scout_monitor/tests/test_scout_monitor_virtual.cpp
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#include <signal.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "monitor/scout_monitor.hpp"
|
||||||
|
|
||||||
|
using namespace wescore;
|
||||||
|
|
||||||
|
ScoutMonitor monitor;
|
||||||
|
|
||||||
|
void SignalHandler(int s)
|
||||||
|
{
|
||||||
|
printf("Caught signal %d\n", s);
|
||||||
|
monitor.Terminate();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct sigaction sigIntHandler;
|
||||||
|
sigIntHandler.sa_handler = SignalHandler;
|
||||||
|
sigemptyset(&sigIntHandler.sa_mask);
|
||||||
|
sigIntHandler.sa_flags = 0;
|
||||||
|
sigaction(SIGINT, &sigIntHandler, NULL);
|
||||||
|
|
||||||
|
std::cout << "scout monitor started" << std::endl;
|
||||||
|
monitor.Run();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
24
src/async_io/CMakeLists.txt
Normal file
24
src/async_io/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Dependency libraries
|
||||||
|
# find_package(LIB_NAME REQUIRED)
|
||||||
|
|
||||||
|
add_subdirectory(asio)
|
||||||
|
|
||||||
|
# Add libraries
|
||||||
|
set(ASYNC_IO_LIB_SRC
|
||||||
|
src/async_serial.cpp
|
||||||
|
src/async_can.cpp
|
||||||
|
src/asyncio_utils.cpp
|
||||||
|
)
|
||||||
|
add_library(asyncio STATIC ${ASYNC_IO_LIB_SRC})
|
||||||
|
set_target_properties(asyncio PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||||
|
target_compile_definitions(asyncio PUBLIC "-DASIO_ENABLE_OLD_SERVICES -DASIO_HAS_POSIX_STREAM_DESCRIPTOR")
|
||||||
|
target_link_libraries(asyncio asio pthread)
|
||||||
|
target_include_directories(asyncio PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<INSTALL_INTERFACE:include>
|
||||||
|
PRIVATE src)
|
||||||
|
|
||||||
|
# Add executables
|
||||||
|
if(BUILD_TESTS)
|
||||||
|
add_subdirectory(tests)
|
||||||
|
endif()
|
||||||
9
src/async_io/asio/CMakeLists.txt
Normal file
9
src/async_io/asio/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
project(asio)
|
||||||
|
|
||||||
|
# ascent library
|
||||||
|
add_library(asio INTERFACE)
|
||||||
|
target_compile_definitions(asio INTERFACE "-DASIO_STANDALONE")
|
||||||
|
target_include_directories(asio INTERFACE
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<INSTALL_INTERFACE:include>)
|
||||||
4
src/async_io/asio/COPYING
Normal file
4
src/async_io/asio/COPYING
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
||||||
|
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
5
src/async_io/asio/INSTALL
Normal file
5
src/async_io/asio/INSTALL
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
See doc/index.html for information on:
|
||||||
|
- External dependencies
|
||||||
|
- Using asio
|
||||||
|
- Supported platforms
|
||||||
|
- How to build the tests and examples
|
||||||
23
src/async_io/asio/LICENSE_1_0.txt
Normal file
23
src/async_io/asio/LICENSE_1_0.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Boost 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.
|
||||||
19
src/async_io/asio/Makefile.am
Normal file
19
src/async_io/asio/Makefile.am
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
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
|
||||||
778
src/async_io/asio/Makefile.in
Normal file
778
src/async_io/asio/Makefile.in
Normal file
@@ -0,0 +1,778 @@
|
|||||||
|
# Makefile.in generated by automake 1.15.1 from Makefile.am.
|
||||||
|
# @configure_input@
|
||||||
|
|
||||||
|
# Copyright (C) 1994-2017 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 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@
|
||||||
|
runstatedir = @runstatedir@
|
||||||
|
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__depfiles_maybe)'; \
|
||||||
|
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
|
||||||
|
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: $(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:
|
||||||
4
src/async_io/asio/README
Normal file
4
src/async_io/asio/README
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
asio version 1.12.1
|
||||||
|
Released Sunday, 15 April 2018.
|
||||||
|
|
||||||
|
See doc/index.html for API documentation and a tutorial.
|
||||||
1188
src/async_io/asio/aclocal.m4
vendored
Normal file
1188
src/async_io/asio/aclocal.m4
vendored
Normal file
File diff suppressed because it is too large
Load Diff
343
src/async_io/asio/compile
Executable file
343
src/async_io/asio/compile
Executable file
@@ -0,0 +1,343 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# Wrapper for compilers which do not understand '-c -o'.
|
||||||
|
|
||||||
|
scriptversion=2012-03-05.13; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
|
||||||
|
# Software Foundation, Inc.
|
||||||
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
|
#
|
||||||
|
# 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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 <bug-automake@gnu.org> or send patches to
|
||||||
|
# <automake-patches@gnu.org>.
|
||||||
|
|
||||||
|
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
|
||||||
|
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 <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "compile $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
cl | *[/\\]cl | cl.exe | *[/\\]cl.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 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
1530
src/async_io/asio/config.guess
vendored
Executable file
1530
src/async_io/asio/config.guess
vendored
Executable file
File diff suppressed because it is too large
Load Diff
1782
src/async_io/asio/config.sub
vendored
Executable file
1782
src/async_io/asio/config.sub
vendored
Executable file
File diff suppressed because it is too large
Load Diff
6485
src/async_io/asio/configure
vendored
Executable file
6485
src/async_io/asio/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
186
src/async_io/asio/configure.ac
Normal file
186
src/async_io/asio/configure.ac
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
AC_INIT(asio, [1.12.1])
|
||||||
|
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])
|
||||||
708
src/async_io/asio/depcomp
Executable file
708
src/async_io/asio/depcomp
Executable file
@@ -0,0 +1,708 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
# depcomp - compile a program generating dependencies as side-effects
|
||||||
|
|
||||||
|
scriptversion=2012-03-27.16; # UTC
|
||||||
|
|
||||||
|
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
|
||||||
|
# 2011, 2012 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
# 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 <oliva@dcc.unicamp.br>.
|
||||||
|
|
||||||
|
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 <bug-automake@gnu.org>.
|
||||||
|
EOF
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
-v | --v*)
|
||||||
|
echo "depcomp $scriptversion"
|
||||||
|
exit $?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# A tabulation character.
|
||||||
|
tab=' '
|
||||||
|
# A newline character.
|
||||||
|
nl='
|
||||||
|
'
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
# 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 informations.
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
mv "$tmpdepfile" "$depfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
gcc)
|
||||||
|
## 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).
|
||||||
|
## - 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 -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
rm -f "$depfile"
|
||||||
|
echo "$object : \\" > "$depfile"
|
||||||
|
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
||||||
|
## 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.
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" |
|
||||||
|
## 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.
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
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
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#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.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
# Each line is of the form 'foo.o: dependent.h'.
|
||||||
|
# Do two passes, one to just change these to
|
||||||
|
# '$object: dependent.h' and one to simply 'dependent.h:'.
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
# The sourcefile does not contain any dependencies, so just
|
||||||
|
# store a dummy comment line, to avoid errors with the Makefile
|
||||||
|
# "include basename.Plo" scheme.
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
icc)
|
||||||
|
# Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
|
||||||
|
# However on
|
||||||
|
# $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
||||||
|
# ICC 7.0 will fill foo.d with something like
|
||||||
|
# foo.o: sub/foo.c
|
||||||
|
# foo.o: sub/foo.h
|
||||||
|
# which is wrong. We want
|
||||||
|
# sub/foo.o: sub/foo.c
|
||||||
|
# sub/foo.o: sub/foo.h
|
||||||
|
# sub/foo.c:
|
||||||
|
# sub/foo.h:
|
||||||
|
# ICC 7.1 will output
|
||||||
|
# foo.o: sub/foo.c sub/foo.h
|
||||||
|
# and will wrap long lines using '\':
|
||||||
|
# foo.o: sub/foo.c ... \
|
||||||
|
# sub/foo.h ... \
|
||||||
|
# ...
|
||||||
|
# tcc 0.9.26 (FIXME still under development at the moment of writing)
|
||||||
|
# will emit a similar output, but also prepend the continuation lines
|
||||||
|
# with horizontal tabulation characters.
|
||||||
|
"$@" -MD -MF "$tmpdepfile"
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
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 -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \
|
||||||
|
< "$tmpdepfile" > "$depfile"
|
||||||
|
sed '
|
||||||
|
s/[ '"$tab"'][ '"$tab"']*/ /g
|
||||||
|
s/^ *//
|
||||||
|
s/ *\\*$//
|
||||||
|
s/^[^:]*: *//
|
||||||
|
/^$/d
|
||||||
|
/:$/d
|
||||||
|
s/$/ :/
|
||||||
|
' < "$tmpdepfile" >> "$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.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
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 -eq 0; then :
|
||||||
|
else
|
||||||
|
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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
||||||
|
# Add 'dependent.h:' lines.
|
||||||
|
sed -ne '2,${
|
||||||
|
s/^ *//
|
||||||
|
s/ \\*$//
|
||||||
|
s/$/:/
|
||||||
|
p
|
||||||
|
}' "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#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.
|
||||||
|
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
||||||
|
test "x$dir" = "x$object" && dir=
|
||||||
|
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
||||||
|
|
||||||
|
if test "$libtool" = yes; then
|
||||||
|
# With Tru64 cc, shared objects can also be used to make a
|
||||||
|
# static library. This mechanism is used in libtool 1.4 series to
|
||||||
|
# handle both shared and static libraries in a single compilation.
|
||||||
|
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||||
|
#
|
||||||
|
# With libtool 1.5 this exception was removed, and libtool now
|
||||||
|
# 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.libs/$base.lo.d # libtool 1.4
|
||||||
|
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||||
|
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||||
|
"$@" -Wc,-MD
|
||||||
|
else
|
||||||
|
tmpdepfile1=$dir$base.o.d
|
||||||
|
tmpdepfile2=$dir$base.d
|
||||||
|
tmpdepfile3=$dir$base.d
|
||||||
|
tmpdepfile4=$dir$base.d
|
||||||
|
"$@" -MD
|
||||||
|
fi
|
||||||
|
|
||||||
|
stat=$?
|
||||||
|
if test $stat -eq 0; then :
|
||||||
|
else
|
||||||
|
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
exit $stat
|
||||||
|
fi
|
||||||
|
|
||||||
|
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||||
|
do
|
||||||
|
test -f "$tmpdepfile" && break
|
||||||
|
done
|
||||||
|
if test -f "$tmpdepfile"; then
|
||||||
|
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
||||||
|
sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
||||||
|
else
|
||||||
|
echo "#dummy" > "$depfile"
|
||||||
|
fi
|
||||||
|
rm -f "$tmpdepfile"
|
||||||
|
;;
|
||||||
|
|
||||||
|
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" = 0; then :
|
||||||
|
else
|
||||||
|
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"
|
||||||
|
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"
|
||||||
|
tr ' ' "$nl" < "$tmpdepfile" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
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"
|
||||||
|
sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
|
||||||
|
## Some versions of the HPUX 10.20 sed can't process this invocation
|
||||||
|
## correctly. Breaking it into two sed invocations is a workaround.
|
||||||
|
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 'write-file-hooks 'time-stamp)
|
||||||
|
# time-stamp-start: "scriptversion="
|
||||||
|
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||||
|
# time-stamp-time-zone: "UTC"
|
||||||
|
# time-stamp-end: "; # UTC"
|
||||||
|
# End:
|
||||||
BIN
src/async_io/asio/doc/asio.png
Normal file
BIN
src/async_io/asio/doc/asio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
54
src/async_io/asio/doc/asio/examples.html
Normal file
54
src/async_io/asio/doc/asio/examples.html
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Examples</title>
|
||||||
|
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../index.html" title="Asio">
|
||||||
|
<link rel="prev" href="tutorial/boost_bind.html" title="boost::bind">
|
||||||
|
<link rel="next" href="examples/cpp03_examples.html" title="C++03 Examples">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="tutorial/boost_bind.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="examples/cpp03_examples.html"><img src="../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||||
|
<a name="asio.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a>
|
||||||
|
</h2></div></div></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="examples/cpp03_examples.html" title="C++03 Examples">C++03 Examples</a>: Illustrates
|
||||||
|
the use of Asio using only C++03 language and library features. Where necessary,
|
||||||
|
the examples make use of selected Boost C++ libraries.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="examples/cpp11_examples.html" title="C++11 Examples">C++11 Examples</a>: 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.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="examples/cpp17_examples.html" title="C++17 Examples">C++17 Examples</a>: Selected
|
||||||
|
examples illustrating C++17 usage in conjunction with Technical Specifications.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="tutorial/boost_bind.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="examples/cpp03_examples.html"><img src="../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
635
src/async_io/asio/doc/asio/examples/cpp03_examples.html
Normal file
635
src/async_io/asio/doc/asio/examples/cpp03_examples.html
Normal file
@@ -0,0 +1,635 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>C++03 Examples</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../examples.html" title="Examples">
|
||||||
|
<link rel="prev" href="../examples.html" title="Examples">
|
||||||
|
<link rel="next" href="cpp11_examples.html" title="C++11 Examples">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp11_examples.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.examples.cpp03_examples"></a><a class="link" href="cpp03_examples.html" title="C++03 Examples">C++03 Examples</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h0"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.allocation"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.allocation">Allocation</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example shows how to customise the allocation of memory associated with
|
||||||
|
asynchronous operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/allocation/server.cpp" target="_top">../src/examples/cpp03/allocation/server.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h1"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.buffers"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.buffers">Buffers</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example demonstrates how to create reference counted buffers that can
|
||||||
|
be used with socket read and write operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/buffers/reference_counted.cpp" target="_top">../src/examples/cpp03/buffers/reference_counted.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h2"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.chat"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.chat">Chat</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/chat/chat_message.hpp" target="_top">../src/examples/cpp03/chat/chat_message.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/chat/chat_client.cpp" target="_top">../src/examples/cpp03/chat/chat_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/chat/chat_server.cpp" target="_top">../src/examples/cpp03/chat/chat_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
The following POSIX-specific chat client demonstrates how to use the <a class="link" href="../reference/posix__stream_descriptor.html" title="posix::stream_descriptor">posix::stream_descriptor</a>
|
||||||
|
class to perform console input and output.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/chat/posix_chat_client.cpp" target="_top">../src/examples/cpp03/chat/posix_chat_client.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h3"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.echo"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.echo">Echo</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
A collection of simple clients and servers, showing the use of both synchronous
|
||||||
|
and asynchronous operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/echo/async_tcp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/async_tcp_echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/echo/async_udp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/async_udp_echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/echo/blocking_tcp_echo_client.cpp" target="_top">../src/examples/cpp03/echo/blocking_tcp_echo_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/echo/blocking_tcp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/blocking_tcp_echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/echo/blocking_udp_echo_client.cpp" target="_top">../src/examples/cpp03/echo/blocking_udp_echo_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/echo/blocking_udp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/blocking_udp_echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h4"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.fork"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.fork">Fork</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
These POSIX-specific examples show how to use Asio in conjunction with the
|
||||||
|
<code class="computeroutput">fork()</code> system call. The first example illustrates the steps
|
||||||
|
required to start a daemon process:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/fork/daemon.cpp" target="_top">../src/examples/cpp03/fork/daemon.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
The second example demonstrates how it is possible to fork a process from
|
||||||
|
within a completion handler.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/fork/process_per_connection.cpp" target="_top">../src/examples/cpp03/fork/process_per_connection.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h5"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.http_client"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_client">HTTP
|
||||||
|
Client</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example programs implementing simple HTTP 1.0 clients. These examples show
|
||||||
|
how to use the <a class="link" href="../reference/read_until.html" title="read_until">read_until</a>
|
||||||
|
and <a class="link" href="../reference/async_read_until.html" title="async_read_until">async_read_until</a>
|
||||||
|
functions.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/client/sync_client.cpp" target="_top">../src/examples/cpp03/http/client/sync_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/client/async_client.cpp" target="_top">../src/examples/cpp03/http/client/async_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h6"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.http_server"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server">HTTP
|
||||||
|
Server</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/connection.cpp" target="_top">../src/examples/cpp03/http/server/connection.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/connection.hpp" target="_top">../src/examples/cpp03/http/server/connection.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/connection_manager.cpp" target="_top">../src/examples/cpp03/http/server/connection_manager.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/connection_manager.hpp" target="_top">../src/examples/cpp03/http/server/connection_manager.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/header.hpp" target="_top">../src/examples/cpp03/http/server/header.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/main.cpp" target="_top">../src/examples/cpp03/http/server/main.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/mime_types.cpp" target="_top">../src/examples/cpp03/http/server/mime_types.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/mime_types.hpp" target="_top">../src/examples/cpp03/http/server/mime_types.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/reply.cpp" target="_top">../src/examples/cpp03/http/server/reply.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/reply.hpp" target="_top">../src/examples/cpp03/http/server/reply.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/request.hpp" target="_top">../src/examples/cpp03/http/server/request.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/request_handler.cpp" target="_top">../src/examples/cpp03/http/server/request_handler.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/request_handler.hpp" target="_top">../src/examples/cpp03/http/server/request_handler.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/request_parser.cpp" target="_top">../src/examples/cpp03/http/server/request_parser.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/request_parser.hpp" target="_top">../src/examples/cpp03/http/server/request_parser.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/server.cpp" target="_top">../src/examples/cpp03/http/server/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server/server.hpp" target="_top">../src/examples/cpp03/http/server/server.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h7"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.http_server_2"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server_2">HTTP
|
||||||
|
Server 2</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
An HTTP server using an io_context-per-CPU design.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/connection.cpp" target="_top">../src/examples/cpp03/http/server2/connection.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/connection.hpp" target="_top">../src/examples/cpp03/http/server2/connection.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/header.hpp" target="_top">../src/examples/cpp03/http/server2/header.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/io_context_pool.cpp" target="_top">../src/examples/cpp03/http/server2/io_context_pool.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/io_context_pool.hpp" target="_top">../src/examples/cpp03/http/server2/io_context_pool.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/main.cpp" target="_top">../src/examples/cpp03/http/server2/main.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/mime_types.cpp" target="_top">../src/examples/cpp03/http/server2/mime_types.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/mime_types.hpp" target="_top">../src/examples/cpp03/http/server2/mime_types.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/reply.cpp" target="_top">../src/examples/cpp03/http/server2/reply.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/reply.hpp" target="_top">../src/examples/cpp03/http/server2/reply.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/request.hpp" target="_top">../src/examples/cpp03/http/server2/request.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/request_handler.cpp" target="_top">../src/examples/cpp03/http/server2/request_handler.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/request_handler.hpp" target="_top">../src/examples/cpp03/http/server2/request_handler.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/request_parser.cpp" target="_top">../src/examples/cpp03/http/server2/request_parser.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/request_parser.hpp" target="_top">../src/examples/cpp03/http/server2/request_parser.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/server.cpp" target="_top">../src/examples/cpp03/http/server2/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server2/server.hpp" target="_top">../src/examples/cpp03/http/server2/server.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h8"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.http_server_3"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server_3">HTTP
|
||||||
|
Server 3</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
An HTTP server using a single io_context and a thread pool calling <code class="computeroutput">io_context::run()</code>.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/connection.cpp" target="_top">../src/examples/cpp03/http/server3/connection.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/connection.hpp" target="_top">../src/examples/cpp03/http/server3/connection.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/header.hpp" target="_top">../src/examples/cpp03/http/server3/header.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/main.cpp" target="_top">../src/examples/cpp03/http/server3/main.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/mime_types.cpp" target="_top">../src/examples/cpp03/http/server3/mime_types.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/mime_types.hpp" target="_top">../src/examples/cpp03/http/server3/mime_types.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/reply.cpp" target="_top">../src/examples/cpp03/http/server3/reply.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/reply.hpp" target="_top">../src/examples/cpp03/http/server3/reply.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/request.hpp" target="_top">../src/examples/cpp03/http/server3/request.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/request_handler.cpp" target="_top">../src/examples/cpp03/http/server3/request_handler.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/request_handler.hpp" target="_top">../src/examples/cpp03/http/server3/request_handler.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/request_parser.cpp" target="_top">../src/examples/cpp03/http/server3/request_parser.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/request_parser.hpp" target="_top">../src/examples/cpp03/http/server3/request_parser.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/server.cpp" target="_top">../src/examples/cpp03/http/server3/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server3/server.hpp" target="_top">../src/examples/cpp03/http/server3/server.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h9"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.http_server_4"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server_4">HTTP
|
||||||
|
Server 4</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
A single-threaded HTTP server implemented using stackless coroutines.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/file_handler.cpp" target="_top">../src/examples/cpp03/http/server4/file_handler.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/file_handler.hpp" target="_top">../src/examples/cpp03/http/server4/file_handler.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/header.hpp" target="_top">../src/examples/cpp03/http/server4/header.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/main.cpp" target="_top">../src/examples/cpp03/http/server4/main.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/mime_types.cpp" target="_top">../src/examples/cpp03/http/server4/mime_types.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/mime_types.hpp" target="_top">../src/examples/cpp03/http/server4/mime_types.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/reply.cpp" target="_top">../src/examples/cpp03/http/server4/reply.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/reply.hpp" target="_top">../src/examples/cpp03/http/server4/reply.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/request.hpp" target="_top">../src/examples/cpp03/http/server4/request.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/request_parser.cpp" target="_top">../src/examples/cpp03/http/server4/request_parser.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/request_parser.hpp" target="_top">../src/examples/cpp03/http/server4/request_parser.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/server.cpp" target="_top">../src/examples/cpp03/http/server4/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/http/server4/server.hpp" target="_top">../src/examples/cpp03/http/server4/server.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h10"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.icmp"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.icmp">ICMP</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example shows how to use raw sockets with ICMP to ping a remote host.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/icmp/ping.cpp" target="_top">../src/examples/cpp03/icmp/ping.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/icmp/ipv4_header.hpp" target="_top">../src/examples/cpp03/icmp/ipv4_header.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/icmp/icmp_header.hpp" target="_top">../src/examples/cpp03/icmp/icmp_header.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h11"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.invocation"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.invocation">Invocation</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example shows how to customise handler invocation. Completion handlers
|
||||||
|
are added to a priority queue rather than executed immediately.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/invocation/prioritised_handlers.cpp" target="_top">../src/examples/cpp03/invocation/prioritised_handlers.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h12"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.iostreams"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.iostreams">Iostreams</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Two examples showing how to use <a class="link" href="../reference/ip__tcp/iostream.html" title="ip::tcp::iostream">ip::tcp::iostream</a>.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/iostreams/daytime_client.cpp" target="_top">../src/examples/cpp03/iostreams/daytime_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/iostreams/daytime_server.cpp" target="_top">../src/examples/cpp03/iostreams/daytime_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/iostreams/http_client.cpp" target="_top">../src/examples/cpp03/iostreams/http_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h13"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.multicast"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.multicast">Multicast</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
An example showing the use of multicast to transmit packets to a group of
|
||||||
|
subscribers.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/multicast/receiver.cpp" target="_top">../src/examples/cpp03/multicast/receiver.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/multicast/sender.cpp" target="_top">../src/examples/cpp03/multicast/sender.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h14"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.serialization"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.serialization">Serialization</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example shows how Boost.Serialization can be used with asio to encode
|
||||||
|
and decode structures for transmission over a socket.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/serialization/client.cpp" target="_top">../src/examples/cpp03/serialization/client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/serialization/connection.hpp" target="_top">../src/examples/cpp03/serialization/connection.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/serialization/server.cpp" target="_top">../src/examples/cpp03/serialization/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/serialization/stock.hpp" target="_top">../src/examples/cpp03/serialization/stock.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h15"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.services"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.services">Services</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example demonstrates how to integrate custom functionality (in this
|
||||||
|
case, for logging) into asio's <a class="link" href="../reference/io_context.html" title="io_context">io_context</a>,
|
||||||
|
and how to use a custom service with <a class="link" href="../reference/basic_stream_socket.html" title="basic_stream_socket">basic_stream_socket<></a>.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/services/basic_logger.hpp" target="_top">../src/examples/cpp03/services/basic_logger.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/services/daytime_client.cpp" target="_top">../src/examples/cpp03/services/daytime_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/services/logger.hpp" target="_top">../src/examples/cpp03/services/logger.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/services/logger_service.cpp" target="_top">../src/examples/cpp03/services/logger_service.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/services/logger_service.hpp" target="_top">../src/examples/cpp03/services/logger_service.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/services/stream_socket_service.hpp" target="_top">../src/examples/cpp03/services/stream_socket_service.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h16"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.socks_4"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.socks_4">SOCKS
|
||||||
|
4</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example client program implementing the SOCKS 4 protocol for communication
|
||||||
|
via a proxy.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/socks4/sync_client.cpp" target="_top">../src/examples/cpp03/socks4/sync_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/socks4/socks4.hpp" target="_top">../src/examples/cpp03/socks4/socks4.hpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h17"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.ssl"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.ssl">SSL</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example client and server programs showing the use of the <a class="link" href="../reference/ssl__stream.html" title="ssl::stream">ssl::stream<></a>
|
||||||
|
template with asynchronous operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/ssl/client.cpp" target="_top">../src/examples/cpp03/ssl/client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/ssl/server.cpp" target="_top">../src/examples/cpp03/ssl/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h18"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.timeouts"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.timeouts">Timeouts</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
A collection of examples showing how to cancel long running asynchronous
|
||||||
|
operations after a period of time.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/timeouts/async_tcp_client.cpp" target="_top">../src/examples/cpp03/timeouts/async_tcp_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/timeouts/blocking_tcp_client.cpp" target="_top">../src/examples/cpp03/timeouts/blocking_tcp_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp" target="_top">../src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/timeouts/blocking_udp_client.cpp" target="_top">../src/examples/cpp03/timeouts/blocking_udp_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/timeouts/server.cpp" target="_top">../src/examples/cpp03/timeouts/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h19"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.timers"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.timers">Timers</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example showing how to customise basic_waitable_timer using a different clock
|
||||||
|
type.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/timers/time_t_timer.cpp" target="_top">../src/examples/cpp03/timers/time_t_timer.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h20"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.porthopper"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.porthopper">Porthopper</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example illustrating mixed synchronous and asynchronous operations, and how
|
||||||
|
to use Boost.Lambda with Asio.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/porthopper/protocol.hpp" target="_top">../src/examples/cpp03/porthopper/protocol.hpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/porthopper/client.cpp" target="_top">../src/examples/cpp03/porthopper/client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/porthopper/server.cpp" target="_top">../src/examples/cpp03/porthopper/server.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h21"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.nonblocking"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.nonblocking">Nonblocking</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example demonstrating reactor-style operations for integrating a third-party
|
||||||
|
library that wants to perform the I/O operations itself.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/nonblocking/third_party_lib.cpp" target="_top">../src/examples/cpp03/nonblocking/third_party_lib.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h22"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.spawn"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.spawn">Spawn</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example of using the asio::spawn() function, a wrapper around the <a href="http://www.boost.org/doc/libs/release/libs/coroutine/index.html" target="_top">Boost.Coroutine</a>
|
||||||
|
library, to implement a chain of asynchronous operations using stackful coroutines.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/spawn/echo_server.cpp" target="_top">../src/examples/cpp03/spawn/echo_server.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h23"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.unix_domain_sockets"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.unix_domain_sockets">UNIX
|
||||||
|
Domain Sockets</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Examples showing how to use UNIX domain (local) sockets.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/local/connect_pair.cpp" target="_top">../src/examples/cpp03/local/connect_pair.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/local/iostream_client.cpp" target="_top">../src/examples/cpp03/local/iostream_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/local/stream_server.cpp" target="_top">../src/examples/cpp03/local/stream_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/local/stream_client.cpp" target="_top">../src/examples/cpp03/local/stream_client.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp03_examples.h24"></a>
|
||||||
|
<span><a name="asio.examples.cpp03_examples.windows"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.windows">Windows</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
An example showing how to use the Windows-specific function <code class="computeroutput">TransmitFile</code>
|
||||||
|
with Asio.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp03/windows/transmit_file.cpp" target="_top">../src/examples/cpp03/windows/transmit_file.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp11_examples.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
326
src/async_io/asio/doc/asio/examples/cpp11_examples.html
Normal file
326
src/async_io/asio/doc/asio/examples/cpp11_examples.html
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>C++11 Examples</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../examples.html" title="Examples">
|
||||||
|
<link rel="prev" href="cpp03_examples.html" title="C++03 Examples">
|
||||||
|
<link rel="next" href="cpp17_examples.html" title="C++17 Examples">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="cpp03_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp17_examples.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.examples.cpp11_examples"></a><a class="link" href="cpp11_examples.html" title="C++11 Examples">C++11 Examples</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h0"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.allocation"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.allocation">Allocation</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example shows how to customise the allocation of memory associated with
|
||||||
|
asynchronous operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/allocation/server.cpp" target="_top">../src/examples/cpp11/allocation/server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/allocation/server.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h1"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.buffers"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.buffers">Buffers</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example demonstrates how to create reference counted buffers that can
|
||||||
|
be used with socket read and write operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/buffers/reference_counted.cpp" target="_top">../src/examples/cpp11/buffers/reference_counted.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/buffers/reference_counted.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h2"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.chat"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.chat">Chat</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/chat/chat_message.hpp" target="_top">../src/examples/cpp11/chat/chat_message.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/chat/chat_message.hpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/chat/chat_client.cpp" target="_top">../src/examples/cpp11/chat/chat_client.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/chat/chat_client.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/chat/chat_server.cpp" target="_top">../src/examples/cpp11/chat/chat_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/chat/chat_server.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h3"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.echo"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.echo">Echo</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
A collection of simple clients and servers, showing the use of both synchronous
|
||||||
|
and asynchronous operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/echo/async_tcp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/async_tcp_echo_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/echo/async_tcp_echo_server.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/echo/async_udp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/async_udp_echo_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/echo/async_udp_echo_server.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/echo/blocking_tcp_echo_client.cpp" target="_top">../src/examples/cpp11/echo/blocking_tcp_echo_client.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/echo/blocking_tcp_echo_client.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/echo/blocking_tcp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/blocking_tcp_echo_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/echo/blocking_tcp_echo_server.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/echo/blocking_udp_echo_client.cpp" target="_top">../src/examples/cpp11/echo/blocking_udp_echo_client.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/echo/blocking_udp_echo_client.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/echo/blocking_udp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/blocking_udp_echo_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/echo/blocking_udp_echo_server.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h4"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.fork"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.fork">Fork</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
These POSIX-specific examples show how to use Asio in conjunction with the
|
||||||
|
<code class="computeroutput">fork()</code> system call. The first example illustrates the steps
|
||||||
|
required to start a daemon process:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/fork/daemon.cpp" target="_top">../src/examples/cpp11/fork/daemon.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/fork/daemon.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
The second example demonstrates how it is possible to fork a process from
|
||||||
|
within a completion handler.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/fork/process_per_connection.cpp" target="_top">../src/examples/cpp11/fork/process_per_connection.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/fork/process_per_connection.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h5"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.futures"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.futures">Futures</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example demonstrates how to use std::future in conjunction with Asio's
|
||||||
|
asynchronous operations.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/futures/daytime_client.cpp" target="_top">../src/examples/cpp11/futures/daytime_client.cpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h6"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.handler_tracking"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.handler_tracking">Handler
|
||||||
|
Tracking</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
This example shows how to implement custom handler tracking.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/handler_tracking/custom_tracking.hpp" target="_top">../src/examples/cpp11/handler_tracking/custom_tracking.hpp</a>
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h7"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.http_server"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.http_server">HTTP
|
||||||
|
Server</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/connection.cpp" target="_top">../src/examples/cpp11/http/server/connection.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/connection.cpp.html" target="_top">diff to
|
||||||
|
C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/connection.hpp" target="_top">../src/examples/cpp11/http/server/connection.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/connection.hpp.html" target="_top">diff to
|
||||||
|
C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/connection_manager.cpp" target="_top">../src/examples/cpp11/http/server/connection_manager.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/connection_manager.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/connection_manager.hpp" target="_top">../src/examples/cpp11/http/server/connection_manager.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/connection_manager.hpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/header.hpp" target="_top">../src/examples/cpp11/http/server/header.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/header.hpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/main.cpp" target="_top">../src/examples/cpp11/http/server/main.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/main.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/mime_types.cpp" target="_top">../src/examples/cpp11/http/server/mime_types.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/mime_types.cpp.html" target="_top">diff to
|
||||||
|
C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/mime_types.hpp" target="_top">../src/examples/cpp11/http/server/mime_types.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/mime_types.hpp.html" target="_top">diff to
|
||||||
|
C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/reply.cpp" target="_top">../src/examples/cpp11/http/server/reply.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/reply.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/reply.hpp" target="_top">../src/examples/cpp11/http/server/reply.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/reply.hpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/request.hpp" target="_top">../src/examples/cpp11/http/server/request.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/request.hpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/request_handler.cpp" target="_top">../src/examples/cpp11/http/server/request_handler.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/request_handler.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/request_handler.hpp" target="_top">../src/examples/cpp11/http/server/request_handler.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/request_handler.hpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/request_parser.cpp" target="_top">../src/examples/cpp11/http/server/request_parser.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/request_parser.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/request_parser.hpp" target="_top">../src/examples/cpp11/http/server/request_parser.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/request_parser.hpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/server.cpp" target="_top">../src/examples/cpp11/http/server/server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/server.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/http/server/server.hpp" target="_top">../src/examples/cpp11/http/server/server.hpp</a>
|
||||||
|
(<a href="../../examples/diffs/http/server/server.hpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h8"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.multicast"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.multicast">Multicast</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
An example showing the use of multicast to transmit packets to a group of
|
||||||
|
subscribers.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/multicast/receiver.cpp" target="_top">../src/examples/cpp11/multicast/receiver.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/multicast/receiver.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/multicast/sender.cpp" target="_top">../src/examples/cpp11/multicast/sender.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/multicast/sender.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h9"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.nonblocking"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.nonblocking">Nonblocking</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example demonstrating reactor-style operations for integrating a third-party
|
||||||
|
library that wants to perform the I/O operations itself.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/nonblocking/third_party_lib.cpp" target="_top">../src/examples/cpp11/nonblocking/third_party_lib.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/nonblocking/third_party_lib.cpp.html" target="_top">diff
|
||||||
|
to C++03</a>)
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h10"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.spawn"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.spawn">Spawn</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Example of using the asio::spawn() function, a wrapper around the <a href="http://www.boost.org/doc/libs/release/libs/coroutine/index.html" target="_top">Boost.Coroutine</a>
|
||||||
|
library, to implement a chain of asynchronous operations using stackful coroutines.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/spawn/echo_server.cpp" target="_top">../src/examples/cpp11/spawn/echo_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/spawn/echo_server.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp11_examples.h11"></a>
|
||||||
|
<span><a name="asio.examples.cpp11_examples.unix_domain_sockets"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.unix_domain_sockets">UNIX
|
||||||
|
Domain Sockets</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Examples showing how to use UNIX domain (local) sockets.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/local/connect_pair.cpp" target="_top">../src/examples/cpp11/local/connect_pair.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/local/connect_pair.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/local/iostream_client.cpp" target="_top">../src/examples/cpp11/local/iostream_client.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/local/iostream_client.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/local/stream_server.cpp" target="_top">../src/examples/cpp11/local/stream_server.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/local/stream_server.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../../../src/examples/cpp11/local/stream_client.cpp" target="_top">../src/examples/cpp11/local/stream_client.cpp</a>
|
||||||
|
(<a href="../../examples/diffs/local/stream_client.cpp.html" target="_top">diff to C++03</a>)
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="cpp03_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp17_examples.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
62
src/async_io/asio/doc/asio/examples/cpp17_examples.html
Normal file
62
src/async_io/asio/doc/asio/examples/cpp17_examples.html
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>C++17 Examples</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../examples.html" title="Examples">
|
||||||
|
<link rel="prev" href="cpp11_examples.html" title="C++11 Examples">
|
||||||
|
<link rel="next" href="../reference.html" title="Reference">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="cpp11_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.examples.cpp17_examples"></a><a class="link" href="cpp17_examples.html" title="C++17 Examples">C++17 Examples</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.examples.cpp17_examples.h0"></a>
|
||||||
|
<span><a name="asio.examples.cpp17_examples.coroutines_ts_support"></a></span><a class="link" href="cpp17_examples.html#asio.examples.cpp17_examples.coroutines_ts_support">Coroutines
|
||||||
|
TS Support</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Examples showing how to implement a chain of asynchronous operations using
|
||||||
|
the Coroutines TS.
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../example/cpp17/coroutines_ts/echo_server.cpp" target="_top">asio/example/cpp17/coroutines_ts/echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../example/cpp17/coroutines_ts/refactored_echo_server.cpp" target="_top">asio/example/cpp17/coroutines_ts/refactored_echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../example/cpp17/coroutines_ts/double_buffered_echo_server.cpp" target="_top">asio/example/cpp17/coroutines_ts/double_buffered_echo_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../example/cpp17/coroutines_ts/chat_server.cpp" target="_top">asio/example/cpp17/coroutines_ts/chat_server.cpp</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a href="../example/cpp17/coroutines_ts/range_based_for.cpp" target="_top">asio/example/cpp17/coroutines_ts/range_based_for.cpp</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="cpp11_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1984
src/async_io/asio/doc/asio/history.html
Normal file
1984
src/async_io/asio/doc/asio/history.html
Normal file
File diff suppressed because it is too large
Load Diff
4960
src/async_io/asio/doc/asio/index.html
Normal file
4960
src/async_io/asio/doc/asio/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1221
src/async_io/asio/doc/asio/net_ts.html
Normal file
1221
src/async_io/asio/doc/asio/net_ts.html
Normal file
File diff suppressed because it is too large
Load Diff
155
src/async_io/asio/doc/asio/overview.html
Normal file
155
src/async_io/asio/doc/asio/overview.html
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Overview</title>
|
||||||
|
<link rel="stylesheet" href="../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../index.html" title="Asio">
|
||||||
|
<link rel="prev" href="../index.html" title="Asio">
|
||||||
|
<link rel="next" href="overview/rationale.html" title="Rationale">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../index.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="overview/rationale.html"><img src="../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
|
||||||
|
<a name="asio.overview"></a><a class="link" href="overview.html" title="Overview">Overview</a>
|
||||||
|
</h2></div></div></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/rationale.html" title="Rationale">Rationale</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core.html" title="Core Concepts and Functionality">Core Concepts and Functionality</a>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/basics.html" title="Basic Asio Anatomy">Basic Asio Anatomy</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/async.html" title="The Proactor Design Pattern: Concurrency Without Threads">The Proactor Design Pattern:
|
||||||
|
Concurrency Without Threads</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/threads.html" title="Threads and Asio">Threads and Asio</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/strands.html" title="Strands: Use Threads Without Explicit Locking">Strands: Use Threads Without
|
||||||
|
Explicit Locking</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/buffers.html" title="Buffers">Buffers</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/streams.html" title="Streams, Short Reads and Short Writes">Streams, Short Reads and
|
||||||
|
Short Writes</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/reactor.html" title="Reactor-Style Operations">Reactor-Style Operations</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/line_based.html" title="Line-Based Operations">Line-Based Operations</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/allocation.html" title="Custom Memory Allocation">Custom Memory Allocation</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/handler_tracking.html" title="Handler Tracking">Handler Tracking</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/concurrency_hint.html" title="Concurrency Hints">Concurrency Hints</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/core/coroutines_ts.html" title="Coroutines TS Support (experimental)">Coroutines TS Support
|
||||||
|
(experimental)</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/networking.html" title="Networking">Networking</a>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/networking/protocols.html" title="TCP, UDP and ICMP">TCP, UDP and ICMP</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/networking/other_protocols.html" title="Support for Other Protocols">Support
|
||||||
|
for Other Protocols</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/networking/iostreams.html" title="Socket Iostreams">Socket Iostreams</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/networking/bsd_sockets.html" title="The BSD Socket API and Asio">The BSD Socket
|
||||||
|
API and Asio</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/timers.html" title="Timers">Timers</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/serial_ports.html" title="Serial Ports">Serial Ports</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/signals.html" title="Signal Handling">Signal Handling</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/posix.html" title="POSIX-Specific Functionality">POSIX-Specific Functionality</a>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/posix/local.html" title="UNIX Domain Sockets">UNIX Domain Sockets</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/posix/stream_descriptor.html" title="Stream-Oriented File Descriptors">Stream-Oriented
|
||||||
|
File Descriptors</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/windows.html" title="Windows-Specific Functionality">Windows-Specific Functionality</a>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/windows/stream_handle.html" title="Stream-Oriented HANDLEs">Stream-Oriented
|
||||||
|
HANDLEs</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/windows/random_access_handle.html" title="Random-Access HANDLEs">Random-Access
|
||||||
|
HANDLEs</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/ssl.html" title="SSL">SSL</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/cpp2011.html" title="C++ 2011 Support">C++ 2011 Support</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="overview/implementation.html" title="Platform-Specific Implementation Notes">Platform-Specific Implementation
|
||||||
|
Notes</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../index.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="overview/rationale.html"><img src="../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
84
src/async_io/asio/doc/asio/overview/core.html
Normal file
84
src/async_io/asio/doc/asio/overview/core.html
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Core Concepts and Functionality</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="rationale.html" title="Rationale">
|
||||||
|
<link rel="next" href="core/basics.html" title="Basic Asio Anatomy">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="rationale.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core/basics.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.core"></a><a class="link" href="core.html" title="Core Concepts and Functionality">Core Concepts and Functionality</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/basics.html" title="Basic Asio Anatomy">Basic Asio Anatomy</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/async.html" title="The Proactor Design Pattern: Concurrency Without Threads">The Proactor Design Pattern:
|
||||||
|
Concurrency Without Threads</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/threads.html" title="Threads and Asio">Threads and Asio</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/strands.html" title="Strands: Use Threads Without Explicit Locking">Strands: Use Threads Without
|
||||||
|
Explicit Locking</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/buffers.html" title="Buffers">Buffers</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/streams.html" title="Streams, Short Reads and Short Writes">Streams, Short Reads and Short
|
||||||
|
Writes</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/reactor.html" title="Reactor-Style Operations">Reactor-Style Operations</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/line_based.html" title="Line-Based Operations">Line-Based Operations</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/allocation.html" title="Custom Memory Allocation">Custom Memory Allocation</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/handler_tracking.html" title="Handler Tracking">Handler Tracking</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/concurrency_hint.html" title="Concurrency Hints">Concurrency Hints</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="core/coroutines_ts.html" title="Coroutines TS Support (experimental)">Coroutines TS Support
|
||||||
|
(experimental)</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="rationale.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core/basics.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
135
src/async_io/asio/doc/asio/overview/core/allocation.html
Normal file
135
src/async_io/asio/doc/asio/overview/core/allocation.html
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Custom Memory Allocation</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="line_based.html" title="Line-Based Operations">
|
||||||
|
<link rel="next" href="handler_tracking.html" title="Handler Tracking">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="line_based.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="handler_tracking.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.allocation"></a><a class="link" href="allocation.html" title="Custom Memory Allocation">Custom Memory Allocation</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Many asynchronous operations need to allocate an object to store state
|
||||||
|
associated with the operation. For example, a Win32 implementation needs
|
||||||
|
<code class="computeroutput"><span class="identifier">OVERLAPPED</span></code>-derived objects
|
||||||
|
to pass to Win32 API functions.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Given a copy of a user-defined <code class="computeroutput"><span class="identifier">Handler</span></code>
|
||||||
|
object <code class="computeroutput"><span class="identifier">h</span></code>, if the implementation
|
||||||
|
needs to allocate memory associated with that handler it will obtain an
|
||||||
|
allocator using the <code class="computeroutput"><span class="identifier">get_associated_allocator</span></code>
|
||||||
|
function. For example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">associated_allocator_t</span><span class="special"><</span><span class="identifier">Handler</span><span class="special">></span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The associated allocator must satisfy the standard Allocator requirements.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
By default, handlers use the standard allocator (which is implemented in
|
||||||
|
terms of <code class="computeroutput"><span class="special">::</span><span class="keyword">operator</span>
|
||||||
|
<span class="keyword">new</span><span class="special">()</span></code>
|
||||||
|
and <code class="computeroutput"><span class="special">::</span><span class="keyword">operator</span>
|
||||||
|
<span class="keyword">delete</span><span class="special">()</span></code>).
|
||||||
|
The allocator may be customised for a particular handler type by specifying
|
||||||
|
a nested type <code class="computeroutput"><span class="identifier">allocator_type</span></code>
|
||||||
|
and member function <code class="computeroutput"><span class="identifier">get_allocator</span><span class="special">()</span></code>:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">my_handler</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">public</span><span class="special">:</span>
|
||||||
|
<span class="comment">// Custom implementation of Allocator type requirements.</span>
|
||||||
|
<span class="keyword">typedef</span> <span class="identifier">my_allocator</span> <span class="identifier">allocator_type</span><span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="comment">// Return a custom allocator implementation.</span>
|
||||||
|
<span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">my_allocator</span><span class="special">();</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
|
||||||
|
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
In more complex cases, the <code class="computeroutput"><span class="identifier">associated_allocator</span></code>
|
||||||
|
template may be partially specialised directly:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">asio</span> <span class="special">{</span>
|
||||||
|
|
||||||
|
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Allocator</span><span class="special">></span>
|
||||||
|
<span class="keyword">struct</span> <span class="identifier">associated_allocator</span><span class="special"><</span><span class="identifier">my_handler</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">></span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="comment">// Custom implementation of Allocator type requirements.</span>
|
||||||
|
<span class="keyword">typedef</span> <span class="identifier">my_allocator</span> <span class="identifier">type</span><span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="comment">// Return a custom allocator implementation.</span>
|
||||||
|
<span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">my_handler</span><span class="special">&,</span>
|
||||||
|
<span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">())</span> <span class="keyword">noexcept</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">my_allocator</span><span class="special">();</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
|
||||||
|
<span class="special">}</span> <span class="comment">// namespace asio</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.allocation.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.allocation.see_also"></a></span><a class="link" href="allocation.html#asio.overview.core.allocation.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/associated_allocator.html" title="associated_allocator">associated_allocator</a>,
|
||||||
|
<a class="link" href="../../reference/get_associated_allocator.html" title="get_associated_allocator">get_associated_allocator</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.allocation">custom memory allocation
|
||||||
|
example (C++03)</a>, <a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.allocation">custom
|
||||||
|
memory allocation example (C++11)</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="line_based.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="handler_tracking.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
279
src/async_io/asio/doc/asio/overview/core/async.html
Normal file
279
src/async_io/asio/doc/asio/overview/core/async.html
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>The Proactor Design Pattern: Concurrency Without Threads</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="basics.html" title="Basic Asio Anatomy">
|
||||||
|
<link rel="next" href="threads.html" title="Threads and Asio">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="basics.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="threads.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.async"></a><a class="link" href="async.html" title="The Proactor Design Pattern: Concurrency Without Threads">The Proactor Design Pattern:
|
||||||
|
Concurrency Without Threads</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
The Asio library offers side-by-side support for synchronous and asynchronous
|
||||||
|
operations. The asynchronous support is based on the Proactor design pattern
|
||||||
|
<a class="link" href="async.html#asio.overview.core.async.references">[POSA2]</a>. The
|
||||||
|
advantages and disadvantages of this approach, when compared to a synchronous-only
|
||||||
|
or Reactor approach, are outlined below.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.async.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.async.proactor_and_asio"></a></span><a class="link" href="async.html#asio.overview.core.async.proactor_and_asio">Proactor
|
||||||
|
and Asio</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
Let us examine how the Proactor design pattern is implemented in Asio,
|
||||||
|
without reference to platform-specific details.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../../../proactor.png" alt="proactor"></span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="bold"><strong>Proactor design pattern (adapted from [POSA2])</strong></span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Operation
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Defines an operation that is executed asynchronously, such as an asynchronous
|
||||||
|
read or write on a socket.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Operation Processor
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Executes asynchronous operations and queues events on a completion event
|
||||||
|
queue when operations complete. From a high-level point of view, internal
|
||||||
|
services like <code class="computeroutput"><span class="identifier">reactive_socket_service</span></code>
|
||||||
|
are asynchronous operation processors.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Completion Event Queue
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Buffers completion events until they are dequeued by an asynchronous
|
||||||
|
event demultiplexer.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Completion Handler
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Processes the result of an asynchronous operation. These are function
|
||||||
|
objects, often created using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Event Demultiplexer
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Blocks waiting for events to occur on the completion event queue, and
|
||||||
|
returns a completed event to its caller.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Proactor
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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 <code class="computeroutput"><span class="identifier">io_context</span></code> class.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Initiator
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Application-specific code that starts asynchronous operations. The initiator
|
||||||
|
interacts with an asynchronous operation processor via a high-level interface
|
||||||
|
such as <code class="computeroutput"><span class="identifier">basic_stream_socket</span></code>,
|
||||||
|
which in turn delegates to a service like <code class="computeroutput"><span class="identifier">reactive_socket_service</span></code>.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.async.h1"></a>
|
||||||
|
<span><a name="asio.overview.core.async.implementation_using_reactor"></a></span><a class="link" href="async.html#asio.overview.core.async.implementation_using_reactor">Implementation
|
||||||
|
Using Reactor</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
On many platforms, Asio implements the Proactor design pattern in terms
|
||||||
|
of a Reactor, such as <code class="computeroutput"><span class="identifier">select</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">epoll</span></code> or <code class="computeroutput"><span class="identifier">kqueue</span></code>. This implementation approach
|
||||||
|
corresponds to the Proactor design pattern as follows:
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Operation Processor
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
A reactor implemented using <code class="computeroutput"><span class="identifier">select</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">epoll</span></code> or <code class="computeroutput"><span class="identifier">kqueue</span></code>. 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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Completion Event Queue
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
A linked list of completion handlers (i.e. function objects).
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Event Demultiplexer
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
This is implemented by waiting on an event or condition variable until
|
||||||
|
a completion handler is available in the completion event queue.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.async.h2"></a>
|
||||||
|
<span><a name="asio.overview.core.async.implementation_using_windows_overlapped_i_o"></a></span><a class="link" href="async.html#asio.overview.core.async.implementation_using_windows_overlapped_i_o">Implementation
|
||||||
|
Using Windows Overlapped I/O</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Operation Processor
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
This is implemented by the operating system. Operations are initiated
|
||||||
|
by calling an overlapped function such as <code class="computeroutput"><span class="identifier">AcceptEx</span></code>.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Completion Event Queue
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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 <code class="computeroutput"><span class="identifier">io_context</span></code> instance.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Asynchronous Event Demultiplexer
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Called by Asio to dequeue events and their associated completion handlers.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.async.h3"></a>
|
||||||
|
<span><a name="asio.overview.core.async.advantages"></a></span><a class="link" href="async.html#asio.overview.core.async.advantages">Advantages</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
— Portability.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
Many operating systems offer a native asynchronous I/O API (such as overlapped
|
||||||
|
I/O on <span class="emphasis"><em>Windows</em></span>) 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 <span class="emphasis"><em>POSIX</em></span>
|
||||||
|
<code class="computeroutput"><span class="identifier">select</span><span class="special">()</span></code>.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Decoupling threading from concurrency.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Performance and scalability.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Simplified application synchronisation.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Function composition.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.async.h4"></a>
|
||||||
|
<span><a name="asio.overview.core.async.disadvantages"></a></span><a class="link" href="async.html#asio.overview.core.async.disadvantages">Disadvantages</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
— Program complexity.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<p>
|
||||||
|
— Memory usage.
|
||||||
|
</p>
|
||||||
|
<div class="blockquote"><blockquote class="blockquote"><p>
|
||||||
|
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.
|
||||||
|
</p></blockquote></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.async.h5"></a>
|
||||||
|
<span><a name="asio.overview.core.async.references"></a></span><a class="link" href="async.html#asio.overview.core.async.references">References</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
[POSA2] D. Schmidt et al, <span class="emphasis"><em>Pattern Oriented Software Architecture,
|
||||||
|
Volume 2</em></span>. Wiley, 2000.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="basics.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="threads.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
166
src/async_io/asio/doc/asio/overview/core/basics.html
Normal file
166
src/async_io/asio/doc/asio/overview/core/basics.html
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Basic Asio Anatomy</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="next" href="async.html" title="The Proactor Design Pattern: Concurrency Without Threads">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../core.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="async.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.basics"></a><a class="link" href="basics.html" title="Basic Asio Anatomy">Basic Asio Anatomy</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../../../sync_op.png" alt="sync_op"></span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="bold"><strong>Your program</strong></span> will have at least one <span class="bold"><strong>io_context</strong></span> object. The <span class="bold"><strong>io_context</strong></span>
|
||||||
|
represents <span class="bold"><strong>your program</strong></span>'s link to the
|
||||||
|
<span class="bold"><strong>operating system</strong></span>'s I/O services.
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">io_context</span> <span class="identifier">io_context</span><span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
To perform I/O operations <span class="bold"><strong>your program</strong></span>
|
||||||
|
will need an <span class="bold"><strong>I/O object</strong></span> such as a TCP
|
||||||
|
socket:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">socket</span><span class="special">(</span><span class="identifier">io_context</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
When a synchronous connect operation is performed, the following sequence
|
||||||
|
of events occurs:
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
1. <span class="bold"><strong>Your program</strong></span> initiates the connect
|
||||||
|
operation by calling the <span class="bold"><strong>I/O object</strong></span>:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">socket</span><span class="special">.</span><span class="identifier">connect</span><span class="special">(</span><span class="identifier">server_endpoint</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
2. The <span class="bold"><strong>I/O object</strong></span> forwards the request
|
||||||
|
to the <span class="bold"><strong>io_context</strong></span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
3. The <span class="bold"><strong>io_context</strong></span> calls on the <span class="bold"><strong>operating system</strong></span> to perform the connect operation.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
4. The <span class="bold"><strong>operating system</strong></span> returns the result
|
||||||
|
of the operation to the <span class="bold"><strong>io_context</strong></span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
5. The <span class="bold"><strong>io_context</strong></span> translates any error
|
||||||
|
resulting from the operation into an object of type <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span></code>.
|
||||||
|
An <code class="computeroutput"><span class="identifier">error_code</span></code> may be compared
|
||||||
|
with specific values, or tested as a boolean (where a <code class="computeroutput"><span class="keyword">false</span></code>
|
||||||
|
result means that no error occurred). The result is then forwarded back
|
||||||
|
up to the <span class="bold"><strong>I/O object</strong></span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
6. The <span class="bold"><strong>I/O object</strong></span> throws an exception
|
||||||
|
of type <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">system_error</span></code> if the operation failed.
|
||||||
|
If the code to initiate the operation had instead been written as:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span>
|
||||||
|
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">connect</span><span class="special">(</span><span class="identifier">server_endpoint</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
then the <code class="computeroutput"><span class="identifier">error_code</span></code> variable
|
||||||
|
<code class="computeroutput"><span class="identifier">ec</span></code> would be set to the
|
||||||
|
result of the operation, and no exception would be thrown.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
When an asynchronous operation is used, a different sequence of events
|
||||||
|
occurs.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../../../async_op1.png" alt="async_op1"></span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
1. <span class="bold"><strong>Your program</strong></span> initiates the connect
|
||||||
|
operation by calling the <span class="bold"><strong>I/O object</strong></span>:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">socket</span><span class="special">.</span><span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">server_endpoint</span><span class="special">,</span> <span class="identifier">your_completion_handler</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
where <code class="computeroutput"><span class="identifier">your_completion_handler</span></code>
|
||||||
|
is a function or function object with the signature:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">your_completion_handler</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">ec</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The exact signature required depends on the asynchronous operation being
|
||||||
|
performed. The reference documentation indicates the appropriate form for
|
||||||
|
each operation.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
2. The <span class="bold"><strong>I/O object</strong></span> forwards the request
|
||||||
|
to the <span class="bold"><strong>io_context</strong></span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
3. The <span class="bold"><strong>io_context</strong></span> signals to the <span class="bold"><strong>operating system</strong></span> that it should start an asynchronous
|
||||||
|
connect.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Time passes. (In the synchronous case this wait would have been contained
|
||||||
|
entirely within the duration of the connect operation.)
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<span class="inlinemediaobject"><img src="../../../async_op2.png" alt="async_op2"></span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
4. The <span class="bold"><strong>operating system</strong></span> indicates that
|
||||||
|
the connect operation has completed by placing the result on a queue, ready
|
||||||
|
to be picked up by the <span class="bold"><strong>io_context</strong></span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
5. <span class="bold"><strong>Your program</strong></span> must make a call to <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>
|
||||||
|
(or to one of the similar <span class="bold"><strong>io_context</strong></span> member
|
||||||
|
functions) in order for the result to be retrieved. A call to <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>
|
||||||
|
blocks while there are unfinished asynchronous operations, so you would
|
||||||
|
typically call it as soon as you have started your first asynchronous operation.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
6. While inside the call to <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>, the <span class="bold"><strong>io_context</strong></span>
|
||||||
|
dequeues the result of the operation, translates it into an <code class="computeroutput"><span class="identifier">error_code</span></code>, and then passes it to <span class="bold"><strong>your completion handler</strong></span>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../core.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="async.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
234
src/async_io/asio/doc/asio/overview/core/buffers.html
Normal file
234
src/async_io/asio/doc/asio/overview/core/buffers.html
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Buffers</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="strands.html" title="Strands: Use Threads Without Explicit Locking">
|
||||||
|
<link rel="next" href="streams.html" title="Streams, Short Reads and Short Writes">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="strands.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="streams.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.buffers"></a><a class="link" href="buffers.html" title="Buffers">Buffers</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
A scatter-read receives data into multiple buffers.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
A gather-write transmits multiple buffers.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">void</span><span class="special">*,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">mutable_buffer</span><span class="special">;</span>
|
||||||
|
<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">></span> <span class="identifier">const_buffer</span><span class="special">;</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Here, a mutable_buffer would be convertible to a const_buffer, but conversion
|
||||||
|
in the opposite direction is not valid.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
However, Asio does not use the above definitions as-is, but instead defines
|
||||||
|
two classes: <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
|
||||||
|
and <code class="computeroutput"><span class="identifier">const_buffer</span></code>. The goal
|
||||||
|
of these is to provide an opaque representation of contiguous memory, where:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Types behave as std::pair would in conversions. That is, a <code class="computeroutput"><span class="identifier">mutable_buffer</span></code> is convertible to
|
||||||
|
a <code class="computeroutput"><span class="identifier">const_buffer</span></code>, but
|
||||||
|
the opposite conversion is disallowed.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
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, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code>
|
||||||
|
or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code> of POD elements, or from a
|
||||||
|
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
The underlying memory is explicitly accessed using the <code class="computeroutput"><span class="identifier">data</span><span class="special">()</span></code>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Finally, multiple buffers can be passed to scatter-gather operations (such
|
||||||
|
as <a class="link" href="../../reference/read.html" title="read">read()</a> or <a class="link" href="../../reference/write.html" title="write">write()</a>)
|
||||||
|
by putting the buffer objects into a container. The <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code>
|
||||||
|
and <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code>
|
||||||
|
concepts have been defined so that containers such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>
|
||||||
|
or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code> can be used.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.buffers.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.buffers.streambuf_for_integration_with_iostreams"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.streambuf_for_integration_with_iostreams">Streambuf
|
||||||
|
for Integration with Iostreams</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
The class <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">basic_streambuf</span></code> is derived from <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_streambuf</span></code> 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:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
The input sequence of the streambuf is accessible via the <a class="link" href="../../reference/basic_streambuf/data.html" title="basic_streambuf::data">data()</a>
|
||||||
|
member function. The return type of this function meets the <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code> requirements.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
The output sequence of the streambuf is accessible via the <a class="link" href="../../reference/basic_streambuf/prepare.html" title="basic_streambuf::prepare">prepare()</a>
|
||||||
|
member function. The return type of this function meets the <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code> requirements.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Data is transferred from the front of the output sequence to the back
|
||||||
|
of the input sequence by calling the <a class="link" href="../../reference/basic_streambuf/commit.html" title="basic_streambuf::commit">commit()</a>
|
||||||
|
member function.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Data is removed from the front of the input sequence by calling the
|
||||||
|
<a class="link" href="../../reference/basic_streambuf/consume.html" title="basic_streambuf::consume">consume()</a>
|
||||||
|
member function.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
The streambuf constructor accepts a <code class="computeroutput"><span class="identifier">size_t</span></code>
|
||||||
|
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 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">length_error</span></code>
|
||||||
|
exception.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.buffers.h1"></a>
|
||||||
|
<span><a name="asio.overview.core.buffers.bytewise_traversal_of_buffer_sequences"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.bytewise_traversal_of_buffer_sequences">Bytewise
|
||||||
|
Traversal of Buffer Sequences</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><span class="identifier">buffers_iterator</span><span class="special"><></span></code>
|
||||||
|
class template allows buffer sequences (i.e. types meeting <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code> or <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code> 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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
As an example, to read a single line from a socket and into a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>, you may write:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">sb</span><span class="special">;</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">n</span> <span class="special">=</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">read_until</span><span class="special">(</span><span class="identifier">sock</span><span class="special">,</span> <span class="identifier">sb</span><span class="special">,</span> <span class="char">'\n'</span><span class="special">);</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span><span class="special">::</span><span class="identifier">const_buffers_type</span> <span class="identifier">bufs</span> <span class="special">=</span> <span class="identifier">sb</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">line</span><span class="special">(</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffers_begin</span><span class="special">(</span><span class="identifier">bufs</span><span class="special">),</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffers_begin</span><span class="special">(</span><span class="identifier">bufs</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">n</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.buffers.h2"></a>
|
||||||
|
<span><a name="asio.overview.core.buffers.buffer_debugging"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.buffer_debugging">Buffer
|
||||||
|
Debugging</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">1</span><span class="special">)</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
|
||||||
|
<span class="identifier">v</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span> <span class="comment">// invalidates iterators</span>
|
||||||
|
<span class="special">*</span><span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// assertion!</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Asio takes advantage of this feature to add buffer debugging. Consider
|
||||||
|
the following code:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">dont_do_this</span><span class="special">()</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">msg</span> <span class="special">=</span> <span class="string">"Hello, world!"</span><span class="special">;</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">async_write</span><span class="special">(</span><span class="identifier">sock</span><span class="special">,</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">msg</span><span class="special">),</span> <span class="identifier">my_handler</span><span class="special">);</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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 <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
|
||||||
|
variable <code class="computeroutput"><span class="identifier">msg</span></code>. 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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
This feature is automatically made available for Microsoft Visual Studio
|
||||||
|
8.0 or later and for GCC when <code class="computeroutput"><span class="identifier">_GLIBCXX_DEBUG</span></code>
|
||||||
|
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 <code class="computeroutput"><span class="identifier">ASIO_ENABLE_BUFFER_DEBUGGING</span></code>.
|
||||||
|
It can also be explicitly disabled by defining <code class="computeroutput"><span class="identifier">ASIO_DISABLE_BUFFER_DEBUGGING</span></code>.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.buffers.h3"></a>
|
||||||
|
<span><a name="asio.overview.core.buffers.see_also"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/buffer.html" title="buffer">buffer</a>, <a class="link" href="../../reference/buffers_begin.html" title="buffers_begin">buffers_begin</a>,
|
||||||
|
<a class="link" href="../../reference/buffers_end.html" title="buffers_end">buffers_end</a>, <a class="link" href="../../reference/buffers_iterator.html" title="buffers_iterator">buffers_iterator</a>,
|
||||||
|
<a class="link" href="../../reference/const_buffer.html" title="const_buffer">const_buffer</a>, <a class="link" href="../../reference/const_buffers_1.html" title="const_buffers_1">const_buffers_1</a>, <a class="link" href="../../reference/mutable_buffer.html" title="mutable_buffer">mutable_buffer</a>, <a class="link" href="../../reference/mutable_buffers_1.html" title="mutable_buffers_1">mutable_buffers_1</a>,
|
||||||
|
<a class="link" href="../../reference/streambuf.html" title="streambuf">streambuf</a>, <a class="link" href="../../reference/ConstBufferSequence.html" title="Constant buffer sequence requirements">ConstBufferSequence</a>,
|
||||||
|
<a class="link" href="../../reference/MutableBufferSequence.html" title="Mutable buffer sequence requirements">MutableBufferSequence</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.buffers">buffers example (C++03)</a>,
|
||||||
|
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.buffers">buffers example (c++11)</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="strands.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="streams.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
167
src/async_io/asio/doc/asio/overview/core/concurrency_hint.html
Normal file
167
src/async_io/asio/doc/asio/overview/core/concurrency_hint.html
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Concurrency Hints</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="handler_tracking.html" title="Handler Tracking">
|
||||||
|
<link rel="next" href="coroutine.html" title="Stackless Coroutines">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="handler_tracking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutine.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.concurrency_hint"></a><a class="link" href="concurrency_hint.html" title="Concurrency Hints">Concurrency Hints</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
The <a class="link" href="../../reference/io_context/io_context.html" title="io_context::io_context"><code class="computeroutput"><span class="identifier">io_context</span></code> constructor</a> allows
|
||||||
|
programs to specify a concurrency hint. This is a suggestion to the <code class="computeroutput"><span class="identifier">io_context</span></code> implementation as to the number
|
||||||
|
of active threads that should be used for running completion handlers.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
When the Windows I/O completion port backend is in use, this value is passed
|
||||||
|
to <code class="literal">CreateIoCompletionPort</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
When a reactor-based backend is used, the implementation recognises the
|
||||||
|
following special concurrency hint values:
|
||||||
|
</p>
|
||||||
|
<div class="informaltable"><table class="table">
|
||||||
|
<colgroup>
|
||||||
|
<col>
|
||||||
|
<col>
|
||||||
|
</colgroup>
|
||||||
|
<thead><tr>
|
||||||
|
<th>
|
||||||
|
<p>
|
||||||
|
Value
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<p>
|
||||||
|
Description
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="number">1</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
The implementation assumes that the <code class="computeroutput"><span class="identifier">io_context</span></code>
|
||||||
|
will be run from a single thread, and applies several optimisations
|
||||||
|
based on this assumption.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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).
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_CONCURRENCY_HINT_UNSAFE</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
This special concurrency hint disables locking in both the scheduler
|
||||||
|
and reactor I/O. This hint has the following restrictions:
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— Care must be taken to ensure that all operations on the <code class="computeroutput"><span class="identifier">io_context</span></code> and any of its associated
|
||||||
|
I/O objects (such as sockets and timers) occur in only one thread
|
||||||
|
at a time.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— Asynchronous resolve operations fail with <code class="computeroutput"><span class="identifier">operation_not_supported</span></code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— If a <code class="computeroutput"><span class="identifier">signal_set</span></code>
|
||||||
|
is used with the <code class="computeroutput"><span class="identifier">io_context</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">signal_set</span></code> objects
|
||||||
|
cannot be used with any other io_context in the program.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_CONCURRENCY_HINT_UNSAFE_IO</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
This special concurrency hint disables locking in the reactor
|
||||||
|
I/O. This hint has the following restrictions:
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
— Care must be taken to ensure that run functions on the <code class="computeroutput"><span class="identifier">io_context</span></code>, and all operations
|
||||||
|
on the context's associated I/O objects (such as sockets and
|
||||||
|
timers), occur in only one thread at a time.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_CONCURRENCY_HINT_SAFE</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
The default. The <code class="computeroutput"><span class="identifier">io_context</span></code>
|
||||||
|
provides full thread safety, and distinct I/O objects may be
|
||||||
|
used from any thread.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table></div>
|
||||||
|
<p>
|
||||||
|
The concurrency hint used by default-constructed <code class="computeroutput">io_context</code>
|
||||||
|
objects can be overridden at compile time by defining the <code class="computeroutput">ASIO_CONCURRENCY_HINT_DEFAULT</code>
|
||||||
|
macro. For example, specifying
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">-DASIO_CONCURRENCY_HINT_DEFAULT=1
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
on the compiler command line means that a concurrency hint of <code class="computeroutput">1</code>
|
||||||
|
is used for all default-constructed <code class="computeroutput">io_context</code> objects in
|
||||||
|
the program. Similarly, the concurrency hint used by <code class="computeroutput">io_context</code>
|
||||||
|
objects constructed with <code class="computeroutput">1</code> can be overridden by defining
|
||||||
|
<code class="computeroutput">ASIO_CONCURRENCY_HINT_1</code>. For example, passing
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">-DASIO_CONCURRENCY_HINT_1=ASIO_CONCURRENCY_HINT_UNSAFE
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
to the compiler will disable thread safety for all of these objects.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="handler_tracking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutine.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
83
src/async_io/asio/doc/asio/overview/core/coroutine.html
Normal file
83
src/async_io/asio/doc/asio/overview/core/coroutine.html
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Stackless Coroutines</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="concurrency_hint.html" title="Concurrency Hints">
|
||||||
|
<link rel="next" href="spawn.html" title="Stackful Coroutines">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="concurrency_hint.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="spawn.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.coroutine"></a><a class="link" href="coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
The <a class="link" href="../../reference/coroutine.html" title="coroutine"><code class="computeroutput">coroutine</code></a>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput">coroutine</code> class is used in conjunction with the pseudo-keywords
|
||||||
|
<code class="computeroutput">reenter</code>, <code class="computeroutput">yield</code> and <code class="computeroutput">fork</code>. These are
|
||||||
|
preprocessor macros, and are implemented in terms of a <code class="computeroutput">switch</code>
|
||||||
|
statement using a technique similar to Duff's Device. The <a class="link" href="../../reference/coroutine.html" title="coroutine"><code class="computeroutput">coroutine</code></a>
|
||||||
|
class's documentation provides a complete description of these pseudo-keywords.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.coroutine.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.coroutine.see_also"></a></span><a class="link" href="coroutine.html#asio.overview.core.coroutine.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/coroutine.html" title="coroutine">coroutine</a>, <a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_server_4">HTTP
|
||||||
|
Server 4 example</a>, <a class="link" href="spawn.html" title="Stackful Coroutines">Stackful
|
||||||
|
Coroutines</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="concurrency_hint.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="spawn.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
147
src/async_io/asio/doc/asio/overview/core/coroutines_ts.html
Normal file
147
src/async_io/asio/doc/asio/overview/core/coroutines_ts.html
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Coroutines TS Support (experimental)</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="spawn.html" title="Stackful Coroutines">
|
||||||
|
<link rel="next" href="../networking.html" title="Networking">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="spawn.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../networking.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.coroutines_ts"></a><a class="link" href="coroutines_ts.html" title="Coroutines TS Support (experimental)">Coroutines TS Support
|
||||||
|
(experimental)</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
(Note: "Experimental" means that this interface is provided to
|
||||||
|
gather feedback and may change in subsequent Asio releases.)
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Experimental support for the Coroutines TS is provided via the <a class="link" href="../../reference/experimental__co_spawn.html" title="experimental::co_spawn"><code class="computeroutput">experimental::co_spawn()</code></a>
|
||||||
|
function. This <code class="computeroutput">co_spawn()</code> function enables programs to implement
|
||||||
|
asynchronous logic in a synchronous manner, in conjunction with the <code class="computeroutput">co_await</code>
|
||||||
|
keyword, as shown in the following example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The first argument to <code class="computeroutput">co_spawn()</code> is an <a class="link" href="../../reference/Executor1.html" title="Executor requirements">executor</a>
|
||||||
|
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 <code class="computeroutput">strand</code> so that no explicit
|
||||||
|
synchronisation is required.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The second argument is a nullary function object that returns a <a class="link" href="../../reference/experimental__awaitable.html" title="experimental::awaitable"><code class="computeroutput">asio::awaitable<R></code></a>,
|
||||||
|
where <code class="computeroutput">R</code> is the type of return value produced by the coroutine.
|
||||||
|
In the above example, the coroutine returns <code class="computeroutput">void</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The third argument is a completion token, and this is used by <code class="computeroutput">co_spawn()</code>
|
||||||
|
to produce a completion handler with signature <code class="computeroutput">void(std::exception_ptr,
|
||||||
|
R)</code>. 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,
|
||||||
|
<a class="link" href="../../reference/experimental__detached.html" title="experimental::detached"><code class="computeroutput">asio::experimental::detached</code></a>,
|
||||||
|
which is used to explicitly ignore the result of an asynchronous operation.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
In this example the body of the coroutine is implemented in the <code class="computeroutput">echo</code>
|
||||||
|
function. This function first obtains a completion token that represents
|
||||||
|
the current coroutine:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">auto token = co_await asio::experimental::this_coro::token();
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
When this completion token is passed to an asynchronous operation, the
|
||||||
|
operation's initiating function returns an <code class="computeroutput">awaitable</code> that
|
||||||
|
may be used with the <code class="computeroutput">co_await</code> keyword:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">std::size_t n = co_await socket.async_read_some(asio::buffer(data), token);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Where an asynchronous operation's handler signature has the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void handler(asio::error_code ec, result_type result);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
the resulting type of the <code class="computeroutput">co_await</code> expression is <code class="computeroutput">result_type</code>.
|
||||||
|
In the <code class="computeroutput">async_read_some</code> example above, this is <code class="computeroutput">size_t</code>.
|
||||||
|
If the asynchronous operation fails, the <code class="computeroutput">error_code</code> is converted
|
||||||
|
into a <code class="computeroutput">system_error</code> exception and thrown.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Where a handler signature has the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void handler(asio::error_code ec);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
the <code class="computeroutput">co_await</code> expression produces a <code class="computeroutput">void</code> result.
|
||||||
|
As above, an error is passed back to the coroutine as a <code class="computeroutput">system_error</code>
|
||||||
|
exception.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.coroutines_ts.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.coroutines_ts.see_also"></a></span><a class="link" href="coroutines_ts.html#asio.overview.core.coroutines_ts.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/experimental__co_spawn.html" title="experimental::co_spawn">experimental::co_spawn</a>,
|
||||||
|
<a class="link" href="../../reference/experimental__detached.html" title="experimental::detached">experimental::detached</a>,
|
||||||
|
<a class="link" href="../../reference/experimental__redirect_error.html" title="experimental::redirect_error">experimental::redirect_error</a>,
|
||||||
|
<a class="link" href="../../reference/experimental__awaitable.html" title="experimental::awaitable">experimental::awaitable</a>,
|
||||||
|
<a class="link" href="../../reference/experimental__await_token.html" title="experimental::await_token">experimental::await_token</a>,
|
||||||
|
<a class="link" href="../../reference/experimental__this_coro__executor.html" title="experimental::this_coro::executor">experimental::this_coro::executor</a>,
|
||||||
|
<a class="link" href="../../reference/experimental__this_coro__token.html" title="experimental::this_coro::token">experimental::this_coro::token</a>,
|
||||||
|
<a class="link" href="../../examples/cpp17_examples.html#asio.examples.cpp17_examples.coroutines_ts_support">Coroutines
|
||||||
|
TS examples</a>, <a class="link" href="spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>,
|
||||||
|
<a class="link" href="coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="spawn.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../networking.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
414
src/async_io/asio/doc/asio/overview/core/handler_tracking.html
Normal file
414
src/async_io/asio/doc/asio/overview/core/handler_tracking.html
Normal file
@@ -0,0 +1,414 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Handler Tracking</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="allocation.html" title="Custom Memory Allocation">
|
||||||
|
<link rel="next" href="concurrency_hint.html" title="Concurrency Hints">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="allocation.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="concurrency_hint.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.handler_tracking"></a><a class="link" href="handler_tracking.html" title="Handler Tracking">Handler Tracking</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
To aid in debugging asynchronous programs, Asio provides support for handler
|
||||||
|
tracking. When enabled by defining <code class="computeroutput"><span class="identifier">ASIO_ENABLE_HANDLER_TRACKING</span></code>,
|
||||||
|
Asio writes debugging output to the standard error stream. The output records
|
||||||
|
asynchronous operations and the relationships between their handlers.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">@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
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Each line is of the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><tag>|<timestamp>|<action>|<description>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><tag></code> is always <code class="computeroutput">@asio</code>, and is used
|
||||||
|
to identify and extract the handler tracking messages from the program
|
||||||
|
output.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><timestamp></code> is seconds and microseconds from 1 Jan
|
||||||
|
1970 UTC.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><action></code> takes one of the following forms:
|
||||||
|
</p>
|
||||||
|
<div class="variablelist">
|
||||||
|
<p class="title"><b></b></p>
|
||||||
|
<dl>
|
||||||
|
<dt><span class="term">>n</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The program entered the handler number <code class="computeroutput">n</code>. The <code class="computeroutput"><description></code>
|
||||||
|
shows the arguments to the handler.
|
||||||
|
</p></dd>
|
||||||
|
<dt><span class="term"><n</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The program left handler number <code class="computeroutput">n</code>.
|
||||||
|
</p></dd>
|
||||||
|
<dt><span class="term">!n</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The program left handler number n due to an exception.
|
||||||
|
</p></dd>
|
||||||
|
<dt><span class="term">~n</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The handler number <code class="computeroutput">n</code> was destroyed without having been
|
||||||
|
invoked. This is usually the case for any unfinished asynchronous
|
||||||
|
operations when the <code class="computeroutput">io_context</code> is destroyed.
|
||||||
|
</p></dd>
|
||||||
|
<dt><span class="term">n*m</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The handler number <code class="computeroutput">n</code> created a new asynchronous operation
|
||||||
|
with completion handler number <code class="computeroutput">m</code>. The <code class="computeroutput"><description></code>
|
||||||
|
shows what asynchronous operation was started.
|
||||||
|
</p></dd>
|
||||||
|
<dt><span class="term">n</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The handler number <code class="computeroutput">n</code> performed some other operation.
|
||||||
|
The <code class="computeroutput"><description></code> shows what function was called.
|
||||||
|
Currently only <code class="computeroutput">close()</code> and <code class="computeroutput">cancel()</code> operations
|
||||||
|
are logged, as these may affect the state of pending asynchronous
|
||||||
|
operations.
|
||||||
|
</p></dd>
|
||||||
|
<dt><span class="term">.n</span></dt>
|
||||||
|
<dd><p>
|
||||||
|
The implementation performed a system call as part of the asynchronous
|
||||||
|
operation for which handler number <code class="computeroutput">n</code> is the completion
|
||||||
|
handler. The <code class="computeroutput"><description></code> shows what function
|
||||||
|
was called and its results. These tracking events are only emitted
|
||||||
|
when using a reactor-based implementation.
|
||||||
|
</p></dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
Where the <code class="computeroutput"><description></code> shows a synchronous or asynchronous
|
||||||
|
operation, the format is <code class="computeroutput"><object-type>@<pointer>.<operation></code>.
|
||||||
|
For handler entry, it shows a comma-separated list of arguments and their
|
||||||
|
values.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.handler_tracking.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.handler_tracking.visual_representations"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.visual_representations">Visual
|
||||||
|
Representations</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
The handler tracking output may be post-processed using the included <code class="literal">handlerviz.pl</code>
|
||||||
|
tool to create a visual representation of the handlers (requires the GraphViz
|
||||||
|
tool <code class="literal">dot</code>).
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.handler_tracking.h1"></a>
|
||||||
|
<span><a name="asio.overview.core.handler_tracking.custom_tracking"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.custom_tracking">Custom Tracking</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
Handling tracking may be customised by defining the <code class="computeroutput"><span class="identifier">ASIO_CUSTOM_HANDLER_TRACKING</span></code>
|
||||||
|
macro to the name of a header file (enclosed in <code class="computeroutput"><span class="string">""</span></code>
|
||||||
|
or <code class="computeroutput"><span class="special"><></span></code>). This header
|
||||||
|
file must implement the following preprocessor macros:
|
||||||
|
</p>
|
||||||
|
<div class="informaltable"><table class="table">
|
||||||
|
<colgroup>
|
||||||
|
<col>
|
||||||
|
<col>
|
||||||
|
</colgroup>
|
||||||
|
<thead><tr>
|
||||||
|
<th>
|
||||||
|
<p>
|
||||||
|
Macro
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<p>
|
||||||
|
Description
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_INHERIT_TRACKED_HANDLER</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
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 <code class="computeroutput"><span class="special">:</span>
|
||||||
|
<span class="keyword">public</span> <span class="identifier">my_class</span></code>.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_ALSO_INHERIT_TRACKED_HANDLER</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
Specifies a base class for classes that implement asynchronous
|
||||||
|
operations. When used, the macro follows other base classes,
|
||||||
|
so it must have the form <code class="computeroutput"><span class="special">,</span>
|
||||||
|
<span class="keyword">public</span> <span class="identifier">my_class</span></code>.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_TRACKING_INIT</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is used to initialise the tracking mechanism.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_CREATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called on creation of an asynchronous operation.
|
||||||
|
<code class="computeroutput"><span class="identifier">args</span></code> 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.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_COMPLETION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called on completion of an asynchronous
|
||||||
|
operation. <code class="computeroutput"><span class="identifier">args</span></code>
|
||||||
|
is a parenthesised function argument list containing the tracked
|
||||||
|
handler.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_INVOCATION_BEGIN</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called immediately before a completion
|
||||||
|
handler is invoked. <code class="computeroutput"><span class="identifier">args</span></code>
|
||||||
|
is a parenthesised function argument list containing the arguments
|
||||||
|
to the completion handler.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_INVOCATION_END</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called immediately after a completion handler
|
||||||
|
is invoked.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_OPERATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called when some synchronous object operation
|
||||||
|
is called (such as <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>). <code class="computeroutput"><span class="identifier">args</span></code>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_REGISTRATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called when an object is registered with
|
||||||
|
the reactor. <code class="computeroutput"><span class="identifier">args</span></code>
|
||||||
|
is a parenthesised function argument list containing the owning
|
||||||
|
execution context, the object's native handle, and a unique registration
|
||||||
|
key.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_DEREGISTRATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called when an object is deregistered from
|
||||||
|
the reactor. <code class="computeroutput"><span class="identifier">args</span></code>
|
||||||
|
is a parenthesised function argument list containing the owning
|
||||||
|
execution context, the object's native handle, and a unique registration
|
||||||
|
key.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_READ_EVENT</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
A bitmask constant used to identify reactor read readiness events.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_WRITE_EVENT</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
A bitmask constant used to identify reactor write readiness events.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_ERROR_EVENT</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
A bitmask constant used to identify reactor error readiness events.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_EVENTS</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called when an object registered with the
|
||||||
|
reactor becomes ready. <code class="computeroutput"><span class="identifier">args</span></code>
|
||||||
|
is a parenthesised function argument list containing the owning
|
||||||
|
execution context, the unique registration key, and a bitmask
|
||||||
|
of the ready events.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_OPERATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
An expression that is called when the implementation performs
|
||||||
|
a system call as part of a reactor-based asynchronous operation.
|
||||||
|
<code class="computeroutput"><span class="identifier">args</span></code> 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.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.handler_tracking.h2"></a>
|
||||||
|
<span><a name="asio.overview.core.handler_tracking.see_also"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.handler_tracking">Custom handler
|
||||||
|
tracking example</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="allocation.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="concurrency_hint.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
157
src/async_io/asio/doc/asio/overview/core/line_based.html
Normal file
157
src/async_io/asio/doc/asio/overview/core/line_based.html
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Line-Based Operations</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="reactor.html" title="Reactor-Style Operations">
|
||||||
|
<link rel="next" href="allocation.html" title="Custom Memory Allocation">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="reactor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="allocation.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.line_based"></a><a class="link" href="line_based.html" title="Line-Based Operations">Line-Based Operations</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Many commonly-used internet protocols are line-based, which means that
|
||||||
|
they have protocol elements that are delimited by the character sequence
|
||||||
|
<code class="computeroutput"><span class="string">"\r\n"</span></code>. 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 <code class="computeroutput"><span class="identifier">read_until</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The following example illustrates the use of <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code> in an HTTP server, to receive the first
|
||||||
|
line of an HTTP request from a client:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">http_connection</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
|
||||||
|
<span class="keyword">void</span> <span class="identifier">start</span><span class="special">()</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">async_read_until</span><span class="special">(</span><span class="identifier">socket_</span><span class="special">,</span> <span class="identifier">data_</span><span class="special">,</span> <span class="string">"\r\n"</span><span class="special">,</span>
|
||||||
|
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&</span><span class="identifier">http_connection</span><span class="special">::</span><span class="identifier">handle_request_line</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">));</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
|
||||||
|
<span class="keyword">void</span> <span class="identifier">handle_request_line</span><span class="special">(</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">)</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">if</span> <span class="special">(!</span><span class="identifier">ec</span><span class="special">)</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">method</span><span class="special">,</span> <span class="identifier">uri</span><span class="special">,</span> <span class="identifier">version</span><span class="special">;</span>
|
||||||
|
<span class="keyword">char</span> <span class="identifier">sp1</span><span class="special">,</span> <span class="identifier">sp2</span><span class="special">,</span> <span class="identifier">cr</span><span class="special">,</span> <span class="identifier">lf</span><span class="special">;</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">istream</span> <span class="identifier">is</span><span class="special">(&</span><span class="identifier">data_</span><span class="special">);</span>
|
||||||
|
<span class="identifier">is</span><span class="special">.</span><span class="identifier">unsetf</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">skipws</span><span class="special">);</span>
|
||||||
|
<span class="identifier">is</span> <span class="special">>></span> <span class="identifier">method</span> <span class="special">>></span> <span class="identifier">sp1</span> <span class="special">>></span> <span class="identifier">uri</span> <span class="special">>></span> <span class="identifier">sp2</span> <span class="special">>></span> <span class="identifier">version</span> <span class="special">>></span> <span class="identifier">cr</span> <span class="special">>></span> <span class="identifier">lf</span><span class="special">;</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
|
||||||
|
<span class="special">...</span>
|
||||||
|
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">socket_</span><span class="special">;</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">data_</span><span class="special">;</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><span class="identifier">streambuf</span></code> 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 <span class="emphasis"><em>after</em></span> the delimiter.
|
||||||
|
This surplus data should be left in the <code class="computeroutput"><span class="identifier">streambuf</span></code>
|
||||||
|
so that it may be inspected by a subsequent call to <code class="computeroutput"><span class="identifier">read_until</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The delimiters may be specified as a single <code class="computeroutput"><span class="keyword">char</span></code>,
|
||||||
|
a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> or a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">regex</span></code>.
|
||||||
|
The <code class="computeroutput"><span class="identifier">read_until</span><span class="special">()</span></code>
|
||||||
|
and <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffers_iterator</span><span class="special"><</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span><span class="special">::</span><span class="identifier">const_buffers_type</span><span class="special">></span> <span class="identifier">iterator</span><span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span>
|
||||||
|
<span class="identifier">match_whitespace</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">)</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">begin</span><span class="special">;</span>
|
||||||
|
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">)</span>
|
||||||
|
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">isspace</span><span class="special">(*</span><span class="identifier">i</span><span class="special">++))</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">true</span><span class="special">);</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">false</span><span class="special">);</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">b</span><span class="special">;</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">read_until</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">match_whitespace</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
To read data into a streambuf until a matching character is found:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">match_char</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">public</span><span class="special">:</span>
|
||||||
|
<span class="keyword">explicit</span> <span class="identifier">match_char</span><span class="special">(</span><span class="keyword">char</span> <span class="identifier">c</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">c_</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span> <span class="special">{}</span>
|
||||||
|
|
||||||
|
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">></span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span> <span class="keyword">operator</span><span class="special">()(</span>
|
||||||
|
<span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">)</span> <span class="keyword">const</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="identifier">Iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">begin</span><span class="special">;</span>
|
||||||
|
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">)</span>
|
||||||
|
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">c_</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">i</span><span class="special">++)</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">true</span><span class="special">);</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">false</span><span class="special">);</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
|
||||||
|
<span class="keyword">private</span><span class="special">:</span>
|
||||||
|
<span class="keyword">char</span> <span class="identifier">c_</span><span class="special">;</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
|
||||||
|
<span class="keyword">namespace</span> <span class="identifier">asio</span> <span class="special">{</span>
|
||||||
|
<span class="keyword">template</span> <span class="special"><></span> <span class="keyword">struct</span> <span class="identifier">is_match_condition</span><span class="special"><</span><span class="identifier">match_char</span><span class="special">></span>
|
||||||
|
<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span> <span class="special">{};</span>
|
||||||
|
<span class="special">}</span> <span class="comment">// namespace asio</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">b</span><span class="special">;</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">read_until</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">match_char</span><span class="special">(</span><span class="char">'a'</span><span class="special">));</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><span class="identifier">is_match_condition</span><span class="special"><></span></code> type trait automatically evaluates
|
||||||
|
to true for functions, and for function objects with a nested <code class="computeroutput"><span class="identifier">result_type</span></code> typedef. For other types
|
||||||
|
the trait must be explicitly specialised, as shown above.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.line_based.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.line_based.see_also"></a></span><a class="link" href="line_based.html#asio.overview.core.line_based.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/async_read_until.html" title="async_read_until">async_read_until()</a>,
|
||||||
|
<a class="link" href="../../reference/is_match_condition.html" title="is_match_condition">is_match_condition</a>,
|
||||||
|
<a class="link" href="../../reference/read_until.html" title="read_until">read_until()</a>, <a class="link" href="../../reference/streambuf.html" title="streambuf">streambuf</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_client">HTTP client example</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="reactor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="allocation.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
78
src/async_io/asio/doc/asio/overview/core/reactor.html
Normal file
78
src/async_io/asio/doc/asio/overview/core/reactor.html
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Reactor-Style Operations</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="streams.html" title="Streams, Short Reads and Short Writes">
|
||||||
|
<link rel="next" href="line_based.html" title="Line-Based Operations">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="streams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="line_based.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.reactor"></a><a class="link" href="reactor.html" title="Reactor-Style Operations">Reactor-Style Operations</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
As an example, to perform a non-blocking read something like the following
|
||||||
|
may be used:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">socket</span><span class="special">(</span><span class="identifier">my_io_context</span><span class="special">);</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">true</span><span class="special">);</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">async_wait</span><span class="special">(</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span><span class="special">::</span><span class="identifier">wait_read</span><span class="special">,</span> <span class="identifier">read_handler</span><span class="special">);</span>
|
||||||
|
<span class="special">...</span>
|
||||||
|
<span class="keyword">void</span> <span class="identifier">read_handler</span><span class="special">(</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">)</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">if</span> <span class="special">(!</span><span class="identifier">ec</span><span class="special">)</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span> <span class="identifier">buf</span><span class="special">(</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">available</span><span class="special">());</span>
|
||||||
|
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buf</span><span class="special">));</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
These operations are supported for sockets on all platforms, and for the
|
||||||
|
POSIX stream-oriented descriptor classes.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.reactor.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.reactor.see_also"></a></span><a class="link" href="reactor.html#asio.overview.core.reactor.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/wait.html" title="basic_socket::wait">basic_socket::wait()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/async_wait.html" title="basic_socket::async_wait">basic_socket::async_wait()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/non_blocking.html" title="basic_socket::non_blocking">basic_socket::non_blocking()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/native_non_blocking.html" title="basic_socket::native_non_blocking">basic_socket::native_non_blocking()</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.nonblocking">nonblocking example</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="streams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="line_based.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
145
src/async_io/asio/doc/asio/overview/core/spawn.html
Normal file
145
src/async_io/asio/doc/asio/overview/core/spawn.html
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Stackful Coroutines</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="coroutine.html" title="Stackless Coroutines">
|
||||||
|
<link rel="next" href="coroutines_ts.html" title="Coroutines TS Support (experimental)">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="coroutine.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutines_ts.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.spawn"></a><a class="link" href="spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
The <a class="link" href="../../reference/spawn.html" title="spawn"><code class="computeroutput">spawn()</code></a> function
|
||||||
|
is a high-level wrapper for running stackful coroutines. It is based on
|
||||||
|
the Boost.Coroutine library. The <code class="computeroutput">spawn()</code> function enables
|
||||||
|
programs to implement asynchronous logic in a synchronous manner, as shown
|
||||||
|
in the following example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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)
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The first argument to <code class="computeroutput">spawn()</code> may be a <a class="link" href="../../reference/io_context__strand.html" title="io_context::strand"><code class="computeroutput">strand</code></a>,
|
||||||
|
<a class="link" href="../../reference/io_context.html" title="io_context"><code class="computeroutput">io_context</code></a>,
|
||||||
|
or <a class="link" href="../../reference/CompletionHandler.html" title="Completion handler requirements">completion handler</a>.
|
||||||
|
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 <code class="computeroutput">strand</code> so that
|
||||||
|
no explicit synchronisation is required.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The second argument is a function object with signature:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void coroutine(asio::yield_context yield);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
that specifies the code to be run as part of the coroutine. The parameter
|
||||||
|
<code class="computeroutput">yield</code> may be passed to an asynchronous operation in place
|
||||||
|
of the completion handler, as in:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">std::size_t length =
|
||||||
|
my_socket.async_read_some(
|
||||||
|
asio::buffer(data), yield);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
This starts the asynchronous operation and suspends the coroutine. The
|
||||||
|
coroutine will be resumed automatically when the asynchronous operation
|
||||||
|
completes.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Where an asynchronous operation's handler signature has the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void handler(asio::error_code ec, result_type result);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
the initiating function returns the result_type. In the <code class="computeroutput">async_read_some</code>
|
||||||
|
example above, this is <code class="computeroutput">size_t</code>. If the asynchronous operation
|
||||||
|
fails, the <code class="computeroutput">error_code</code> is converted into a <code class="computeroutput">system_error</code>
|
||||||
|
exception and thrown.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Where a handler signature has the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void handler(asio::error_code ec);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
the initiating function returns <code class="computeroutput">void</code>. As above, an error is
|
||||||
|
passed back to the coroutine as a <code class="computeroutput">system_error</code> exception.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To collect the <code class="computeroutput">error_code</code> from an operation, rather than have
|
||||||
|
it throw an exception, associate the output variable with the <code class="computeroutput">yield_context</code>
|
||||||
|
as follows:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">asio::error_code ec;
|
||||||
|
std::size_t length =
|
||||||
|
my_socket.async_read_some(
|
||||||
|
asio::buffer(data), yield[ec]);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
<span class="bold"><strong>Note:</strong></span> if <code class="computeroutput">spawn()</code> is used
|
||||||
|
with a custom completion handler of type <code class="computeroutput">Handler</code>, the function
|
||||||
|
object signature is actually:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void coroutine(asio::basic_yield_context<Handler> yield);
|
||||||
|
</pre>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.spawn.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.spawn.see_also"></a></span><a class="link" href="spawn.html#asio.overview.core.spawn.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/spawn.html" title="spawn">spawn</a>, <a class="link" href="../../reference/yield_context.html" title="yield_context">yield_context</a>,
|
||||||
|
<a class="link" href="../../reference/basic_yield_context.html" title="basic_yield_context">basic_yield_context</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.spawn">Spawn example (C++03)</a>,
|
||||||
|
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.spawn">Spawn example (C++11)</a>,
|
||||||
|
<a class="link" href="coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="coroutine.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutines_ts.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
160
src/async_io/asio/doc/asio/overview/core/strands.html
Normal file
160
src/async_io/asio/doc/asio/overview/core/strands.html
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Strands: Use Threads Without Explicit Locking</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="threads.html" title="Threads and Asio">
|
||||||
|
<link rel="next" href="buffers.html" title="Buffers">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="threads.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="buffers.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.strands"></a><a class="link" href="strands.html" title="Strands: Use Threads Without Explicit Locking">Strands: Use Threads Without
|
||||||
|
Explicit Locking</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Strands may be either implicit or explicit, as illustrated by the following
|
||||||
|
alternative approaches:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
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().
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An explicit strand is an instance of <code class="computeroutput"><span class="identifier">strand</span><span class="special"><></span></code> or <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">strand</span></code>.
|
||||||
|
All event handler function objects need to be bound to the strand using
|
||||||
|
<code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">bind_executor</span><span class="special">()</span></code>
|
||||||
|
or otherwise posted/dispatched through the strand object.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
In the case of composed asynchronous operations, such as <code class="computeroutput"><span class="identifier">async_read</span><span class="special">()</span></code>
|
||||||
|
or <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>,
|
||||||
|
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 <code class="computeroutput"><span class="identifier">async_read</span><span class="special">()</span></code> it's the socket, which the caller can
|
||||||
|
<code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>
|
||||||
|
to cancel the operation).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To achieve this, all asynchronous operations obtain the handler's associated
|
||||||
|
executor by using the <code class="computeroutput"><span class="identifier">get_associated_executor</span></code>
|
||||||
|
function. For example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">associated_executor_t</span><span class="special"><</span><span class="identifier">Handler</span><span class="special">></span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The executor may be customised for a particular handler type by specifying
|
||||||
|
a nested type <code class="computeroutput"><span class="identifier">executor_type</span></code>
|
||||||
|
and member function <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span></code>:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">my_handler</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">public</span><span class="special">:</span>
|
||||||
|
<span class="comment">// Custom implementation of Executor type requirements.</span>
|
||||||
|
<span class="keyword">typedef</span> <span class="identifier">my_executor</span> <span class="identifier">executor_type</span><span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="comment">// Return a custom executor implementation.</span>
|
||||||
|
<span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">my_executor</span><span class="special">();</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
|
||||||
|
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
In more complex cases, the <code class="computeroutput"><span class="identifier">associated_executor</span></code>
|
||||||
|
template may be partially specialised directly:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">my_handler</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
|
||||||
|
<span class="keyword">namespace</span> <span class="identifier">asio</span> <span class="special">{</span>
|
||||||
|
|
||||||
|
<span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">></span>
|
||||||
|
<span class="keyword">struct</span> <span class="identifier">associated_executor</span><span class="special"><</span><span class="identifier">my_handler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">></span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="comment">// Custom implementation of Executor type requirements.</span>
|
||||||
|
<span class="keyword">typedef</span> <span class="identifier">my_executor</span> <span class="identifier">type</span><span class="special">;</span>
|
||||||
|
|
||||||
|
<span class="comment">// Return a custom executor implementation.</span>
|
||||||
|
<span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">my_handler</span><span class="special">&,</span>
|
||||||
|
<span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&</span> <span class="special">=</span> <span class="identifier">Executor</span><span class="special">())</span> <span class="keyword">noexcept</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="keyword">return</span> <span class="identifier">my_executor</span><span class="special">();</span>
|
||||||
|
<span class="special">}</span>
|
||||||
|
<span class="special">};</span>
|
||||||
|
|
||||||
|
<span class="special">}</span> <span class="comment">// namespace asio</span>
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">bind_executor</span><span class="special">()</span></code>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting"><span class="identifier">my_socket</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">my_buffer</span><span class="special">,</span>
|
||||||
|
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">bind_executor</span><span class="special">(</span><span class="identifier">my_strand</span><span class="special">,</span>
|
||||||
|
<span class="special">[](</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">length</span><span class="special">)</span>
|
||||||
|
<span class="special">{</span>
|
||||||
|
<span class="comment">// ...</span>
|
||||||
|
<span class="special">}));</span>
|
||||||
|
</pre>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.strands.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.strands.see_also"></a></span><a class="link" href="strands.html#asio.overview.core.strands.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/associated_executor.html" title="associated_executor">associated_executor</a>,
|
||||||
|
<a class="link" href="../../reference/get_associated_executor.html" title="get_associated_executor">get_associated_executor</a>,
|
||||||
|
<a class="link" href="../../reference/bind_executor.html" title="bind_executor">bind_executor</a>, <a class="link" href="../../reference/strand.html" title="strand">strand</a>, <a class="link" href="../../reference/io_context__strand.html" title="io_context::strand">io_context::strand</a>,
|
||||||
|
<a class="link" href="../../tutorial/tuttimer5.html" title="Timer.5 - Synchronising handlers in multithreaded programs">tutorial Timer.5</a>, <a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_server_3">HTTP server 3 example</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="threads.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="buffers.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
120
src/async_io/asio/doc/asio/overview/core/streams.html
Normal file
120
src/async_io/asio/doc/asio/overview/core/streams.html
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Streams, Short Reads and Short Writes</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="buffers.html" title="Buffers">
|
||||||
|
<link rel="next" href="reactor.html" title="Reactor-Style Operations">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="buffers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="reactor.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.streams"></a><a class="link" href="streams.html" title="Streams, Short Reads and Short Writes">Streams, Short Reads and
|
||||||
|
Short Writes</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Many I/O objects in Asio are stream-oriented. This means that:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
There are no message boundaries. The data being transferred is a continuous
|
||||||
|
sequence of bytes.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Read or write operations may transfer fewer bytes than requested. This
|
||||||
|
is referred to as a short read or short write.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Objects that provide stream-oriented I/O model one or more of the following
|
||||||
|
type requirements:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<code class="computeroutput"><span class="identifier">SyncReadStream</span></code>, where
|
||||||
|
synchronous read operations are performed using a member function called
|
||||||
|
<code class="computeroutput"><span class="identifier">read_some</span><span class="special">()</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<code class="computeroutput"><span class="identifier">AsyncReadStream</span></code>, where
|
||||||
|
asynchronous read operations are performed using a member function
|
||||||
|
called <code class="computeroutput"><span class="identifier">async_read_some</span><span class="special">()</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<code class="computeroutput"><span class="identifier">SyncWriteStream</span></code>, where
|
||||||
|
synchronous write operations are performed using a member function
|
||||||
|
called <code class="computeroutput"><span class="identifier">write_some</span><span class="special">()</span></code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<code class="computeroutput"><span class="identifier">AsyncWriteStream</span></code>, where
|
||||||
|
synchronous write operations are performed using a member function
|
||||||
|
called <code class="computeroutput"><span class="identifier">async_write_some</span><span class="special">()</span></code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Examples of stream-oriented I/O objects include <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">ssl</span><span class="special">::</span><span class="identifier">stream</span><span class="special"><></span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">posix</span><span class="special">::</span><span class="identifier">stream_descriptor</span></code>, <code class="computeroutput"><span class="identifier">windows</span><span class="special">::</span><span class="identifier">stream_handle</span></code>,
|
||||||
|
etc.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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: <code class="computeroutput"><span class="identifier">read</span><span class="special">()</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">async_read</span><span class="special">()</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">write</span><span class="special">()</span></code>
|
||||||
|
and <code class="computeroutput"><span class="identifier">async_write</span><span class="special">()</span></code>.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.streams.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.streams.why_eof_is_an_error"></a></span><a class="link" href="streams.html#asio.overview.core.streams.why_eof_is_an_error">Why
|
||||||
|
EOF is an Error</a>
|
||||||
|
</h6>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
The end of a stream can cause <code class="computeroutput"><span class="identifier">read</span></code>,
|
||||||
|
<code class="computeroutput"><span class="identifier">async_read</span></code>, <code class="computeroutput"><span class="identifier">read_until</span></code> or <code class="computeroutput"><span class="identifier">async_read_until</span></code>
|
||||||
|
functions to violate their contract. E.g. a read of N bytes may finish
|
||||||
|
early due to EOF.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An EOF error may be used to distinguish the end of a stream from a
|
||||||
|
successful read of size 0.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.streams.h1"></a>
|
||||||
|
<span><a name="asio.overview.core.streams.see_also"></a></span><a class="link" href="streams.html#asio.overview.core.streams.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>,
|
||||||
|
<a class="link" href="../../reference/read.html" title="read">read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>,
|
||||||
|
<a class="link" href="../../reference/AsyncReadStream.html" title="Buffer-oriented asynchronous read stream requirements">AsyncReadStream</a>,
|
||||||
|
<a class="link" href="../../reference/AsyncWriteStream.html" title="Buffer-oriented asynchronous write stream requirements">AsyncWriteStream</a>,
|
||||||
|
<a class="link" href="../../reference/SyncReadStream.html" title="Buffer-oriented synchronous read stream requirements">SyncReadStream</a>, <a class="link" href="../../reference/SyncWriteStream.html" title="Buffer-oriented synchronous write stream requirements">SyncWriteStream</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="buffers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="reactor.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
123
src/async_io/asio/doc/asio/overview/core/threads.html
Normal file
123
src/async_io/asio/doc/asio/overview/core/threads.html
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Threads and Asio</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
|
||||||
|
<link rel="prev" href="async.html" title="The Proactor Design Pattern: Concurrency Without Threads">
|
||||||
|
<link rel="next" href="strands.html" title="Strands: Use Threads Without Explicit Locking">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="async.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="strands.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.core.threads"></a><a class="link" href="threads.html" title="Threads and Asio">Threads and Asio</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.threads.h0"></a>
|
||||||
|
<span><a name="asio.overview.core.threads.thread_safety"></a></span><a class="link" href="threads.html#asio.overview.core.threads.thread_safety">Thread
|
||||||
|
Safety</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
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
|
||||||
|
<code class="computeroutput"><span class="identifier">io_context</span></code> provide a stronger
|
||||||
|
guarantee that it is safe to use a single object concurrently.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.threads.h1"></a>
|
||||||
|
<span><a name="asio.overview.core.threads.thread_pools"></a></span><a class="link" href="threads.html#asio.overview.core.threads.thread_pools">Thread
|
||||||
|
Pools</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
Multiple threads may call <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> to set up a pool of threads from which
|
||||||
|
completion handlers may be invoked. This approach may also be used with
|
||||||
|
<code class="computeroutput"><span class="identifier">post</span><span class="special">()</span></code>
|
||||||
|
as a means to perform arbitrary computational tasks across a thread pool.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Note that all threads that have joined an <code class="computeroutput"><span class="identifier">io_context</span></code>'s
|
||||||
|
pool are considered equivalent, and the <code class="computeroutput"><span class="identifier">io_context</span></code>
|
||||||
|
may distribute work across them in an arbitrary fashion.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.threads.h2"></a>
|
||||||
|
<span><a name="asio.overview.core.threads.internal_threads"></a></span><a class="link" href="threads.html#asio.overview.core.threads.internal_threads">Internal
|
||||||
|
Threads</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
must not call the user's code directly; and
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
must block all signals.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
This approach is complemented by the following guarantee:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Asynchronous completion handlers will only be called from threads that
|
||||||
|
are currently calling <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Consequently, it is the library user's responsibility to create and manage
|
||||||
|
all threads to which the notifications will be delivered.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The reasons for this approach include:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
By only calling <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> 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).
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
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 <code class="computeroutput"><span class="identifier">CoInitializeEx</span></code>
|
||||||
|
before any other COM operations can be called from that thread.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
The library interface is decoupled from interfaces for thread creation
|
||||||
|
and management, and permits implementations on platforms where threads
|
||||||
|
are not available.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.core.threads.h3"></a>
|
||||||
|
<span><a name="asio.overview.core.threads.see_also"></a></span><a class="link" href="threads.html#asio.overview.core.threads.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/io_context.html" title="io_context">io_context</a>, <a class="link" href="../../reference/post.html" title="post">post</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="async.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="strands.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
64
src/async_io/asio/doc/asio/overview/cpp2011.html
Normal file
64
src/async_io/asio/doc/asio/overview/cpp2011.html
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>C++ 2011 Support</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="ssl.html" title="SSL">
|
||||||
|
<link rel="next" href="cpp2011/system_error.html" title="System Errors and Error Codes">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="ssl.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp2011/system_error.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.cpp2011"></a><a class="link" href="cpp2011.html" title="C++ 2011 Support">C++ 2011 Support</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/system_error.html" title="System Errors and Error Codes">System Errors and Error
|
||||||
|
Codes</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/move_objects.html" title="Movable I/O Objects">Movable I/O Objects</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/move_handlers.html" title="Movable Handlers">Movable Handlers</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/variadic.html" title="Variadic Templates">Variadic Templates</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/array.html" title="Array Container">Array Container</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/atomic.html" title="Atomics">Atomics</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/shared_ptr.html" title="Shared Pointers">Shared Pointers</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/chrono.html" title="Chrono">Chrono</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="cpp2011/futures.html" title="Futures">Futures</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="ssl.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp2011/system_error.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
62
src/async_io/asio/doc/asio/overview/cpp2011/array.html
Normal file
62
src/async_io/asio/doc/asio/overview/cpp2011/array.html
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Array Container</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="variadic.html" title="Variadic Templates">
|
||||||
|
<link rel="next" href="atomic.html" title="Atomics">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="variadic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="atomic.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.array"></a><a class="link" href="array.html" title="Array Container">Array Container</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Where the standard library provides <code class="computeroutput">std::array<></code>, Asio:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Provides overloads for the <a class="link" href="../../reference/buffer.html" title="buffer">buffer()</a>
|
||||||
|
function.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Uses it in preference to <code class="computeroutput">boost::array<></code> for the
|
||||||
|
<a class="link" href="../../reference/ip__address_v4/bytes_type.html" title="ip::address_v4::bytes_type">ip::address_v4::bytes_type</a>
|
||||||
|
and <a class="link" href="../../reference/ip__address_v6/bytes_type.html" title="ip::address_v6::bytes_type">ip::address_v6::bytes_type</a>
|
||||||
|
types.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Uses it in preference to <code class="computeroutput">boost::array<></code> where a
|
||||||
|
fixed size array type is needed in the implementation.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Support for <code class="computeroutput">std::array<></code> is automatically enabled for
|
||||||
|
<code class="literal">g++</code> 4.3 and later, when the <code class="literal">-std=c++0x</code>
|
||||||
|
or <code class="literal">-std=gnu++0x</code> compiler options are used, as well as
|
||||||
|
for Microsoft Visual C++ 10. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_ARRAY</code>,
|
||||||
|
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_ARRAY</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="variadic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="atomic.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
47
src/async_io/asio/doc/asio/overview/cpp2011/atomic.html
Normal file
47
src/async_io/asio/doc/asio/overview/cpp2011/atomic.html
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Atomics</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="array.html" title="Array Container">
|
||||||
|
<link rel="next" href="shared_ptr.html" title="Shared Pointers">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="array.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="shared_ptr.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.atomic"></a><a class="link" href="atomic.html" title="Atomics">Atomics</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Asio's implementation can use <code class="computeroutput">std::atomic<></code> in preference
|
||||||
|
to <code class="computeroutput">boost::detail::atomic_count</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Support for the standard atomic integer template is automatically enabled
|
||||||
|
for <code class="literal">g++</code> 4.5 and later, when the <code class="literal">-std=c++0x</code>
|
||||||
|
or <code class="literal">-std=gnu++0x</code> compiler options are used. It may be
|
||||||
|
disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_ATOMIC</code>, or explicitly
|
||||||
|
enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_ATOMIC</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="array.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="shared_ptr.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
58
src/async_io/asio/doc/asio/overview/cpp2011/chrono.html
Normal file
58
src/async_io/asio/doc/asio/overview/cpp2011/chrono.html
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Chrono</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="shared_ptr.html" title="Shared Pointers">
|
||||||
|
<link rel="next" href="futures.html" title="Futures">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="shared_ptr.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="futures.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.chrono"></a><a class="link" href="chrono.html" title="Chrono">Chrono</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Asio provides timers based on the <code class="computeroutput">std::chrono</code> facilities via
|
||||||
|
the <a class="link" href="../../reference/basic_waitable_timer.html" title="basic_waitable_timer">basic_waitable_timer</a>
|
||||||
|
class template. The typedefs <a class="link" href="../../reference/system_timer.html" title="system_timer">system_timer</a>,
|
||||||
|
<a class="link" href="../../reference/steady_timer.html" title="steady_timer">steady_timer</a> and <a class="link" href="../../reference/high_resolution_timer.html" title="high_resolution_timer">high_resolution_timer</a>
|
||||||
|
utilise the standard clocks <code class="computeroutput">system_clock</code>, <code class="computeroutput">steady_clock</code>
|
||||||
|
and <code class="computeroutput">high_resolution_clock</code> respectively.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Support for the <code class="computeroutput">std::chrono</code> facilities is automatically enabled
|
||||||
|
for <code class="literal">g++</code> 4.6 and later, when the <code class="literal">-std=c++0x</code>
|
||||||
|
or <code class="literal">-std=gnu++0x</code> compiler options are used. (Note that,
|
||||||
|
for <code class="literal">g++</code>, the draft-standard <code class="computeroutput">monotonic_clock</code>
|
||||||
|
is used in place of <code class="computeroutput">steady_clock</code>.) Support may be disabled
|
||||||
|
by defining <code class="computeroutput">ASIO_DISABLE_STD_CHRONO</code>, or explicitly enabled
|
||||||
|
for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_CHRONO</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
When standard <code class="computeroutput">chrono</code> is unavailable, Asio will otherwise use
|
||||||
|
the Boost.Chrono library. The <a class="link" href="../../reference/basic_waitable_timer.html" title="basic_waitable_timer">basic_waitable_timer</a>
|
||||||
|
class template may be used with either.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="shared_ptr.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="futures.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
74
src/async_io/asio/doc/asio/overview/cpp2011/futures.html
Normal file
74
src/async_io/asio/doc/asio/overview/cpp2011/futures.html
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Futures</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="chrono.html" title="Chrono">
|
||||||
|
<link rel="next" href="../implementation.html" title="Platform-Specific Implementation Notes">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="chrono.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../implementation.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.futures"></a><a class="link" href="futures.html" title="Futures">Futures</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
The <code class="computeroutput">asio::use_future</code> special value provides first-class support
|
||||||
|
for returning a C++11 <code class="computeroutput">std::future</code> from an asynchronous operation's
|
||||||
|
initiating function.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To use <code class="computeroutput">asio::use_future</code>, pass it to an asynchronous operation
|
||||||
|
instead of a normal completion handler. For example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">std::future<std::size_t> length =
|
||||||
|
my_socket.async_read_some(my_buffer, asio::use_future);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Where a handler signature has the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void handler(asio::error_code ec, result_type result);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
the initiating function returns a <code class="computeroutput">std::future</code> templated on
|
||||||
|
<code class="computeroutput">result_type</code>. In the above example, this is <code class="computeroutput">std::size_t</code>.
|
||||||
|
If the asynchronous operation fails, the <code class="computeroutput">error_code</code> is converted
|
||||||
|
into a <code class="computeroutput">system_error</code> exception and passed back to the caller
|
||||||
|
through the future.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Where a handler signature has the form:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">void handler(asio::error_code ec);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
the initiating function returns <code class="computeroutput">std::future<void></code>. As
|
||||||
|
above, an error is passed back in the future as a <code class="computeroutput">system_error</code>
|
||||||
|
exception.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/use_future.html" title="use_future">use_future</a>, <a class="link" href="../../reference/use_future_t.html" title="use_future_t">use_future_t</a>,
|
||||||
|
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.futures">Futures example (C++11)</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="chrono.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../implementation.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Movable Handlers</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="move_objects.html" title="Movable I/O Objects">
|
||||||
|
<link rel="next" href="variadic.html" title="Variadic Templates">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="move_objects.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="variadic.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.move_handlers"></a><a class="link" href="move_handlers.html" title="Movable Handlers">Movable Handlers</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
When move support is enabled, asynchronous that are documented as follows:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">template <typename Handler>
|
||||||
|
void async_XYZ(..., Handler handler);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
are actually declared as:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">template <typename Handler>
|
||||||
|
void async_XYZ(..., Handler&& handler);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The handler argument is perfectly forwarded and the move construction occurs
|
||||||
|
within the body of <code class="computeroutput">async_XYZ()</code>. This ensures that all other
|
||||||
|
function arguments are evaluated prior to the move. This is critical when
|
||||||
|
the other arguments to <code class="computeroutput">async_XYZ()</code> are members of the handler.
|
||||||
|
For example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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));
|
||||||
|
...
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Move support is automatically enabled for <code class="literal">g++</code> 4.5 and
|
||||||
|
later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
|
||||||
|
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_MOVE</code>,
|
||||||
|
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_MOVE</code>.
|
||||||
|
Note that these macros also affect the availability of <a class="link" href="move_objects.html" title="Movable I/O Objects">movable
|
||||||
|
I/O objects</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="move_objects.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="variadic.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
101
src/async_io/asio/doc/asio/overview/cpp2011/move_objects.html
Normal file
101
src/async_io/asio/doc/asio/overview/cpp2011/move_objects.html
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Movable I/O Objects</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="system_error.html" title="System Errors and Error Codes">
|
||||||
|
<link rel="next" href="move_handlers.html" title="Movable Handlers">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="system_error.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_handlers.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.move_objects"></a><a class="link" href="move_objects.html" title="Movable I/O Objects">Movable I/O Objects</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
When move support is available (via rvalue references), Asio allows move
|
||||||
|
construction and assignment of sockets, serial ports, POSIX descriptors
|
||||||
|
and Windows handles.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Move support allows you to write code like:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">tcp::socket make_socket(io_context& i)
|
||||||
|
{
|
||||||
|
tcp::socket s(i);
|
||||||
|
...
|
||||||
|
std::move(s);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
or:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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(...);
|
||||||
|
}
|
||||||
|
...
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
as well as:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">std::vector<tcp::socket> sockets;
|
||||||
|
sockets.push_back(tcp::socket(...));
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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 <a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a> 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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Move support is automatically enabled for <code class="literal">g++</code> 4.5 and
|
||||||
|
later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
|
||||||
|
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_MOVE</code>,
|
||||||
|
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_MOVE</code>.
|
||||||
|
Note that these macros also affect the availability of <a class="link" href="move_handlers.html" title="Movable Handlers">movable
|
||||||
|
handlers</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="system_error.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_handlers.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
47
src/async_io/asio/doc/asio/overview/cpp2011/shared_ptr.html
Normal file
47
src/async_io/asio/doc/asio/overview/cpp2011/shared_ptr.html
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Shared Pointers</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="atomic.html" title="Atomics">
|
||||||
|
<link rel="next" href="chrono.html" title="Chrono">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="atomic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="chrono.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.shared_ptr"></a><a class="link" href="shared_ptr.html" title="Shared Pointers">Shared Pointers</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Asio's implementation can use <code class="computeroutput">std::shared_ptr<></code> and
|
||||||
|
<code class="computeroutput">std::weak_ptr<></code> in preference to the Boost equivalents.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Support for the standard smart pointers is automatically enabled for <code class="literal">g++</code>
|
||||||
|
4.3 and later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
|
||||||
|
compiler options are used, as well as for Microsoft Visual C++ 10. It may
|
||||||
|
be disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_SHARED_PTR</code>, or explicitly
|
||||||
|
enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_SHARED_PTR</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="atomic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="chrono.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>System Errors and Error Codes</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="next" href="move_objects.html" title="Movable I/O Objects">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../cpp2011.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_objects.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.system_error"></a><a class="link" href="system_error.html" title="System Errors and Error Codes">System Errors and
|
||||||
|
Error Codes</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
When available, Asio can use the <code class="computeroutput">std::error_code</code> and <code class="computeroutput">std::system_error</code>
|
||||||
|
classes for reporting errors. In this case, the names <code class="computeroutput">asio::error_code</code>
|
||||||
|
and <code class="computeroutput">asio::system_error</code> will be typedefs for these standard
|
||||||
|
classes.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
System error support is automatically enabled for <code class="literal">g++</code>
|
||||||
|
4.6 and later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
|
||||||
|
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_SYSTEM_ERROR</code>,
|
||||||
|
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_SYSTEM_ERROR</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../cpp2011.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_objects.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
48
src/async_io/asio/doc/asio/overview/cpp2011/variadic.html
Normal file
48
src/async_io/asio/doc/asio/overview/cpp2011/variadic.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Variadic Templates</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
|
||||||
|
<link rel="prev" href="move_handlers.html" title="Movable Handlers">
|
||||||
|
<link rel="next" href="array.html" title="Array Container">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="move_handlers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="array.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.cpp2011.variadic"></a><a class="link" href="variadic.html" title="Variadic Templates">Variadic Templates</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
When supported by a compiler, Asio can use variadic templates to implement
|
||||||
|
the <a class="link" href="../../reference/basic_socket_streambuf/connect.html" title="basic_socket_streambuf::connect">basic_socket_streambuf::connect()</a>
|
||||||
|
and <a class="link" href="../../reference/basic_socket_iostream/connect.html" title="basic_socket_iostream::connect">basic_socket_iostream::connect()</a>
|
||||||
|
functions.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Support for variadic templates is automatically enabled for <code class="literal">g++</code>
|
||||||
|
4.3 and later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
|
||||||
|
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_VARIADIC_TEMPLATES</code>,
|
||||||
|
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_VARIADIC_TEMPLATES</code>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="move_handlers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="array.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
490
src/async_io/asio/doc/asio/overview/implementation.html
Normal file
490
src/async_io/asio/doc/asio/overview/implementation.html
Normal file
@@ -0,0 +1,490 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Platform-Specific Implementation Notes</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="cpp2011/futures.html" title="Futures">
|
||||||
|
<link rel="next" href="../using.html" title="Using Asio">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="cpp2011/futures.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../using.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.implementation"></a><a class="link" href="implementation.html" title="Platform-Specific Implementation Notes">Platform-Specific Implementation
|
||||||
|
Notes</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<p>
|
||||||
|
This section lists platform-specific implementation details, such as the
|
||||||
|
default demultiplexing mechanism, the number of threads created internally,
|
||||||
|
and when threads are created.
|
||||||
|
</p>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h0"></a>
|
||||||
|
<span><a name="asio.overview.implementation.linux_kernel_2_4"></a></span><a class="link" href="implementation.html#asio.overview.implementation.linux_kernel_2_4">Linux
|
||||||
|
Kernel 2.4</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
|
||||||
|
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h1"></a>
|
||||||
|
<span><a name="asio.overview.implementation.linux_kernel_2_6"></a></span><a class="link" href="implementation.html#asio.overview.implementation.linux_kernel_2_6">Linux
|
||||||
|
Kernel 2.6</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">epoll</code> for demultiplexing.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">epoll</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h2"></a>
|
||||||
|
<span><a name="asio.overview.implementation.solaris"></a></span><a class="link" href="implementation.html#asio.overview.implementation.solaris">Solaris</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="literal">/dev/poll</code> for demultiplexing.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="literal">/dev/poll</code> is performed in one
|
||||||
|
of the threads that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h3"></a>
|
||||||
|
<span><a name="asio.overview.implementation.qnx_neutrino"></a></span><a class="link" href="implementation.html#asio.overview.implementation.qnx_neutrino">QNX
|
||||||
|
Neutrino</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
|
||||||
|
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h4"></a>
|
||||||
|
<span><a name="asio.overview.implementation.mac_os_x"></a></span><a class="link" href="implementation.html#asio.overview.implementation.mac_os_x">Mac
|
||||||
|
OS X</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">kqueue</code> for demultiplexing.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">kqueue</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h5"></a>
|
||||||
|
<span><a name="asio.overview.implementation.freebsd"></a></span><a class="link" href="implementation.html#asio.overview.implementation.freebsd">FreeBSD</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">kqueue</code> for demultiplexing.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">kqueue</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h6"></a>
|
||||||
|
<span><a name="asio.overview.implementation.aix"></a></span><a class="link" href="implementation.html#asio.overview.implementation.aix">AIX</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
|
||||||
|
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h7"></a>
|
||||||
|
<span><a name="asio.overview.implementation.hp_ux"></a></span><a class="link" href="implementation.html#asio.overview.implementation.hp_ux">HP-UX</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
|
||||||
|
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h8"></a>
|
||||||
|
<span><a name="asio.overview.implementation.tru64"></a></span><a class="link" href="implementation.html#asio.overview.implementation.tru64">Tru64</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
|
||||||
|
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h9"></a>
|
||||||
|
<span><a name="asio.overview.implementation.windows_95__98_and_me"></a></span><a class="link" href="implementation.html#asio.overview.implementation.windows_95__98_and_me">Windows
|
||||||
|
95, 98 and Me</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for demultiplexing.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
|
||||||
|
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
For sockets, at most 16 buffers may be transferred in a single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h10"></a>
|
||||||
|
<span><a name="asio.overview.implementation.windows_nt__2000__xp__2003__vista__7_and_8"></a></span><a class="link" href="implementation.html#asio.overview.implementation.windows_nt__2000__xp__2003__vista__7_and_8">Windows
|
||||||
|
NT, 2000, XP, 2003, Vista, 7 and 8</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Uses overlapped I/O and I/O completion ports for all asynchronous socket
|
||||||
|
operations except for asynchronous connect.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Uses <code class="computeroutput">select</code> for emulating asynchronous connect.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Demultiplexing using I/O completion ports is performed in all threads
|
||||||
|
that call <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
|
||||||
|
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to trigger timers.
|
||||||
|
This thread is created on construction of the first <code class="computeroutput">basic_deadline_timer</code>
|
||||||
|
or <code class="computeroutput">basic_waitable_timer</code> objects.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used for the <code class="computeroutput">select</code>
|
||||||
|
demultiplexing. This thread is created on the first call to <code class="computeroutput">async_connect()</code>.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
|
||||||
|
host resolution. This thread is created on the first call to either
|
||||||
|
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
For sockets, at most 64 buffers may be transferred in a single operation.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
For stream-oriented handles, only one buffer may be transferred in a
|
||||||
|
single operation.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.implementation.h11"></a>
|
||||||
|
<span><a name="asio.overview.implementation.windows_runtime"></a></span><a class="link" href="implementation.html#asio.overview.implementation.windows_runtime">Windows
|
||||||
|
Runtime</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
The core facilities such as the <code class="computeroutput">io_context</code>, <code class="computeroutput">strand</code>,
|
||||||
|
buffers, composed operations, timers, etc., should all work as normal.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
For sockets, only client-side TCP is supported.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Explicit binding of a client-side TCP socket is not supported.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
The <code class="computeroutput">cancel()</code> function is not supported for sockets. Asynchronous
|
||||||
|
operations may only be cancelled by closing the socket.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Operations that use <code class="computeroutput">null_buffers</code> are not supported.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Only <code class="computeroutput">tcp::no_delay</code> and <code class="computeroutput">socket_base::keep_alive</code>
|
||||||
|
options are supported.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Resolvers do not support service names, only numbers. I.e. you must use
|
||||||
|
"80" rather than "http".
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
Most resolver query flags have no effect.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Demultiplexing mechanism:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
Uses the <code class="computeroutput">Windows::Networking::Sockets::StreamSocket</code> class
|
||||||
|
to implement asynchronous TCP socket operations.
|
||||||
|
</li></ul></div>
|
||||||
|
<p>
|
||||||
|
Threads:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
Event completions are delivered to the Windows thread pool and posted
|
||||||
|
to the <code class="computeroutput">io_context</code> for the handler to be executed.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
An additional thread per <code class="computeroutput">io_context</code> is used to trigger timers.
|
||||||
|
This thread is created on construction of the first timer objects.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
Scatter-Gather:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
||||||
|
For sockets, at most one buffer may be transferred in a single operation.
|
||||||
|
</li></ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="cpp2011/futures.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../using.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
52
src/async_io/asio/doc/asio/overview/networking.html
Normal file
52
src/async_io/asio/doc/asio/overview/networking.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Networking</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="core/coroutines_ts.html" title="Coroutines TS Support (experimental)">
|
||||||
|
<link rel="next" href="networking/protocols.html" title="TCP, UDP and ICMP">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="core/coroutines_ts.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="networking/protocols.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.networking"></a><a class="link" href="networking.html" title="Networking">Networking</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="networking/protocols.html" title="TCP, UDP and ICMP">TCP, UDP and ICMP</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="networking/other_protocols.html" title="Support for Other Protocols">Support for
|
||||||
|
Other Protocols</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="networking/iostreams.html" title="Socket Iostreams">Socket Iostreams</a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="networking/bsd_sockets.html" title="The BSD Socket API and Asio">The BSD Socket API
|
||||||
|
and Asio</a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="core/coroutines_ts.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="networking/protocols.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
545
src/async_io/asio/doc/asio/overview/networking/bsd_sockets.html
Normal file
545
src/async_io/asio/doc/asio/overview/networking/bsd_sockets.html
Normal file
@@ -0,0 +1,545 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>The BSD Socket API and Asio</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../networking.html" title="Networking">
|
||||||
|
<link rel="prev" href="iostreams.html" title="Socket Iostreams">
|
||||||
|
<link rel="next" href="../timers.html" title="Timers">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="iostreams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../timers.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.networking.bsd_sockets"></a><a class="link" href="bsd_sockets.html" title="The BSD Socket API and Asio">The BSD Socket
|
||||||
|
API and Asio</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Unsafe and error prone aspects of the BSD socket API not included. For
|
||||||
|
example, the use of <code class="computeroutput">int</code> 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 <code class="computeroutput">ip::tcp::socket</code>, and
|
||||||
|
for UDP one uses <code class="computeroutput">ip::udp::socket</code>.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The following table shows the mapping between the BSD socket API and Asio:
|
||||||
|
</p>
|
||||||
|
<div class="informaltable"><table class="table">
|
||||||
|
<colgroup>
|
||||||
|
<col>
|
||||||
|
<col>
|
||||||
|
</colgroup>
|
||||||
|
<thead><tr>
|
||||||
|
<th>
|
||||||
|
<p>
|
||||||
|
BSD Socket API Elements
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
<th>
|
||||||
|
<p>
|
||||||
|
Equivalents in Asio
|
||||||
|
</p>
|
||||||
|
</th>
|
||||||
|
</tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
socket descriptor - <code class="computeroutput">int</code> (POSIX) or <code class="computeroutput">SOCKET</code>
|
||||||
|
(Windows)
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/ip__tcp/socket.html" title="ip::tcp::socket">ip::tcp::socket</a>,
|
||||||
|
<a class="link" href="../../reference/ip__tcp/acceptor.html" title="ip::tcp::acceptor">ip::tcp::acceptor</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/ip__udp/socket.html" title="ip::udp::socket">ip::udp::socket</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket.html" title="basic_socket">basic_socket</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket.html" title="basic_stream_socket">basic_stream_socket</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket.html" title="basic_datagram_socket">basic_datagram_socket</a>,
|
||||||
|
<a class="link" href="../../reference/basic_raw_socket.html" title="basic_raw_socket">basic_raw_socket</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">in_addr</code>, <code class="computeroutput">in6_addr</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__address.html" title="ip::address">ip::address</a>,
|
||||||
|
<a class="link" href="../../reference/ip__address.html" title="ip::address">ip::address_v4</a>,
|
||||||
|
<a class="link" href="../../reference/ip__address.html" title="ip::address">ip::address_v6</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">sockaddr_in</code>, <code class="computeroutput">sockaddr_in6</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/ip__tcp/endpoint.html" title="ip::tcp::endpoint">ip::tcp::endpoint</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/ip__udp/endpoint.html" title="ip::udp::endpoint">ip::udp::endpoint</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__basic_endpoint.html" title="ip::basic_endpoint">ip::basic_endpoint</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">accept()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket_acceptor/accept.html" title="basic_socket_acceptor::accept">ip::tcp::acceptor::accept()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket_acceptor/accept.html" title="basic_socket_acceptor::accept">basic_socket_acceptor::accept()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">bind()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">ip::tcp::acceptor::bind()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">ip::tcp::socket::bind()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">ip::udp::socket::bind()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">basic_socket::bind()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">close()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">ip::tcp::acceptor::close()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">ip::tcp::socket::close()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">ip::udp::socket::close()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">basic_socket::close()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">connect()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/connect.html" title="basic_socket::connect">ip::tcp::socket::connect()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/connect.html" title="basic_socket::connect">ip::udp::socket::connect()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/connect.html" title="basic_socket::connect">basic_socket::connect()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">getaddrinfo()</code>, <code class="computeroutput">gethostbyaddr()</code>, <code class="computeroutput">gethostbyname()</code>,
|
||||||
|
<code class="computeroutput">getnameinfo()</code>, <code class="computeroutput">getservbyname()</code>, <code class="computeroutput">getservbyport()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/ip__basic_resolver/resolve.html" title="ip::basic_resolver::resolve">ip::tcp::resolver::resolve()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__basic_resolver/async_resolve.html" title="ip::basic_resolver::async_resolve">ip::tcp::resolver::async_resolve()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/ip__basic_resolver/resolve.html" title="ip::basic_resolver::resolve">ip::udp::resolver::resolve()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__basic_resolver/async_resolve.html" title="ip::basic_resolver::async_resolve">ip::udp::resolver::async_resolve()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__basic_resolver/resolve.html" title="ip::basic_resolver::resolve">ip::basic_resolver::resolve()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__basic_resolver/async_resolve.html" title="ip::basic_resolver::async_resolve">ip::basic_resolver::async_resolve()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">gethostname()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__host_name.html" title="ip::host_name">ip::host_name()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">getpeername()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/remote_endpoint.html" title="basic_socket::remote_endpoint">ip::tcp::socket::remote_endpoint()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/remote_endpoint.html" title="basic_socket::remote_endpoint">ip::udp::socket::remote_endpoint()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/remote_endpoint.html" title="basic_socket::remote_endpoint">basic_socket::remote_endpoint()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">getsockname()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">ip::tcp::acceptor::local_endpoint()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">ip::tcp::socket::local_endpoint()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">ip::udp::socket::local_endpoint()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">basic_socket::local_endpoint()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">getsockopt()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">ip::tcp::acceptor::get_option()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">ip::tcp::socket::get_option()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">ip::udp::socket::get_option()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">basic_socket::get_option()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">inet_addr()</code>, <code class="computeroutput">inet_aton()</code>, <code class="computeroutput">inet_pton()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__address/from_string.html" title="ip::address::from_string">ip::address::from_string()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__address/from_string.html" title="ip::address::from_string">ip::address_v4::from_string()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__address/from_string.html" title="ip::address::from_string">ip_address_v6::from_string()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">inet_ntoa()</code>, <code class="computeroutput">inet_ntop()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__address/to_string.html" title="ip::address::to_string">ip::address::to_string()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__address/to_string.html" title="ip::address::to_string">ip::address_v4::to_string()</a>,
|
||||||
|
<a class="link" href="../../reference/ip__address/to_string.html" title="ip::address::to_string">ip_address_v6::to_string()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">ioctl()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/io_control.html" title="basic_socket::io_control">ip::tcp::socket::io_control()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/io_control.html" title="basic_socket::io_control">ip::udp::socket::io_control()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/io_control.html" title="basic_socket::io_control">basic_socket::io_control()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">listen()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket_acceptor/listen.html" title="basic_socket_acceptor::listen">ip::tcp::acceptor::listen()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket_acceptor/listen.html" title="basic_socket_acceptor::listen">basic_socket_acceptor::listen()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">poll()</code>, <code class="computeroutput">select()</code>, <code class="computeroutput">pselect()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/io_context/run.html" title="io_context::run">io_context::run()</a>,
|
||||||
|
<a class="link" href="../../reference/io_context/run_one.html" title="io_context::run_one">io_context::run_one()</a>,
|
||||||
|
<a class="link" href="../../reference/io_context/poll.html" title="io_context::poll">io_context::poll()</a>,
|
||||||
|
<a class="link" href="../../reference/io_context/poll_one.html" title="io_context::poll_one">io_context::poll_one()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Note: in conjunction with asynchronous operations.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">readv()</code>, <code class="computeroutput">recv()</code>, <code class="computeroutput">read()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_stream_socket/read_some.html" title="basic_stream_socket::read_some">ip::tcp::socket::read_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_read_some.html" title="basic_stream_socket::async_read_some">ip::tcp::socket::async_read_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/receive.html" title="basic_stream_socket::receive">ip::tcp::socket::receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_receive.html" title="basic_stream_socket::async_receive">ip::tcp::socket::async_receive()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_datagram_socket/receive.html" title="basic_datagram_socket::receive">ip::udp::socket::receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_receive.html" title="basic_datagram_socket::async_receive">ip::udp::socket::async_receive()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/read_some.html" title="basic_stream_socket::read_some">basic_stream_socket::read_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_read_some.html" title="basic_stream_socket::async_read_some">basic_stream_socket::async_read_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/receive.html" title="basic_stream_socket::receive">basic_stream_socket::receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_receive.html" title="basic_stream_socket::async_receive">basic_stream_socket::async_receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/receive.html" title="basic_datagram_socket::receive">basic_datagram_socket::receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_receive.html" title="basic_datagram_socket::async_receive">basic_datagram_socket::async_receive()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">recvfrom()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_datagram_socket/receive_from.html" title="basic_datagram_socket::receive_from">ip::udp::socket::receive_from()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_receive_from.html" title="basic_datagram_socket::async_receive_from">ip::udp::socket::async_receive_from()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/receive_from.html" title="basic_datagram_socket::receive_from">basic_datagram_socket::receive_from()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_receive_from.html" title="basic_datagram_socket::async_receive_from">basic_datagram_socket::async_receive_from()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">send()</code>, <code class="computeroutput">write()</code>, <code class="computeroutput">writev()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_stream_socket/write_some.html" title="basic_stream_socket::write_some">ip::tcp::socket::write_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_write_some.html" title="basic_stream_socket::async_write_some">ip::tcp::socket::async_write_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/send.html" title="basic_stream_socket::send">ip::tcp::socket::send()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_send.html" title="basic_stream_socket::async_send">ip::tcp::socket::async_send()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_datagram_socket/send.html" title="basic_datagram_socket::send">ip::udp::socket::send()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_send.html" title="basic_datagram_socket::async_send">ip::udp::socket::async_send()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/write_some.html" title="basic_stream_socket::write_some">basic_stream_socket::write_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_write_some.html" title="basic_stream_socket::async_write_some">basic_stream_socket::async_write_some()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/send.html" title="basic_stream_socket::send">basic_stream_socket::send()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_send.html" title="basic_stream_socket::async_send">basic_stream_socket::async_send()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/send.html" title="basic_datagram_socket::send">basic_datagram_socket::send()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_send.html" title="basic_datagram_socket::async_send">basic_datagram_socket::async_send()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">sendto()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_datagram_socket/send_to.html" title="basic_datagram_socket::send_to">ip::udp::socket::send_to()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_send_to.html" title="basic_datagram_socket::async_send_to">ip::udp::socket::async_send_to()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/send_to.html" title="basic_datagram_socket::send_to">basic_datagram_socket::send_to()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_send_to.html" title="basic_datagram_socket::async_send_to">basic_datagram_socket::async_send_to()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">setsockopt()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">ip::tcp::acceptor::set_option()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">ip::tcp::socket::set_option()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">ip::udp::socket::set_option()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">basic_socket::set_option()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">shutdown()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/shutdown.html" title="basic_socket::shutdown">ip::tcp::socket::shutdown()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/shutdown.html" title="basic_socket::shutdown">ip::udp::socket::shutdown()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/shutdown.html" title="basic_socket::shutdown">basic_socket::shutdown()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">sockatmark()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/at_mark.html" title="basic_socket::at_mark">ip::tcp::socket::at_mark()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/at_mark.html" title="basic_socket::at_mark">basic_socket::at_mark()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">socket()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
For TCP: <a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">ip::tcp::acceptor::open()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">ip::tcp::socket::open()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For UDP: <a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">ip::udp::socket::open()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">basic_socket::open()</a>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<code class="computeroutput">socketpair()</code>
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/local__connect_pair.html" title="local::connect_pair">local::connect_pair()</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Note: POSIX operating systems only.
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table></div>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="iostreams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../timers.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
111
src/async_io/asio/doc/asio/overview/networking/iostreams.html
Normal file
111
src/async_io/asio/doc/asio/overview/networking/iostreams.html
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Socket Iostreams</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../networking.html" title="Networking">
|
||||||
|
<link rel="prev" href="other_protocols.html" title="Support for Other Protocols">
|
||||||
|
<link rel="next" href="bsd_sockets.html" title="The BSD Socket API and Asio">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="other_protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="bsd_sockets.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.networking.iostreams"></a><a class="link" href="iostreams.html" title="Socket Iostreams">Socket Iostreams</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::tcp::iostream stream("www.boost.org", "http");
|
||||||
|
if (!stream)
|
||||||
|
{
|
||||||
|
// Can't connect.
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The iostream class can also be used in conjunction with an acceptor to
|
||||||
|
create simple servers. For example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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());
|
||||||
|
...
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Timeouts may be set by calling <code class="computeroutput">expires_at()</code> or <code class="computeroutput">expires_from_now()</code>
|
||||||
|
to establish a deadline. Any socket operations that occur past the deadline
|
||||||
|
will put the iostream into a "bad" state.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For example, a simple client program like this:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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();
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
will fail if all the socket operations combined take longer than 60 seconds.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If an error does occur, the iostream's <code class="computeroutput">error()</code> member function
|
||||||
|
may be used to retrieve the error code from the most recent system call:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">if (!stream)
|
||||||
|
{
|
||||||
|
std::cout << "Error: " << stream.error().message() << "\n";
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.iostreams.h0"></a>
|
||||||
|
<span><a name="asio.overview.networking.iostreams.see_also"></a></span><a class="link" href="iostreams.html#asio.overview.networking.iostreams.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__tcp/iostream.html" title="ip::tcp::iostream">ip::tcp::iostream</a>,
|
||||||
|
<a class="link" href="../../reference/basic_socket_iostream.html" title="basic_socket_iostream">basic_socket_iostream</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.iostreams">iostreams examples</a>.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.iostreams.h1"></a>
|
||||||
|
<span><a name="asio.overview.networking.iostreams.notes"></a></span><a class="link" href="iostreams.html#asio.overview.networking.iostreams.notes">Notes</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
These iostream templates only support <code class="computeroutput">char</code>, not <code class="computeroutput">wchar_t</code>,
|
||||||
|
and do not perform any code conversion.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="other_protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="bsd_sockets.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Support for Other Protocols</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../networking.html" title="Networking">
|
||||||
|
<link rel="prev" href="protocols.html" title="TCP, UDP and ICMP">
|
||||||
|
<link rel="next" href="iostreams.html" title="Socket Iostreams">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="iostreams.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.networking.other_protocols"></a><a class="link" href="other_protocols.html" title="Support for Other Protocols">Support for
|
||||||
|
Other Protocols</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Support for other socket protocols (such as Bluetooth or IRCOMM sockets)
|
||||||
|
can be added by implementing the <a class="link" href="../../reference/Protocol.html" title="Protocol requirements">protocol
|
||||||
|
type requirements</a>. However, in many cases these protocols may also
|
||||||
|
be used with Asio's generic protocol support. For this, Asio provides the
|
||||||
|
following four classes:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="../../reference/generic__datagram_protocol.html" title="generic::datagram_protocol"><code class="computeroutput">generic::datagram_protocol</code></a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="../../reference/generic__raw_protocol.html" title="generic::raw_protocol"><code class="computeroutput">generic::raw_protocol</code></a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="../../reference/generic__seq_packet_protocol.html" title="generic::seq_packet_protocol"><code class="computeroutput">generic::seq_packet_protocol</code></a>
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<a class="link" href="../../reference/generic__stream_protocol.html" title="generic::stream_protocol"><code class="computeroutput">generic::stream_protocol</code></a>
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
These classes implement the <a class="link" href="../../reference/Protocol.html" title="Protocol requirements">protocol
|
||||||
|
type requirements</a>, but allow the user to specify the address family
|
||||||
|
(e.g. <code class="computeroutput">AF_INET</code>) and protocol type (e.g. <code class="computeroutput">IPPROTO_TCP</code>)
|
||||||
|
at runtime. For example:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">asio::generic::stream_protocol::socket my_socket(my_io_context);
|
||||||
|
my_socket.open(asio::generic::stream_protocol(AF_INET, IPPROTO_TCP));
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
An endpoint class template, <a class="link" href="../../reference/generic__basic_endpoint.html" title="generic::basic_endpoint"><code class="computeroutput">asio::generic::basic_endpoint</code></a>,
|
||||||
|
is included to support these protocol classes. This endpoint can hold any
|
||||||
|
other endpoint type, provided its native representation fits into a <code class="computeroutput">sockaddr_storage</code>
|
||||||
|
object. This class will also convert from other types that implement the
|
||||||
|
<a class="link" href="../../reference/Endpoint.html" title="Endpoint requirements">endpoint</a> type requirements:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">asio::ip::tcp::endpoint my_endpoint1 = ...;
|
||||||
|
asio::generic::stream_protocol::endpoint my_endpoint2(my_endpoint1);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The conversion is implicit, so as to support the following use cases:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">asio::generic::stream_protocol::socket my_socket(my_io_context);
|
||||||
|
asio::ip::tcp::endpoint my_endpoint = ...;
|
||||||
|
my_socket.connect(my_endpoint);
|
||||||
|
</pre>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.other_protocols.h0"></a>
|
||||||
|
<span><a name="asio.overview.networking.other_protocols.c__11_move_construction"></a></span><a class="link" href="other_protocols.html#asio.overview.networking.other_protocols.c__11_move_construction">C++11
|
||||||
|
Move Construction</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">Protocol1 p1 = ...;
|
||||||
|
Protocol2 p2(p1);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
then the corresponding socket conversion is allowed:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">Protocol1::socket my_socket1(my_io_context);
|
||||||
|
...
|
||||||
|
Protocol2::socket my_socket2(std::move(my_socket1));
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
For example, one possible conversion is from a TCP socket to a generic
|
||||||
|
stream-oriented socket:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">asio::ip::tcp::socket my_socket1(my_io_context);
|
||||||
|
...
|
||||||
|
asio::generic::stream_protocol::socket my_socket2(std::move(my_socket1));
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
These conversions are also available for move-assignment.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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 <code class="computeroutput">Protocol1</code> to <code class="computeroutput">Protocol2</code>
|
||||||
|
is valid, as above.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.other_protocols.h1"></a>
|
||||||
|
<span><a name="asio.overview.networking.other_protocols.accepting_generic_sockets"></a></span><a class="link" href="other_protocols.html#asio.overview.networking.other_protocols.accepting_generic_sockets">Accepting
|
||||||
|
Generic Sockets</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
As a convenience, a socket acceptor's <code class="computeroutput">accept()</code> and <code class="computeroutput">async_accept()</code>
|
||||||
|
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 <code class="computeroutput">asio::ip::tcp</code>
|
||||||
|
is convertible to <code class="computeroutput">asio::generic::stream_protocol</code>:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">asio::ip::tcp::acceptor my_acceptor(my_io_context);
|
||||||
|
...
|
||||||
|
asio::generic::stream_protocol::socket my_socket(my_io_context);
|
||||||
|
my_acceptor.accept(my_socket);
|
||||||
|
</pre>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.other_protocols.h2"></a>
|
||||||
|
<span><a name="asio.overview.networking.other_protocols.see_also"></a></span><a class="link" href="other_protocols.html#asio.overview.networking.other_protocols.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/generic__datagram_protocol.html" title="generic::datagram_protocol"><code class="computeroutput">generic::datagram_protocol</code></a>,
|
||||||
|
<a class="link" href="../../reference/generic__raw_protocol.html" title="generic::raw_protocol"><code class="computeroutput">generic::raw_protocol</code></a>,
|
||||||
|
<a class="link" href="../../reference/generic__seq_packet_protocol.html" title="generic::seq_packet_protocol"><code class="computeroutput">generic::seq_packet_protocol</code></a>,
|
||||||
|
<a class="link" href="../../reference/generic__stream_protocol.html" title="generic::stream_protocol"><code class="computeroutput">generic::stream_protocol</code></a>,
|
||||||
|
<a class="link" href="../../reference/Protocol.html" title="Protocol requirements">protocol type requirements</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="iostreams.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
203
src/async_io/asio/doc/asio/overview/networking/protocols.html
Normal file
203
src/async_io/asio/doc/asio/overview/networking/protocols.html
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>TCP, UDP and ICMP</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../networking.html" title="Networking">
|
||||||
|
<link rel="prev" href="../networking.html" title="Networking">
|
||||||
|
<link rel="next" href="other_protocols.html" title="Support for Other Protocols">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../networking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="other_protocols.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.networking.protocols"></a><a class="link" href="protocols.html" title="TCP, UDP and ICMP">TCP, UDP and ICMP</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Asio provides off-the-shelf support for the internet protocols TCP, UDP
|
||||||
|
and ICMP.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.protocols.h0"></a>
|
||||||
|
<span><a name="asio.overview.networking.protocols.tcp_clients"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.tcp_clients">TCP
|
||||||
|
Clients</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
Hostname resolution is performed using a resolver, where host and service
|
||||||
|
names are looked up and converted into one or more endpoints:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
To simplify the development of protocol-independent programs, TCP clients
|
||||||
|
may establish connections using the free functions <a class="link" href="../../reference/connect.html" title="connect">connect()</a>
|
||||||
|
and <a class="link" href="../../reference/async_connect.html" title="async_connect">async_connect()</a>.
|
||||||
|
These operations try each endpoint in a list until the socket is successfully
|
||||||
|
connected. For example, a single call:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::tcp::socket socket(my_io_context);
|
||||||
|
asio::connect(socket, resolver.resolve(query));
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
will synchronously try all endpoints until one is successfully connected.
|
||||||
|
Similarly, an asynchronous connect may be performed by writing:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
When a specific endpoint is available, a socket can be created and connected:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::tcp::socket socket(my_io_context);
|
||||||
|
socket.connect(endpoint);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Data may be read from or written to a connected TCP socket using the <a class="link" href="../../reference/basic_stream_socket/receive.html" title="basic_stream_socket::receive">receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_receive.html" title="basic_stream_socket::async_receive">async_receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/send.html" title="basic_stream_socket::send">send()</a> or
|
||||||
|
<a class="link" href="../../reference/basic_stream_socket/async_send.html" title="basic_stream_socket::async_send">async_send()</a>
|
||||||
|
member functions. However, as these could result in <a class="link" href="../core/streams.html" title="Streams, Short Reads and Short Writes">short
|
||||||
|
writes or reads</a>, an application will typically use the following
|
||||||
|
operations instead: <a class="link" href="../../reference/read.html" title="read">read()</a>,
|
||||||
|
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>
|
||||||
|
and <a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.protocols.h1"></a>
|
||||||
|
<span><a name="asio.overview.networking.protocols.tcp_servers"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.tcp_servers">TCP
|
||||||
|
Servers</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
A program uses an acceptor to accept incoming TCP connections:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::tcp::acceptor acceptor(my_io_context, my_endpoint);
|
||||||
|
...
|
||||||
|
ip::tcp::socket socket(my_io_context);
|
||||||
|
acceptor.accept(socket);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
After a socket has been successfully accepted, it may be read from or written
|
||||||
|
to as illustrated for TCP clients above.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.protocols.h2"></a>
|
||||||
|
<span><a name="asio.overview.networking.protocols.udp"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.udp">UDP</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
UDP hostname resolution is also performed using a resolver:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::udp::resolver resolver(my_io_context);
|
||||||
|
ip::udp::resolver::query query("localhost", "daytime");
|
||||||
|
ip::udp::resolver::iterator iter = resolver.resolve(query);
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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 <code class="computeroutput">12345</code>:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::udp::endpoint endpoint(ip::udp::v4(), 12345);
|
||||||
|
ip::udp::socket socket(my_io_context, endpoint);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
Data may be read from or written to an unconnected UDP socket using the
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/receive_from.html" title="basic_datagram_socket::receive_from">receive_from()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_receive_from.html" title="basic_datagram_socket::async_receive_from">async_receive_from()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/send_to.html" title="basic_datagram_socket::send_to">send_to()</a>
|
||||||
|
or <a class="link" href="../../reference/basic_datagram_socket/async_send_to.html" title="basic_datagram_socket::async_send_to">async_send_to()</a>
|
||||||
|
member functions. For a connected UDP socket, use the <a class="link" href="../../reference/basic_datagram_socket/receive.html" title="basic_datagram_socket::receive">receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/async_receive.html" title="basic_datagram_socket::async_receive">async_receive()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_datagram_socket/send.html" title="basic_datagram_socket::send">send()</a>
|
||||||
|
or <a class="link" href="../../reference/basic_datagram_socket/async_send.html" title="basic_datagram_socket::async_send">async_send()</a>
|
||||||
|
member functions.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.protocols.h3"></a>
|
||||||
|
<span><a name="asio.overview.networking.protocols.icmp"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.icmp">ICMP</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
As with TCP and UDP, ICMP hostname resolution is performed using a resolver:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::icmp::resolver resolver(my_io_context);
|
||||||
|
ip::icmp::resolver::query query("localhost", "");
|
||||||
|
ip::icmp::resolver::iterator iter = resolver.resolve(query);
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">ip::icmp::endpoint endpoint(ip::icmp::v6(), 0);
|
||||||
|
ip::icmp::socket socket(my_io_context, endpoint);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
The port number is not used for ICMP.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Data may be read from or written to an unconnected ICMP socket using the
|
||||||
|
<a class="link" href="../../reference/basic_raw_socket/receive_from.html" title="basic_raw_socket::receive_from">receive_from()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_raw_socket/async_receive_from.html" title="basic_raw_socket::async_receive_from">async_receive_from()</a>,
|
||||||
|
<a class="link" href="../../reference/basic_raw_socket/send_to.html" title="basic_raw_socket::send_to">send_to()</a>
|
||||||
|
or <a class="link" href="../../reference/basic_raw_socket/async_send_to.html" title="basic_raw_socket::async_send_to">async_send_to()</a>
|
||||||
|
member functions.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.networking.protocols.h4"></a>
|
||||||
|
<span><a name="asio.overview.networking.protocols.see_also"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/ip__tcp.html" title="ip::tcp">ip::tcp</a>, <a class="link" href="../../reference/ip__udp.html" title="ip::udp">ip::udp</a>,
|
||||||
|
<a class="link" href="../../reference/ip__icmp.html" title="ip::icmp">ip::icmp</a>, <a class="link" href="../../tutorial/tutdaytime1.html" title="Daytime.1 - A synchronous TCP daytime client">daytime
|
||||||
|
protocol tutorials</a>, <a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.icmp">ICMP
|
||||||
|
ping example</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../networking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="other_protocols.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
46
src/async_io/asio/doc/asio/overview/posix.html
Normal file
46
src/async_io/asio/doc/asio/overview/posix.html
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>POSIX-Specific Functionality</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="signals.html" title="Signal Handling">
|
||||||
|
<link rel="next" href="posix/local.html" title="UNIX Domain Sockets">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="signals.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="posix/local.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.posix"></a><a class="link" href="posix.html" title="POSIX-Specific Functionality">POSIX-Specific Functionality</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="posix/local.html" title="UNIX Domain Sockets">UNIX Domain Sockets</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="posix/stream_descriptor.html" title="Stream-Oriented File Descriptors">Stream-Oriented File
|
||||||
|
Descriptors</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="posix/fork.html" title="Fork">Fork</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="signals.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="posix/local.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
76
src/async_io/asio/doc/asio/overview/posix/fork.html
Normal file
76
src/async_io/asio/doc/asio/overview/posix/fork.html
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Fork</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../posix.html" title="POSIX-Specific Functionality">
|
||||||
|
<link rel="prev" href="stream_descriptor.html" title="Stream-Oriented File Descriptors">
|
||||||
|
<link rel="next" href="../windows.html" title="Windows-Specific Functionality">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="stream_descriptor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../windows.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.posix.fork"></a><a class="link" href="fork.html" title="Fork">Fork</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
Asio supports programs that utilise the <code class="computeroutput">fork()</code> system call.
|
||||||
|
Provided the program calls <code class="computeroutput">io_context.notify_fork()</code> 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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">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);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
User-defined services can also be made fork-aware by overriding the <code class="computeroutput">io_context::service::notify_fork()</code>
|
||||||
|
virtual function.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Note that any file descriptors accessible via Asio's public API (e.g. the
|
||||||
|
descriptors underlying <code class="computeroutput">basic_socket<></code>, <code class="computeroutput">posix::stream_descriptor</code>,
|
||||||
|
etc.) are not altered during a fork. It is the program's responsibility
|
||||||
|
to manage these as required.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.posix.fork.h0"></a>
|
||||||
|
<span><a name="asio.overview.posix.fork.see_also"></a></span><a class="link" href="fork.html#asio.overview.posix.fork.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/io_context/notify_fork.html" title="io_context::notify_fork">io_context::notify_fork()</a>,
|
||||||
|
<a class="link" href="../../reference/io_context/fork_event.html" title="io_context::fork_event">io_context::fork_event</a>,
|
||||||
|
<a class="link" href="../../reference/execution_context__service/notify_fork.html" title="execution_context::service::notify_fork">io_context::service::notify_fork()</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.fork">Fork examples</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="stream_descriptor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../windows.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
103
src/async_io/asio/doc/asio/overview/posix/local.html
Normal file
103
src/async_io/asio/doc/asio/overview/posix/local.html
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>UNIX Domain Sockets</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../posix.html" title="POSIX-Specific Functionality">
|
||||||
|
<link rel="prev" href="../posix.html" title="POSIX-Specific Functionality">
|
||||||
|
<link rel="next" href="stream_descriptor.html" title="Stream-Oriented File Descriptors">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../posix.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="stream_descriptor.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.posix.local"></a><a class="link" href="local.html" title="UNIX Domain Sockets">UNIX Domain Sockets</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">local::stream_protocol::socket socket1(my_io_context);
|
||||||
|
local::stream_protocol::socket socket2(my_io_context);
|
||||||
|
local::connect_pair(socket1, socket2);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
will create a pair of stream-oriented sockets. To do the same for datagram-oriented
|
||||||
|
sockets, use:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">local::datagram_protocol::socket socket1(my_io_context);
|
||||||
|
local::datagram_protocol::socket socket2(my_io_context);
|
||||||
|
local::connect_pair(socket1, socket2);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">::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);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
A client that connects to this server might look like:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">local::stream_protocol::endpoint ep("/tmp/foobar");
|
||||||
|
local::stream_protocol::socket socket(my_io_context);
|
||||||
|
socket.connect(ep);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
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 <a class="link" href="../../reference/basic_socket/native_handle.html" title="basic_socket::native_handle">native_handle()</a>
|
||||||
|
member function.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.posix.local.h0"></a>
|
||||||
|
<span><a name="asio.overview.posix.local.see_also"></a></span><a class="link" href="local.html#asio.overview.posix.local.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/local__connect_pair.html" title="local::connect_pair">local::connect_pair</a>,
|
||||||
|
<a class="link" href="../../reference/local__datagram_protocol.html" title="local::datagram_protocol">local::datagram_protocol</a>,
|
||||||
|
<a class="link" href="../../reference/local__datagram_protocol/endpoint.html" title="local::datagram_protocol::endpoint">local::datagram_protocol::endpoint</a>,
|
||||||
|
<a class="link" href="../../reference/local__datagram_protocol/socket.html" title="local::datagram_protocol::socket">local::datagram_protocol::socket</a>,
|
||||||
|
<a class="link" href="../../reference/local__stream_protocol.html" title="local::stream_protocol">local::stream_protocol</a>,
|
||||||
|
<a class="link" href="../../reference/local__stream_protocol/acceptor.html" title="local::stream_protocol::acceptor">local::stream_protocol::acceptor</a>,
|
||||||
|
<a class="link" href="../../reference/local__stream_protocol/endpoint.html" title="local::stream_protocol::endpoint">local::stream_protocol::endpoint</a>,
|
||||||
|
<a class="link" href="../../reference/local__stream_protocol/iostream.html" title="local::stream_protocol::iostream">local::stream_protocol::iostream</a>,
|
||||||
|
<a class="link" href="../../reference/local__stream_protocol/socket.html" title="local::stream_protocol::socket">local::stream_protocol::socket</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.unix_domain_sockets">UNIX domain
|
||||||
|
sockets examples</a>.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.posix.local.h1"></a>
|
||||||
|
<span><a name="asio.overview.posix.local.notes"></a></span><a class="link" href="local.html#asio.overview.posix.local.notes">Notes</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
UNIX domain sockets are only available at compile time if supported by
|
||||||
|
the target operating system. A program may test for the macro <code class="computeroutput">ASIO_HAS_LOCAL_SOCKETS</code>
|
||||||
|
to determine whether they are supported.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../posix.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="stream_descriptor.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Stream-Oriented File Descriptors</title>
|
||||||
|
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../posix.html" title="POSIX-Specific Functionality">
|
||||||
|
<link rel="prev" href="local.html" title="UNIX Domain Sockets">
|
||||||
|
<link rel="next" href="fork.html" title="Fork">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="local.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="fork.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h4 class="title">
|
||||||
|
<a name="asio.overview.posix.stream_descriptor"></a><a class="link" href="stream_descriptor.html" title="Stream-Oriented File Descriptors">Stream-Oriented
|
||||||
|
File Descriptors</a>
|
||||||
|
</h4></div></div></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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 <code class="computeroutput">EAGAIN</code> or <code class="computeroutput">EWOULDBLOCK</code>.
|
||||||
|
(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 <code class="computeroutput">asio::null_buffers</code>, are not portably
|
||||||
|
supported.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
For example, to perform read and write operations on standard input and
|
||||||
|
output, the following objects may be created:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">posix::stream_descriptor in(my_io_context, ::dup(STDIN_FILENO));
|
||||||
|
posix::stream_descriptor out(my_io_context, ::dup(STDOUT_FILENO));
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
These are then used as synchronous or asynchronous read and write streams.
|
||||||
|
This means the objects can be used with any of the <a class="link" href="../../reference/read.html" title="read">read()</a>,
|
||||||
|
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>,
|
||||||
|
<a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>, <a class="link" href="../../reference/read_until.html" title="read_until">read_until()</a> or <a class="link" href="../../reference/async_read_until.html" title="async_read_until">async_read_until()</a>
|
||||||
|
free functions.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.posix.stream_descriptor.h0"></a>
|
||||||
|
<span><a name="asio.overview.posix.stream_descriptor.see_also"></a></span><a class="link" href="stream_descriptor.html#asio.overview.posix.stream_descriptor.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../../reference/posix__stream_descriptor.html" title="posix::stream_descriptor">posix::stream_descriptor</a>,
|
||||||
|
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.chat">Chat example (C++03)</a>,
|
||||||
|
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.chat">Chat example (C++11)</a>.
|
||||||
|
</p>
|
||||||
|
<h6>
|
||||||
|
<a name="asio.overview.posix.stream_descriptor.h1"></a>
|
||||||
|
<span><a name="asio.overview.posix.stream_descriptor.notes"></a></span><a class="link" href="stream_descriptor.html#asio.overview.posix.stream_descriptor.notes">Notes</a>
|
||||||
|
</h6>
|
||||||
|
<p>
|
||||||
|
POSIX stream descriptors are only available at compile time if supported
|
||||||
|
by the target operating system. A program may test for the macro <code class="computeroutput">ASIO_HAS_POSIX_STREAM_DESCRIPTOR</code>
|
||||||
|
to determine whether they are supported.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="local.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="fork.html"><img src="../../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
96
src/async_io/asio/doc/asio/overview/rationale.html
Normal file
96
src/async_io/asio/doc/asio/overview/rationale.html
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Rationale</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="../overview.html" title="Overview">
|
||||||
|
<link rel="next" href="core.html" title="Core Concepts and Functionality">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../overview.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.rationale"></a><a class="link" href="rationale.html" title="Rationale">Rationale</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Asio provides the tools to manage these long running operations, without
|
||||||
|
requiring programs to use concurrency models based on threads and explicit
|
||||||
|
locking.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
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:
|
||||||
|
</p>
|
||||||
|
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Portability.</strong></span> The library should support
|
||||||
|
a range of commonly used operating systems, and provide consistent behaviour
|
||||||
|
across these operating systems.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Scalability.</strong></span> 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.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Efficiency.</strong></span> The library should support
|
||||||
|
techniques such as scatter-gather I/O, and allow programs to minimise
|
||||||
|
data copying.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Model concepts from established APIs, such as BSD
|
||||||
|
sockets.</strong></span> 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.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Ease of use.</strong></span> 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.
|
||||||
|
</li>
|
||||||
|
<li class="listitem">
|
||||||
|
<span class="bold"><strong>Basis for further abstraction.</strong></span> 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.
|
||||||
|
</li>
|
||||||
|
</ul></div>
|
||||||
|
<p>
|
||||||
|
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.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="../overview.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
82
src/async_io/asio/doc/asio/overview/serial_ports.html
Normal file
82
src/async_io/asio/doc/asio/overview/serial_ports.html
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
|
||||||
|
<title>Serial Ports</title>
|
||||||
|
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
|
||||||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
|
||||||
|
<link rel="home" href="../../index.html" title="Asio">
|
||||||
|
<link rel="up" href="../overview.html" title="Overview">
|
||||||
|
<link rel="prev" href="timers.html" title="Timers">
|
||||||
|
<link rel="next" href="signals.html" title="Signal Handling">
|
||||||
|
</head>
|
||||||
|
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
|
||||||
|
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="timers.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="signals.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="titlepage"><div><div><h3 class="title">
|
||||||
|
<a name="asio.overview.serial_ports"></a><a class="link" href="serial_ports.html" title="Serial Ports">Serial Ports</a>
|
||||||
|
</h3></div></div></div>
|
||||||
|
<p>
|
||||||
|
Asio includes classes for creating and manipulating serial ports in a portable
|
||||||
|
manner. For example, a serial port may be opened using:
|
||||||
|
</p>
|
||||||
|
<pre class="programlisting">serial_port port(my_io_context, name);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
where name is something like <code class="computeroutput">"COM1"</code> on Windows, and
|
||||||
|
<code class="computeroutput">"/dev/ttyS0"</code> on POSIX platforms.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Once opened, the serial port may be used as a <a class="link" href="core/streams.html" title="Streams, Short Reads and Short Writes">stream</a>.
|
||||||
|
This means the objects can be used with any of the <a class="link" href="../reference/read.html" title="read">read()</a>,
|
||||||
|
<a class="link" href="../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../reference/write.html" title="write">write()</a>,
|
||||||
|
<a class="link" href="../reference/async_write.html" title="async_write">async_write()</a>, <a class="link" href="../reference/read_until.html" title="read_until">read_until()</a>
|
||||||
|
or <a class="link" href="../reference/async_read_until.html" title="async_read_until">async_read_until()</a>
|
||||||
|
free functions.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
The serial port implementation also includes option classes for configuring
|
||||||
|
the port's baud rate, flow control type, parity, stop bits and character
|
||||||
|
size.
|
||||||
|
</p>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.serial_ports.h0"></a>
|
||||||
|
<span><a name="asio.overview.serial_ports.see_also"></a></span><a class="link" href="serial_ports.html#asio.overview.serial_ports.see_also">See
|
||||||
|
Also</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
<a class="link" href="../reference/serial_port.html" title="serial_port">serial_port</a>, <a class="link" href="../reference/serial_port_base.html" title="serial_port_base">serial_port_base</a>,
|
||||||
|
<a class="link" href="../reference/serial_port_base__baud_rate.html" title="serial_port_base::baud_rate">serial_port_base::baud_rate</a>,
|
||||||
|
<a class="link" href="../reference/serial_port_base__flow_control.html" title="serial_port_base::flow_control">serial_port_base::flow_control</a>,
|
||||||
|
<a class="link" href="../reference/serial_port_base__parity.html" title="serial_port_base::parity">serial_port_base::parity</a>,
|
||||||
|
<a class="link" href="../reference/serial_port_base__stop_bits.html" title="serial_port_base::stop_bits">serial_port_base::stop_bits</a>,
|
||||||
|
<a class="link" href="../reference/serial_port_base__character_size.html" title="serial_port_base::character_size">serial_port_base::character_size</a>.
|
||||||
|
</p>
|
||||||
|
<h5>
|
||||||
|
<a name="asio.overview.serial_ports.h1"></a>
|
||||||
|
<span><a name="asio.overview.serial_ports.notes"></a></span><a class="link" href="serial_ports.html#asio.overview.serial_ports.notes">Notes</a>
|
||||||
|
</h5>
|
||||||
|
<p>
|
||||||
|
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 <code class="computeroutput">ASIO_HAS_SERIAL_PORT</code>
|
||||||
|
to determine whether they are supported.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
|
||||||
|
<td align="left"></td>
|
||||||
|
<td align="right"><div class="copyright-footer">Copyright © 2003-2018 Christopher M. Kohlhoff<p>
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
|
||||||
|
</p>
|
||||||
|
</div></td>
|
||||||
|
</tr></table>
|
||||||
|
<hr>
|
||||||
|
<div class="spirit-nav">
|
||||||
|
<a accesskey="p" href="timers.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="signals.html"><img src="../../next.png" alt="Next"></a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user