ZEND_METHOD( appnetServer , close ) { long fd; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &fd ) == FAILURE) { RETURN_FALSE;; } if( fd <= 0 ) { printf( "app close fd=%d error \n" , fd ); RETURN_FALSE; } aeServer* appserv = APPNET_G( appserv ); aeConnection* uc = &appserv->connlist[fd]; if( uc == NULL ) { php_printf( "close error,client obj is null"); RETURN_FALSE; } appserv->close( fd ); RETURN_TRUE; }
ZEND_METHOD( appnetServer , getHeader ) { array_init(return_value); aeServer* appserv = APPNET_G( appserv ); int i; int connfd = appserv->worker->connfd; httpHeader* header = &appserv->connlist[connfd].hh; if( header->protocol == HTTP ) { add_assoc_string(return_value, "Protocol" , "HTTP" ); } else if( header->protocol == WEBSOCKET ) { add_assoc_string(return_value, "Protocol" , "WEBSOCKET" ); } else { add_assoc_string(return_value, "Protocol" , "TCP" ); return; } add_assoc_string(return_value, "Method" , header->method ); add_assoc_string(return_value, "Uri" , header->uri ); add_assoc_string(return_value, "Version" , header->version ); for( i = 0 ; i < header->filed_nums ; i++ ) { add_assoc_string(return_value, header->fileds[i].key , header->fileds[i].value ); } }
ZEND_METHOD( appnetServer , getInfo ) { array_init(return_value); aeServer* appserv = APPNET_G( appserv ); if( appserv == NULL ) { return; } add_assoc_long(return_value, "worker_num" ,appserv->workerNum ); add_assoc_long(return_value, "reactor_num" , appserv->reactorNum ); add_assoc_long(return_value, "max_connection" , appserv->maxConnect ); add_assoc_long(return_value, "protocol" , appserv->protocolType ); }
ZEND_METHOD( appnetServer , send ) { size_t len = 0; long fd; char* buffer; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &fd,&buffer,&len ) == FAILURE) { return; } aeServer* appserv = APPNET_G( appserv ); int sendlen; sendlen = appserv->send( fd , buffer , len ); RETURN_LONG( sendlen ); }
//===================================================== ZEND_METHOD( appnetServer , __construct ) { size_t host_len = 0; char* serv_host; long serv_port; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &serv_host, &host_len, &serv_port ) == FAILURE) { return; } aeServer* appserv = appnetServInit( serv_host , serv_port ); //save to global var appserv->ptr2 = getThis(); APPNET_G( appserv ) = appserv; }
int onTimer( aeEventLoop *l, int id,void *data ) { timerArgs* timerArg = (timerArgs*)data; zval* callback = (zval*)timerArg->func; zval* params = (zval*)timerArg->params; if( callback == NULL ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "onTimer callback ptr NULL"); } aeServer* appserv = APPNET_G( appserv ); zval retval; zval *args; zval *zserv = (zval*)appserv->ptr2; zval zid; args = safe_emalloc(sizeof(zval),3, 0 ); ZVAL_LONG( &zid , (long)id ); ZVAL_COPY(&args[0], zserv ); ZVAL_COPY(&args[1] , &zid ); ZVAL_COPY(&args[2], params ); printf( "server=%p,cb_ptr=%p,cb=%p,cb=%s,arg=%s \n" , appserv, callback , params , callback , params ); if (call_user_function_ex(EG(function_table), NULL, callback ,&retval, 3 , args , 0, NULL) == FAILURE ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "call_user_function_ex timer callback error"); } if (EG(exception)) { php_error_docref(NULL, E_WARNING, "timer callback failed"); } zval_ptr_dtor(&zid); efree( args ); if ( &retval != NULL) { zval_ptr_dtor(&retval); } return timerArg->ts; }
ZEND_METHOD( appnetServer , setOption ) { size_t key_len; size_t val_len; char* key; char* val; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &key, &key_len, &val , &val_len ) == FAILURE) { return; } aeServer* appserv = APPNET_G( appserv ); int ret = appserv->setOption( key,val ); if( ret == AE_TRUE ) { RETURN_TRUE; } RETURN_FALSE; }
int onTimer( aeEventLoop *l, int id, void *data ) { timerArgs* timerArg = (timerArgs*)data; aeServer* appserv = APPNET_G( appserv ); zval retval; zval *args; zval *zserv = (zval*)appserv->ptr2; zval zid; zval zparam; args = safe_emalloc(sizeof(zval), 3, 0 ); ZVAL_STRINGL( &zparam , timerArg->params , strlen( timerArg->params ) ); ZVAL_LONG( &zid , (long)id ); ZVAL_COPY(&args[0], zserv ); ZVAL_COPY(&args[1] , &zid ); ZVAL_COPY(&args[2], &zparam ); if (call_user_function_ex(EG(function_table), NULL, appnet_serv_callback[APPNET_SERVER_CB_onTimer] , &retval, 3 , args , 0, NULL) == FAILURE ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "call_user_function_ex timer callback error"); } if (EG(exception)) { php_error_docref(NULL, E_WARNING, "timer callback failed"); } zval_ptr_dtor(&zid); efree( args ); if ( &retval != NULL) { zval_ptr_dtor(&retval); } return timerArg->ts; }
ZEND_METHOD( appnetServer , getHeader ) { array_init(return_value); aeServer* appserv = APPNET_G( appserv ); int i; int connfd = appserv->worker->connfd; httpHeader* header = &appserv->worker->req_header; if ( appserv->worker->proto == HTTP ) { add_assoc_string(return_value, "Protocol" , "HTTP" ); } else if ( appserv->worker->proto == WEBSOCKET ) { add_assoc_string(return_value, "Protocol" , "WEBSOCKET" ); } else { add_assoc_string(return_value, "Protocol" , "TCP" ); return; } add_assoc_string(return_value, "Method" , header->method ); add_assoc_string(return_value, "Uri" , header->uri ); add_assoc_string(return_value, "Version" , header->version ); char key[64]; char val[1024]; for ( i = 0 ; i < header->filed_nums ; i++ ) { memset( key , 0 , sizeof( key )); memset( val , 0 , sizeof( val )); memcpy( key , header->fileds[i].key.pos , header->fileds[i].key.len ); memcpy( val , header->fileds[i].val.pos , header->fileds[i].val.len ); add_assoc_string(return_value, key , val ); } }