2013-08-14 2 views
0

Мне нужно выиграть сервис XP с помощью TTcpServer.Удаленное подключение TTcpServer к службе

приложение было создано "File-> New-> Другие-> сервисПрикладной"

TTcpServer.localport: = 33000

сервер зарегистрирует exename.exe/установить

все выглядит хорошо, даже netstat -a показывает, что порт 33000 - ПРОСЛУШИВАНИЕ

, но я не могу получить доступ к этому порту за пределами этого аппарата. только локальный.

и когда я делаю стандартное приложение с одинаковыми параметрами - все в порядке. TTcpServer config

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; 
+0

Что происходит, когда клиент пытается подключиться к службе? Есть ли ошибка? На стороне клиента или на стороне сервера? Какова фактическая ошибка? Вы должны быть более конкретными. –

+0

никаких ошибок. just timeout – Subdigger

ответ

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 код и т.д. В настоящее время он стоит, вы не предоставили достаточно подробностей для диагностики вашей проблемы.

+0

TTcpServer.LocalHost устанавливается в локальную сеть ip (192.168.3.222). и, как я сказал выше, если TTcpServer на TForm - все работает нормально. если я положил его на TService ... проблемы – Subdigger

+0

@Subdigger: тогда клиенты могут подключаться только к '192.168.3.222'. Уверяю вас, сам TCP/IP отлично работает в службе, поэтому это будет связано с тем, что ваш код, взаимодействующий с «TTcpServer», ошибочно в среде службы, но вы не указали какой-либо из этого кода все же. В любом случае, 'TTcpServer' является действительно плохим компонентом вообще (на самом деле, все блоки' Sockets' плохие), поэтому вы действительно должны его вырезать. Либо используйте оригинальный компонент «TServerSocket» VCL, либо напишите свой собственный код Winsock с нуля, либо переключитесь на стороннюю библиотеку сокетов, такую ​​как Indy, ICS или Synapse. –

+0

... с TServerSocket такой же предмет. если я использую его в стандартном приложении - все идет правильно (получать и отправлять). если я переведу его, чтобы обслуживать его, он не отвечает на удаленный ip – Subdigger

Смежные вопросы