123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #include <websocketpp/server.hpp>
- #include <websocketpp/config/asio_no_tls.hpp>
- namespace websocketpp
- {
- typedef lib::weak_ptr<void> connection_hdl;
- template <typename config>
- class endpoint : public config::socket_type
- {
- typedef lib::shared_ptr<lib::asio::steady_timer> timer_ptr;
- typedef typename connection_type::ptr connection_ptr;
- typedef typename connection_type::message_ptr message_ptr;
- typedef lib::function<void(connection_hdl)> open_handler;
- typedef lib::function<void(connection_hdl)> close_handler;
- typedef lib::function<void(connection_hdl)> http_handler;
- typedef lib::function<void(connection_hdl, message_ptr)>
- message_handler;
- /* websocketpp::log::alevel::none 禁⽌打印所有⽇志*/
- void set_access_channels(log::level channels); /*设置⽇志打印等级*/
- void clear_access_channels(log::level channels); /*清除指定等级的⽇志*/
- /*设置指定事件的回调函数*/
- void set_open_handler(open_handler h); /*websocket握⼿成功回调处理函数*/
- void set_close_handler(close_handler h); /*websocket连接关闭回调处理函数*/
- void set_message_handler(message_handler h); /*websocket消息回调处理函数*/
- void set_http_handler(http_handler h); /*http请求回调处理函数*/
- /*发送数据接⼝*/
- void send(connection_hdl hdl, std::string &payload,
- frame::opcode::value op);
- void send(connection_hdl hdl, void *payload, size_t len,
- frame::opcode::value op);
- /*关闭连接接⼝*/
- void close(connection_hdl hdl, close::status::value code, std::string &reason);
- /*获取connection_hdl 对应连接的connection_ptr*/
- connection_ptr get_con_from_hdl(connection_hdl hdl);
- /*websocketpp基于asio框架实现,init_asio⽤于初始化asio框架中的io_service调度
- 器*/
- void init_asio();
- /*设置是否启⽤地址重⽤*/
- void set_reuse_addr(bool value);
- /*设置endpoint的绑定监听端⼝*/
- void listen(uint16_t port);
- /*对io_service对象的run接⼝封装,⽤于启动服务器*/
- std::size_t run();
- /*websocketpp提供的定时器,以毫秒为单位*/
- timer_ptr set_timer(long duration, timer_handler callback);
- };
- template <typename config>
- class server : public endpoint<connection<config>, config>
- {
- /*初始化并启动服务端监听连接的accept事件处理*/
- void start_accept();
- };
- template <typename config>
- class connection
- : public config::transport_type::transport_con_type,
- public config::connection_base
- {
- /*发送数据接⼝*/
- error_code send(std::string &payload, frame::opcode::value
- op = frame::opcode::text);
- /*获取http请求头部*/
- std::string const &get_request_header(std::string const &key)
- /*获取请求正⽂*/
- std::string const &get_request_body();
- /*设置响应状态码*/
- void set_status(http::status_code::value code);
- /*设置http响应正⽂*/
- void set_body(std::string const &value);
- /*添加http响应头部字段*/
- void append_header(std::string const &key, std::string const &val);
- /*获取http请求对象*/
- request_type const &get_request();
- /*获取connection_ptr 对应的 connection_hdl */
- connection_hdl get_handle();
- };
- namespace http
- {
- namespace parser
- {
- class parser
- {
- std::string const &get_header(std::string const &key);
- };
- class request : public parser
- {
- /*获取请求⽅法*/
- std::string const &get_method();
- /*获取请求uri接⼝*/
- std::string const &get_uri();
- };
- }
- };
- namespace message_buffer
- {
- /*获取websocket请求中的payload数据类型*/
- frame::opcode::value get_opcode();
- /*获取websocket中payload数据*/
- std::string const &get_payload();
- };
- namespace log
- {
- struct alevel
- {
- static level const none = 0x0;
- static level const connect = 0x1;
- static level const disconnect = 0x2;
- static level const control = 0x4;
- static level const frame_header = 0x8;
- static level const frame_payload = 0x10;
- static level const message_header = 0x20;
- static level const message_payload = 0x40;
- static level const endpoint = 0x80;
- static level const debug_handshake = 0x100;
- static level const debug_close = 0x200;
- static level const devel = 0x400;
- static level const app = 0x800;
- static level const http = 0x1000;
- static level const fail = 0x2000;
- static level const access_core = 0x00003003;
- static level const all = 0xffffffff;
- };
- }
- namespace http
- {
- namespace status_code
- {
- enum value
- {
- uninitialized = 0,
- continue_code = 100,
- switching_protocols = 101,
- ok = 200,
- created = 201,
- accepted = 202,
- non_authoritative_information = 203,
- no_content = 204,
- reset_content = 205,
- partial_content = 206,
- multiple_choices = 300,
- moved_permanently = 301,
- found = 302,
- see_other = 303,
- not_modified = 304,
- use_proxy = 305,
- temporary_redirect = 307,
- bad_request = 400,
- unauthorized = 401,
- payment_required = 402,
- forbidden = 403,
- not_found = 404,
- method_not_allowed = 405,
- not_acceptable = 406,
- proxy_authentication_required = 407,
- request_timeout = 408,
- conflict = 409,
- gone = 410,
- length_required = 411,
- precondition_failed = 412,
- request_entity_too_large = 413,
- request_uri_too_long = 414,
- unsupported_media_type = 415,
- request_range_not_satisfiable = 416,
- expectation_failed = 417,
- im_a_teapot = 418,
- upgrade_required = 426,
- precondition_required = 428,
- too_many_requests = 429,
- request_header_fields_too_large = 431,
- internal_server_error = 500,
- not_implemented = 501,
- bad_gateway = 502,
- service_unavailable = 503,
- gateway_timeout = 504,
- http_version_not_supported = 505,
- not_extended = 510,
- network_authentication_required = 511
- };
- }
- }
- namespace frame
- {
- namespace opcode
- {
- enum value
- {
- continuation = 0x0,
- text = 0x1,
- binary = 0x2,
- rsv3 = 0x3,
- rsv4 = 0x4,
- rsv5 = 0x5,
- rsv6 = 0x6,
- rsv7 = 0x7,
- close = 0x8,
- ping = 0x9,
- pong = 0xA,
- control_rsvb = 0xB,
- control_rsvc = 0xC,
- control_rsvd = 0xD,
- control_rsve = 0xE,
- control_rsvf = 0xF,
- };
- }
- }
- }
|