Pergunta

Sinto que estou fazendo isso errado, ou é apenas um resultado do meu novato com soquetes. Estou usando asyncsocket no iPhone para enviar dados para node.js. Meu problema é que, de vez em quando, o aplicativo pendurará e, em seguida, receberei 5 ou 10 mensagens de uma só vez em um dados, em vez de se separar, leituras mais oportunas.

Isso é um soluço de rede e os dados backup ou este node.js estão tentando ser inteligentes em meu nome e agrupar mensagens muito rápidas? Existe algo que eu possa enviar no lado do iPhone para dizer "este é o fim da minha mensagem, pare de esperar por mais dados" para ter certeza de que é um problema de rede? Sinto que deve haver um personagem de rescisão, como o Asynsocket usa novas linhas, mas não consigo fazer esse trabalho com o nó.

É muito mais importante para mim que os dados cheguem rapidamente do que qualquer outra coisa.

Obrigado!

EDIT: Tenho tentado usar 0xFF, mas não tenho certeza se estou fazendo isso certo, e não tenho nada para testar, então não tenho como saber.

...
[asyncSocket writeData:data withTimeout:-1 tag:0];
NSData* term = [NSData dataWithBytes:"\xFF" length:1];
[asyncSocket writeData:term withTimeout:-1 tag:0];
Foi útil?

Solução

Como um colega recente iniciante, posso dizer que meu macarrão estava bem e verdadeiramente assado por soquetes UNIX regulares e chatos (no PHP?!), Tanto que eu teria medo de abordar toda a coisa do Libevent muito cedo!

Uma coisa que posso dizer é que é o trabalho do protocolo para sinalizar o fim de um mensagem, o tubo TCP subjacente parece ser completamente assíncrono.

Hth

Outras dicas

As implementações TCP usuais bufferam dados escritos antes de enviá -los para aumentar o desempenho da gravação.

Para desativar esse comportamento, você precisa ter acesso ao seu soquete e definir "tcp_nodelay", assim:

int yes = 1;
setsockopt(yourNativeSocket, IPPROTO_TCP, TCP_NODELAY, (void *)&yes, sizeof(yes));


A correção rápida e suja para asyncsocket é conectar este código em asyncsocket.m no método- (BOOL)setSocketFromStreamsAndReturnError:(NSError **)errPtr

(yourNativeSocket é chamado native neste método)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top