0

我需要带有 TTcpServer 的 win XP 服务。

应用程序是由“File->New->Other->ServiceApplication”创建的

TTcpServer.localport := 33000

用 exename.exe /install 注册的服务器

一切看起来都不错,甚至netstat -a显示端口 33000 - 听

但我无法从这台机器外部访问该端口。仅限本地。

当我使用相同的参数制作标准应用程序时 - 一切正常。 TTcpServer 配置

EDIT1 TTcpServe.OnAccept =

procedure TFlexorXL.tcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
  var str: string;
begin
 if ClientSocket.Connect then
 begin
    str := ClientSocket.Receiveln;

  ClientSocket.Sendln('test');
               //ClientSocket.Disconnect;
  end;
end;
4

1 回答 1

2

TCP/IP 在服务中工作得很好(我一直都在使用它),所以你很可能只是误用了这个TTcpServer组件(这是可能的,因为它是一个写得很糟糕的组件)。

如果该TTcpServer.LocalHost属性为空,则套接字将绑定到所有可用的本地 IPv4 地址,否则它将仅绑定到您指定的特定 IPv4 地址(netstat 将显示服务器实际绑定到的实际 IP)。那是您必须让客户端连接到的 IP。在 的情况下0.0.0.0,您可以连接到属于服务器机器的任何 IP。

话虽如此,为了真正接受客户,您必须:

  1. TTcpServer.BlockMode属性设置为bmThreadBlocking。然后服务器将使用内部工作线程来接受连接,每个客户端将在自己的工作线程中运行。但是,您必须在事件内部执行所有与客户端相关的逻辑TTcpServer.OnAccept,因为在该事件处理程序退出后客户端将立即断开连接。

  2. 对于 的任何其他值BlockMode,您必须调用TTcpServer.Accept()自己,例如在计时器或线程中。如果调用Accept()没有参数的重载版本,则必须在事件内部执行所有与客户端相关的逻辑TTcpServer.OnAccept,因为在该事件处理程序退出后客户端将立即断开连接。如果您调用Accept()返回TCustomIpClient对象的另一个重载版本,那么您可以控制该对象的生命周期,并且可以根据需要使用它。

话虽如此,如果您正在执行所有这些操作,但仍然遇到问题,那么您需要提供有关您的实际TTcpServer设置的更多信息,显示一些实际TTcpServer代码等。就目前而言,您没有提供足够的详细信息来诊断您的问题。

于 2013-08-14T20:50:36.447 回答