这篇Embarcadero文章描述了在线程中使用阻塞套接字。如果我已将我的套接字创建为ctNonBlocking
,并且我只使用TClientWinSocket.SendText
向套接字编写简单消息:
// Inside TThread::Execute: Option 1
strMessage := 'Hello!';
mySocket.Socket.SendText(strMessage);
或者我应该创建TWinSocketStream
并使用Write
:
// Inside TThread::Execute: Option 2
strMessage := 'Hello!';
stream := TWinSocketStream.Create(mySocket.Socket, 1000);
stream.Write(strMessage[1], Length(strMessage));
我发现我的应用程序退出时(在DPR文件中Application.Run()
之后并且无法调试)会抛出异常,如果我注释掉所有TClientSocket代码,它就会消失。
答案 0 :(得分:1)
如果套接字处于非阻塞模式,则无法使用TWinSocketStream
。如果套接字未处于阻塞模式,TWinSocketStream
的构造函数将引发异常。这在documentation:
非阻塞模式下的使用TWinSocketStream通过阻止套接字连接读取或写入信息......
...
注意:TWinSocketStream不适用于非阻塞套接字。
TClientSocket
在工作线程中工作正常(虽然阻塞模式是首选),前提是线程有消息循环。原因是因为在非阻塞模式下,TClientSocket
创建了一个内部窗口并将其与套接字关联。此窗口从WinSock接收消息以触发TClientSocket
的事件。因此,必须在同一线程上下文中创建,使用和销毁非阻塞模式下的TClientSocket
。不要跨越线程边界访问它。
TClientSocket
没有这个限制。