少见多怪之:单步调试能够通过, 直接运行永远通不过!

ggdayup 2005-10-20 11:25:48
遇到一个怪问题, 解决不了了, 特此向各位大虾请教!

代码情况:
一个FTP客户端的代码;
问题函数Login()
函数流程:建立socket
send ("USER " + username)
send ("PASS " + password)

故障点:
直接运行时send ("PASS " + password)通不过.
调试发现一直堵在:
this.bytes = clientSocket.Receive( this.buffer, this.buffer.Length, 0 );
估计是服务器端没有返回数据流,所以一直在等待.

特别说明:
以上故障只有在直接运行的时候才出现, 如果用单步调试,就一切正常.

各位大虾,烦请劳心,给小弟点指导,各位有没有遇到类似的情况啊?
谢谢!

...全文
440 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggdayup 2005-10-25
  • 打赏
  • 举报
回复
我用Ethereal 在With Breakpoint 和 Without Breakpoint 的情况下分别抓包,有了一点收获:
对比图在http://static.flickr.com/30/55912002_5f12caa102_o.jpg

下面的分析比较难说清楚,大家能看就看吧.

分析:
用Breakpoint的时候,Server端过来的包,Client都会回一个TCP 的ACK消息.

Without Breakpoint 的时候, Server端过来的包,Client会直接用ftp的某种命令(如request:user root)这样的包作为TCP的ACK回复.

可以看出无论如何程序都是一直运行到send password, 并且成功接收了返回的消息的.
至于为什么还会一直等服务器端的回应,我仍然不知道.
希望各位大虾出力帮帮忙!谢谢!




网_风 2005-10-24
  • 打赏
  • 举报
回复
ftp大多数命令,发送一个命令就要接收一个返回参数(user和pass就是)
ggdayup 2005-10-24
  • 打赏
  • 举报
回复
谢谢o1o(两蛋一枪)
-----------------

send ("USER " + username)

send ("PASS " + password)
之间加个等待试试
sleep(1000)
-----------------

我试了, 问题依旧.
o1o 2005-10-24
  • 打赏
  • 举报
回复

send ("USER " + username)

send ("PASS " + password)
之间加个等待试试
sleep(1000)
ggdayup 2005-10-24
  • 打赏
  • 举报
回复
谢谢 lh8287(iWorm)
-------------------------
你可以在发送username之后,让服务器返回一个消息,如果收到才发送password。

你这个问题估计就是因为网络延迟造成的。
-------------------------
因为是ftp的客户端, 所以我的程序确实是在,send username之后,等到服务器返回消息,然后才发的password.

网络状况非常良好,延迟应该不会.
不过会不会有消息返回的先后顺序有问题这样的情况?我也不是很清楚.

还请各位大虾多多帮忙.
lh8287 2005-10-21
  • 打赏
  • 举报
回复
你可以在发送username之后,让服务器返回一个消息,如果收到才发送password。

你这个问题估计就是因为网络延迟造成的。
ggdayup 2005-10-21
  • 打赏
  • 举报
回复
谢谢PGLife(程序人生)

---------------------------------------------------
楼主试试把发送用户名和密码写在一个线程中看看,在这个线程中你采用阻塞的方法来获取回传信息,不知道行不行,只是给个建议了
---------------------------------------------------
Demo程序, 只有一个线程;甚至只有一行语句就是Login(),分三步,create socket,send username,sendpassword.

程序停在
this.bytes = clientSocket.Receive( this.buffer, this.buffer.Length, 0 );
说明是被阻塞了的.不然即使收不到任何bytes,也跳出了,不会停在receive这里.
moodboy1982 2005-10-20
  • 打赏
  • 举报
回复
不知,帮你顶下。
PGLife 2005-10-20
  • 打赏
  • 举报
回复
楼主试试把发送用户名和密码写在一个线程中看看,在这个线程中你采用阻塞的方法来获取回传信息,不知道行不行,只是给个建议了
chinazp 2005-10-20
  • 打赏
  • 举报
回复
我也遇到过,过来听听


jeffwangxm 2005-10-20
  • 打赏
  • 举报
回复
只能帮LZ顶下下
ggdayup 2005-10-20
  • 打赏
  • 举报
回复
感谢各位的关注.

----------------------------
沒遇過,你是不是一直在發,還是??
你是什麼錯誤信息啊??
----------------------------
A: 只发了一个命令"PASS ***";
没有错误信息,只是程序停在
this.bytes = clientSocket.Receive( this.buffer, this.buffer.Length, 0 );
这一行了.

-----------------------------------------
有可能是运行过程中的时间差造成的,单步调试由于有断点,部分处理过程的时间很充分,会掩盖掉一些运行比较慢,但会对下面程序造成影响的过程,这点在网络编程上更为明显。仅供参考!
-----------------------------------------
A: 为了测试,几乎就把Login()这个函数写在第一行了,前面没有什么操作,更没有需要长时间处理的操作.

-----------------------------------------
除了时间问题还有就是安全问题,看看网站的安全设置或是证书什么的配置的对不对!
-----------------------------------------
A: 如果是安全问题的话, 应该单步调试也通不过啊.


勤奋的阿拉丁 2005-10-20
  • 打赏
  • 举报
回复
除了时间问题还有就是安全问题,看看网站的安全设置或是证书什么的配置的对不对!
RedComet2005 2005-10-20
  • 打赏
  • 举报
回复
有可能是运行过程中的时间差造成的,单步调试由于有断点,部分处理过程的时间很充分,会掩盖掉一些运行比较慢,但会对下面程序造成影响的过程,这点在网络编程上更为明显。仅供参考!
dragonfly001 2005-10-20
  • 打赏
  • 举报
回复
沒遇過,你是不是一直在發,還是??
你是什麼錯誤信息啊??
幫忙頂!!

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧