예제 #1
0
파일: ip.c 프로젝트: kelixin/wlan-portal
void Stage0(void) 
{
	char buf[MAXLEN];
	MYSQL_RES *mysql_res;
	MYSQL_ROW row;

	snprintf(buf,MAXLEN,"select phone,memo from VIPMAC where MAC='%s'",MAC);
	mysql_res = ExecSQL(buf,1);
	row = mysql_fetch_row(mysql_res);
	if( row ) {
		snprintf(PHONE,12,row[0]);
		snprintf(buf,MAXLEN,"insert into Log values('%s','%s','%s',now(),'VIP %s auto online 7 day')",
			remote_addr(), MAC, PHONE, row[1]);
		ExecSQL(buf,0);
		IPOnline(7*24*3600);
	}
	snprintf(buf,MAXLEN,"select phone,timestampdiff(second,now(),end) from MACPhone where MAC='%s' and now()< end",MAC);
	mysql_res = ExecSQL(buf,1);
	row = mysql_fetch_row(mysql_res);
	if( row ) {
		snprintf(PHONE,12,row[0]);
		snprintf(buf,MAXLEN,"insert into Log values('%s','%s','%s',now(),'auto online %s sec')",
			remote_addr(), MAC, PHONE, row[1]);
		ExecSQL(buf,0);
		IPOnline(atoi(row[1]));
	}
	DisplayStage('0',NULL,0);	
	exit(0);
}
예제 #2
0
파일: ip.c 프로젝트: kelixin/wlan-portal
void IPOnline( int timespan )
{
	char buf[MAXLEN];
	char *url;
	setuid(0);
	snprintf(buf,MAXLEN,"/usr/sbin/ipset add -exist user %s,%c%c:%c%c:%c%c:%c%c:%c%c:%c%c timeout %d",
		remote_addr(), MAC[0],MAC[1],MAC[2],MAC[3],MAC[4],MAC[5],MAC[6],MAC[7],MAC[8],MAC[9],MAC[10],MAC[11],
		timespan );
	system(buf);
	snprintf(buf,MAXLEN,"insert into IPMACPhone values('%s', '%s','%s',now(), date_add(now(), interval %d second))",
			remote_addr(),MAC,PHONE,timespan);
	ExecSQL(buf,0);
	url=GetValue("url");
	if(url && (*url) && (strcmp(url,"URL")!=0)) {
		if( HtmlHeadOut==0 ) {
			HtmlHead();
			PrintFile("/var/www/html/redir.html");
		}
		printf("<script language=\"javascript\" type=\"text/javascript\">"
                        "window.location.href=\"%s\";</script>\n", url);
		printf("请继续访问<a href=%s>%s</a><p>",url,url);
		printf("</body></html>\n");
		mysql_close(mysql);
		exit(0);
	}
	DisplayStage('2',"欢迎使用网络",0);
}
예제 #3
0
/** \brief Start the operation
 */
ntudp_err_t	ntudp_itor_t::start()		throw()
{
	// sanity check
	DBG_ASSERT( ntudp_peer != NULL );
	DBG_ASSERT( remote_addr().is_null() == false );

	// if no profile is already set, take the one from ntudp_peer_t
	if( !profile )	profile	= nipmem_new ntudp_itor_profile_t(ntudp_peer->get_profile().itor());

	// if the expire_delay has NOT been set, get the default value
	if( expire_delay.is_null() )	expire_delay	= profile->expire_delay();
	// start the timeout
	expire_timeout.start(expire_delay, this, NULL);

	// init some variable for the kad_query_t
	kad_keyid_t	record_keyid	= remote_addr().peerid().to_canonical_string();
	kad_peer_t *	kad_peer	= ntudp_peer->kad_peer();
	kad_err_t	kad_err;
	// create and start the kad_query_t
	kad_query	= nipmem_new kad_query_t();
	kad_err		= kad_query->start(kad_peer, record_keyid, 0, delay_t::ALWAYS, this, NULL);
	if( kad_err.failed() )	return ntudp_err_from_kad(kad_err);
	
	// return no error
	return ntudp_err_t::OK;
}
예제 #4
0
/** \brief The common part of all subitor callback
 * 
 * - NOTE: this deletes ALL subitor
 */
void ntudp_itor_t::subitor_common_cb(udp_full_t *udp_full, const pkt_t &estapkt_in
							, const pkt_t &estapkt_out)	throw()
{
	// if no subitor are running (aka they all failed), notify NO_ROUTE_TO_HOST
	if( sub_itor_is_running() == false ){
		std::string reason	= "No route to PeerID " + remote_addr().peerid().to_string();
		notify_callback( ntudp_event_t::build_no_route_to_host(reason) );
		return;
	}

	// if this subitor failed, do nothing
	if( udp_full == NULL )	return;

	// create the ntudp_full_t
	ntudp_full_t *ntudp_full = nipmem_new ntudp_full_t(ntudp_peer, local_addr(), remote_addr(), udp_full);
	// set the ntudp_full_t estapkt
	ntudp_full->set_estapkt(estapkt_in, estapkt_out);

	// delete all the subitor
	delete_all_subitor();

	// notify the event
	ntudp_event_t	ntudp_event	= ntudp_event_t::build_cnx_established(ntudp_full);
	notify_callback( ntudp_event );
}
예제 #5
0
파일: ip.c 프로젝트: kelixin/wlan-portal
char * FilterLine ( char * line) {
	static char buf[MAXLEN];
	char *url;
	
   	int i = 0;
   	char *s, *p, *ps;

	p = GetValue("url");
	if( (p==0) || (*p==0) ) 
			url = NULL;
	else url = p;

   	p = line;
   	while(*p) {
		s = "USERIP";
		if((ps=strstr(p,s))) {
			strncpy(buf+i,p,ps-p);  i += ps-p;
			strcpy(buf+i,remote_addr()); i += strlen(remote_addr());
			p=ps+strlen(s); continue;
		}
		s = "MACADDR";
		if((ps=strstr(p,s))) {
			strncpy(buf+i,p,ps-p);  i += ps-p;
			strcpy(buf+i,MAC); i += strlen(MAC);
			p=ps+strlen(s); continue;
		}
		s = "MSG";
		if((ps=strstr(p,s))) {
			strncpy(buf+i,p,ps-p);  i += ps-p;
			strcpy(buf+i,DeferMSG); i += strlen(DeferMSG);
			p=ps+strlen(s); continue;
		}
		s = "PHONE";
		if((ps=strstr(p,s))) {
			strncpy(buf+i,p,ps-p);  i += ps-p;
			strcpy(buf+i,PHONE); i += strlen(PHONE);
			p=ps+strlen(s); continue;
		}
		
		if(url) {
			s = "URL";
			if((ps=strstr(p,s))) {
				strncpy(buf+i,p,ps-p);  i += ps-p;
				strcpy(buf+i,url); i += strlen(url);
				p=ps+strlen(s); continue;
			}
		}

		strcpy(buf+i,p);
		break;
	}
    return buf;
}
예제 #6
0
/** \brief Set the remote address
 * 
 * - NOTE: this is binding the connection
 *   - if the local_addr is to be specified by the caller, it MUST be before this function.
 */
ntudp_err_t	ntudp_itor_t::set_remote_addr(ntudp_peer_t *ntudp_peer
					, const ntudp_addr_t &m_remote_addr)	throw()
{
	// sanity check - ntudp_peer MUST NOT be null
	DBG_ASSERT( ntudp_peer );
	// -- Set the local address stuff
	// if the local_addr has been NOT been set, set it to a random portid
	if( m_local_addr.is_null() )
		m_local_addr = ntudp_addr_t(ntudp_peer->local_peerid(), ntudp_portid_t::build_random());
	// if the local_addr peerid is not qualified, set it to the ntudp_peer_t one
	if( m_local_addr.peerid().is_null() )	m_local_addr.peerid(ntudp_peer->local_peerid());

	// sanity check - the local_addr peerid MUST be the same as the ntudp_peer_t one
	DBG_ASSERT( local_addr().peerid() == ntudp_peer->local_peerid() );
	// sanity check - the local_addr and remote_addr MUST be fully qualified
	DBG_ASSERT( local_addr().is_fully_qualified() );
	DBG_ASSERT( m_remote_addr.is_fully_qualified() );

	// copy some parameter
	this->ntudp_peer	= ntudp_peer;	
	this->m_remote_addr	= m_remote_addr;

	// if this connection address is already bound, return ntudp_err_t::ALREADY_BOUND
	if( ntudp_peer->cnxaddr_is_bound(local_addr(), remote_addr()) )
		return ntudp_err_t::ALREADY_BOUND;

	// link this object to the ntudp_peer_t
	// - NOTE: it MUST be linked AFTER already_bound check or ntudp_itor_t will conflict with itself
	ntudp_peer->ntudp_itor_link(this);

	// return no error
	return ntudp_err_t::OK;
}
예제 #7
0
/** \brief Start the operation
 */
socket_err_t	socket_full_udp_t::start()					throw()
{
	nlay_err_t	nlay_err;
	inet_err_t	inet_err;
	// sanity check - udp_full and nlay_full MUST be set
	DBG_ASSERT( udp_full );
	DBG_ASSERT( nlay_full );
	DBG_ASSERT( callback );

	// TODO ISSUE with udp_full_t being already started when arriving here
	inet_err	= udp_full->set_callback(this, NULL);
	if( !inet_err.succeed() )	return socket_err_from_inet(inet_err);

	// start nlay_full
	nlay_err	= nlay_full->start(this, NULL);
	if( !nlay_err.succeed() )	return socket_err_from_nlay(nlay_err);

	// read the local_addr() once the socket is started
	m_local_addr	= socket_addr_t(domain().to_string() + "://" + udp_full->get_local_addr().to_string());
	DBG_ASSERT( !local_addr().is_null() );
	// read the remote_addr() once the socket is started
	m_remote_addr	= socket_addr_t(domain().to_string() + "://" + udp_full->get_remote_addr().to_string());
	DBG_ASSERT( !remote_addr().is_null() );
	// read the socket_type_t once the socket is started
	m_socket_type	= socket_type_from_nlay(nlay_full->get_inner_type());
	DBG_ASSERT( !type().is_null() );

	// enable mtu_pathdisc on outter connection IIF socket_type_t::is_stream() is true
	if( type().is_stream() )	udp_full->mtu_pathdisc(true);
	// notify nlay_full of its current outter mtu - thus it can propagate it thru nlay_full
	nlay_full->mtu_outter( udp_full->mtu_inner() );

	// return no error
	return socket_err_t::OK;
}
예제 #8
0
int
run_main (int argc, ACE_TCHAR *argv[])
{
  ACE_START_TEST (ACE_TEXT ("Reactor_Exceptions_Test"));

  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT ("Starting tracing\n")));

  u_short port = argc > 1 ? ACE_OS::atoi (argv[1]) : ACE_DEFAULT_SERVER_PORT;

  ACE_INET_Addr local_addr (port);
  ACE_INET_Addr remote_addr (port, ACE_LOCALHOST, PF_INET);
  ACE_Reactor reactor (new My_Reactor, true);

  ACE_Reactor::instance (&reactor);
  ACE_Thread_Manager *thr_mgr = ACE_Thread_Manager::instance ();

  {
    // Make sure handler gets cleaned up before reactor by putting it in its
    // own scope
    My_Handler handler (local_addr);


    if (ACE_Reactor::instance ()->register_handler
        (&handler,
         ACE_Event_Handler::READ_MASK) == -1)
      ACE_ERROR_RETURN ((LM_ERROR,
                         ACE_TEXT ("%p\n"),
                         ACE_TEXT ("register_handler")),
                        -1);

#if defined (ACE_HAS_THREADS)
    thr_mgr->spawn (ACE_THR_FUNC (worker));
#else
    // Need to figure out how to implement this test.
    ACE_ERROR ((LM_INFO,
                ACE_TEXT ("threads not supported on this platform\n")));
#endif /* ACE_HAS_THREADS */

    ACE_SOCK_Dgram dgram (ACE_sap_any_cast (ACE_INET_Addr &), PF_INET);

    for (size_t i = 0; i < ACE_MAX_ITERATIONS; i++)
      dgram.send (ACE_TEXT ("Hello"),
                  sizeof (ACE_TEXT ("Hello")),
                  remote_addr);
    // Barrier to wait for the other thread to return.
    thr_mgr->wait ();

    handler.close ();
    dgram.close ();
  }

  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT (" (%t) exiting main\n")));

  ACE_END_TEST;
  return 0;
}
예제 #9
0
/** \brief callback notified when a command in a kad_query_t has an event to notify
 */
bool	ntudp_itor_t::neoip_kad_query_cb(void *cb_userptr, kad_query_t &cb_kad_query
						, const kad_event_t &kad_event)	throw()
{
	// log to debug
	KLOG_DBG("enter event=" << kad_event);
	// sanity check - the kad_event MUST be query_ok()
	DBG_ASSERT( kad_event.is_query_ok() );
	// sanity check - the reporter cb_kad_query MUST be the local one
	DBG_ASSERT( kad_query == &cb_kad_query );
	// sanity check - the kad_event_t MUST be a kad_event_t::RECDUPS
	// - kad_event_t::TIMEDOUT is possible on kad_query but not here as the timeout is delay_t::NEVER
	DBG_ASSERT( kad_event.is_recdups() );

	// copy the kad_recdups_t before deleting the command
	kad_recdups_t	kad_recdups	= kad_event.get_recdups(NULL);

	// delete the kad_query_t and mark is unused
	nipmem_zdelete	kad_query;

	// if no record have been returned, notify a ntudp_event_t::UNKNOWN_HOST
	if( kad_recdups.size() == 0 ){
		std::string reason	= "No Peer Record for " + remote_addr().peerid().to_string();
		notify_callback( ntudp_event_t::build_unknown_host(reason) );
		return false;
	}

	// handle the received kad_recdups_t			
	handle_recved_kad_recdups(kad_recdups);
	
	// log to debug
	KLOG_DBG("direct_db.size()="	<< direct_db.size());
	KLOG_DBG("estarelay_db.size()=" << estarelay_db.size());
	KLOG_DBG("reverse_db.size()="	<< reverse_db.size());

	// if no sub-itor are running, notify a ntudp_event_t::NO_ROUTE_TO_HOST
	if( !sub_itor_is_running() ){
		std::string reason	= "No route to PeerID " + remote_addr().peerid().to_string();
		notify_callback( ntudp_event_t::build_no_route_to_host(reason) );
		return false;
	}

	// return 'dontkeep' as the command has just been deleted
	return false;
}
예제 #10
0
/** \brief convert the object to a string
 */
std::string	socket_full_tcp_t::to_string()					const throw()
{
	std::ostringstream	oss;
	// build the string
	oss << "connected";
	oss << " in "	<< type();
	oss << " from "	<< local_addr();
	oss << " to "	<< remote_addr();
	// return the just built string
	return oss.str();
}
예제 #11
0
  virtual int handle_timeout(const time_value &)
  {
    for (int i = 0; i < 32; ++i)
    {
      if (this->conn_list_.size() > 256)
        break;

      inet_address remote_addr(g_port, g_host);
      time_value tv(2, 0);
      this->connector_.connect(new short_conn(), remote_addr, &tv);
    }
    return 0;
  }
예제 #12
0
파일: test_upipe.cpp 프로젝트: asdlei00/ACE
  virtual int init (int argc, ACE_TCHAR *argv[])
  {
    ACE_TRACE ("Client::init");

    const ACE_TCHAR *r_addr = argc > 1 ? argv[1] : ACE_DEFAULT_RENDEZVOUS;

    ACE_UPIPE_Addr remote_addr (r_addr);

    Client_Service *cs;

    ACE_NEW_RETURN (cs, Client_Service (this->thr_mgr_), -1);

    return this->connect (cs, remote_addr);
  }
예제 #13
0
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
    const ACE_TCHAR *rendezvous = argc > 1 ? argv[1] : ACE_DEFAULT_RENDEZVOUS;
    char buf[BUFSIZ];

    ACE_LSOCK_Stream cli_stream;
    ACE_LSOCK_Connector con;
    ACE_UNIX_Addr remote_addr (rendezvous);

    // Establish the connection with server.
    if (con.connect (cli_stream, remote_addr) == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           ACE_TEXT ("%p\n"),
                           ACE_TEXT ("connect")),
                          1);

    // Send data to server (correctly handles "incomplete writes").

    for (int r_bytes;
            (r_bytes = ACE_OS::read (ACE_STDIN, buf, sizeof buf)) > 0;
        )
        if (cli_stream.send_n (buf, r_bytes) == -1)
            ACE_ERROR_RETURN ((LM_ERROR,
                               ACE_TEXT ("%p\n"),
                               ACE_TEXT ("send_n")),
                              1);

    // Explicitly close the writer-side of the connection.
    if (cli_stream.close_writer () == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           ACE_TEXT ("%p\n"),
                           ACE_TEXT ("close_writer")),
                          1);

    // Wait for handshake with server.
    if (cli_stream.recv_n (buf, 1) != 1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           ACE_TEXT ("%p\n"),
                           ACE_TEXT ("recv_n")),
                          1);

    // Close the connection completely.
    if (cli_stream.close () == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           ACE_TEXT ("%p\n"),
                           ACE_TEXT ("close")),
                          1);
    return 0;
}
예제 #14
0
파일: sync_client.cpp 프로젝트: ycopy/wawo
int main( int argc, char** argv ) {

	wawo::app::App application ;

	wawo::net::SocketAddr remote_addr( "192.168.2.7", 12121 );
	WAWO_REF_PTR<wawo::net::Socket> socket ( new wawo::net::Socket( remote_addr,wawo::net::F_AF_INET , wawo::net::ST_STREAM, wawo::net::P_TCP ) );
	int rt = socket->Open();
	WAWO_RETURN_V_IF_NOT_MATCH(rt, rt == wawo::OK);
	rt = socket->Connect();
	WAWO_RETURN_V_IF_NOT_MATCH(rt, rt == wawo::OK);

	WWRP<wawo::net::core::TLP_Abstract> tlp(new typename PeerT::TLPT());
	socket->SetTLP(tlp);
	rt = socket->TLP_Handshake();
	WAWO_RETURN_V_IF_NOT_MATCH(rt, rt == wawo::OK);

	WAWO_REF_PTR<PeerT> peer(new PeerT());
	peer->AttachSocket(socket);

	int sndhellort;
	PEER_SND_HELLO(peer, sndhellort);
	WAWO_ASSERT(sndhellort==wawo::OK);

	int ec;
	do {
		WWSP<MessageT> arrives[5];
		wawo::u32_t count = peer->DoReceiveMessages(arrives, 5, ec);

		WAWO_ASSERT(count == 1);
		WAWO_ASSERT(ec == wawo::OK);
		WAWO_ASSERT(arrives[0]->GetType() == wawo::net::peer::message::Wawo::T_RESPONSE );

		wawo::Len_CStr reqstr("this is request from client");
		WWSP<wawo::algorithm::Packet> reqpack( new wawo::algorithm::Packet() );

		reqpack->Write<wawo::u32_t>(services::C_ECHO_STRING_REQUEST_TEST);
		reqpack->Write<wawo::u32_t>(reqstr.Len());
		reqpack->Write((wawo::byte_t*)reqstr.CStr(),reqstr.Len());

		reqpack->WriteLeft < wawo::net::ServiceIdT >(services::S_ECHO);
		WWSP< MessageT> message_to_req(new MessageT(reqpack));
		int sndrt = peer->Request(message_to_req);
		WAWO_ASSERT(sndrt == wawo::OK);
	} while (ec == wawo::OK);

	WAWO_LOG_WARN( "main", "socket server exit ..." ) ;
	return wawo::OK;
}
예제 #15
0
파일: ip.c 프로젝트: kelixin/wlan-portal
int CGImain(void) {
	char *s;
	ConnectDB();
	s = GetValue("s");
	GetMAC(remote_addr());
	if(MAC[0]==0) 
		DisplayStage('0',"无法获取MAC地址",1);
	if ( (s== NULL) || *s=='0') 
		Stage0();
	else if( *s=='1') 
		Stage1();
	else if(*s=='2') {
		 Stage2();
	} else Stage0();
	return 0;
}
예제 #16
0
int TCPClient::connect(const char* host, uint16_t port) 
{
      int rv = 0;
      if(isWanReady())
      {

        uint32_t ip_addr = 0;

        if(gethostbyname((char*)host, strlen(host), &ip_addr) > 0)
        {
                IPAddress remote_addr(BYTE_N(ip_addr, 3), BYTE_N(ip_addr, 2), BYTE_N(ip_addr, 1), BYTE_N(ip_addr, 0));

                return connect(remote_addr, port);
        }
      }
      return rv;
}
예제 #17
0
int
ACE::HTBP::ID_Requestor::connect_to_server (ACE_SOCK_Stream *cli_stream)
{
  if (port_ == 0 || host_.length() == 0)
    {
      int host_start = url_.find (ACE_TEXT("http://")) + 7;
      int port_sep = 0;
      int sep = 0;
      if (host_start == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           ACE_TEXT("(%P|%t) ACE::HTBP::ID_Requestor::")
                           ACE_TEXT("connect_to_server: ")
                           ACE_TEXT("invalid URL: \"%s\"\n"),
                           url_.c_str()),
                          -1);
      port_sep = url_.find (ACE_TEXT(":"),(size_t)host_start);
      sep = url_.find (ACE_TEXT("/"),(size_t)host_start);
      if (sep == -1 || sep == host_start +1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           ACE_TEXT("(%P|%t) ACE::HTBP::ID_Requestor::")
                           ACE_TEXT("connect_to_server: ")
                           ACE_TEXT("invalid URL: \"%s\"\n"),
                           url_.c_str()),
                          -1);
      if (port_sep == -1)
        {
          port_sep = sep;
          port_ = 80; // should be a default?
        }
      host_ = url_.substr(host_start,port_sep - host_start);
    }

  ACE_INET_Addr remote_addr (static_cast<u_short> (port_), host_.c_str());
  ACE_SOCK_Connector con;
  if (con.connect (*cli_stream,
                   remote_addr) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       ACE_TEXT("(%P|%t) ACE::HTBP::ID_Requestor::")
                       ACE_TEXT("connect_to_server: ")
                       ACE_TEXT("%p\n"),
                       ACE_TEXT("socket connect")),
                      -1);
  return 0;
}
예제 #18
0
 virtual int handle_timeout(const time_value &now)
 {
   if (this->sock_status_ == _SOCK_INIT
       && !this->be_connecting_)
   {
     this->be_connecting_ = true;
     inet_address remote_addr(this->port_, this->host_);
     s_connector.connect(this, remote_addr, NULL, MAX_INNER_SOCKET_BUF_SIZE);
     s_log->rinfo("begin to connect db proxy %s:%d!", this->host_, this->port_);
     return 0;
   }else if (this->sock_status_ == _SOCK_ACTIVE
             || this->sock_status_ == _SOCK_CON_OK)
   {
     if (this->do_heart_beat() == 0
         && this->check_heart_beat(now) == 0)
       return 0;
     return -1;
   }
   return 0;
 }
예제 #19
0
/** \brief Start the operation
 */
socket_err_t	socket_full_tcp_t::start()					throw()
{
	inet_err_t	inet_err;
	// sanity check - tcp_full and nlay_full MUST be set
	DBG_ASSERT( tcp_full );
	DBG_ASSERT( callback );

	// start the tcp_full_t
	inet_err	= tcp_full->start(this, NULL);
	if( !inet_err.succeed() )	return socket_err_from_inet(inet_err);

	// read the local_addr() once the socket is started
	m_local_addr	= socket_addr_t(domain().to_string() + "://" + tcp_full->local_addr().to_string());
	DBG_ASSERT( !local_addr().is_null() );
	// read the remote_addr() once the socket is started
	m_remote_addr	= socket_addr_t(domain().to_string() + "://" + tcp_full->remote_addr().to_string());
	DBG_ASSERT( !remote_addr().is_null() );

	// return no error
	return socket_err_t::OK;
}
예제 #20
0
void AsyncTCPSocket::ProcessInput(char * data, size_t& len) {
  SocketAddress remote_addr(GetRemoteAddress());

  while (true) {
    if (len < PKT_LEN_SIZE)
      return;

    PacketLength pkt_len;
    memcpy(&pkt_len, data, PKT_LEN_SIZE);
    pkt_len = NetworkToHost16(pkt_len);

    if (len < PKT_LEN_SIZE + pkt_len)
      return;

    SignalReadPacket(this, data + PKT_LEN_SIZE, pkt_len, remote_addr);

    len -= PKT_LEN_SIZE + pkt_len;
    if (len > 0) {
      memmove(data, data + PKT_LEN_SIZE + pkt_len, len);
    }
  }
}
예제 #21
0
파일: ip.c 프로젝트: kelixin/wlan-portal
void Stage2() // setonline
{
	char *phone,*password,*p;
   	char buf[MAXLEN];
	MYSQL_RES *mysql_res;
	MYSQL_ROW row;
	phone = GetValue("phone");
	if( (phone==NULL) || (phone[0]==0) ) 
		DisplayStage('0',"输入的电话号码为空",1);
	CheckPhone(phone);
	strncpy(PHONE,phone,12);	
	password = GetValue("password");
	if((password==NULL) || strlen(password)!=6) 
		DisplayStage('1',"请输入密码",1);
	
	snprintf(buf,MAXLEN,"select pass from PhonePass where phone='%s' and valid>now()",phone);
	mysql_res = ExecSQL(buf,1);
	row = mysql_fetch_row(mysql_res);
	if( row==NULL )   
       		DisplayStage('0',"未查到一周内的电话号码信息,请重新输入",1);
	if( strcmp(row[0],password)!=0 ) {
       		DisplayStage('1',"密码错误,请重新输入",1);
	}
	
	p=GetValue("timespan");
	if ( (p==NULL) || (*p==0) ) p="1";
	*(p+1)=0;
	if ((*p!='1') && (*p!='7') )  p="1";
	snprintf(buf,MAXLEN,"replace into MACPhone values('%s','%s',now(), date_add(now(), interval %s day))",
			MAC,PHONE,p);
	ExecSQL(buf,0);
	snprintf(buf,MAXLEN,"insert into Log values('%s','%s','%s',now(),'online %s day')",
		remote_addr(), MAC, PHONE, p);
	ExecSQL(buf,0);

	IPOnline((*p-'0')*24*3600);
}
예제 #22
0
파일: robot.cpp 프로젝트: chenbk85/gserver
  int handle_timeout(const time_value &now)
  {
    time_util::now = now.sec();
    for (int i = 0;
         i < 40 && g_curr_payload < g_total_payload;
         ++i, ++this->id_)
    {
      if (this->id_ >= begin_id + g_total_payload)
      {
        e_log->rinfo("may be kick out other robot, because:");
        e_log->rinfo("  robot id shoudle be [%d---%d], now is:%d", begin_id, begin_id + g_total_payload -1, this->id_);
      }

      inet_address remote_addr(port, host);
      time_value tv(30, 0);
      char ac_bf[32] = {0};
      ::snprintf(ac_bf, sizeof(ac_bf), "robot_%d", this->id_);
      char name_bf[32] = {0};
      ::snprintf(name_bf, sizeof(name_bf), "name_%d", this->id_);
      if (robot_connector.connect(new player(ac_bf, name_bf), remote_addr, &tv) != 0)
        e_log->rinfo("connect world failed!");
    }
    return 0;
  }
예제 #23
0
파일: CPP-ATM-client.cpp 프로젝트: CCJY/ACE
int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  if (argc < 2)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "Usage: %s [-s selector] hostname [QoS in KB/sec]\n",
                       argv[0]),
                      1);

  unsigned char selector = ACE_ATM_Addr::DEFAULT_SELECTOR;
  int selector_specified = 0;
  extern int optind;
  int opt;
  while ((opt = ACE_OS::getopt (argc, argv, "s:?h")) != EOF)
    {
    switch(opt)
      {
      case 's':
        selector = ACE_OS::atoi (optarg);
        selector_specified = 1;
        break;
      case '?':
      case 'h':
        ACE_ERROR_RETURN ((LM_ERROR,
                           "Usage: %s hostname [-s selector] [QoS in KB/s]\n",
                           argv[0]),
                          1);
      } // switch
    } // while getopt

  const char *host = argv[optind];

  int rate = (argc == 3) ? ACE_OS::atoi (argv[2]) :
    (argc == 5) ? ACE_OS::atoi (argv[4]) : 0;
  // The timeout really gets ignored since FORE's drivers don't work when
  //  ioctl or fcntl calls are made on the transport id/file descriptor
  int timeout = ACE_DEFAULT_TIMEOUT;

  char buf[BUFSIZ];

  ACE_TLI_Stream cli_stream;

  ACE_ATM_Addr remote_addr (host);
  if (selector_specified)
    remote_addr.set_selector(selector);
  char hostname[MAXNAMELEN];
  ACE_OS::hostname(hostname, MAXNAMELEN);
  ACE_ATM_Addr local_addr (hostname);

  // In order to construct connections options the file handle is
  // needed.  Therefore, we need to open the TLI_Stream before we
  // construct the options.
  if (cli_stream.open (ACE_XTI_ATM_DEVICE, O_RDWR, 0) == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "open failed"),
                      1);

  ACE_DEBUG ((LM_DEBUG,
              "starting non-blocking connect\n"));

  // Initiate timed, non-blocking connection with server.
  ACE_TLI_Connector con;

  // Construct QoS options - currently FORE only supports bandwidth
  ACE_ATM_QoS qos;
  qos.set_rate(cli_stream.get_handle (),
               rate,
               ACE_ATM_QoS::OPT_FLAGS_CPID);

  struct netbuf optbuf = qos.get_qos();
//   long optlen = 0;
//   char *options = remote_addr.construct_options (cli_stream.get_handle (),
//                                                  rate,
//                                                  ACE_ATM_Addr::OPT_FLAGS_CPID,
//                                                  &optlen);
//   struct netbuf optbuf;
//   optbuf.len = optlen;
//   optbuf.buf = options;

  // Not sure why but reuse_addr set to true/1 causes problems for
  // FORE/XTI/ATM - this is now handled in ACE_TLI_Connector::connect()
  if (con.connect (cli_stream,
                   remote_addr,
                   (ACE_Time_Value *) &ACE_Time_Value::zero,
                   local_addr,
                   1,
                   O_RDWR,
                   0,
                   ACE_XTI_ATM_DEVICE,
                   0,
                   1,
                   0,
                   &optbuf) == -1)
    {
      if (errno != EWOULDBLOCK)
        ACE_ERROR_RETURN ((LM_ERROR,
                           "%p\n",
                           "connection failed"),
                          1);

      ACE_DEBUG ((LM_DEBUG,
                  "starting timed connect\n"));

      // Check if non-blocking connection is in progress, and wait up
      // to timeout seconds for it to complete.
      ACE_Time_Value tv (timeout);

      if (con.complete (cli_stream,
                        &remote_addr,
                        &tv) == -1)
        ACE_ERROR_RETURN ((LM_ERROR,
                           "%p\n",
                           "connection failed"),
                          1);
      else
        ACE_DEBUG ((LM_DEBUG,
                    "connected to %s\n",
                    remote_addr.addr_to_string ()));
    }

  // Send data to server (correctly handles "incomplete writes").

  for (int r_bytes;
       (r_bytes = ACE_OS::read (ACE_STDIN, buf, sizeof buf)) > 0;
       )
    if (cli_stream.send_n (buf,
                           r_bytes,
                           0) == -1)
      ACE_ERROR_RETURN ((LM_ERROR,
                         "%p\n",
                         "send_n"),
                        1);

  // Explicitly close the connection.
  if (cli_stream.close () == -1)
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "close"),
                      -1);
  return 0;
}
예제 #24
0
파일: ip.c 프로젝트: kelixin/wlan-portal
void Stage1() // sendsms, dispay input page
{
	char *phone,*p;
   	char buf[MAXLEN];
	char pass[MAXLEN];
	MYSQL_RES *mysql_res;
	MYSQL_ROW row;
	FILE *fp;
	p = GetValue("changenum");
	if ( p ) 
		DisplayStage('0',"请输入电话号码",0);
	phone = GetValue("phone");
	if( phone==NULL || phone[0]==0 ) 
		DisplayStage('0',"输入的电话号码为空",1);
	CheckPhone(phone);
	strncpy(PHONE,phone,12);	
	p = GetValue("havepass");
	if(p) 
		DisplayStage('1',"请输入密码",0);

	// 检查该设备当天是否发送过短信, 每天最多 MAXPERMAC
	snprintf(buf,MAXLEN,"select count from MACcount where MAC='%s' and sendday=curdate()",MAC);
	mysql_res = ExecSQL(buf,1);
	row = mysql_fetch_row(mysql_res);
	if( row ) {
		if( atoi(row[0]) >= MAXPERMAC ) {
			sprintf(buf,"每台设备每天允许%d手机登录,今天已经使用%s次,请换台设备再试",MAXPERMAC,row[0]);
			DisplayStage('0',buf,1);
		} 
		snprintf(buf,MAXLEN,"update MACcount set count=count+1 where MAC='%s' and sendday=curdate()",MAC);
		ExecSQL(buf,0);
	} else {
		snprintf(buf,MAXLEN,"replace into MACcount values ('%s', now(), 1)",MAC);
		ExecSQL(buf,0);
	}
	
	// 检查手机当天是否发送过短信, 每天最多 MAXPERPHONE
	snprintf(buf,MAXLEN,"select count from Phonecount where phone='%s' and sendday=curdate()",PHONE);
	mysql_res = ExecSQL(buf,1);
	row = mysql_fetch_row(mysql_res);
	if( row ) {
		if( atoi(row[0]) >= MAXPERPHONE ) {
			sprintf(buf,"每个手机每天允许%d短信,今天已经使用%s次,请换手机再试",MAXPERPHONE,row[0]);
			DisplayStage('0',buf,1);
		} 
		snprintf(buf,MAXLEN,"update Phonecount set count=count+1 where phone='%s' and sendday=curdate()",PHONE);
		ExecSQL(buf,0);
	} else {
		snprintf(buf,MAXLEN,"replace into Phonecount values ('%s', now(), 1)",PHONE);
		ExecSQL(buf,0);
	}

	snprintf(buf,MAXLEN,"select pass from PhonePass where phone='%s' and now()<valid",PHONE);
	mysql_res = ExecSQL(buf,1);
	row = mysql_fetch_row(mysql_res);
	if( row==NULL ) {
		srand(time(NULL));
		int i;
		for(i=0;i<6;i++) {
			int r;
			r=rand();
			pass[i]='0' + r%10;
		}
		pass[6]=0;
	} else 
		strncpy(pass,row[0],7);
	snprintf(buf,MAXLEN,"replace into PhonePass values ('%s', '%s', date_add(now(), interval 8 day) )",PHONE,pass);
	ExecSQL(buf,0);
	snprintf(buf,MAXLEN,"php /usr/src/sendsms/sendsms.php %s \"%s是您在中国科大访客WLAN密码,一周内都可以使用本密码登录,请保留本短信。\" 2>/dev/null",PHONE,pass);
	fp=popen(buf,"r");
	if(fp==NULL){
		snprintf(buf,MAXLEN,"insert into Log values('%s','%s','%s',now(),'send pass error')",
			remote_addr(), MAC, PHONE);
		ExecSQL(buf,0);
		DisplayStage('0',"密码发送失败",1);
	}
	fgets(buf,MAXLEN,fp);
	if(strncmp(buf,"OK",2)==0) {
		snprintf(buf,MAXLEN,"insert into Log values('%s','%s','%s',now(),'send pass ok')",
			remote_addr(), MAC, PHONE);
		ExecSQL(buf,0);
		DisplayStage('1',"请输入手机上收到的密码",0);
	} else {
		char tmp[MAXLEN];
		strncpy(tmp,buf,MAXLEN);
		snprintf(buf,MAXLEN,"insert into Log values('%s','%s','%s',now(),'send pass error %s')",
			remote_addr(), MAC, PHONE,tmp);
		ExecSQL(buf,0);
		DisplayStage('0',tmp,1);
	}
}
예제 #25
0
/** \brief convert the object into a string
 */
std::string	ntudp_itor_t::to_string()	const throw()
{
	if( is_null() )	return "null";
	return remote_addr().to_string();
}
/** \brief Start the action
 * 
 * @return a datum containing the reply to the request_datum
 */
datum_t	ntudp_resp_estarelay_t::start(const datum_t &request_datum)	throw()
{
	ntudp_peer_t *		ntudp_peer	= ntudp_resp->ntudp_peer;
	ntudp_sock_pkttype_t	pkttype;
	ntudp_peerid_t		src_peerid, dst_peerid;
	ntudp_portid_t		src_portid, dst_portid;	
	ipport_addr_t		remote_ipport;
	pkt_t			pkt(request_datum);
	// parse the incoming packet
	try {
		pkt >> pkttype;
		pkt >> client_nonce;
		pkt >> dst_peerid >> dst_portid;
		pkt >> src_peerid >> src_portid;
		pkt >> remote_ipport;
	}catch(serial_except_t &e){
		// log the event
		KLOG_ERR("Can't parse incoming packet due to " << e.what() );
		return datum_t();
	}
	
	// sanity check - the packet type MUST be ntudp_sock_pkttype_t::ESTARELAY_CNX_REQUEST
	DBG_ASSERT( pkttype == ntudp_sock_pkttype_t::ESTARELAY_CNX_REQUEST );
	
	// set the local/remote ntudp_addr_t from the peerid/portid of the packet
	m_local_addr	= ntudp_addr_t(dst_peerid, dst_portid);
	m_remote_addr	= ntudp_addr_t(src_peerid, src_portid);

	// if the cnxaddr is already bound, reply an error packet ALREADY_BOUND
	if( ntudp_peer->cnxaddr_is_bound(local_addr(), remote_addr()) ){
		// send back a error packet to the remote peer
		pkt_t pkt_err = ntudp_sock_errcode_build_pkt(ntudp_sock_errcode_t::ALREADY_BOUND, client_nonce);
		// autodelete this
		nipmem_delete this;
		// return the reply
		return pkt_err.to_datum();
	}
	
	// try to steal a ntudp_npos_saddrecho_t from the aview_pool
	ntudp_aview_pool_t *	aview_pool	= ntudp_peer->aview_pool();
	ntudp_npos_saddrecho_t *saddrecho	= aview_pool->steal_one_saddrecho();
	// if no ntudp_npos_saddrecho_t have been stolen, ignore this packet
	if( !saddrecho ){
		nipmem_delete this;
		return datum_t();
	}
	
	// extract the ipport_aview_t from the saddrecho and delete it
	ipport_aview_t	local_aview	= saddrecho->local_addr_aview();
	nipmem_zdelete	saddrecho;

	// create and start the udp_client on the ipport_aview_t from the aview_pool
	inet_err_t	inet_err;
	udp_client	= nipmem_new udp_client_t();
	inet_err	= udp_client->set_local_addr(local_aview.lview());
	if( inet_err.succeed() )	inet_err = udp_client->start(remote_ipport, this, NULL);
	if( inet_err.failed() ){
		nipmem_delete this;
		return datum_t();
	}
	
	// return a ntudp_sock_pkttype_t::ESTARELAY_CNX_REPLY
	return build_estarelay_cnx_reply(local_aview.pview()).to_datum();
}
예제 #27
0
int main (int argc, char *argv[])                       
{
  const char *host = argc > 1 ? argv[1] : ACE_DEFAULT_SERVER_HOST;
  u_short r_port = argc > 2 ? ACE_OS::atoi (argv[2]) : ACE_DEFAULT_SERVER_PORT;
  int timeout = argc > 3 ? ACE_OS::atoi (argv[3]) : ACE_DEFAULT_TIMEOUT;
  u_short l_port = argc > 4 ? ACE_OS::atoi (argv[4]) : ACE_DEFAULT_LOCAL_PORT;

  char buf[BUFSIZ];

  ACE_TLI_Stream cli_stream;

  ACE_INET_Addr remote_addr (r_port, host);
  ACE_INET_Addr local_addr (l_port);

  ACE_DEBUG ((LM_DEBUG,
              "starting non-blocking connect\n"));

  // Initiate timed, non-blocking connection with server.
  ACE_TLI_Connector con;
                                                        
  if (con.connect (cli_stream,
                   remote_addr, 
                   (ACE_Time_Value *) &ACE_Time_Value::zero, 
                   local_addr,
                   1) == -1)
    {
      if (errno != EWOULDBLOCK)
	ACE_ERROR_RETURN ((LM_ERROR,
                           "%p\n",
                           "connection failed"),
                          1);

      ACE_DEBUG ((LM_DEBUG,
                  "starting timed connect\n"));

      // Check if non-blocking connection is in progress, and wait up
      // to timeout seconds for it to complete.
      ACE_Time_Value tv (timeout);

      if (con.complete (cli_stream,
                        &remote_addr,
                        &tv) == -1)
	ACE_ERROR_RETURN ((LM_ERROR,
                           "%p\n",
                           "connection failed"),
                          1);
      else
	ACE_DEBUG ((LM_DEBUG,
                    "connected to %s\n", 
		    remote_addr.get_host_name ()));
    }

  // Send data to server (correctly handles "incomplete writes").
  
  for (int r_bytes;
       (r_bytes = ACE_OS::read (ACE_STDIN, buf, sizeof buf)) > 0; 
       )
    if (cli_stream.send_n (buf,
                           r_bytes,
                           0) == -1)
      ACE_ERROR_RETURN ((LM_ERROR,
                         "%p\n",
                         "send_n"),
                        1);

  // Explicitly close the connection.
  if (cli_stream.close () == -1) 
    ACE_ERROR_RETURN ((LM_ERROR,
                       "%p\n",
                       "close"),
                      -1);
  return 0;
}                                                       
void CNetworkLayerTestDlg::DoConnect()
{
TRY_CATCH

	char buf[MAX_PATH];

	m_RemotePort.GetWindowText( buf, MAX_PATH );
	unsigned int remote_port = atoi( buf );

	m_LocalPort.GetWindowText( buf, MAX_PATH );
	unsigned int local_port = atoi( buf );

	m_Timeout.GetWindowText( buf, MAX_PATH );
	unsigned int timeout = atoi( buf );

	m_RemoteAddress.GetWindowText( buf, MAX_PATH );
	tstring remote_addr( buf );

//	Stream.SetConnectedEvent( boost::bind( &CNetworkLayerTestDlg::OnConnected, this, _1 ) );
//	Stream.SetDisconnectedEvent( boost::bind( &CNetworkLayerTestDlg::OnDisconnected, this, _1 ) );
//	Stream.SetConnectErrorEvent( boost::bind( &CNetworkLayerTestDlg::OnConnectError, this, _1, _2 ) );
	
	Stream.SetConnectTimeout( timeout );

//***************************************************************************

	m_UserID.GetWindowText( buf, MAX_PATH );
	tstring user_id( buf );

	m_UserKey.GetWindowText( buf, MAX_PATH );
	tstring user_key( buf );

	Stream.GetCredentials().UserID = user_id;
	Stream.GetCredentials().Key = user_key;

//***************************************************************************
	switch ( m_Cipher )
	{
	case 1:
		Stream.GetSuite().Cipher = CPH_AES_128;
		break;

	case 2:
		Stream.GetSuite().Cipher = CPH_AES_256;
		break;

	case 3:
		Stream.GetSuite().Cipher = CPH_3DES;
		break;

	case 4:
		Stream.GetSuite().Cipher = CPH_RC4_128;
		break;

	default:
		Stream.GetSuite().Cipher = CPH_NULL;
	}
	
	switch ( m_Compression )
	{
	case 1:
		Stream.GetSuite().Compression = PRS_ZLIB;
		break;

	case 2:
		Stream.GetSuite().Compression = PRS_LZO;
		break;

	default:
		Stream.GetSuite().Compression = PRS_NULL;
	}
	
	switch ( m_KeyExchange )
	{
	case 1:
		Stream.GetSuite().KeyExchange = KX_DHE_PSK;
		break;

	default:
		Stream.GetSuite().KeyExchange = KX_PSK;
	}

	Stream.GetSuite().PrimeBits = PB_1024;

//***************************************************************************
	m_ProxyPort.GetWindowText( buf, MAX_PATH );
	unsigned int proxy_port = atoi( buf );

	m_ProxyAddress.GetWindowText( buf, MAX_PATH );
	tstring proxy_addr( buf );

	bool use_proxy = ( BST_CHECKED == m_UseProxy.GetCheck() );

	Stream.SetConnectThroughProxy( use_proxy );
	Stream.GetProxySettings().ProxyURL = proxy_addr;
	Stream.GetProxySettings().ProxyPort = proxy_port;
//***************************************************************************

	m_SendList.AddString( "Connecting ..." );

	try
	{
		Stream.SetLocalAddr( local_port );
		Stream.SetRemoteAddr( remote_addr, remote_port );
		Stream.Connect();
		OnConnected(NULL);
	}
	catch(CStreamException ex)
	{
		m_SendList.AddString( ex.what.c_str() );
		m_ConnectButton.EnableWindow( true );
		m_DisconnectButton.EnableWindow( false );
		m_SendButton.EnableWindow( false );
	}

CATCH_LOG("CNetworkLayerTestDlg::DoConnect")
}
예제 #29
0
	socket_addr_t	get_remote_addr()	const throw()	{ return remote_addr();	}
예제 #30
0
파일: robot.cpp 프로젝트: chenbk85/gserver
int main (int argc, char *argv[])
{
#ifdef FOR_ONEROBOT
  if (argc != 3)
  {
    fprintf(stderr, "%s 192.168.1.221 4001!\n", argv[0]);
    return -1;
  }
#else
  if (argc != 5)
  {
    fprintf(stderr, "%s 192.168.1.221 4001 payload begin_idx!\n", argv[0]);
    return -1;
  }
#endif

  signal(SIGPIPE ,SIG_IGN);
  signal(SIGINT ,SIG_IGN);

  set_max_fds(1024);

  reactor r;
  if (r.open(10000, 2192) != 0)
  {
    fprintf(stderr, "open failed![%s]\n", strerror(errno));
    return -1;
  }

  if (init_log() != 0)
	{
		fprintf(stderr, "init log err.\n");
		return -1;
	}

  host = argv[1];
  port = ::atoi(argv[2]);
#ifndef FOR_ONEROBOT
  g_total_payload = ::atoi(argv[3]);
  begin_id = ::atoi(argv[4]);
#endif

  srand(time_value::start_time.sec());
  time_util::init();

  robot_connector.open(&r);
#ifndef FOR_ONEROBOT
  r.schedule_timer(new timer(begin_id),
                   time_value(0, 800*1000),
                   time_value(0, 800*1000));
#endif

  if (global_param_cfg::instance()->load_config("../config") != 0)
  {
    fprintf(stderr, "Error: config - load global_param_cfg config failed!\n");
    return -1;
  }
  if (scene_config::instance()->load_config("../config") != 0)
  {
    fprintf(stderr, "Error: config - load scene config failed!\n");
    return -1;
  }
  if (buff_config::instance()->load_config("../config") != 0)
  {
    fprintf(stderr, "Error: config - load buff config failed!\n");
    return -1;
  }
  if (skill_config::instance()->load_config("../config") != 0)
  {
    fprintf(stderr, "Error: config - load skill config failed!\n");
    return -1;
  }
  if (item_config::instance()->load_config("../config") != 0)
  {
    fprintf(stderr, "Error: config - load item config failed!\n");
    return -1;
  }

  L = luaL_newstate();
  luaL_openlibs(L);
#ifdef FOR_LUA
  tolua_player_open(L);
  tolua_lua_istream_open(L);
  if (luaL_loadfile(L, "src/ai_func.lua")
      || lua_pcall(L, 0, 0, 0))
  {
    fprintf(stderr, "load ai_func lua file failed!\n");
    return -1;
  }
  if (luaL_loadfile(L, "src/dispatch_msg.lua")
      || lua_pcall(L, 0, 0, 0))
  {
    fprintf(stderr, "load dispatch_msg lua file failed!\n");
    return -1;
  }
#endif

	s_log->rinfo("=============================begin=================");
	e_log->rinfo("=============================begin=================");

#ifdef FOR_ONEROBOT
  ::signal(SIGABRT, svc_core_signal);
  //::signal(SIGSEGV, svc_core_signal);
  inet_address remote_addr(port, host);
  time_value tv(30, 0);
  char ac_bf[32] = {0};
  login_ncurses::input_account(ac_bf);

  if (robot_connector.connect(new player(ac_bf, ""), remote_addr, &tv) != 0)
  {
    e_log->rinfo("connect world failed!");
    return 0;
  }
#endif

  r.run_reactor_event_loop();

#ifdef FOR_ONEROBOT
  director::instance()->exit();
#endif

  lua_close(L);
  return 0;
}