今天找到了贵论坛,发现坛主的很多想法和本人不谋而合,本人近1年主要精力都致力于开发一个大型多人在线游戏的基本架构和相关的技术模组。而我欣喜的发现我与坛主的研究方向正好相反:我是先从服务器端开始研究入手的,目前服务器端告一段落,正准备开始客户端的研发,在寻找客户端引擎的时候碰巧找到了这里。
我看到坛主的这个板块,了解到Orz正需要一些服务器方面的资料,在此我先奉上个人的服务器端的一些成果,希望能有所帮助。
(一)自己开发的一个基于boost::asio的网络引擎
首先这个网络引擎是基于boost::asio的一个封装,网络部分功能非常底层,API只有基本的listen、connect、send、kick等(均为异步,目前只实现了TCP协议),而其他方面提供的是基于mysql的db接口和log接口,还有一个自己开发的对象池,用于使用FreeList的概念来事先分配内存,降低运行时期内存的分配时间;
另外就是开发了一个多线程下的数据结构,一个线程安全的map,这个map可以让无限个线程同时读和写(包括添加元素、删除元素、修改元素)而无需任何因为互斥锁定带来的线程等待等开销。即是说1000个线程和1个线程操作这个map的效率是相同的。
发布形式:win32(64位未测试,但是开发考虑了相关的定制,例如指针和long在64位下从4字节提高到8字节,引擎底层做了数据类型的typedef)下 dll+lib+include;linux(Redhat、CentOS5.x,gcc3.4以上,需要安装boost1.37和mysql5.0)so+include;source code,yes,of course!
网络部分的基本结构是这样的:
#1 io部分设计。一个线程池负责处理io,这个实际上就是一组boost::asio::io_service::run,每个boost::asio::io_service下有一组私有线程,负责处理异步io事件,这里,boost::asio::io_service得数量和其下私有线程的数量是可以根据配置文件自由设置的,如果你了解boost::asio,那么一定知道它推荐一个cpu对应一个boost::asio::io_service对象(或者一个boost::asio::io_service,但是每个boost::asio::io_service下的私有线程对应每个cpu),这样在多处理器(或者多核处理器)下效率可以达到最高;
#2 complete handler设计。另一个线程池负责处理封装好的complete handler,即对应io事件的用户定义的逻辑处理,例如io recv事件,对应一个用户实现邦定的(使用boost::bind和boost::function)handler来处理当接受到socket消息的时候调用对应的handler(函数、仿函数对象、成员函数等)。#1和#2中的线程池之间使用一组线程安全的队列来传递消息(传递使用直接的值拷贝,不使用动态内存,因为动态内存的申请和释放太消耗时间,即便使用内存池也一样。1k以下的值拷贝的时间损耗都远远小于对应的动态内存申请的时间;另外使用值拷贝也有线程安全的考虑);
#3 封包的设计。head+body,head中有固定4字节的body长度信息(int32)和4字节的封包类型信息(int32),如果愿意,可以修改代码进行扩展(packet部分是独立于引擎的模块,也是一组dll,lib,include或者so,include),接受和发送由于是tcp,所以按照head中的body长度来控制一个封包的完整性。
#4 多线程模型。boss-worker模型,主要用于广播消息、查找、和db、log的实现上;生产者、消费者模型,主要用于#1和#2 的两个线程池之间的事件传递(io线程池产生completehandler,用户的线程池负责处理、消费)
#5 session的设计。一个session就是一个成功连接进来的客户端socket代理,出于线程安全和效率的考虑,session的存储容器不使用任何stl和boost的容器,而是使用——C的数组(当然不是静态数组,而是:new char[n]这样的),来实现。而且是二维数组,这样配合对象池(指与先分配好一组“空”的session),我们无需任何互斥变量就能够毫无阻碍的访问和修改数组中的每个元素(session),并发性能达到最大。至于二维数组的设计,第二维的值对应io线程池和用户线程池中的线程数量,即一个线程唯一邦定一组session,这是为了分配session id时候效率和安全的考虑。(例如id 0~9对应一组session,10~19是第二组,而每组id和session都唯一绑定一个线程)
#6 线程之间数据传递的设计。线程安全的queue,使用了boost::thread::locks中的mutex、shared_mutex、condition_variable_any等概念,当queue空闲时,使用条件变量等待特定的事件(例如新的元素push进来,或者程序退出等);
#7 异步下session的唯一性。由于整体是异步的,所以不可避免的会出现当一个session的某个处理还未结束的时候,这个session已经消失了,甚至换了一个新的session(指id的分配),那么这个时候如果没有任何防范处理,之前的那个未完成的处理很可能会作用到这个新的session上,就不可避免的出现一些错误和未知情况,我们如何防范呢?使用valid_code,设计一个64位的无符号整型变量,给每个session按照事先给定的session总量(这个引擎使用预先分配内存方法,所以开始前必须手动指定session的最大数量——通过配置文件),分配一个唯一的数据段(例如1~10000000,10000001~2000000等),每次这个session发现有新连接进来的socket使用了自己,则将自己的valid_code +1,当加到最大值的时候(例如刚才举例的10000000等),自动变为最小值(例如刚才的1等)。每个session的valid_code在引擎的初始化阶段是随机生成的(在事先指定好的数据段中随机)。再加上每个session的数据段时唯一的,所以不会产生重复的valid_code,这样鉴别某个时间段内唯一的session就成了可能;
#8 agent基类的设计。这个其实就是封装了boost::thread类,即“带私有线程的类”,主要用于作为一些相对独立的工作,例如log记录、db访问处理、定期ping某个ip等,引擎中的logger和db接口都是继承自它;
#9 db接口设计。一个数据库对应一个database对象,每个database对象拥有一个自己私有的线程池,其中线程的数量可以根据配置文件自由设定(例如和mysql的连接数量等,处理query的线程数量等)
#10 一些零碎。BIG_ENDIAN问题,封包内部自动进行了处理,无须用户单独设置;跨平台以及不同编译器的预编译设置,以及不同cpu的针对处理(x86,powerpc等)
目前的不足之处:
#1 并未开发完全。udp没有实现封装,当然boost::asio完全支持。logger目前只支持printf功能,对于写file和传递到专门的log服务器方面只留下了接口;封包加密以及安全方面是一个空白,目前的版本并未添加。
#2 面向底层,并不提供高层功能,所以很多开发都需要自己进行;(对,这并不是一个“网游引擎”)
#3 性能方面并未经过大量测试,由于本人工作较忙,这些都是业余时间搞得,所以只是初步测了一下连接并发部分:使用某个不知道配置的笔记本测得3秒并发连接1500。再多的并发连接并没有尝试过。
PS 由于本人工作较忙,故只能提供源代码(只提供windows版,便于查看,linux可以直接使用源代码编译,gcc3.4以上boost1.37即可),文档方面一直没有时间整理,这篇文章都是中午抽空写的(零零散散修改到现在),所以暂时就写这么多把。
PS2 提供的源代码是vs2005sln,只包含source code、配置和工程文件。
PS3 我看到贵论坛在研究RakNet,据我的一个前同事说,他认为RakNet并不好,网络底层用的是select,而且不是异步,代码质量不高,建议我不要使用它的网络层。我感觉RakNet的一些高层功能还是可以参考的,例如安全加密、大厅分流等,至于网络底层,我建议还是用boost::asio,跨平台、性能和扩展性都很优秀,而且被C++标准委员会所支持,很被看好。
作者:Nouness

posted @ 2014-07-24 08:21 卡洛shll 阅读(500) | 评论 (0)编辑 收藏

编译BDB报错:

……

Stop.
ld: 0711-736 ERROR: Input file jjkz_rcv.o:
        XCOFF64 object files are not allowed in 32-bit mode.

 

查了link,解决方法为在系统变量里加个参数:

export OBJECT_MODE=64

编译过去了,可执行文件生成了。

还有报错,估计是程序的通用性问题。

记下来,便于以后查找。

posted @ 2012-10-12 15:47 卡洛shll 阅读(1552) | 评论 (0)编辑 收藏

 

在AIX上编译64位的库基本上有两个方法一个是设置OBJECT_MODE环境变量,另一个是使用-q64的编译选项。

关于OBJECT_MODE环境变量:

The AIX operating system provides support for the OBJECT_MODE environment variable to enable the user to obtain a 64-bit development environment. AIX tools use the setting of OBJECT_MODE to determine the type of object to be used or created. The OBJECT_MODE environment variable has three recognized settings:

OBJECT_MODE=32
Works with 32-bit objects
OBJECT_MODE=64
Works with 64-bit objects
OBJECT_MODE=32_64
Works with either 32-bit or 64-bit objects

 

 

关于-q64:

-q32, -q64

Description

Selects either 32-bit or 64-bit compiler mode.

Notes

The -q32 and -q64 options override the compiler mode set by the value of the OBJECT_MODE environment variable, if it exists. If this option is not explicitly specified on the command line, and the OBJECT_MODE environment variable is not set, the compiler will default to 32-bit output mode.

If the compiler is invoked in 64-bit mode, the __64BIT__ preprocessor macro is defined.

posted @ 2012-10-12 15:46 卡洛shll 阅读(548) | 评论 (0)编辑 收藏

Linux 下制作动态链接库,“标准” 的做法是编译成位置无关代码(Position Independent CodePIC),然后链接成一个动态链接库。经常遇到的一个问题是 -fPIC 是不是必需,因为好像不加经常也能正常运行,只是创建 .so 的时候会有一个警告。

 

搜索、试验了一下,答案似乎是这样:

 

(1) 通常的建议是始终加上 -fPIC 生成位置无关代码;

(2) AMD64 下,必须使用位置无关代码,否则连接失败:

 

relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC

 

(3) IA32 下,连接成功,但有警告:

 

warning: creating a DT_TEXTREL in object.

 

这样的 .so 文件可以完全正常工作。

 

可执行文件在链接时就知道每一行代码、每一个变量会被放到线性地址空间的什么位置,因此这些地址可以都作为常数写到代码里面。对动态库,这就不行了,这要等到加载时才知道。无非下面两种方法:

 

(1) 可重定位代码(relocatable code):Windows DLL 以及不使用 -fPIC Linux SO

 

生成动态库时假定它被加载在地址 0 处。加载时它会被加载到一个地址(base),这时要进行一次重定位(relocation),把代码、数据段中所有的地址加上这个 base 的值。这样代码运行时就能使用正确的地址了。

 

(2) 位置无关代码(position independent code):使用 -fPIC Linux SO

 

这样的代码本身就能被放到线性地址空间的任意位置,无需修改就能正确执行。通常的方法是获取指令指针(如 IA32 EIP 寄存器)的值,加上一个偏移得到全局变量/函数的地址。

 

PIC vs. relocatable

 

(1) PIC 的缺点主要就是代码有可能长一些。例如 IA32,由于不能直接使用 [EIP+constant] 这样的寻址方式,甚至不能直接将 EIP 的值交给其他寄存器,要用到 GOTglobal offset table)来定位全局变量和函数。这样导致代码的效率略低。

 

(2) PIC 的加载速度稍快,因为不需要做重定位。

 

(3) 多个进程引用同一个 PIC 动态库时,可以共用内存。这一个库在不同进程中的虚拟地址不同,但操作系统显然会把它们映射到同一块物理内存上。对于可重定位代码,则必须为每个库都在物理内存中复制一份副本,因为需要修改其中的地址。当然,主流现代操作系统都启用了分页内存机制,这使得重定位时可以使用 COWcopy on write)来节省内存(32 Windows 就是这样做的);然而,页面的粒度还是比较大的(例如 IA32 上是 4KiB),至少对于代码段来说能节省的相当有限。

 

注:对于 AMD64,由于 AMD64 实现了 [RIP+constant] 的寻址方式,第 (1) 点不成立。

 

这样,把动态库编译成 PIC 只有好处没有坏处,因而 Linux AMD64 要求用于生成动态库的目标文件必须使用 -fPIC 编译也合情合理了。

posted @ 2012-09-28 11:04 卡洛shll 阅读(316) | 评论 (0)编辑 收藏

Berkeley DB在Queue模式下的使用

   Queue模式下仅能存储定长的记录,即value的长度为定长。Queue的key是一个逻辑增长的数,一般就是int。
不需要开发者去改变这个类型。

   Queue模式下只能存储定长的记录。所以一定要调用Db的set_re_len函数来设定数据库中记录的长度。
如果没有设定,默认的为0。这样当存储记录时一定会报异常。程序出错。
在读取记录时,当记录的长度小于设定的长度时,会填充字符达到设定长度。
默认的字符为0x02(ASCII中的)。可以设定自己的填充字符。调用DB的set_re_pad。

一个简单的示例

#include <time.h>
#include <iostream>
#include <db_cxx.h>

struct ValueType
{
    int _int;
    char _char;
    char _array[256];
};

void writeDB( void )
{
    Db bdb(0, 0);

    bdb.set_re_len(sizeof(ValueType)); //用Queue模式一定要调用,而且一定要在open前调用
    bdb.set_re_pad(0x00); //填充字符串为0。

    bdb.open(0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0);

    size_t k;
    ValueType v;
    Dbt key&k, sizeof(size_t));
    Dbt value(&v, sizeof(ValueType));

    //直接用数据库的写函数
    for (int i=0; i<1000000; ++i) {
        bdb.put(0, &key, &value, DB_APPEND);
    }

    bdb.close(0);
}

int main( int argc, char* argv[] )
{
    clock_t et1 = clock();
    writeDB();
    clock_t et2 = clock();

    std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
    return 0;
}

在Queue模式下不能用游标进行数据的插入。只能进行数据的修改。

Queue模式读数据的一个简单的示例
在Queue模式下读数据,记录(Dbt)要调用set_ulen函数和set_flags函数

#include <time.h>
#include <iostream>
#include <bdb/db_cxx.h>

struct ValueType
{
    int _int;
    char _char;
    char _array[256];
};

void readDB( void )
{
    Db bdb(0, 0);

    bdb.set_re_len(sizeof(ValueType)); //用Queue模式一定要调用,而且一定要在open前调用
    bdb.set_re_pad(0x00); //字符串的填充为0。

    bdb.open(0, "SaveRecodeDB.db", 0, DB_QUEUE, DB_CREATE, 0);

    size_t k;
    ValueType v;
    Dbt key( &k, sizeof( size_t ) );
    key.set_ulen( sizeof( size_t ) );

    Dbt value( &v, sizeof( ValueType ) );
    value.set_ulen( sizeof( ValueType ) );
    value.set_flags( DB_DBT_USERMEM );

    //直接用数据库的读函数
    for( int i=0; i<1000000; ++i )
    {
        bdb.get( 0, &key, &value, DB_CONSUME );
    }

    bdb.close( 0 );
}

int main( int argc, char* argv[] )
{
    clock_t et1 = clock();
    readDB();
    clock_t et2 = clock();

    std::cout << "work is fine, " << "have times : " << et2 - et1 << std::endl;
    return 0;
}

posted @ 2012-09-06 15:13 卡洛shll 阅读(871) | 评论 (0)编辑 收藏

数据库表空间满后,直接执行drop,delete,truncate等删除数据的操作,都不会释放数据库表空间,释放os的空间,用df -lh 查看都还是满的。虽然oracle的表空间即便不被回收,也是可以利用的,但会引起问题,释放os的空间是最放心的。
       在这种情况下,如果要释放os的空间,解决办法如下:
       1.exp
       2.drop tablespace
       3.create tablespace
       4.imp
1.exp 导出表空间中所需的数据。
       在这之前,如果日志数据不是很必要,非保留不可,可以先truncate table tablename;然后导出数据已满的表空间。cd $ORACLE_HOME/bin目录下,
./expname/pass@testdbfile=/tmp/bak/tabelspace.dmp tablespaces=TBS_TEST
2.drop tablespace 删除数据库表空间
        命令drop tablespace TBS_TEST INCLUDING CONTENTS;然后进入到表空间的物理存储目录,执行rm -f *,这是空间利用率下来了。如果想直接删除文件,可以用drop tablespace TBS_TEST INCLUDING CONTENTS and datafiles;,这是会发现时间的物理数据文件已经没有了,但df -lh空间使用率并没有变化,需要重启数据库。删除表空间和删除物理文件的顺序不能改变,如果反了,请参考上一篇文章。
3.create tablespace 重新创建数据库表空间
         使用创建命令,直接创建即可。create bigfile tablespace tbs_test datafile '/usr/data/test/tbs_test.DBF' size 2000M autoextend on next 100M;
4.imp 导入数据文件
          ./impname/pass@testdbfile=/tmp/bakloginfo.dmp full=y tablespaces=TBS_TEST
       如果不想做导入导出,比如索引表空间,可以直接删除表空间,删除物理文件,然后创建表空间,重建索引。

posted @ 2012-08-30 10:20 卡洛shll 阅读(2011) | 评论 (0)编辑 收藏

在ORACLE当中,如果想访问某个服务器,必需要设置TNS,它不想SQLSERVER那样,客户端会自动列举出在局域网内所有的在线服务器,只需在客户端选择需要的服务器,然后使用帐号与密码登录即可。而ORCAL是不会自动列举出网内的服务器的,需要通过读取TNS配置文件才能列出经过配置的服务器名。

ORACLE的配置文件名:tnsnames.ora

文件所在路径:安装ORACLE所在的目录\oracle\ora92\network\admin\tnsnames.ora

配置的一个实例:

# TNSNAMES.ORA Network Configuration File: D:\Oracle\network\admin\tnsnames.ora

# Generated by Oracle configuration tools.

ODS =

  (description =

    (address = (protocol = tcp)(host = 10.201.64.12)(port = 1521))

    (connect_data =

      (sid = ods)

    )

  )

AUTOCLM_10.210.4.11 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.210.4.11)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = autoclm)

      (SERVER = DEDICATED)

    )

  )

PROPTEST_10.210.4.30 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.210.4.30)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = proptest)

      (SERVER = DEDICATED)

    )

  )

p05 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.201.64.14)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = p05)

      (SERVER = DEDICATED)

    )

  )

p05_8 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.201.64.8)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SID = p05)

    )

  )

 

ODS =

  (description =

    (address = (protocol = tcp)(host = 10.201.64.8)(port = 1521))

    (connect_data =

      (sid = p05)

    )

  )

test_14 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.201.64.14)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = p05test)

    )

  )   

 

CIBS =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.203.68.71)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = cibs)

    )

  )

 

  ORA10 =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.202.1.77)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = ORA10)

    )

  )

CIBS =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.203.68.71)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = cibs)

    )

  ) 

 

CAI =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.203.68.80)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = proplh)

    )

  ) 

 

CHELP =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.203.68.137)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = autoclm)

    )

  ) 

配置完毕后,客户端就可以列举出“CAI”,“CHELP”,“CIBS”等的服务器名出来。

posted @ 2012-08-27 18:50 卡洛shll 阅读(306) | 评论 (0)编辑 收藏

[mailz@/cdr2/home/mailz]$ su - oracle
oracle's Password:
-bash-3.00$ sqlplus /as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Usage 1: sqlplus -H | -V

    -H             Displays the SQL*Plus version and the
                   usage help.
    -V             Displays the SQL*Plus version.

Usage 2: sqlplus [ [<option>] [<logon>] [<start>] ]

  <option> is: [-C <version>] [-L] [-M "<options>"] [-R <level>] [-S]

    -C <version>   Sets the compatibility of affected commands to the
                   version specified by <version>.  The version has
                   the form "x.y[.z]".  For example, -C 10.2.0
    -L             Attempts to log on just once, instead of
                   reprompting on error.
    -M "<options>" Sets automatic HTML markup of output.  The options
                   have the form:
                   HTML [ON|OFF] [HEAD text] [BODY text] [TABLE text]
                   [ENTMAP {ON|OFF}] [SPOOL {ON|OFF}] [PRE[FORMAT] {ON|OFF}]
    -R <level>     Sets restricted mode to disable SQL*Plus commands
                   that interact with the file system.  The level can
                   be 1, 2 or 3.  The most restrictive is -R 3 which
                   disables all user commands interacting with the
                   file system.
    -S             Sets silent mode which suppresses the display of
                   the SQL*Plus banner, prompts, and echoing of
                   commands.

  <logon> is: (<username>[/<password>][@<connect_identifier>] | /)
              [AS SYSDBA | AS SYSOPER] | /NOLOG

    Specifies the database account username, password and connect
    identifier for the database connection.  Without a connect
    identifier, SQL*Plus connects to the default database.

    The AS SYSDBA and AS SYSOPER options are database administration
    privileges.

    The /NOLOG option starts SQL*Plus without connecting to a
    database.

  <start> is: @<URL>|<filename>[.<ext>] [<parameter> ...]

    Runs the specified SQL*Plus script from a web server (URL) or the
    local file system (filename.ext) with specified parameters that
    will be assigned to substitution variables in the script.

When SQL*Plus starts, and after CONNECT commands, the site profile
(e.g. $ORACLE_HOME/sqlplus/admin/glogin.sql) and the user profile
(e.g. login.sql in the working directory) are run.  The files may
contain SQL*Plus commands.

Refer to the SQL*Plus User's Guide and Reference for more information.
-bash-3.00$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Aug 27 15:54:53 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> alter user sys identified by 123;
alter user sys identified by 123
*
ERROR at line 1:
ORA-01034: ORACLE not available


SQL> select username from dba_users;
select username from dba_users
*
ERROR at line 1:
ORA-01034: ORACLE not available


SQL> quit
Disconnected
-bash-3.00$ id oracle
uid=205(oracle) gid=203(oinstall) groups=204(dba)
-bash-3.00$ lsnrctl start

LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production on 27-AUG-2012 15:57:24

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Starting /cdr2/app/oracle/product/10gr2/bin/tnslsnr: please wait...

TNSLSNR for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production
System parameter file is /cdr2/app/oracle/product/10gr2/network/admin/listener.ora
Log messages written to /cdr2/app/oracle/product/10gr2/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=cdr2)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production
Start Date                27-AUG-2012 15:57:27
Uptime                    0 days 0 hr. 0 min. 2 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      ON
Listener Parameter File   /cdr2/app/oracle/product/10gr2/network/admin/listener.ora
Listener Log File         /cdr2/app/oracle/product/10gr2/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=cdr2)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "ocstest" has 1 instance(s).
  Instance "ocstest", status UNKNOWN, has 1 handler(s) for this service...
Service "test62" has 1 instance(s).
  Instance "test62", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
-bash-3.00$ id
uid=205(oracle) gid=203(oinstall) groups=204(dba)
-bash-3.00$ lsnrctl status

LSNRCTL for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production on 27-AUG-2012 15:58:31

Copyright (c) 1991, 2005, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for IBM/AIX RISC System/6000: Version 10.2.0.1.0 - Production
Start Date                27-AUG-2012 15:57:27
Uptime                    0 days 0 hr. 1 min. 5 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      ON
Listener Parameter File   /cdr2/app/oracle/product/10gr2/network/admin/listener.ora
Listener Log File         /cdr2/app/oracle/product/10gr2/network/log/listener.log
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=cdr2)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "ocstest" has 1 instance(s).
  Instance "ocstest", status UNKNOWN, has 1 handler(s) for this service...
Service "test62" has 1 instance(s).
  Instance "test62", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
-bash-3.00$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Aug 27 15:59:00 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> connect /as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size                  2021224 bytes
Variable Size             318769304 bytes
Database Buffers         1275068416 bytes
Redo Buffers               14753792 bytes
Database mounted.
Database opened.
SQL> quit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
-bash-3.00$ env|grep ORACLE
ORACLE_SID=ocstest
ORACLE_BASE=/cdr2/app/oracle
ORACLE_HOME=/cdr2/app/oracle/product/10gr2
-bash-3.00$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on Mon Aug 27 16:00:36 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> connect /as sysdba
Connected.
SQL> select username from dba_users;

posted @ 2012-08-27 16:07 卡洛shll 阅读(2979) | 评论 (0)编辑 收藏

这个问题是在从1.82升级到2.0的时候出的连接问题,自己用了很长时间才解决掉,总算解决了,分享下原因吧。主要是因为从官网上下载的C++ Mongo驱动有问题。必须自己编译,可以通过命令查看:

 

  1. >>nm libmongoclient.a | grep get_system_category                                                                                 
  2. U _ZN5boost6system19get_system_categoryEv   
  3. U _ZN5boost6system19get_system_categoryEv   
  4. U _ZN5boost6system19get_system_categoryEv   
  5. U _ZN5boost6system19get_system_categoryEv   
  6. U _ZN5boost6system19get_system_categoryE  

 

 

会发现这个在boost库中根本就没有这个函数。可能官网提供的lib编译参数不一样。 只能自己编译了。 另外如果boost还有其它问题,你需要。

1.删除boost /usr/include/ 和/usr/lib/下的 所有关于boost的文件 还有系统自带的 一般在 /usr/lib64 下 可以通过 locate boost | grep usr 来查找

2.重新安装boost:

 

  1.     ./bootstrap.sh   
  2.     ./bjam install    
  3.     默认会安装到/usr/local 下  

posted @ 2012-08-05 19:47 卡洛shll 阅读(822) | 评论 (0)编辑 收藏

Linux命令行修改IP、网关、DNS的方法

方式一:

ifconfig eth0 192.168.1.18 netmask 255.255.255.0

说明:该种方式可以使改变即时生效,重启后会恢复为原来的IP

方式二:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

说明:该方式要重启后生效,且是永久的

如果要立即更改且永久生效,就只能以上两种方式同时使用了。

以上是通过linux命令行修改IP的方法。

 

网卡eth0    IP修改为 102.168.0.1   

ifconfig eth0 102.168.0.1 netmask 255.255.255.0

网关修改为 102.168.0.254

route add default gw 102.168.0.254

Linux命令行修改dns

echo "nameserver 202.202.202.20 ">> /etc/resolv.conf

重启网络服务

 

例子:由原来的DHCP改固定IP
DEVICE=eth0
HWADDR=00:0C:29:F7:EF:BF
ONBOOT=yes
TYPE=Ethernet
NETMASK=255.255.255.0
IPADDR=192.168.0.68
GATEWAY=192.168.0.1
加上红色即可

重启网卡:
/etc/init.d/network restart

ifconfig eth0 新ip
然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0,修改ip

[aeolus@db1 network-scripts]$ vi ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=219.136.241.211
NETMASK=255.255.255.128
GATEWAY=219.136.241.254

[aeolus@db1 etc]$ vi resolv.conf

nameserver 202.96.128.68
nameserver 219.136.241.206

-----------------------
Linux下修改网卡IP和网关


建议通过终端字符方式下来修改
一修改IP地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
IPADDR=192.168.1.33
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
USERCTL=no
PEERDNS=no
TYPE=Ethernet
~

vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.2.34
NETMASK=255.255.255.0
USERCTL=no
PEERDNS=no
TYPE=Ethernet
NETWORK=192.168.2.0
BROADCAST=192.168.2.255
二修改网关
vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=Aaron
GATEWAY=192.168.1.1

三重新启动网络配置
/etc/init.d/network restart



-----------------------------------------------------------------------------------

修改配置文件

/etc/sysconfig/network-scripts/ 下有配置文件

比如文件:ifcfg-eth0 代表是以太网实际网卡0的配置文件

比如文件:ifcfg-eth0:1 代表是以太网实际网卡0的配置文件

域名服务器配置文件:/etc/ resolv.conf

修改ip地址
即时生效:
# ifconfig eth0 192.168.0.20 netmask 255.255.255.0
启动生效:
修改/etc/sysconfig/network-scripts/ifcfg-eth0

修改default gateway
即时生效:
# route add default gw 192.168.0.254
启动生效:
修改/etc/sysconfig/network-scripts/ifcfg-eth0

修改dns
修改/etc/resolv.conf
修改后可即时生效,启动同样有效

修改host name
即时生效:
# hostname fc2
启动生效:
修改/etc/sysconfig/network

 

# Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
DEVICE=eth0 接口名称
BOOTPROTO=none                  静态配置,若该值为“dhcp”则为动态获得,另外 static也是表示静态ip地址
BROADCAST=192.168.10.255 广播地址,通过IP地址和子网掩码自动计算得到
HWADDR=00:13:D3:27:9F:80
IPADDR=192.168.10.238
IPV6INIT=yes
IPV6_AUTOCONF=yes
NETMASK=255.255.255.0
NETWORK=192.168.10.0    指定网络,通过IP地址和子网掩码自动计算得到
ONBOOT=yes    开机时自动加载
GATEWAY=192.168.10.1
TYPE=Ethernet
PEERDNS=yes
USERCTL=no

ifdown eth0               关闭网络
ifconfig eth0 down    关闭网络

ifup eth0                   开启网络
ifconfig eth0 up         开启网络

设置dns
/etc/resolv.conf

nameserver 61.144.56.101
nameserver 202.96.128.166

[yeger@yeger ~]$ cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 202.96.128.86
nameserver 202.96.128.166

其他方面
service network start             //启动网络服务
service network stop              //停止网络服务
service network restart           //重启网络服务
service network status            //查看网络服务状态

ifconfig eth0 192.168.10.222 netmask 255.255.255.0 //临时修改接口IP地址(无需重启接口)

[yeger@yeger ~]$ sudo ifconfig wlan0 192.168.21.199 netmask 255.255.255.0
[yeger@yeger ~]$ ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 00:02:72:77:BB:D1
inet addr:192.168.21.199 Bcast:192.168.21.255 Mask:255.255.255.0
inet6 addr: fe80::202:72ff:fe77:bbd1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3246 errors:0 dropped:0 overruns:0 frame:0
TX packets:1947 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4514869 (4.3 MiB) TX bytes:177732 (173.5 KiB)
wlan0             表示第一块无线以太网卡

Link encap        表示该网卡位于OSI物理层(Physical Layer)的名称
HWaddr             表示网卡的MAC地址(Hardware Address)
inet addr        表示该网卡在TCP/IP网络中的IP地址
Bcast              表示广播地址(Broad Address)
Mask                  表示子网掩码(Subnet Mask)
MTU                  表示最大传送单元,不同局域网 MTU值不一定相同,对以太网来说,MTU的默认设置是1500个字节
Metric              表示度量值,通常用于计算路由成本
RX                  表示接收的数据包
TX                    表示发送的数据包
collisions        表示数据包冲突的次数
txqueuelen    表示传送列队(Transfer Queue)长度
interrupt            表示该网卡的IRQ中断号
Base address    
表示I/O地址

配置虚拟网卡IP地址:网卡需要拥有多个IP地址

命令格式: ifconfig 网卡名:虚拟网卡ID IP地址 netmask 子网掩码

[yeger@yeger ~]$ sudo ifconfig wlan0:1 192.168.21.188 netmask 255.255.255.0

更改网卡MAC地址

ifconfig 网卡名 hw ether MAC地址

[yeger@yeger ~]$ ifconfig wlan0 hw ether 00:11:22:33:44:55


SIOCSIFHWADDR: 不允许的操作
[yeger@yeger ~]$ sudo ifconfig wlan0 hw ether 00:11:22:33:44:55
SIOCSIFHWADDR: 设备或资源忙
[yeger@yeger ~]$ ifconfig wlan0 down
SIOCSIFFLAGS: 权限不够
[yeger@yeger ~]$ sudo ifconfig wlan0 down
[yeger@yeger ~]$ sudo ifconfig wlan0 hw ether 00:11:22:33:44:55
更改成功

[yeger@yeger ~]$ netstat -ant 查看端口信息 a 所有 n数字显示 t tcp协议 u udp协议
Active Internet connections (servers and established 已建立连接)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     
协议                               本地地址                        远程地址                  连接状态
类型
tcp        0      0 0.0.0.0:57798               0.0.0.0:*                   LISTEN      listen表示监听状态
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN     
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN     
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN     
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN     
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     
tcp        0      0 :::111                      :::*                        LISTEN     
tcp        0      0 :::22                       :::*                        LISTEN     
tcp        0      0 ::1:631                     :::*                        LISTEN     

[yeger@yeger ~]$ netstat -r 查看路由表
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window irtt Iface
192.168.21.0    *               255.255.255.0   U         0 0          0 wlan0
192.168.122.0   *               255.255.255.0   U         0 0          0 virbr0
default         192.168.21.1    0.0.0.0         UG        0 0          0 wlan0

[yeger@yeger ~]$ netstat -i   查看网络接口状态
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg    
eth0       1500   0        0      0      0      0        0      0      0      0 BMU
lo     16436   0      230      0      0      0      230      0      0      0 LRU
virbr0     1500   0        0      0      0      0       29      0      0      0 BMRU
wlan0      1500   0    10546      0      0      0     7060      0      0      0 BMRU
wmaster0      0   0        0      0      0      0        0      0      0      0 RU
[yeger@yeger ~]$

MTU字段:表示最大传输单元,即网络接口传输数据包的最大值。
Met字段:表示度量值,越小优先级越高。
RX-OK/TX-OK分别表示接收、发送的数据包数量。
RX-ERR/TX-ERR表示接收、发送的错误数据包数量。
RX-DRP/TX-DRP表示丢弃的数量。
RX-OVR/TX-OVR表示丢失数据包数量。

[yeger@yeger ~]$ nslookup www.baidu.com 测试域名解析
Server:        202.96.128.86
Address:    202.96.128.86#53

Non-authoritative answer:
www.baidu.com    canonical name = www.a.shifen.com.
Name:    www.a.shifen.com
Address: 119.75.218.45
Name:    www.a.shifen.com
Address: 119.75.218.45

百度的IP地址是:119.75.218.45

posted @ 2012-08-05 02:06 卡洛shll 阅读(540) | 评论 (0)编辑 收藏

仅列出标题
共3页: 1 2 3