为什么ClientSocket的ClientType设为ctNonBlocking时,接收到的文件不完整?设为ctBlocking时,就好了呢(100分)

  • 主题发起人 主题发起人 时报平
  • 开始时间 开始时间

时报平

Unregistered / Unconfirmed
GUEST, unregistred user!
我本来设定的是非阻塞模式(ctNonBlocking),在ClientSocketRead事件中接收,但是接收到的文件不完整,每次大小都不一样。
但是设为阻塞模式(ctBlocking)后,我直接在发送的代码后面加上接收代码,竟然行了。
try
ClientSocket1.Socket.SendBuf(DataheadFS,sizeof(DataheadFS));

while ClientSocket1.Socket.ReceiveBuf(DataheadRev,sizeof(DataheadRev))>0 do
begin
DataheadRev.datatype := ntohs(DataheadRev.datatype);
DataheadRev.datalen := ntohl(DataheadRev.datalen);
if DataheadRev.datatype=1002 then
begin
bit_Insert.enabled := True;
BitBtn1.Enabled := True;
StatusBar1.Panels[1].Text := '';
end;
if DataheadRev.datatype=1001 then
if (DataheadRev.datalen>0) and (DataheadRev.datalen<=512) then
begin
for i := 0 to (DataheadRev.datalen -1) do
writeTofile(DataheadRev.filename,DataheadRev.datas);
srcFileName := DataheadRev.filename;
end;
ClientSocket1.Socket.Sendtext('OK');
StatusBar1.Panels[1].Text := ......';
Application.ProcessMessages;
end;
finally
//ClientSocket1.Active := False
end;
哪位讲讲道理是什么?
 
贴出代码
 
阻塞方式,发送完后,直接接收,没问题。
try
ClientSocket1.Socket.SendBuf(DataheadFS,sizeof(DataheadFS));//发送
//接收
while ClientSocket1.Socket.ReceiveBuf(DataheadRev,sizeof(DataheadRev))>0 do
begin
DataheadRev.datatype := ntohs(DataheadRev.datatype);
DataheadRev.datalen := ntohl(DataheadRev.datalen);
if DataheadRev.datatype=1002 then
begin
bit_Insert.enabled := True;
BitBtn1.Enabled := True;
StatusBar1.Panels[1].Text := '';
end;
if DataheadRev.datatype=1001 then
if (DataheadRev.datalen>0) and (DataheadRev.datalen<=512) then
begin
for i := 0 to (DataheadRev.datalen -1) do
writeTofile(DataheadRev.filename,DataheadRev.datas);
srcFileName := DataheadRev.filename;
end;
ClientSocket1.Socket.Sendtext('OK');
StatusBar1.Panels[1].Text := '';
Application.ProcessMessages;
end;
finally
//ClientSocket1.Active := False
end;
 
非阻塞方式
接收部分写在
ClientSocketRead里,但是接收同样的文件大小不一。
 
关键可能是
ClientSocket1.Socket.ReceiveBuf(DataheadRev,sizeof(DataheadRev))>0吧。

只你判断接收是否成功(>0),而且没有判断接收了多少字节。

还有我不知你在非阻塞下为什么会成功,按你的程序逻辑来说,应该都会错的。

最后看看DELPHI的帮助怎么说吧
ReceiveBuf only works in response to a read notification to a non-blocking windows socket. Blocking sockets must use a TWinSocketStream for reading. The TWinSocketStream object waits for the remote socket to be ready before transferring information.
 
后退
顶部