Problema transmitir caractere nulo sobre soquetes

votos
1

Estou escrevendo um pequeno servidor Java, e um cliente correspondente em C ++, que implementar um serviço de IM simples sobre o protocolo STOMP .

O protocolo especifica que cada quadro (mensagem que passa entre o servidor eo cliente, se você) deve terminar com um caractere nulo, que no código que se referem como '\0', tanto em Java e em C ++.

No entanto, quando eu transmitir um frame sobre TCP via soquetes, o caractere nulo simplesmente não aparece, em ambos os lados. Eu estou trabalhando com codificação UTF-8, e tentou mudar para ASCII, não ajudou.

O que estou fazendo de errado?

Publicado 21/02/2009 em 12:29
fonte usuário
Em outras línguas...                            


5 respostas

votos
2

O tempo que você estiver codificando texto em ASCII ou UTF-8, você converter suas "letras" a um fluxo de bytes (codificações de bytes). Você precisa adicionar um byte zero para o fim das cadeias de mensagens.

[Adivinhar] Você pode estar usando uma biblioteca de alto nível com um método como "WriteLine (String line)" para enviar os dados através da rede. A documentação do método com descrever o que bytes são, na verdade, enviada, que tipicamente inclui a codificação de texto da mensagem na codificação corrente (ASCII, UTF-8, etc.) seguido por uma sequência de terminação de linha, que é, tipicamente, quer o byte 13, 10m ou uma combinação dos mesmos ( '\ n', '\ r \ n').

Use o método de baixo nível Write () método ou writeBytes () (dependendo de suas bibliotecas). Converter o texto em ASCII ou UTF-8, adicione o byte zero até o fim, e enviar exatamente o que você deseja enviar.

Respondeu 21/02/2009 em 12:36
fonte usuário

votos
1

Eu recomendo o download Wireshark e monitorar a transmissão para ver se o problema está no envio ou a extremidade de recepção.

Respondeu 21/02/2009 em 12:34
fonte usuário

votos
0

Você está em C ++?

Um erro novato é colocar o NUL no final da string: "Foo!\x00".

Claro, o ting que escreve a string trata esse primeiro NUL como o fim da cadeia, e dos não transmiti-lo. Você precisa branca do nul caráter '\x00' explicitamente como um personagem (com putchar ou no entanto c ++ faz isso), não como parte de uma cadeia.

Respondeu 21/02/2009 em 12:48
fonte usuário

votos
0

A primeira coisa que você precisa fazer é usar Wireshark (ou algo similar) como sugerido por Spencer.

Se é um problema do lado de transmissão, verifique que você está codificando a mensagem corretamente, adicionando traços de diagnóstico apropriados ao seu código.

Se é um problema do lado do receber, há uma maneira para configurar o caractere delimitador na tomada de receber? Pode haver uma opção de soquete que diz se deseja incluir ou excluir o caractere de delimitação. Talvez ele está sendo transmitido corretamente, mas o socket receber está descascando-lo.

Respondeu 21/02/2009 em 12:41
fonte usuário

votos
0

Você transmitir um tampão ou uma string? Se você transmitir uma string, o caractere nulo será terminar a corda e não serão transmitidos. Usando um buffer, você pode especificar quantos bytes você quer transmitir e incluir o caractere nulo.

Claro, o problema pode ser tanto na transmissão e o lado de recebimento.

Respondeu 21/02/2009 em 12:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more