Re: [Cppcms-users] Design decision
Brought to you by:
artyom-beilis
|
From: Christian G. <chr...@gm...> - 2012-10-04 14:41:05
|
2012/10/4 Christian Gmeiner <chr...@gm...>:
> 2012/10/4 Artyom Beilis <art...@ya...>:
>> Read more about std::bind / boost::bind
>>
>> netlink.on_readable(std::bind(&Netlink::read));
>>
>> should be
>>
>>
>> netlink.on_readable(std::bind(&Netlink::read,&netlink,std::placeholders::_1));
>>
>> But if you already use C++11...
>
> I am using it to get std::bind (gcc version 4.6.3) as I don't wand an
> other dependency
> only to get bind working.
>
>>
>> netlink.on_readable( [&](booster::system::error_code const &e) {
>> netlink.read(e);
>> });
>>
>> Much easier to understand.
>>
>
> I really should have a closer look at C++11...
>
The netlink stuff works and I get some messages on stderr that I got a new IP.
As far as I understood the event system of cppcms I should make use of
post(..) now.
This is my current main
// start cppcms service
try
{
cppcms::service srv(argc, argv);
// add server send events asynchronous application
booster::intrusive_ptr<SSE> sse = new SSE(srv);
srv.applications_pool().mount(sse);
// add netlink listner
booster::aio::io_service &io_srv = srv.get_io_service();
Netlink netlink;
netlink.set_io_service(io_srv);
//netlink.on_readable(std::bind(&Netlink::read, &netlink));
netlink.on_readable( [&](booster::system::error_code const &e) {
netlink.read(e);
});
srv.applications_pool().mount(cppcms::applications_factory<Tssw>());
srv.run();
}
catch (std::exception const &e)
{
std::cerr << e.what() << std::endl;
}
In the SSE class I have a quite simple method called handle:
void SSE::handle(std::string name, std::string ip)
{
std::ostringstream ss;
ss << name << ", " << ip;
_stream->update(ss.str());
}
Now in my Netlink class I need to post an handler that SSE:handle gets
called... but how?
void Netlink::read(booster::system::error_code const &e)
{
int len;
struct nlmsghdr *nlh;
nlh = (struct nlmsghdr *)_buffer;
while ((len = recv(this->native(), nlh, 4096, 0)) > 0)
{
while ((NLMSG_OK(nlh, len)) && (nlh->nlmsg_type != NLMSG_DONE))
{
if (nlh->nlmsg_type == RTM_NEWADDR)
{
struct ifaddrmsg *ifa = (struct ifaddrmsg *) NLMSG_DATA(nlh);
struct rtattr *rth = IFA_RTA(ifa);
int rtl = IFA_PAYLOAD(nlh);
while (rtl && RTA_OK(rth, rtl))
{
if (rth->rta_type == IFA_LOCAL)
{
uint32_t ipaddr = htonl(*((uint32_t *) RTA_DATA(rth)));
char name[IFNAMSIZ];
if_indextoname(ifa->ifa_index, name);
fprintf(stderr, "%s is now %d.%d.%d.%d\n",
name,
(ipaddr >> 24) & 0xff,
(ipaddr >> 16) & 0xff,
(ipaddr >> 8) & 0xff,
ipaddr & 0xff);
// inform our SSE application by posting a new event
// into the event loop
this->get_io_service().post(std::bind(&SSE::handle, ...)); <<-- ?!?!
}
rth = RTA_NEXT(rth, rtl);
}
}
nlh = NLMSG_NEXT(nlh, len);
}
}
}
I have looked quite deeply into post(..) usages, but I don't get it :/
I have seen binder's -
what is the concept behind them?
thanks
---
Christian Gmeiner MSc
> thanks
> ---
> Christian Gmeiner MSc
>
>> Artyom Beilis
>> --------------
>> CppCMS - C++ Web Framework: http://cppcms.com/
>> CppDB - C++ SQL Connectivity: http://cppcms.com/sql/cppdb/
>>
>> ________________________________
>> From: Christian Gmeiner <chr...@gm...>
>> To: Artyom Beilis <art...@ya...>; cpp...@li...
>> Sent: Thursday, October 4, 2012 2:11 PM
>> Subject: Re: [Cppcms-users] Design decision
>>
>> 2012/10/4 Artyom Beilis <art...@ya...>:
>>>>________________________________
>>>
>>>> From: Christian Gmeiner <chr...@gm...>
>>>>To: cpp...@li...
>>>>Sent: Thursday, October 4, 2012 11:01 AM
>>>>Subject: [Cppcms-users] Design decision
>>>>
>>>>Hi all.
>>>>
>>>>My cppcms based web application is in a quite good shape and I got
>>>>some ideas what
>>>>new features could be added.
>>>>
>>>>+ Detection of networking changes via PF_NETLINK socket
>>>>
>>>>At the moment it is possible to configure networking settings via
>>>>cppcms. For instance,
>>>>it is possible to use manual mode for an ethernet interface to specify
>>>>ip. netmask etc. or
>>>>use DHCP mode. If DHCP gets used the running system starts dhcp client
>>>>and it could
>>>>takes some seconds until it got a valid IP address.
>>>>
>>>>The basic idea is now to use SSE (server send events) and some
>>>>detection threads.
>>>>
>>>>Create a (cppcms ?) thread per ethernet interface and run something like
>>>>http://stackoverflow.com/questions/579783/how-to-detect-ip-address-change-programmatically-in-linux
>>>>
>>>>Then I would have a singleton class for SSE where I can call e.g.
>>>>SSE::instance()->ethernet("eth0", ip,...) and my front-end can update
>>>>the values.
>>>>
>>>>Can this work?
>>>>
>>>>
>>>>---
>>>>Christian Gmeiner, MSc
>>>>
>>>
>>> Why not?
>>>
>>> Several points
>>>
>>> 1. In there link there is an example to use it without polling, so just
>>> use basic_io_device to check
>>> for readability and then call recv
>>>
>>> So basically you don't need threads just implement event driven
>>> handling in the event loop (see tutorial for examples)
>>>
>>
>> This looks like the elegant solution I am looking for :)
>>
>> But... I don't get it up and running :/
>>
>> I decided to go this way:
>>
>> #ifndef NETLINK_H_
>> #define NETLINK_H_
>>
>> #include <booster/aio/basic_io_device.h>
>>
>> class Netlink : public booster::aio::basic_io_device
>> {
>> public:
>> Netlink();
>> ~Netlink();
>>
>> void read(booster::system::error_code const &e);
>>
>> private:
>> char _buffer[4096];
>> };
>>
>> #endif /* NETLINK_H_ */
>>
>>
>> And this is my main()
>>
>> // start cppcms service
>> try
>> {
>> cppcms::service srv(argc, argv);
>>
>> booster::aio::io_service &io_srv = srv.get_io_service();
>>
>> Netlink netlink;
>> netlink.set_io_service(io_srv);
>> netlink.on_readable(std::bind(&Netlink::read));
>>
>> srv.applications_pool().mount(cppcms::applications_factory<Tssw>());
>> srv.run();
>> }
>> catch (std::exception const &e)
>> {
>> std::cerr << e.what() << std::endl;
>> }
>>
>>
>> The big big problem is how should I use on_readable(..) ? The above example
>> does
>> not compile.
>>
>> ----
>> Christian Gmeiner, MSc
>>
>> ------------------------------------------------------------------------------
>> Don't let slow site performance ruin your business. Deploy New Relic APM
>> Deploy New Relic app performance management and know exactly
>> what is happening inside your Ruby, Python, PHP, Java, and .NET app
>> Try New Relic at no cost today and get our sweet Data Nerd shirt too!
>> http://p.sf.net/sfu/newrelic-dev2dev
>> _______________________________________________
>> Cppcms-users mailing list
>> Cpp...@li...
>> https://lists.sourceforge.net/lists/listinfo/cppcms-users
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Don't let slow site performance ruin your business. Deploy New Relic APM
>> Deploy New Relic app performance management and know exactly
>> what is happening inside your Ruby, Python, PHP, Java, and .NET app
>> Try New Relic at no cost today and get our sweet Data Nerd shirt too!
>> http://p.sf.net/sfu/newrelic-dev2dev
>> _______________________________________________
>> Cppcms-users mailing list
>> Cpp...@li...
>> https://lists.sourceforge.net/lists/listinfo/cppcms-users
>>
|