Z
ZHC
Unregistered / Unconfirmed
GUEST, unregistred user!
我在编写一个Email软件时,使用了阻塞式Winsocket调用,
用TwinsocketStream类读写winsocket,在程序中为了解socket
端口是否已经准备好,我使用了Twinsocketstream的一个成员函数
WaitFordata,根据Delphi的帮助文件说明,在使用Twinsocketstream
读写(注意这里是说“读写”)之前要调用WaitFordata函数,以测试
Socket端口是否准备好接受读写。但是在使用中我发现,在向socket
端口写数据之前,用Waitfordata,它总是返回False(即端口没有准备好)
致使我的程序总处于等待壮态。
我察看了Delphi的源代码,waitfordata函数的代码如下:(在scktcomp.pas)
function TWinSocketStream.WaitForData(Timeout: Longint): Boolean;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
TimeVal.tv_sec := Timeout div 1000;
TimeVal.tv_usec := (Timeout mod 1000) * 1000;
FD_ZERO(FDSet);
FD_SET(FSocket.SocketHandle, FDSet);
Result := select(0, @FDSet, nil, nil, @TimeVal) > 0;
end;
发现里面有一个语句有问题即:
Result := select(0, @FDSet, nil, nil, @TimeVal) > 0;
select是winsocket Api函数,她的第二个参数的含义是:(可选)指针
,指向一组等待可读性检查的套接口。第三个参数含义:(可选)指针
,指向一组等待可写性检查的套接口。上面的语句实际上只是检查套接口的可读性,而不是可写性,因此在写端口之前,如果端口中已无数据可读
自然要返回False.于是,
我在Twinsocketstream里加了一个函数Waitfordatawrite,代码与
Waitfordata大致相同,只是最后一句改成:
Result := select(0, nil,@FDSet, nil, @TimeVal) > 0;
在写端口之前调用,
在程序中使用果然程序运行正常。
不知这是否是一个Delphi的bug ,我的理解是否正确,请高手指教
另外,我想问如果我不在读写端口前调用Waitfordata,为甚么
程序会产生进入异常,严重时会产生蓝屏的0E号错误(处于阻塞状态)。
还有在winsoket阻塞调用情况下,select函数的具体用法。
我准备了200分,奖给高手。
用TwinsocketStream类读写winsocket,在程序中为了解socket
端口是否已经准备好,我使用了Twinsocketstream的一个成员函数
WaitFordata,根据Delphi的帮助文件说明,在使用Twinsocketstream
读写(注意这里是说“读写”)之前要调用WaitFordata函数,以测试
Socket端口是否准备好接受读写。但是在使用中我发现,在向socket
端口写数据之前,用Waitfordata,它总是返回False(即端口没有准备好)
致使我的程序总处于等待壮态。
我察看了Delphi的源代码,waitfordata函数的代码如下:(在scktcomp.pas)
function TWinSocketStream.WaitForData(Timeout: Longint): Boolean;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
TimeVal.tv_sec := Timeout div 1000;
TimeVal.tv_usec := (Timeout mod 1000) * 1000;
FD_ZERO(FDSet);
FD_SET(FSocket.SocketHandle, FDSet);
Result := select(0, @FDSet, nil, nil, @TimeVal) > 0;
end;
发现里面有一个语句有问题即:
Result := select(0, @FDSet, nil, nil, @TimeVal) > 0;
select是winsocket Api函数,她的第二个参数的含义是:(可选)指针
,指向一组等待可读性检查的套接口。第三个参数含义:(可选)指针
,指向一组等待可写性检查的套接口。上面的语句实际上只是检查套接口的可读性,而不是可写性,因此在写端口之前,如果端口中已无数据可读
自然要返回False.于是,
我在Twinsocketstream里加了一个函数Waitfordatawrite,代码与
Waitfordata大致相同,只是最后一句改成:
Result := select(0, nil,@FDSet, nil, @TimeVal) > 0;
在写端口之前调用,
在程序中使用果然程序运行正常。
不知这是否是一个Delphi的bug ,我的理解是否正确,请高手指教
另外,我想问如果我不在读写端口前调用Waitfordata,为甚么
程序会产生进入异常,严重时会产生蓝屏的0E号错误(处于阻塞状态)。
还有在winsoket阻塞调用情况下,select函数的具体用法。
我准备了200分,奖给高手。