Example #1
0
loax_server_t* loax_server_new(loax_server_cmd_fn cmd_fn)
{
	assert(cmd_fn);
	LOGD("debug");

	loax_server_t* self = (loax_server_t*) malloc(sizeof(loax_server_t));
	if(self == NULL)
	{
		LOGE("malloc failed");
		return NULL;
	}

	self->w = 0;
	self->h = 0;

	// JNI callback(s)
	self->cmd_fn = cmd_fn;

	self->socket_render = net_socket_connect("localhost", "6120", NET_SOCKET_TCP_NODELAY);
	if(self->socket_render == NULL)
	{
		goto fail_render;
	}

	int retry = 0;
	while(1)
	{
		self->socket_event = net_socket_connect("localhost", "6121", NET_SOCKET_TCP_BUFFERED);
		if(self->socket_event)
		{
			break;
		}
		else if(retry == 3)
		{
			LOGE("aborted after retry=%i", retry);
			goto fail_event;
		}

		// event socket can fail if server connects too fast
		++retry;
		LOGW("retry=%i", retry);
		usleep(50000*retry);
	}

	// success
	g_server = self;   // TODO
	return self;

	// failure
	fail_event:
		net_socket_close(&self->socket_render);
	fail_render:
		free(self);
	return NULL;
}
Example #2
0
static void net_socket_accept(void *opaque)
{
    NetSocketState *s = opaque;
    struct sockaddr_in saddr;
    socklen_t len;
    int fd;

    for(;;) {
        len = sizeof(saddr);
        fd = qemu_accept(s->listen_fd, (struct sockaddr *)&saddr, &len);
        if (fd < 0 && errno != EINTR) {
            return;
        } else if (fd >= 0) {
            qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
            break;
        }
    }

    s->fd = fd;
    s->nc.link_down = false;
    net_socket_connect(s);
    snprintf(s->nc.info_str, sizeof(s->nc.info_str),
             "socket: connection from %s:%d",
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
}
Example #3
0
void net_poll_status_procedure()
{
  if(net_link_status==NETDEV_LINKED)
  {
  if(dhcp_new_ip_flag==0)//dhcp 无效
  {
    net_ip_flag=0;//ip无效
    if(net_socket_status!=SOCKET_CLOSED)
    {
     net_socket_close();//关闭net app 重新开始
    }
  }
  else
  { 
   if(dhcp_new_ip_flag!=net_ip_flag)//ip需要更新
   {   
    net_socket_param_refresh();//更新ip等资源
    net_ip_flag=dhcp_new_ip_flag;//net ip    
   if(net_socket_status!=SOCKET_CLOSED)
   {
    net_socket_close();//关闭net app 重新开始
    }
   }
  }
  /***********************/
  if(net_socket_status==SOCKET_UDP)//-------------------
  {
    //todo

  }
  if(net_socket_status==SOCKET_INIT)//tcp init
  {
   net_socket_connect(); 
  }

  if(net_socket_status==SOCKET_CLOSED || net_socket_status==SOCKET_CLOSE_WAIT)//如果netsocket 是关闭的或者半关闭重新初始化连接
  {
   if(dhcp_new_ip_flag==net_ip_flag && net_ip_flag!=0  )//如果ip有效
   {
    net_socket_init();     
    net_socket_open();//打开当前net socket 
   }
  } 
  if(net_ip_comflict)
  {
     net_ip_comflict=FALSE;//使IP冲突无效
     net_ip_flag=0;//使ip无效  
     hal_net_device_software_reset();//如果ip冲突 就重启设备
  }
 }
 else//断开link 就关闭net socket
 {   
   if(net_socket_status!=SOCKET_CLOSED)//-----------------
   {
   net_ip_comflict=FALSE;//使IP冲突无效
   net_ip_flag=0;//使ip无效  
   net_socket_close();//关闭当前net socket  
   }
 }
}
Example #4
0
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
                                                 const char *model,
                                                 const char *name,
                                                 int fd, int is_connected)
{
    VLANClientState *nc;
    NetSocketState *s;

    nc = qemu_new_net_client(&net_socket_info, vlan, NULL, model, name);

    snprintf(nc->info_str, sizeof(nc->info_str), "socket: fd=%d", fd);

    s = DO_UPCAST(NetSocketState, nc, nc);

    s->fd = fd;

    if (is_connected) {
        net_socket_connect(s);
    } else {
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
    }
    return s;
}
Example #5
0
/*说明: 创建一个task任务,用于socket请求*/
static void task_net_connect_fun(void * arg)
{
	int ret = -1;
	net_sckt_param_t sckt_param = {0};
	net_options_t *msg = (net_options_t *)arg;
	int socketid;

	BE_ASYNC_S* async = (BE_ASYNC_S*)calloc(1,sizeof(BE_ASYNC_S));
	async->param_count = 1;
	async->params = (be_jse_symbol_t**) calloc(1,sizeof(be_jse_symbol_t*) * async->param_count);
	memset(&sckt_param,0,sizeof(net_sckt_param_t));
	
	ret = parse_net_option_addr(msg->addr,&sckt_param);
	if (ret < 0){
		async->func = (be_jse_symbol_t *)msg->onerror_cb;
		async->params[0] = new_str_symbol("paramter error");
	}

	socketid = net_socket_connect(&sckt_param);
	if  (socketid > 0){
		async->func = (be_jse_symbol_t *)msg->onconn_cb;
		async->params[0] = new_int_symbol(socketid);
		be_debug(JS_NET_TAG,"NET.connect ok ,socketid = %d",socketid);
	}else{
		async->func = (be_jse_symbol_t *)msg->onerror_cb;
		async->params[0] = new_str_symbol("connect error");
		be_debug(JS_NET_TAG,"NET.connect error");
	}
	
	be_debug(JS_NET_TAG,"task: host=%s,port=%d,type=%d",sckt_param.host_ip,sckt_param.port,sckt_param.proto);
	ret = be_osal_schedule_call(be_jse_async_event_cb, async);
	if (ret >=0){
		INC_SYMBL_REF(async->func);//because be_jse_async_event_cb will auto unlock async->func
	}else{
		free(async);
		free(async->params);
	}

	if (socketid > 0){
		  char *buffer = calloc(1,NET_SOCKET_RECV_BUFF_LEN);
		  int bytes_received = 0;
		  while(1){
		  	be_debug(JS_NET_TAG,"ready to recv...socketid=%d",socketid);
		  	bytes_received = recv(socketid, buffer, NET_SOCKET_RECV_BUFF_LEN, 0);
		    if (bytes_received > 0){ //recv成功
					be_debug(JS_NET_TAG,"recv...bytes_received=%d",bytes_received);
					BE_ASYNC_S* async = (BE_ASYNC_S*)calloc(1,sizeof(BE_ASYNC_S));
					async->param_count = 2;
					async->params = (be_jse_symbol_t**) calloc(1,sizeof(be_jse_symbol_t*) * async->param_count);
					async->func = (be_jse_symbol_t *)msg->ondata_cb;
					async->params[0] = new_int_symbol(socketid);
					async->params[1] = new_str_symbol(buffer);
					
					ret = be_osal_schedule_call(be_jse_async_event_cb, async);
					if(ret >= 0){
						INC_SYMBL_REF(async->func); //be_jse_async_event_cb会自动释放func,而这里是while循环
					}else{
						free(async);
					    free(async->params);
					}
					memset(buffer,0,NET_SOCKET_RECV_BUFF_LEN);
		    }else if (bytes_received < 0){//recv失败
		    	if (errno == EINTR) continue;
				be_warn(JS_NET_TAG,"recv...error=%d",bytes_received);
				break;
			}else{
				be_warn(JS_NET_TAG,"server closed=%d",bytes_received);
				break;
			}
		  }

		/*callback when close or error*/
		BE_ASYNC_S* async = (BE_ASYNC_S*)calloc(1,sizeof(BE_ASYNC_S));
		async->param_count = 1;
		async->params = (be_jse_symbol_t**) calloc(1,sizeof(be_jse_symbol_t*) * async->param_count);
		if (bytes_received != 0){
			async->func = (be_jse_symbol_t *)msg->onerror_cb;
			async->params[0] = new_str_symbol("recv error");
		}else{
			async->func = (be_jse_symbol_t *)msg->onclose_cb;
			async->params[0] = new_int_symbol(socketid);
		}
		
		ret = be_osal_schedule_call(be_jse_async_event_cb, async);
		if(ret >= 0){
			INC_SYMBL_REF(async->func); 
		}else{
			free(async);
			free(async->params);
		}
		  	
	}

done:
	/*onxxx_cb callback is optional,need check if vaild*/
	if (msg->onclose_cb) symbol_unlock((be_jse_symbol_t *)msg->onclose_cb);
	if (msg->ondata_cb)  symbol_unlock((be_jse_symbol_t *)msg->ondata_cb);
	if (msg->onerror_cb) symbol_unlock((be_jse_symbol_t *)msg->onerror_cb);
	if (msg->onconn_cb)  symbol_unlock((be_jse_symbol_t *)msg->onconn_cb);
	free(msg->addr);
	free(msg);
	be_debug(JS_NET_TAG,"aos get task exit name=%s",be_osal_task_name());
	be_osal_exit_task(0);
}