예제 #1
0
파일: reconn.c 프로젝트: Jack-chang/myfs
static void* reconn_fun(void* arg){
		conn_t* conn;
		queue_t* q = &g_ctx.reconn_q;
		rval_t rval;
		int  times = 1;
		while(1){
				conn = list_entry(deque(q), conn_t,  reconn_link);
				assert(conn->conn_state == CONNECTING);
				assert(conn->conn_type == ACTIVE);
				debug_info("start reconn conn[%d], fd[%d],%s \n",
						   conn->id, conn->sockfd, dump_addr(conn->addr));
				rval =  re_connect(conn);
				if(success(rval)){
					debug_info("reconn conn[%d], fd[%d] success! \n", conn->id, conn->sockfd);
					set_conn_state(conn, CONNECTED);
					add_event(conn);

				}else{
						debug_warn("reconn conn[%d], fd[%d] failed! errno[%d]\n",
								conn->id, conn->sockfd, rval.err);
						enque(q, &conn->reconn_link); //continue reconn
				}
				sleep(times);
		}
}
예제 #2
0
static void *recv_data_thread(void *arg)
{
	YN_real_handle_t *handle = (YN_real_handle_t *)arg;
	stFrameDataInfo frame;

	while (handle->stop == 0) {
		if (YN_GetVideo(handle->realplay_id, &frame) == -1) {
			YN_StopVideo(handle->realplay_id);
			YN_Logout(handle->login_id);
			if (re_connect(handle) == -1)
				break;
			continue;
		}
		handle->cbk((unsigned long)handle, 0, frame.pData, 
				frame.DataSize, handle->param);
		YN_RealseVideo(frame);
	}

	if (handle->realplay_id)
		YN_StopVideo(handle->realplay_id);
	if (handle->login_id)
		YN_Logout(handle->login_id);
	free(handle);
	return NULL;
}
예제 #3
0
void connection::do_read()
{
    std::lock_guard<std::mutex> lock(_mutex);
    if (_stopped) return;
    auto self = shared_from_this();
    _sock.async_read_some(asio::buffer(_read_buf), [this, self](const asio::error_code& ec, size_t bytes_transferred) {
        if (ec) {
            if (ec == asio::error::operation_aborted) {
                return;
            }
            if (ec.value() != asio::error::eof) {
                std::cerr << "read: " << ec.message() << std::endl;
                stop();
                return;
            }
            _parser.parse(0, 0);
            if (_parser.get_error() == HPE_PAUSED) {
                _requests_num++;
                if (_response.get_status_code() >= 400) {
                    _error_code_num++;
                }
                _response = http_response();
                re_connect();
                return;
            }
            stop();
            return;
        }

        _bytes_received += bytes_transferred;
        _read_buf[bytes_transferred] = 0;
        size_t bytes_parsed = 0;
        size_t bytes_left = bytes_transferred;
        for (;;) {
            size_t now_bytes_parsed = _parser.parse(_read_buf + bytes_parsed, bytes_left);
            auto error = _parser.get_error();
            if (error != HPE_OK && error != HPE_PAUSED) {
                std::cerr << _parser.get_error_name() << std::endl;
                stop();
                return;
            }
            if (error == HPE_OK) { //not enough data, read again
                break;
            }
            //paused, must one message complete
            ++_requests_num;
            if (_response.get_status_code() >= 400) {
                ++_error_code_num;
            }
            end_request();
            //std::cout << _response.to_string() << std::endl;
            _response = http_response();
            _parser.set_paused(false);
            if (now_bytes_parsed < bytes_left) { //still left message
                //bytes_parsed += now_bytes_parsed;
                //bytes_left -= now_bytes_parsed;
                //continue;
                std::cerr << "no pipeline support yet!" << std::endl;
                stop();
                return;
            }
            if (_parser.is_keep_alive()) {
                start_request();
                do_write();
            }
            else {
                re_connect();
            }
            return;
        }
        do_read();
    });
}