iPhone e Node.js, vários pacotes em leitura única
-
26-09-2019 - |
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];
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)