paulo1205
(usa Ubuntu)
Enviado em 16/09/2012 - 22:57h
Seu código tem alguns problemas, sim, a saber:
- Seria bom que o parâmetro
porta fosse de um tipo que o limitasse garantidamente a inteiro sem sinal de 16 bits (num compilador de 32 bits, isso normalmente é
unsigned short, mas se você estiver usando um compilador que tenha <cstdint> ou <stdint.h>, pode usar
uint16_t). Com isso, você ajudaria a evitar eventuais "surpresas" devidas a número de porta nemor que zero ou maior que 65535, que um
int acomoda sem problemas.
- Prefira usar
memset() em lugar de
bzero(), pois esta última não faz parte de padrão algum, e está marcada como obsoleta no POSIX (por exemplo:
bzero(&local, sizeof(local)) deve virar
memset(&local, 0, sizeof local)).
- Aquela segunda chamada a bzero() é desnecessária e, na verdade, perigosa. Remova-a completamente e sem pena.
- Apesar do cast no segundo argumento de
bind() (que é necessária porque o C não tem herança de classes, como tem o C++), o terceiro argumento deve ser o tamanho do tipo original, antes do cast (i.e. você deve usar «sizeof local»).
- Se você declarar
tam como
socklen_t, não precisará fazer o cast.
Mesmo assim, é possível que o erro não seja no seu código. Se você estiver com sua máquina atrás de um firewall, pode ser que as tentativas de conexão estejam simplesmente sendo bloqueadas. De modo semelhante, se você estiver atrás de um roteador de Internet, o IP publicado pelo roteador estará nele, não na sua máquina, e você talvez tenha que criar um redirecionamento na configuração do roteador se quiser que alguém de fora da sua rede eventualmente se conecte no seu programa.