[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,盼各位高手点拨。
急。下星期就要用了。这是业务环境......
 
你的Win95有指定网关吗?

我在调CISCO-2511时也遇到过类似问题(虽然不是在编程)
似乎NT可以搜索网关,因此不指定网关也可以将包发送到
不同网段(至于程序问什么收不到,我没有试验过),
而95则没有此功能,只有指定路由器作网关才行.
 
怀疑是网络设置问题!
 
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,让系统去做.
如果那位有经验的,请写详细一点,小弟以前没接触过这方面.
 
还没解决吗?我们的系统也是跨两个路由,Delphi3.0
一调就通,因此也就没想过这方面问题。

会不会是程序什么地方用了主机名而不是纯粹的IP地址呢?
 
都是IP,
现在只好用NetXRay去分析了.
如果不行就去爬金鹰百货往下跳了.
呜呜.
 
这类问题也不需要用什么网络分析仪之类的高级工具, 我觉得调试的最佳工具
就是你自己的头脑! :)
比如说您遇到的: 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下编译应该没有什么不同.
 
哈,都早试过了.我也怀疑是被别的主机吃掉了,可是把ServerSocket1.socket.
RemoteHost,RemotePort都打印出来,没错啊.
况且相连的只有两台主机,中间是两只Cisco,路由器会接下Socket连接吗?
而且用的端口是7777,应该不会有别人接下来.
所以想到用NetXray.

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

我今天去试试,具体结果将在今天晚上揭晓,不过什么时候能报告给各位就
不知道了.
 
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?

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

当然,如果NT和95真的能接收telnet,就没什么了,
不过我得去试试。
 
在两端都 ping 一下对方的 ip 和 名称, 如果都能 ping 通则不是网络设置问题.
 
列位:
以下是调试结果。
本人于星期二开始测试,故障依旧.

(注:本人前几次叙述时可能太急躁了,让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等各位大虾的帮助。
也希望这个案例对大家有帮助。

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

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

当然,你的解决办法也不错,显然是实用主义的特点,
跟我的习惯差不多:)
 
不好意思,对上一篇贴子的纠正。

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

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

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

仅供各位大虾参考。

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

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

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

我调试高层程序时从来都用不到NetXray这样的底层分析工具
(嬉戏, 不过我还没有用过Delphi呢, 让各位Delphi Fan见笑了, :)
 
怎么会呢?我说的出错是指的Server端
是NT的情况下,在Server端出现错误.
而client端确实是连接,发送,关闭均正常,
这并不矛盾呀,不信可以试验一下.

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

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

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

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

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

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

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

是这样.但是他让我知道从何处下手来采取其他办法.
 
让SERVER先关闭连接, 这样不是解决办法,
另外:

>若TServerSocket 监听,则Unix收发都没有问题;
>在TClientSocket 上,若是WinNT,则 Connect,Send,Close都没有>问题,好象一切正常,结果对方什么也没有收到。
>若是win95,则根本连接不上。
如何解释?
 
>让SERVER先关闭连接, 这样不是解决办法,
这是没办法的办法,我做了10000次试验,证明还是可行的.

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

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

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

> 如何解释?
现在环境没了,只好猜测可能是那时候win95的网络设置有问题.
我是拿笔记本装95的. 不过用95收Unix的请求是正常的,这正是我百思不得
其解之处.
 
如果网络配置有问题, NetXRay也不可能得到对方的应答报文,
唉, 错过了一个大好机会, :(
 

Similar threads

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