TServerSocket的Socket.ReceiveBuf,它收发的体制是什么? (100分)

  • 主题发起人 主题发起人 zjzhou
  • 开始时间 开始时间
Z

zjzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
TServerSocket控件的OnRead事件:Socket.ReceiveBuf,他收的报文时总是收俩次,当把收
的报文的大小加一时,他就收一次。如 Socket.ReceiveBuf(Data,sizeof(Data)),Data
是一个结构体,这时就收俩次,但Socket.ReceiveBuf(Data,sizeof(Data)+1)时,这时就收
一次.这是什么原因?
 
因为OnRead是异步事件,如果一次接受数据没有接受完,那么它就会接受第二次。
 
你的代码太局部了,收少次自己决的呀,不关TServerSocket的事。

不知对不对?多多指教。
 
不同意楼上的说法;收多少应该是由WIN决定,特别当你每次发送数据大于8K时,一般你是
不可能一次收完整数据了,只有每次发送的数据较小时你才有可能一收一发,所以往往SOCKET
要有自己一套完整业务机制才行,但可使你放心的是,你不用担心数据会掉,因为无论你发
多大的数据,SOCKET都会给你全部发送到你想要发送的地方,这就是TCP比UDP的优势所在!
 
不知你发送时是如何发的Dara,既然你要收Buf中的数据,为什么不用Socket.ReceiveLength
一次收完后,统一处理收到的数据,难道你有理由等下一次接收事件来时再去读Buf中余下的
东西么?出现这种情况,定是你的sizeof(data)小于了Socket.ReceiveLength
 
onRead是事件,有数据来话,它就会自动触发,所以会接受两次,
从根本上来说,就是你的sizeof(Data)+1才是真正数据量的大小。
你可以把缓冲区设置大一点,ReceiveBuf的第二个参数设置为缓冲区的
大小。
 
对于TServerSocket 的OnRead来说,你收多少次只是跟发送数据的长度与缓冲区的大小比较
,由Socket决定的收发多少次的!
 
虽然接受几次跟发送数据的长度成正比,与缓冲区的大小成反比,但有数据来OnRead事件就
会触发,这并没有错。再有缓冲区设置有个最大值,超过这个最大值,再大的缓冲区都是
浪费。
 
补充一句:
ReceiveBuf实际上是调用socket的recv函数,要了解ReceiveBuf的实质,看recv的帮助
是最好不过的了。
 
问个傻一点的问题,别笑:(
recv的帮助在哪?我装的D7,怎么看啊?
 

Similar threads

回复
0
查看
688
不得闲
回复
0
查看
976
不得闲
回复
0
查看
801
不得闲
后退
顶部