gpt4 book ai didi

delphi - TWinSocketStream.WaitForData 它如何知道我是否打算读取或写入?

转载 作者:行者123 更新时间:2023-12-03 15:26:00 24 4
gpt4 key购买 nike

我正在阻塞模式下使用 TClientSocket/TServerSocket 创建 TCP 客户端/服务器。概念验证服务器已经使用 telnet 构建并测试了基本功能(接收数据)。在客户端,将有两个线程,一个用于写入,另一个用于读取。现在,为了测试“发送(或写入)线程”,我使用以下代码。但是stream.WaitForData(30000)总是超时。 Delphi帮助说“在通过套接字连接读取或写入信息之前调用WaitForData”。所以我想知道 TWinSockStream 如何知道我正在调用 WaitForData 进行写入而不是读取?

procedure TClientThread.Execute;
var
stream: TWinSocketStream;
buffer: string;
begin

stream := TWinSocketStream.Create(FClientSocket.Socket, 60000);
try
while (not Terminated) and (FClientSocket.Active) do
begin
try
//FSendDataEvent is a trigger used for testing purpose
if FSendDataEvent.WaitFor(1000) = wrSignaled then
begin
FSendDataEvent.ResetEvent;

if stream.WaitForData(30000) then
begin
buffer := 'Hello from client';
stream.Write(buffer, Length(buffer) + 1 );
end;
end;
//Other useful code
except
on E:Exception do
begin
DebugOutput('TClientThread.Execute: ' + E.Message);
end;
end;
end;
finally
stream.free;
end;

end;

即使删除了WaitForData(),文本也不会按原样传输到服务器。但以下代码在直接调用时工作正常——无需 WaitForData()。

FClientSocket.Socket.SendText('Hi from client');

那么将 TWinSocketStream 与 TClientSocket 一起使用的正确方法是什么?

任何帮助将不胜感激。

最佳答案

文档有误。 WaitForData() 仅适用于读取,不适用于写入。

至于使用TWinSocketStream写入数据,您在Write()的第一个参数中传递了错误的值,这就是它无法正确发送的原因。第一个参数是一个无类型的 const,因此您需要引用字符串才能传递第一个字符的内存地址,例如:

Stream.Write(Buffer[1], ...);

或者:

Stream.Write(PChar(Buffer)^, ...);

关于delphi - TWinSocketStream.WaitForData 它如何知道我是否打算读取或写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9595759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com