ssh*_*ssh 4 delphi network-programming
我在阻塞模式下使用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;
Run Code Online (Sandbox Code Playgroud)
即使删除了WaitForData(),文本也不会按原样传输到服务器.但直接调用时,以下代码工作正常 - 没有WaitForData().
FClientSocket.Socket.SendText('Hi from client');
Run Code Online (Sandbox Code Playgroud)
那么在TClientSocket中使用TWinSocketStream的正确方法是什么?
任何帮助将不胜感激.
文档错了.WaitForData()仅适用于阅读,不适用于写作.
至于使用写入数据TWinSocketStream,您在第一个参数中传递了错误的值Write(),这就是它无法正确发送的原因.第一个参数是无类型的const,因此您需要对字符串进行处理以传递第一个字符的内存地址,例如:
Stream.Write(Buffer[1], ...);
Run Code Online (Sandbox Code Playgroud)
要么:
Stream.Write(PChar(Buffer)^, ...);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2569 次 |
| 最近记录: |