|
| 1 | +#include <condition_variable> |
| 2 | + |
| 3 | +#include <websocketpp/config/asio_no_tls_client.hpp> |
| 4 | + |
| 5 | +#include <websocketpp/client.hpp> |
| 6 | + |
| 7 | +#include <iostream> |
| 8 | + |
| 9 | +#include <boost/thread/thread.hpp> |
| 10 | + |
| 11 | +typedef websocketpp::client<websocketpp::config::asio_client> client; |
| 12 | + |
| 13 | +using websocketpp::lib::placeholders::_1; |
| 14 | +using websocketpp::lib::placeholders::_2; |
| 15 | +using websocketpp::lib::bind; |
| 16 | + |
| 17 | +// pull out the type of messages sent by our config |
| 18 | +typedef websocketpp::config::asio_client::message_type::ptr message_ptr; |
| 19 | + |
| 20 | +// Create a server endpoint |
| 21 | +client sip_client; |
| 22 | + |
| 23 | + |
| 24 | +bool received; |
| 25 | + |
| 26 | +void on_open(client* c, websocketpp::connection_hdl hdl) { |
| 27 | + // now it is safe to use the connection |
| 28 | + std::cout << "connection ready" << std::endl; |
| 29 | + |
| 30 | + received=false; |
| 31 | + // Send a SIP OPTIONS message to the server: |
| 32 | + std::string SIP_msg="OPTIONS sip:carol@chicago.com SIP/2.0\r\nVia: SIP/2.0/WS df7jal23ls0d.invalid;rport;branch=z9hG4bKhjhs8ass877\r\nMax-Forwards: 70\r\nTo: <sip:carol@chicago.com>\r\nFrom: Alice <sip:alice@atlanta.com>;tag=1928301774\r\nCall-ID: a84b4c76e66710\r\nCSeq: 63104 OPTIONS\r\nContact: <sip:alice@pc33.atlanta.com>\r\nAccept: application/sdp\r\nContent-Length: 0\r\n\r\n"; |
| 33 | + sip_client.send(hdl, SIP_msg.c_str(), websocketpp::frame::opcode::text); |
| 34 | +} |
| 35 | + |
| 36 | +void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) { |
| 37 | + client::connection_ptr con = sip_client.get_con_from_hdl(hdl); |
| 38 | + |
| 39 | + std::cout << "Received a reply:" << std::endl; |
| 40 | + fwrite(msg->get_payload().c_str(), msg->get_payload().size(), 1, stdout); |
| 41 | + received=true; |
| 42 | +} |
| 43 | + |
| 44 | +int main(int argc, char* argv[]) { |
| 45 | + |
| 46 | + std::string uri = "ws://localhost:9001"; |
| 47 | + |
| 48 | + if (argc == 2) { |
| 49 | + uri = argv[1]; |
| 50 | + } |
| 51 | + |
| 52 | + try { |
| 53 | + // We expect there to be a lot of errors, so suppress them |
| 54 | + sip_client.clear_access_channels(websocketpp::log::alevel::all); |
| 55 | + sip_client.clear_error_channels(websocketpp::log::elevel::all); |
| 56 | + |
| 57 | + // Initialize ASIO |
| 58 | + sip_client.init_asio(); |
| 59 | + |
| 60 | + // Register our handlers |
| 61 | + sip_client.set_open_handler(bind(&on_open,&sip_client,::_1)); |
| 62 | + sip_client.set_message_handler(bind(&on_message,&sip_client,::_1,::_2)); |
| 63 | + |
| 64 | + websocketpp::lib::error_code ec; |
| 65 | + client::connection_ptr con = sip_client.get_connection(uri, ec); |
| 66 | + |
| 67 | + // Specify the SIP subprotocol: |
| 68 | + con->add_subprotocol("sip"); |
| 69 | + |
| 70 | + sip_client.connect(con); |
| 71 | + |
| 72 | + // Start the ASIO io_service run loop |
| 73 | + sip_client.run(); |
| 74 | + |
| 75 | + while(!received) { |
| 76 | + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); |
| 77 | + } |
| 78 | + |
| 79 | + std::cout << "done" << std::endl; |
| 80 | + |
| 81 | + } catch (const std::exception & e) { |
| 82 | + std::cout << e.what() << std::endl; |
| 83 | + } catch (websocketpp::lib::error_code e) { |
| 84 | + std::cout << e.message() << std::endl; |
| 85 | + } catch (...) { |
| 86 | + std::cout << "other exception" << std::endl; |
| 87 | + } |
| 88 | +} |
0 commit comments