00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef TORRENT_SOCKET_HPP_INCLUDED
00034 #define TORRENT_SOCKET_HPP_INCLUDED
00035
00036 #ifdef _MSC_VER
00037 #pragma warning(push, 1)
00038 #endif
00039
00040
00041
00042
00043
00044 #ifdef __OBJC__
00045 #define Protocol Protocol_
00046 #endif
00047
00048 #include <asio/ip/tcp.hpp>
00049 #include <asio/ip/udp.hpp>
00050 #include <asio/io_service.hpp>
00051 #include <asio/deadline_timer.hpp>
00052 #include <asio/write.hpp>
00053 #include <asio/strand.hpp>
00054
00055 #ifdef __OBJC__
00056 #undef Protocol
00057 #endif
00058
00059 #include "libtorrent/io.hpp"
00060
00061 #ifdef _MSC_VER
00062 #pragma warning(pop)
00063 #endif
00064
00065 namespace libtorrent
00066 {
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 using asio::ip::tcp;
00084 using asio::ip::udp;
00085 typedef asio::ip::tcp::socket stream_socket;
00086 typedef asio::ip::address address;
00087 typedef asio::ip::address_v4 address_v4;
00088 typedef asio::ip::address_v6 address_v6;
00089 typedef asio::ip::udp::socket datagram_socket;
00090 typedef asio::ip::tcp::acceptor socket_acceptor;
00091 typedef asio::io_service io_service;
00092
00093 using asio::async_write;
00094 using asio::deadline_timer;
00095
00096 namespace detail
00097 {
00098 template<class OutIt>
00099 void write_address(address const& a, OutIt& out)
00100 {
00101 if (a.is_v4())
00102 {
00103 write_uint32(a.to_v4().to_ulong(), out);
00104 }
00105 else if (a.is_v6())
00106 {
00107 asio::ip::address_v6::bytes_type bytes
00108 = a.to_v6().to_bytes();
00109 std::copy(bytes.begin(), bytes.end(), out);
00110 }
00111 }
00112
00113 template<class InIt>
00114 address read_v4_address(InIt& in)
00115 {
00116 unsigned long ip = read_uint32(in);
00117 return asio::ip::address_v4(ip);
00118 }
00119
00120 template<class InIt>
00121 address read_v6_address(InIt& in)
00122 {
00123 typedef asio::ip::address_v6::bytes_type bytes_t;
00124 bytes_t bytes;
00125 for (bytes_t::iterator i = bytes.begin()
00126 , end(bytes.end()); i != end; ++i)
00127 *i = read_uint8(in);
00128 return asio::ip::address_v6(bytes);
00129 }
00130
00131 template<class Endpoint, class OutIt>
00132 void write_endpoint(Endpoint const& e, OutIt& out)
00133 {
00134 write_address(e.address(), out);
00135 write_uint16(e.port(), out);
00136 }
00137
00138 template<class Endpoint, class InIt>
00139 Endpoint read_v4_endpoint(InIt& in)
00140 {
00141 address addr = read_v4_address(in);
00142 int port = read_uint16(in);
00143 return Endpoint(addr, port);
00144 }
00145
00146 template<class Endpoint, class InIt>
00147 Endpoint read_v6_endpoint(InIt& in)
00148 {
00149 address addr = read_v6_address(in);
00150 int port = read_uint16(in);
00151 return Endpoint(addr, port);
00152 }
00153 }
00154 }
00155
00156 #endif // TORRENT_SOCKET_HPP_INCLUDED
00157