废话不多说直接上代码:
GetConfig函数见本栏其他文章。功能:读取文本配置。
#include <sys/wait.h> #include <iostream> #include <string> #include <boost/asio.hpp> #include "boost/bind.hpp" class receiver_ { public: receiver_(boost::asio::io_service& io_service, const boost::asio::ip::address& listen_address, const boost::asio::ip::address& multicast_address,string src_port) : socket_(io_service), timer_(io_service) { // Create the socket so that multiple may be bound to the same address. stringstream buffer ; buffer<<src_port ; int PORT = 0 ; buffer>>PORT; boost::asio::ip::udp::endpoint listen_endpoint( listen_address, PORT); socket_.open(listen_endpoint.protocol()); socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); socket_.bind(listen_endpoint); // Join the multicast group. socket_.set_option( boost::asio::ip::multicast::join_group(multicast_address)); timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait( boost::bind(&receiver_::handle_timeout, this, boost::asio::placeholders::error)); } void handle_receive_from(const boost::system::error_code& error, size_t bytes_recvd) { if (!error) { printf("Data has coming \n"); int rtn ; int pid=fork() ; if ( pid == 0 ) { /* 子进程程序 */ this->timer_.cancel(); ReadTrackMSGBuf(data_,bytes_recvd); exit(1); } else { /* 父进程程序*/ printf("Father waiting \n"); // signal(SIGCHLD,SIG_IGN); waitpid(pid,&rtn,0); // wait(pid); printf("Child Back\n"); } } else{ Fprint_String(error.message().c_str(),"StdTrackError","a++"); } } void handle_timeout(const boost::system::error_code& error) { if (!error) { memset(data_,0,max_length); socket_.async_receive_from( boost::asio::buffer(data_, max_length), sender_endpoint_, boost::bind(&receiver_::handle_receive_from, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); timer_.cancel(); timer_.expires_from_now(boost::posix_time::milliseconds(100)); timer_.async_wait( boost::bind(&receiver_::handle_timeout, this, boost::asio::placeholders::error)); } else{ Fprint_String(error.message().c_str(),"StdTrackError","a++"); } } private: boost::asio::deadline_timer timer_; boost::asio::ip::udp::socket socket_; boost::asio::ip::udp::endpoint sender_endpoint_; enum { max_length = 102400 }; char data_[max_length]; }; int main_UDP_Receive() { try { boost::asio::io_service io_service; char *Addr = GetConfigVal("TrackConfig","SourceAddr"); char *Port = GetConfigVal("TrackConfig","SourcePort"); if(Addr==NULL || Port==NULL) { printf("TrackConfig Lost\n"); Fprint_String("TrackConfig Lost\n","StdTrackError","a+"); exit(-1); } string StrAddr(Addr); string StrPort(Port); free(Addr); free(Port); receiver_ r(io_service, boost::asio::ip::address::from_string("0.0.0.0"), boost::asio::ip::address::from_string(StrAddr.c_str()),StrPort.c_str()); io_service.run(); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; }