SOS-关于Socket类接收的问题

zslblue 2010-12-10 11:40:12
大家好,求知道的朋友帮助一下小弟,不胜感激!
问题:
需要访问一个目标系统,应该不是基于TelNet的协议的,地址/端口:192.168.1.3 / 4900。
我使用Windows自带的Telnet进行调试, 只要打开Telnet后输入 " o 192.168.1.3 4900"就可以连接

上目标,不需要登陆,连接后输入指令Help,自动返回:
XXXXX
YYYYYYYYYYYYYYYYYY
ZZZZZZZZZZZZZZZZZZZZZZZ
CCCCCCCCCCCCCCCCCCCCCC
但是因为以后要自动控制连结和通信,所以我需要自己编写一个类似elNet的程序,采用.Net

的Socket类编写(C#),便写好之后,为了调试,做了个类似Windows自带的Telnet的Console程序

,问题出现了:
连接成功后,发送指令Help\r\n,返回
XXXXX
再发送空指令过去(即只有"\r\n")返回剩下的部分:
ZZZZZZZZZZZZZZZZZZZZZZZ
CCCCCCCCCCCCCCCCCCCCCC

但是我如果用它访问其他电脑(端口23)(通过TelNet协议),可以完全和Windows自带的Telnet一样.
分析:
我发现访问电脑和我测试的目标系统(192.168.1.3 / 4900) 有一点不一样,电脑会在有一个TelNet协议协商的过程,而目标系统没有,可能因为目标系统不是基于TelNet协议.
查看MSDN:
EndReceive 方法将一直阻止到有数据可用为止。如果您使用的是无连接协议,则 EndReceive 将读取传入网络缓冲区中第一个排队的可用数据报。如果您使用的是面向连接的协议,则 EndReceive 方法将读取所有可用的数据,直到达到 BeginReceive 方法的 size 参数所指定的字节数为止。如果远程主机使用 Shutdown 方法关闭了 Socket 连接,并且所有可用数据均已收到,则 EndReceive 方法将立即完成并返回零字节。

请问大家我该怎么办? 是否因为是无连接协议,所以每次只返回第一个排队的可用数据报???那么为什么Windows的TelNet工具可以正常控制目标系统可以正确返回?
...全文
60 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxx1997 2010-12-10
  • 打赏
  • 举报
回复
你这个问题问的太专业了

至少不是C#的问题了
zslblue 2010-12-10
  • 打赏
  • 举报
回复
其实我自己已经找到原因了,不过也谢谢大家了。
原因:

Socket接收数据和发送不一样,发送是由发送方一次发送完毕数据,而接受可能是分次发送过来,所以应该在BegainReceive的回调函书中再次启动接收!

不过用我这样的方法也带来了一个问题,最后一次启动的接收无法关闭,因为收不到数据。我还在想用什么好方法来改变!!!!!
mjp1234airen4385 2010-12-10
  • 打赏
  • 举报
回复
你只发送/r过去,不要带/n。即Help\r
quanpp 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cxx1997 的回复:]
你这个问题问的太专业了

至少不是C#的问题了
[/Quote]
确实,呵呵, 帮你顶下吧,马上就下班了,大家周末愉快!

110,533

社区成员

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

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

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