EWOULDBLOCK / EAGAIN significa que os dados não puderam ser enviados imediatamente. Precisamos de mais detalhes sobre o seu código para descobrir isso.
- Tente descobrir o que acontece no lado do remetente quando o EWOULDBLOCK é retornado. Verifique se há threads e outros processos, monitore a memória / troca e o uso da cpu. Verifique seus logs (/ var / messages, ...) por qualquer erro de hardware.
- Determinar a perda de pacotes
- Execute o programa em outro SO antes de acusar a pilha TCP do Solaris ou escreva um pequeno programa de teste que envie 300B / s para o terminal remoto (sem necessidade de soquetes sem bloqueio, apenas envie), verifique se há latência o problema da rede.
Eu não sou um desenvolvedor, mas sugiro que você tente substituir sockets sem bloqueio por um multiplexador de E / S: selecione ou poll ou / dev / poll e verifique se o socket está pronto para gravação. Pode mudar o comportamento do seu programa para melhor ou, na pior das hipóteses, dar-lhe mais debug e dicas sobre o problema real.
Em distâncias tão longas, todos os pacotes provavelmente estão usando rotas diferentes, embora com um AS diferente, para que ninguém possa realmente avaliar a qualidade da rede. Um pacote pode levar muito tempo para chegar e ser reconhecido por causa de um problema em algum ponto da internet (provavelmente está próximo, caso contrário as pessoas teriam informado e corrigido), tente entrar de / para outros locais. Se um único pacote demorar muito para ser reconhecido, a janela TCP ficará presa e os dados adicionais poderão não ser processados. Você pode tentar ajustar o tamanho da janela TCP para um valor mais alto.
Além disso, você pode simplesmente executar mtr para verificar rapidamente a qualidade da rede. Execute-o várias vezes, pois os pacotes podem seguir caminhos diferentes.
Espero que isso tenha ajudado, de alguma forma: /