Thanks mark, will try this out
Kelvin Chua On Wed, Jul 22, 2015 at 10:45 PM, Mark Michelson <[email protected]> wrote: > > > On 07/21/2015 11:23 PM, Kelvin Chua wrote: > > i am building a proof of concept for a new module, > > my first step was to create a socket to listen to, accept connections, > show remote IP, accept data and print it in asterisk console. > > so far i am able to load, unload, setup the socket with a few lines of > code. > then i got stuck. any pointers? > > here is what i have so far: > > static struct ast_tcptls_session_args desc = { > .accept_fd = -1, > .master = AST_PTHREADT_NULL, > .tls_cfg = NULL, > .poll_timeout = 5000, /* wake up every 5 seconds */ > .periodic_fn = cleanup, > .name = "Control Module", > .accept_fn = ast_tcptls_server_root, /* thread doing the > accept() */ > .worker_fn = session_do, /* thread handling the session */ > }; > > static int load_module(void) > { > struct ast_sockaddr bindaddr; > ast_sockaddr_parse(&bindaddr, "0.0.0.0:2223", 0); > ast_sockaddr_copy(&desc.local_address, &bindaddr); > ast_tcptls_server_start(&desc); > > return AST_MODULE_LOAD_SUCCESS; > } > > question: > what would be the general flow of session_do() in this scenario? > > > > Kelvin Chua > > > When your session_do() function is called, it is because a client has made > a connection to you. The session_do() function takes an argument of type > ast_tcptls_session_instance, whose definition you can find in > include/asterisk/tcptls.h. This sructure contains the file descriptor from > which data can be read from the socket, and it also contains an > ast_sockaddr structure that contains IP/port information about the remote > client that connected to you. > > If you are interested in printing the remote IP address/port, I suggest > looking at the various flavors of ast_sockaddr_stringify in > include/asterisk/netsock2.h. As for reading data from the TCP connection, > you can use typical *nix/BSD read() or recv(). > > As for the general flow, that's going to depend on what your module's > overall goal is. Typically, your session_do() will need to run a loop that > will last as long as the TCP connection is active. This loop can poll the > TCP file descriptor in order to determine when new data has arrived from > the client, then read that data and act on it. The big thing to keep in > mind is that the TCP/TLS framework in Asterisk basically just takes care of > the boilerplate of setting up a listening socket, accepting connections, > plus some helper functions. Once the connection is accepted and your > session_do() function is called, you now have sole responsibility over the > connection and can essentially do what you please with it. When you are > finished with your connection, you can call ast_tcptls_close_session_file() > in order to tear down the TCP connection. > > Hopefully that points you in the correct direction. > Mark Michelson > > -- > _____________________________________________________________________ > -- Bandwidth and Colocation Provided by http://www.api-digital.com -- > > asterisk-dev mailing list > To UNSUBSCRIBE or update options visit: > http://lists.digium.com/mailman/listinfo/asterisk-dev >
-- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- asterisk-dev mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/asterisk-dev
