Para Multicasting, são adicionadas 4 propriedades ao TWSocket: ReuseAddr permite várias janelas no mesmo PC para ouvir o soquete multicast. MultiCast permite que o soquete para escutar em uma porta multicast MultiCastAddrStr especifique um endereço IP multicast para ouvir, como quot225.1.2.3quot note , Isso deve estar dentro da faixa de endereços de multidifusão definida MultiCastIpTTL alterar Time-To-Live a partir do padrão de 1, deve-se ter cuidado porque os roteadores de IP (gateways) próximos provavelmente precisarão ser configurados para permitir que o Multicast envie pacotes UDP para um grupo Endereço e, portanto, não é mais confiável (na verdade, menos) do que outro uso da UPD. Normalmente, você cria a confiabilidade conforme necessário em seu próprio aplicativo para UDP ou então use o TCP. O uso de multidifusão deve ser semelhante ao usar o ICS com UDP sem multicast, mas tornar a propriedade multicast verdadeira e definir o endereço e a porta adequadamente. Você lançou o teste executando o programa resultante duas vezes (iniciar 2 janelas) em seu PC de desenvolvimento se você definir socket-gtReuseAddr verdadeiro nos soquetes de recebimento. Normalmente, eu coloco dois componentes Wsocket no meu formulário, nomeando-os XmtSocket e RcvSocket. Para enviar, eu configurei Para receber, eu configurei No evento: OnDataAvailable, chame um manipulador que chama: Vários clientes na mesma porta Wilfried Mestdagh wilfriedmestdagh. biz 28 04 2001 gt Posso conectar mais esse cliente à mesma porta Sim você pode . Um TWSocket (ou TWSocketServer) está escutando em uma porta. Quando um cliente se conecta, a conexão é transferida pelo sistema operacional para outra porta local gratuita. O soquete do servidor fica escutando na mesma porta permitindo que outros clientes se conectem a ele. Observe que você pode apenas 1 TWSocket (Servidor) escutando em 1 porta particular. Quando você tem que ouvir em várias portas, você tem que ter muitos TWSocket (Servidor) ouvindo em diferentes portas. A única razão pela qual você quer fazer isso se você tiver servidores diferentes com protocolos diferentes (como POP3, SMTP, FTP, HTTP). Gt Preciso de um servidor de multithread Quando você pensa em fazer um servidor que tenha que atender muitos clientes simultaneamente, você pensa imediatamente que você precisa usar multi-threading. Isso é realmente desnecessário na maioria dos casos. Multi-threading é obrigatório se você tiver algum processo longo para executar. Com o TWSocket, a telecomunicação não é definitivamente um longo processo. Todas as transmissões ocorrem em segundo plano, mesmo que você envie um grande volume de dados. O TWSocket está totalmente absorvido. Isso significa que ele automaticamente buffers dados (entrada ou saída) sem nunca bloquear o seu aplicativo. O TWSocket é totalmente orientado para eventos. Isso significa que um evento é gerado sempre que o processamento é necessário. Toda invocação de um método TWSocket não é bloqueadora. Por exemplo, quando você se conecta a um computador remoto, você chama TWSocket. Connect que configura todas as coisas para iniciar uma conexão e depois retorna quase que imediatamente. Eventualmente, quando a conexão é estabelecida, você obtém o evento OnSessionConnected. Durante o intervalo, seu aplicativo continuará a ser executado. Se você enviar dados, por exemplo 10KB de dados, muito mais do que o recebimento pode receber de uma vez que seu aplicativo não será bloqueado. O método TWSocket. Send é exatamente como Conectar: os dados são colocados em um buffer dinâmico de alocação, tudo é configurado para enviar seus dados em segundo plano e depois retornar quase imediatamente. Eventualmente, seus dados são transmitidos (pode depois de um longo período de tempo). Sua aplicação recebe o evento OnDataSent. Na caixa de diálogo do servidor do cliente, você nunca está bloqueado: você recebe um evento OnDataAvailable quando alguns dados estão disponíveis (para que nunca espere os comandos do cliente), as respostas do servidor são enviadas em segundo plano. Então, se você criar um servidor multiusuário - o que geralmente é o caso - você realmente não precisa fazer nada de especial. Ok, você deve ter um TWSocket para cada cliente (criá-lo dinamicamente ou soltá-lo em um formulário e criar o formulário de forma dinâmica, como o TnSrv faz). Mas uma vez que cada cliente tem o seu próprio TWSocket, tudo passa por manipuladores de eventos e nunca bloqueia sua aplicação. Um cliente nunca irá bloquear outro. Dando toda essa consideração, você deve usar o multi-thread apenas para processar a solicitação real enviada pelo cliente, somente se esses pedidos demorarem tempo (como uma solicitação SQL), sem contar o tempo de transmissão. Na maioria das vezes, se você tiver pedidos longos, use threads para executar cada solicitação em paralelo. Não use um tópico para cada cliente (MtSrv usa um tópico para cada cliente), mas crie um conjunto de threads de trabalho para executar os pedidos. Se o seu computador for capaz de processar 20 pedidos simultâneos, crie 20 threads. À medida que os clientes enviam pedidos, encontre um segmento de trabalho gratuito e deixe-o executar o pedido e, em seguida, retorna o tópico para o pool de threads livre. Se mais de 20 clientes estiverem conectados e mais de 20 estiverem solicitando ao mesmo tempo, coloque seu pedido, ou atualize o seu computador para executar simultaneamente mais de 20 pedidos ao mesmo tempo dentro de um prazo razoável. Não esqueça que, se você tiver um computador de processador único, apenas um segmento realmente é executado em um determinado momento. Você obtém mais desempenho usando threads somente se o processamento de um segmento estiver aguardando I O. Durante esse tempo de espera, outro thread pode usar o processador. Observe também que seu hardware deve ser capaz de fazer vários pedidos de IO ao mesmo tempo para obter vantagem dos segmentos. Se você tiver um único disco ou mesmo vários discos com IDE, você não pode executar vários discos I Os ao mesmo tempo. Se o seu processo estiver ligado à CPU, você não possui vantagem usando threads Se você possui um computador com vários processadores, você deve usar threads para se beneficiar da energia adicionada. E você só verá benefício se você estiver ligado ao CPU e não I O ligado. Em suma, comece seu servidor no modelo conduzido por eventos e, em seguida, adicione o mecanismo do thread de trabalho. Meu servidor envia duas cordas, eu só recebo um OnDataAvailable com ambas as strings anexadas. Francois Piette francois. pietteoverbyte. be 04 03 2001 gt Como receber fluxo de dados de alta velocidade contínua. - Receba sempre todos os dados no OnDataAvailable - Receba em um buffer sempre suficientemente grande - Não mova os dados repetidamente - Processe os dados o mais rápido possível Ok, vamos discuti-lo desde o início com algum código de exemplo. Neste exemplo, irei receber registros completos. Claro que, ao receber dados binários, não é possível usar o LineMode (a menos que os dados sejam escapados), então os dados devem ser concatenados até que haja um registro completo. Mas também é possível que mais registros sejam recebidos ao mesmo tempo. Vamos começar com o registro. Observe que eu uso aqui um registro cheio. Neste caso, será o mesmo código, mas é principalmente uma boa idéia, especialmente se existe a possibilidade de que a outra extremidade esteja escrita em uma CPU de SO de idioma diferente. Ao usar um registro compactado, você tem certeza de que todos os membros estão alinhados por bytes: então precisamos de um buffer alocado dinâmico com ponteiros de leitura, porque não queremos mover os dados durante todo o tempo. Você pode fazer isso em um objeto separado, ou em um componente TWSocket derivado ou em um TForm. Mas isso é puramente dependendo da sua aplicação. Claro que você precisa ter cuidado para que os ponteiros sejam reiniciados no início de uma conexão. Nós também começamos com alguns ajustes de buffersize. Observe que esse tamanho inicial é puramente dependente da velocidade que você recebe dados, do tempo para processar os dados e a velocidade da máquina. Você deve experimentar um pouco com ele e fazer algum registro para saber o mínimo necessário. Faça o teste na máquina mais lenta que você deseja suportar com a rede mais rápida que você deseja suportar. Especialmente se você planeja envolver dados continuamente. Tenha em atenção que pode ser melhor acelerar o remetente ou criar um protocolo onde o receptor acumule todos os dados. Observe que não tocamos o buffer se ele já está alocado, porque assumimos que ele cresceu para um bom valor na sessão anterior e não queremos perder o tempo novamente. Em OnSessionConnected é provavelmente um bom lugar para usar este código: agora, detalhamos o OnDataAvailable em detalhes. Como você vê, usamos TR como PTestRecord, porque só usaremos ponteiros sem mover dados. Primeiro, você deve verificar o argumento de erro. Se não for zero, você pode sair do procedimento porque você não tem mais nada para fazer lá. Claro que você fará algo com o erro (pelo menos, logá-lo). Em seguida, verificamos o tamanho do nosso buffer de recebimento. Se for menor que algum valor predefinido, vamos aumentá-lo. Novamente esse valor depende dos mesmos motivos que a configuração do valor inicial. Durante a fase de teste, você deve registrar cada incremening, apenas para ver se suas configurações iniciais estão bem. Agora estamos prontos para receber. Note que usar Sender é uma boa idéia aqui, pois você pode ter muitos TWSocket, todos usando o mesmo código. Note que Count pode ser 0 ou menos. Mais uma vez nesse caso, não temos mais nada para fazer e saímos do procedimento. Durante o teste, você deve registrar se Count está obtendo o mesmo valor que a sala vazia no buffer. Se assim for, você deve alterar os valores iniciais, a quantidade de bytes onde você decide incrementar o buffer e o próprio valor incrível. Nós recebemos dados, então devemos incrementar o ponteiro de gravação para ficar pronto para a próxima recepção. Em seguida, verifique se ainda temos pelo menos um registro completo (ou mais), e simplesmente configure TR para o endereço certo no buffer de recebimento. TR pode ser acessado no manipulador de procissão como: TR. Intsn. Depois de processar os dados, nós apenas incrementamos nosso ponteiro de leitura. Após o processamento, verificamos se o nosso buffer está vazio. Se assim for, os dois ponteiros têm o mesmo valor. Em seguida, definimos, claro, para 0 para começar de novo desde o início do buffer. E, finalmente, você faz algo com o erro de exepção se houver algum. Pelo menos, logá-lo. Aqui está o código completo: como ele diz, o soquete (servidor ou cliente) está fechado. Gt Isso é certo: se um cliente quiser se conectar a um servidor, e esse servidor gt não está ouvindo, o cliente primeiro tem wsOpened, então wsClosed novamente. Gt Qual é a diferença entre wsOpened e wsConnecting - O servidor gt já aceitou um cliente, se o cliente obtiver wsConnecting E um pouco gt bit mais tarde, wsConnected Quando um cliente tenta se conectar e não há nenhum servidor a ouvir, você seguirá a seqüência seguinte: - Abertura - Conexão - Fechado A diferença para abrir e conectar é quando o soquete é criado, então ele é aberto. Conectando é o próximo passo. Quando há um servidor que escuta, Conectado segue a Conexão. Você pode ver isso com um pequeno projeto de teste onde você faz em OnChangeState: pare de receber conexões e comece novamente mais tarde Francois Piette francois. pietteoverbyte. be 20.09.1998 Basta fechar o soquete de escuta para bloquear outras tentativas de conexão. Então, quando quiser aceitar conexões novamente, reatribua as propriedades (Addr, Proto, Porta) para o soquete de escuta e ligue para ouvir novamente. Você deve reatribuir propriedades porque quando um soquete está fechado, suas propriedades são redefinidas para os valores padrão. Gt Dentro de um único tópico de criação de muitos TWSocket, eu entendo que o gt com Threading temos que chamar TWsocket-gtProcessMessage, eu pergunto será gt ser, temos que chamar TWsocket-gtProcessMessage para todos os gt TWsockets criados Você precisa ter UM E excitly ONE message pump por thread, independentemente de quantos TWSocket ou outros componentes ICS que você crie. Para implementar a bomba de mensagem, você PODE escolher chamar ProcessMessage somente em um WSocket criado no contexto de threads (no método Execute). Outra bomba de mensagens fará o mesmo trabalho. Gt Existe uma maneira de forçar o lançamento TIMEWAIT Não há nenhuma maneira oculta de forçar soquetes no TIMEWAIT a ser fechado - nós enfrentamos isso em servidores de numerout que nós escrevemos e a única resposta é permitir que o cliente remoto feche a conexão primeiro. No cliente remoto, eles terão um soquete no TIMEWAIT, mas seu servidor não irá. Usando esta técnica e o modelo de porta IOCompletion, conseguimos manipular regularmente 8.000 a 10.000 sockets ativos em um sistema NT4 ou W2K. Eu sou um problema realmente estúpido. Gostaria de enviar uma transmissão do udp para minha rede e receber o formulário de resposta de vários dispositivos. Se eu fizer isso com o demo UdpSend (Exemplo do ICS), ele está funcionando para dispositivos com um Ip na minha sub-rede e fora da minha sub-rede (por exemplo, o PC 192.168.120.44 eo dispositivo 192.168.120.70 estão respondendo e o dispositivo 10.20.121.22 também), O Wsocket sempre desencadeia o evento SocketDataAvailable (incluí este evento na demo). Então, a demonstração está funcionando corretamente. O louco é que quando eu abrir um novo projeto e copiar o código, ele só está funcionando para dispositivos com um IP dentro da minha sub-rede. Posso ver que recebo dados de dispositivos fora da minha sub-rede, mas o evento WSocketDataAvailable não é ativado. Eu encontrei o problema. No registro, a chave HKEYLOCALMACHINESYSTEMControlSet001ServicesSharedAccessParametersFir ewallPolicyStandardProfileAuthorizedApplicationsList é uma entrada para o aplicativo. Não sei por que, mas apenas o caminho exato dessa entrada está autorizado a receber a resposta da Ip Adresses fora da sub-rede. Estou tendo esse problema com o UDP. O remetente envia um pacote de 1625 bytes por segundo, o destinatário recebe dois pacotes em vez disso: 1460 bytes e 165 bytes. Eu entendo que os pacotes UDP podem ser fragmentados, mas que devem ser transparentes para o aplicativo. Se eu estiver certo, eu deveria receber um pacote de 1625 bytes, em vez de dois mais pequenos. Estou certo. O buffer que usei é de 2048 bytes, o que é suficientemente grande. A minha compreensão é que os pacotes UDP podem ser tão grandes quanto 64K bytes. Você precisa pedir ao TWSocket que use um buffer maior (propriedade BufSize). Por padrão, é 1460 bytes, que é o maior pacote TCP em Ethernet. Altere BufSize de acordo com o maior datagrama UDP que você pretende receber. Como evitar a perda de dados com pacotes UDP maiores que 1460 bytes Francois PIETTE francois. pietteoverbyte. be 21 04 2002O melhor agente de opções binárias As operações de negociação oferecidas neste site podem ser consideradas Operações de negociação de alto risco e sua execução pode ser muito arriscada. Comprar instrumentos financeiros ou utilizar os serviços oferecidos no site pode resultar em perdas significativas ou mesmo em uma perda total de todos os fundos em sua conta. Você tem direitos limitados e não transferíveis limitados para usar o IP fornecido neste site para fins pessoais e não comerciais em relação aos serviços oferecidos apenas no site. A Companhia atua fora da Federação Russa. Eu. iqoption é detida e operada pela Iqoption Europe Ltd. IQ Option, 2013-2016 As informações de recuperação de senha foram enviadas com sucesso para o seu e-mail O registro está indisponível na Federação Russa. Se você acha que está a ver esta mensagem por engano, entre em contato com supporttiqoption.
No comments:
Post a Comment