Winsockでサービスアプリを書いています。非同期ソケットが必要です。TThread in Execute には、サンプル コードがあります。
procedure TNasluchujPolaczenia.Execute;
var
WindowsSockets: WSAData;
begin
WSAStartup(MAKEWORD(2, 0), WindowsSockets);
mysocket:= Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sizesettings := SizeOf(SettingsSocket)
bind(mysocket, SettingsSocket, SizeOf(SettingsSocket));
listen(mysocket, 10);
while myend <> True do
begin
WSAAsyncSelect(mysocket, Handle, WM_USER, FD_READ or FD_ACCEPT);
accept(mysocket, pointer(@SettingsSocket), @sizesettings);
...
end;
Shutdown(mysocket, SD_BOTH);
CloseSocket(mysocket);
WSACleanUp();
Terminate;
end;
これは機能しません:
WSAAsyncSelect(mysocket, Handle, WM_USER, FD_READ or FD_ACCEPT);
理由はわかりません。私のサービスはこのacccept()でブロックされています。接続すると、ループが一度実行され、次にブロックされます。プレーンアプリケーションでコードをチェックしましたが、すべて問題ありません。