ServerSocket的大Bug ?(200分)

  • 主题发起人 主题发起人 icic
  • 开始时间 开始时间
I

icic

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi5下一个TServersocker,port=4000;servertype=stNonBlocking
有两段代码,自行结果很奇怪
第一段
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage(socket.ReceiveText);
showmessage('aaa');
end;
第二段
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('aaa');
end;
在客户端
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('12345');
end;
服务器端两段代码分别编译后的执行结果很不一样
试一下,看是否很你想象的相同。
实际上,第二段代码 showmessage('aaa');只执行了一次
而第一段代码却可以执行无数次。
是怎么回事?
 
因为第一段一次就已经把数据读完了,不会再执行
而第二段未读数据,会触发多次
 
我试一下
 
这是bugs吗?
$%^@#^$%&#%&#$^%*^&(&^*
 
你不读,那些数据始终在缓冲中啊!
 
这是windows的异步socket机制,每当有数据进来,winsock就发消息socket窗口
并设立一个标记说明发过消息。如果socket程序处理了这个消息,并且[red]使用
winsock的API读入数据,就会清除这个标记并触发另一个winsock消息(如果还有
数据)[/red]
 
事件触发的条件是:系统缓冲中的数据字节数,刚好跨过门槛值。
如:系统内定的门槛值是128个字节,则当接收到127时,无消息产生,
收到第128时发生消息,再收到超过129时,无消息。
如果程序读出几个数据使缓冲区的字节数只剩下127后,这时系统又收到一个
字节,则消息又发生了。
因此:第一段代码将系统缓冲区的数据读完了,后又收到了一些数据,过了
门槛值,于是消息发生了。
第二段代码是缓冲区的数据已过了门槛值,而没有读走,即使又收到数据,
也不产生消息。




 
接受答案了.
 
后退
顶部