Pergunta

Estou prestes a desenvolver algumas tomadas de coisas relacionadas em C ++ e gostaria que o software a ser tão portátil entre Windows e Linux quanto possível desde o início (tornando-o portátil mais tarde é complicado.)

Eu olhei para diferentes bibliotecas, há um para C ++ a partir alhem.net e de claro que há boost :: asio. boost :: asio parece muito promissor, mas seria uma grande dependência para aplicações este pequeno.

É ainda vale a pena escrever as coisas me ou devo apenas usar uma biblioteca? Se eu fazer isso sozinho quais seriam as principais armadilhas?

Foi útil?

Solução

Winsocks não são muito compatíveis com tomadas Posix:

  • Em Winsocks uma tomada é do tipo SOCKET. Em POSIX é simplesmente um descritor de arquivo (int), no qual você pode realizar chamadas read() e write() normais.
  • Eles não retornam erros da mesma forma.
  • Eles não suportam algumas opções sobre recv() e send().
  • Você tem que inicializar e unitialize a biblioteca Winsocks com funções de dois especiais.
  • Eu não acho que você pode fechar Windows sockets com shutdown() ou close(). É algo como closesocket() vez.

Deve haver mais diferenças, mas isso é o que eu lembro agora. Se você quer portabilidade com Winsocks, você terá uma pequena biblioteca para fechar um socket, imprimindo uma mensagem de erro e assim por diante.

Eu provavelmente ir com boost::asio, personnally (eu nunca usei, embora).

Outras dicas

Eu desenvolvi alguns wrappers portáteis em torno de órbitas. Certifique-se de que você não vá para baixo da pista de baixa qualidade de não retorno, que é constituído de eventos WinSock2. Fora isso, a meu ver, as maiores diferenças são:

  • para iniciar a rede no Windows, você precisa chamar ::WSAStartup(), para desligá-lo no Windows, ::WSACleanup() executar; em Linux não fazer nada,
  • close() em Linux é closesocket() no Windows,
  • tamanho padrão do buffer diferem entre os dois drivers e sistemas operacionais, por isso certifique-se de configurá-los usando SO_RCVBUF e SO_SNDBUF,
  • SO_REUSEADDR rouba o endereço no Windows, permite re-abertura frequente no Linux; você provavelmente só quer usar esta bandeira no Linux,
  • fazer uma tomada de usos não-bloqueio ::ioctlsocket() no Windows, ::fcntl() em Linux,
  • os arquivos de cabeçalho são diferentes, <sys/socket.h> e amigos em Linux, <WinSock.h> no Windows,
  • para ir portátil, a maneira mais fácil é provavelmente a utilização ::select() para aguardar os dados para chegar,
  • fd_sets são totalmente diferentes no Windows / Linux; este só é relevante se você precisa de inicialização otimizar de fd_sets, como quando adicionar / remover soquetes arbitrários,
  • no Windows, qualquer Linha de suspensão no socket é lançado com um código de erro quando o socket está fechado, no Linux o fio permanece à espera. Se o segmento está bloqueando o soquete com, por exemplo ::recvfrom(), você pode considerar o uso ::sendto() para liberar o segmento parando no Linux.

Tudo o resto que eu sempre precisei apenas funcionou no Lada.

Dê uma olhada na biblioteca (ACE) "Adaptive Communications Environment": (ACE Página) Ele fornece algumas abstrações agradáveis ??e muita flexibilidade todas enroladas em uma biblioteca portátil que suporta o Windows, MacOS e Linux. Ele tem um pouco de uma curva de aprendizagem, mas eu tenho muito bom valor a partir dele.

Como muita coisa tomada você estará usando? Já fiz várias aplicações onde o material soquete foi muito alto nível (abrir, ler, escrever), e funcionou perfeitamente do Windows para o Linux. Se é mais do que isso -. Ir com impulso

Honestamente, eu usaria boost :: asio como primeira preferência. Se você realmente deseja obter para baixo e sujo com a API soquetes, você pode usar o padrão soquetes BSD API em Windows e Linux - é só que no Windows você terá que apontam para (e inicializar) Winsock2, enquanto que em Linux você não terá uma biblioteca separada para ligação contra.

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