情况如下.安装ORACLE数据库的机器是内网机器,我按照网上搜索到的方法,先在服务器注册表中添加USE_SHARED_SOCKET=TRUE.然后重新配置了NET8中的服务,并修改了数据库为共享模式.然后在路由映射了1521端口.并重启了数据库服务和监听服务.
但是外网连接死活连不上.在内网的一台机器上连接网络对外的IP是可以连接的(比如该网络对外IP为221.111.111.111,内网机器连接这个IP数据库能连接上).外网的机器连接报  无效的服务器(NET:Invalid host)  错误.排除了外网机器问题(因为多台机器测试,甚至用了一台什么都没装的最干净的机器)
在外网机器连接数据库时通过安装在服务器上的抓包软件可以看到在1521端口有通讯.
在此之前试过将路由上的所有端口都映射到该服务器上,依然出现同样的错误.
我测试连接是通过编写的软件,DLEPHI中的ORACLE数据库连接控件.
将服务器机器直接连接外网是通的.所以我认为是ORACLE数据库配置问题,麻烦大虾们帮忙解决下,谢谢

解决方案 »

  1.   

    我查看了下通讯数据包.在注册表中设置的USE_SHARED_SOCKET=TRUE  好象没有效果,或者是我设置错误了,我是添加的USE_SHARED_SOCKET字符串,然后修改值为TRUE.通过查看1521端口的数据包,发现流程是
    1.外网机器发了一个包到数据库
    2.数据库发送了一个包给外网机器
    3.外网机器发送了2个包给服务器.其中第2个包中有连接信息.
    4.数据库发送了2个包给外网机器.其中第1个包中的"HOST="后面的是数据库所在机器的计算机名字.其中还包含了分配的一个端口"PORT=****".根据设置USE_SHARED_SOCKET=TRUE的说明来看不需要告诉外网机器通过哪个端口连接了.
    问题应该就在这里。一是回送的包里是计算机名,外网机器不认识,所以报  Invalid host  错误,而内网机器能连接上.
    二是修改注册表没有效果,继续分析数据包,发现,内网机器通过外网IP连接该数据库时,连接上后进行通讯是使用的这第4条中端口.
      

  2.   

    注册表中你是在哪里添加的USE_SHARED_SOCKET=TRUE?如果你的机器上只安装了一个oracle数据库,应该是在HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0中加一个名为USE_SHARED_SOCKET的字符串值项,其值为“true”。
      

  3.   

    回楼上,是这样改的.
    另外我在第1楼的说明不够详细,再说明下.接第4步后内网机器连通服务器数据库,通过数据包的传递可以看出,它们之间的连接是内网IP连接的.
    过程应该是,客户端连接服务器,服务器检查并回送一些东西,其中包括HOST和PORT.然后客户端根据这个信息连接数据库.
    根据我查看的情况,内网机器向外网IP发送连接服务器数据库后,数据库返回的HOST是计算机名,然后他们连接成功,通讯通道应该是走的内网,经过检查,他们之间的确是通过内网通讯的(IP是192.168......).他们的连接只有第123步中是走的广域网.那么这里就容易理解为什么外网机器连接不上了.因为外网机器发送数据到1521后,数据库回送的HOST是他的计算机名,外网机器不认识,所以报   Invalid host   错.
    现在网络中别人在用,我等下试下把所有端口都映射到数据库所在机器并在外网机器中的系统目录中的HOST文件中添加一条  
    服务器所在IP  服务器计算机名   
    应该可以暂时使用起来.但是并没有解决根本问题.
    1.怎么修改使客户端与数据库的连接使用SOCKET,那么根据说明,只需要映射1521端口就好了.
    2.怎么修改使数据库回送给客户端机器的数据包中的HOST不是服务器的计算机名而是需要的IP地址.
      

  4.   

    经过测试,证明我在5楼的推断是正确的,修改HOST文件并映射所有端口后,能正常连接了
    请各位大大帮忙解决2个根本问题,谢谢
      

  5.   

    试试listener.ora中用ip地址不用机器名。
      

  6.   

    你配置好后,cmd里用tnsping 远程IP 或者机器名,看能否ping通
      

  7.   

    listener.ora   试过修改,修改后监听程序无法运行.