Blue
Red
Green
Orange
Voilet
Slate
Dark

[winsock]跨路由器的怪问题(200分)

  • 主题发起人 曹晓钢
  • 开始时间

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!


诸位大虾,现本人遇到大难题,特向大家请教。

环境:
Sco Unix 5 ;
Windows 95 osr 2 . 简体中文版
Windows Nt 4.0 Server . 简体中文版

现在欲在Unix和Win平台之间通讯,采用Tcp/Ip.
在Win平台上用 Delphi 3.0 c/s TServerSocket & TClientSocket,
分别接收和发送字符串。

若两机( Unix,Win95 or Unit,WinNT)在同一个网段上,一切正常。
昨天在两机之间架了路由器,有怪事发生。

若TServerSocket 监听,则Unix收发都没有问题;
在TClientSocket 上,若是WinNT,则 Connect,Send,Close都没有问题,
好象一切正常,结果对方什么也没有收到。
若是win95,则根本连接不上。

但此时,Telnet 一切正常。

今天换用TCP控件(Internet页上的那个),又有怪事。
在Win95上,发送成功;在WinNT上,又是一切如常,对方就是收不到!
且此TCP控件即使close了,下次Connect时会报错:Address in use.

最后把Win95 上编译的一个试验程序拷到NT上(EXE文件),发送正常!
但是仍然Address in use.

小弟困惑不解,因第一次调Socket,盼各位高手点拨。
急。下星期就要用了。这是业务环境......
 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
你的Win95有指定网关吗?

我在调CISCO-2511时也遇到过类似问题(虽然不是在编程)
似乎NT可以搜索网关,因此不指定网关也可以将包发送到
不同网段(至于程序问什么收不到,我没有试验过),
而95则没有此功能,只有指定路由器作网关才行.
 
C

cpp

Unregistered / Unconfirmed
GUEST, unregistred user!
怀疑是网络设置问题!
 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
95和NT下我都指定了网关.
而且用Route 配置也试过,一样.
(我用 route -p add xx.xx.145.88 xx.xx.146.246,
其中146.246是cisco Route,连接到另一台cisco,是145.245,再连到
145.88 是业务机.)
现在我可能的解决办法是,都在那台95下编译,然后再说.
Address in Use 我已经知道怎么回事了.要指定Socket的localPort不一样,
可以自己增加,或者指定0,让系统去做.
如果那位有经验的,请写详细一点,小弟以前没接触过这方面.
 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
还没解决吗?我们的系统也是跨两个路由,Delphi3.0
一调就通,因此也就没想过这方面问题。

会不会是程序什么地方用了主机名而不是纯粹的IP地址呢?
 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
都是IP,
现在只好用NetXRay去分析了.
如果不行就去爬金鹰百货往下跳了.
呜呜.
 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
这类问题也不需要用什么网络分析仪之类的高级工具, 我觉得调试的最佳工具
就是你自己的头脑! :)
比如说您遇到的: NT上connect, send, close 均正常, 但是
server端却根本没收到, 那只能说明NT上
连接的根本就不是您自己的server.(连到了别的机器上?)
您说的telnet正常, 您有没有试过用telnet连接您自己的服务端?
("telnet address port", under unix ,
or telnet.exe, write your port in dropdown list, under windows)
另外, 您的程序在95或NT下编译应该没有什么不同.
 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
哈,都早试过了.我也怀疑是被别的主机吃掉了,可是把ServerSocket1.socket.
RemoteHost,RemotePort都打印出来,没错啊.
况且相连的只有两台主机,中间是两只Cisco,路由器会接下Socket连接吗?
而且用的端口是7777,应该不会有别人接下来.
所以想到用NetXray.

我指的Telnet正常,是NT telnet Unix,unix telnet NT,95 telnet unix,
unix telnet 95,全都收发正常.

我今天去试试,具体结果将在今天晚上揭晓,不过什么时候能报告给各位就
不知道了.
 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
Now the problem is whether a route affect your program (I think it will not affect ONLY your program, leaving
telnet, etc., untouched :). What's the position of your unix? Is it on a symmetrical position to both 95 and NT?

 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
这倒是让我觉得奇怪了,从没听说过NT和95能接受telnet呀?
如果不是我记错了,那问题就一定出在这里,恐怕真是让路由
或什么别的机器吃掉了。

当然,如果NT和95真的能接收telnet,就没什么了,
不过我得去试试。
 
H

huizhang

Unregistered / Unconfirmed
GUEST, unregistred user!
在两端都 ping 一下对方的 ip 和 名称, 如果都能 ping 通则不是网络设置问题.
 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
列位:
以下是调试结果。
本人于星期二开始测试,故障依旧.

(注:本人前几次叙述时可能太急躁了,让dwwang大侠误会了.
本人的程序可以接受Socket输入,所以让Unix telnet到我Listen的端口,
可以在我的程序得到反映.我指的Unix telnet 95,是说我的程序在95上
运行,而Unix Telnet 到此程序.)

于是NetXray之,发现原因所在:
Socket连接分为Connect,send/Receive,Finish几个阶段,我用
NetXray发现,Connect请求和应答,Send请求、应答和实际传输,都正常
完成了,最后我的程序提出Finish,对方的Unix未回应!

我在ClientSocket. onConnect; onSendComplete,onDisconnected
中的监视输出结果都显示,命令完成了,都正常,但是Unix认为
对话丢失!

但是这个发现很让人惊讶,因为同一台机器在另一个环境中测试是好的!
包括对方是同一台Unix.只是硬件连路不一样。

在没法可想的时候,考虑到传输的包长度是一样的,就想到改Unix上的接收
程序,判断当接收到此长度时,让Unix首先提出Finish.结果这个方法很
有用,果然成功了。现在我发送完了什么都不管,只等对方结束连接了。

不知道为什么会这样。为什么Unix的Socket在接收到Finish请求后不闻不问
呢?

实践证明,路由器没有吃包,连接也是对的,发送都没问题,问题出在最后
一步。
所以说,NetXRay还是很不错的么,以后调Socket都带上他,会给定位错误
带来巨大方便,不用费力瞎猜了。

由于本人口齿不清,误了很多事。
在此感谢dwwang、cpp、pegasus、huizhang等各位大虾的帮助。
也希望这个案例对大家有帮助。

 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
原来如此,那就没办法了,不过Win平台上用的是所谓的
MS Tcp/Ip,与Unix系统不兼容的事情也经常听说。
(因为我在95/NT之间的应用,网络结构与你类似,
从来没出过问题)

你现在用的是Delphi3吧,不知道Delphi4试过没有?
尤其是下载了ScktSrvr的Patch之后?
百分之一的希望也要百分之百的努力嘛!

当然,你的解决办法也不错,显然是实用主义的特点,
跟我的习惯差不多:)
 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
不好意思,对上一篇贴子的纠正。

我昨儿晚上大概太困了,看着晓刚同志这么详细的分析,
竟然没有想起来我遇到过同样的问题(还说什么NT下从来没问题)

我的系统用95/NT作Client/Server,同样必须在通讯结束后
由Server端CloseSocket,否则Client端先Close,Server端
是要出错的,说是无效的SocketHandle,说明Server端去关
闭Socket时,发现Socket的链路已经不存在了。

看来这至少是Delphi 的Socket控件的必须通讯模式,感谢
晓刚同志在异种平台上也作了测试,再次证明了这一点。

仅供各位大虾参考。

 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
可是您还是不能解释您以前的叙述的问题:

Client端连接,发送,关闭均正常, 可是对方并没有收到??????
(这一点是最让我奇怪的)

NetXRay并没有指出为什么在不同的硬件条件下Unix的
Socket有时响应有时不响应FINISH请求,

我调试高层程序时从来都用不到NetXray这样的底层分析工具
(嬉戏, 不过我还没有用过Delphi呢, 让各位Delphi Fan见笑了, :)
 
D

dwwang

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么会呢?我说的出错是指的Server端
是NT的情况下,在Server端出现错误.
而client端确实是连接,发送,关闭均正常,
这并不矛盾呀,不信可以试验一下.

倒霉就倒霉在曹兄Server端用的是Unix,
为什么不出错就不得而知了.所以才找不到原因
而要去用NetXRay.

顺便问曹兄一句,你的NetXRay使那里搞到的?
听说这个东东不错,我也想看看.
 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!

ftp://ftp.lib.pku.edu.cn/incoming/NETXRAY/3.0/NX300K.EXE
还有同一目录下的两个文件是破解过的,覆盖原来的文件.

>可是您还是不能解释您以前的叙述的问题:

> Client端连接,发送,关闭均正常, 可是对方并没有收到??????
> (这一点是最让我奇怪的)

是的,clientsocket一切都完成了,只是没有等待对方对[Finish]的回答,
就认为结束了,OnDisconnect也触发了. Unix端的ServerSocket不知为何
不应答,把这个连接丢弃了.

> NetXRay并没有指出为什么在不同的硬件条件下Unix的
> Socket有时响应有时不响应FINISH请求,

是这样.但是他让我知道从何处下手来采取其他办法.
 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
让SERVER先关闭连接, 这样不是解决办法,
另外:

>若TServerSocket 监听,则Unix收发都没有问题;
>在TClientSocket 上,若是WinNT,则 Connect,Send,Close都没有>问题,好象一切正常,结果对方什么也没有收到。
>若是win95,则根本连接不上。
如何解释?
 

曹晓钢

Unregistered / Unconfirmed
GUEST, unregistred user!
>让SERVER先关闭连接, 这样不是解决办法,
这是没办法的办法,我做了10000次试验,证明还是可行的.

>>若TServerSocket 监听,则Unix收发都没有问题;
这说明serversocket还是能和Unix"友好分手"的.

>>在TClientSocket 上,若是WinNT,则 Connect,Send,Close都没有>问题,好象

一切正常,结果对方什么也没有收到。
>>若是win95,则根本连接不上。

> 如何解释?
现在环境没了,只好猜测可能是那时候win95的网络设置有问题.
我是拿笔记本装95的. 不过用95收Unix的请求是正常的,这正是我百思不得
其解之处.
 
P

pegasus

Unregistered / Unconfirmed
GUEST, unregistred user!
如果网络配置有问题, NetXRay也不可能得到对方的应答报文,
唉, 错过了一个大好机会, :(
 

Similar threads

D
回复
0
查看
736
DelphiTeacher的专栏
D
D
回复
0
查看
712
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部 底部