socket设置断点的问题,老妖进来看看,帮帮忙了,我实在搞不清楚问题在哪儿了

时间:2021-09-05 00:12:39
我写了一个远程控制程序,服务端是用vc,客户端是用的bcb socket控件,但是现在有一个问题。
客户端接收服务端数据时,只有在和socket相关的函数上(任何函数,recv,send,或getpeername,accept等等)断点单步执行,得到的服务端数据一切正常,但是取消断点得到数据就出问题,经常会是乱码,这是为什么呢?

13 个解决方案

#1


是不是阻塞/非阻塞的原因?

#2


我都是非阻塞的方式啊,应该不是这里的问题。我只是奇怪,设置断点单步执行过去就正常,难道设置断点和普通的运行有什么不同的地方吗?

#3


也许是时间的关系,比如服务器发送之后,客户端要延迟一段时间才能接收到,而如果立即接收的话会出现截断的情况。

#4


Recive的时候判断实际接收到的长度,如果非预期长度,则对接收到的数据进行缓存,后续接收到的数据合并之后再处理。另外还要考虑一个粘包的问题(具体什么是粘包,楼主不妨也自己找资料学习一下^_^)。

#5


谢谢两位的思路,给我提供了一个考虑的方向,希望大家多多提供其他的想法啦!!!帮帮忙

#6


今天测试了很多次,也改了很多次还是这个问题。

recv(Socket->SocketHandle,(BYTE*)&sysinfo,sizeof(SYSTEMINFO),NULL);
只要在这句上加上断点就没问题,否则sysinfo要么是乱码,要么是空的,郁闷啊!!!!!!!!各位救命啦!!

#7


既然用非阻塞方式,直接recv就不一定会收到数据,可以检查recv返回的值确定接收到数据没有。

如果楼主不喜欢用控件的话,简单的方法是用一个循环调用recv直到接收到数据或超时。
正规一点可以用 select 函数检查是否有数据。

具体还是参考 socket 帮助吧。

#8


to shadowstar:
    最要命的地方就在这里,recv数据只能设置断点来看,可是只要设置断点他的数据就是正常的,当不设断点查看的时候就出错了..........

#9


我不是说了循环调用recv或者用select,设断点的话已经有等等的时间,当然就会收到了。

#10


to shadowstar:
   那解决的方法是什么呢?

#11


要循环的接收,查看收到的数据是否完全,
recv只是接收已经到达的数据,比如Server发送1024字节,
可能开头有100BYTE到达了Client,那么Client第一次调用recv则只返回100个字节的信息,
你必须继续调用recv,直到1024字节全部收到,

#12


该回复于2008-07-19 16:13:12被版主删除

#13


该回复于2008-07-10 02:40:16被版主删除

#1


是不是阻塞/非阻塞的原因?

#2


我都是非阻塞的方式啊,应该不是这里的问题。我只是奇怪,设置断点单步执行过去就正常,难道设置断点和普通的运行有什么不同的地方吗?

#3


也许是时间的关系,比如服务器发送之后,客户端要延迟一段时间才能接收到,而如果立即接收的话会出现截断的情况。

#4


Recive的时候判断实际接收到的长度,如果非预期长度,则对接收到的数据进行缓存,后续接收到的数据合并之后再处理。另外还要考虑一个粘包的问题(具体什么是粘包,楼主不妨也自己找资料学习一下^_^)。

#5


谢谢两位的思路,给我提供了一个考虑的方向,希望大家多多提供其他的想法啦!!!帮帮忙

#6


今天测试了很多次,也改了很多次还是这个问题。

recv(Socket->SocketHandle,(BYTE*)&sysinfo,sizeof(SYSTEMINFO),NULL);
只要在这句上加上断点就没问题,否则sysinfo要么是乱码,要么是空的,郁闷啊!!!!!!!!各位救命啦!!

#7


既然用非阻塞方式,直接recv就不一定会收到数据,可以检查recv返回的值确定接收到数据没有。

如果楼主不喜欢用控件的话,简单的方法是用一个循环调用recv直到接收到数据或超时。
正规一点可以用 select 函数检查是否有数据。

具体还是参考 socket 帮助吧。

#8


to shadowstar:
    最要命的地方就在这里,recv数据只能设置断点来看,可是只要设置断点他的数据就是正常的,当不设断点查看的时候就出错了..........

#9


我不是说了循环调用recv或者用select,设断点的话已经有等等的时间,当然就会收到了。

#10


to shadowstar:
   那解决的方法是什么呢?

#11


要循环的接收,查看收到的数据是否完全,
recv只是接收已经到达的数据,比如Server发送1024字节,
可能开头有100BYTE到达了Client,那么Client第一次调用recv则只返回100个字节的信息,
你必须继续调用recv,直到1024字节全部收到,

#12


该回复于2008-07-19 16:13:12被版主删除

#13


该回复于2008-07-10 02:40:16被版主删除