Porque meu servidor não funciona com IPV6? [RESOLVIDO]

1. Porque meu servidor não funciona com IPV6? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/10/2018 - 21:52h

Olá, boa noite a todos!
Então, andei escrevendo um pequeno servidor em C usando a API de sockets do UNIX apenas para alguns testes. O programa funciona perfeitamente com IPV4, porém o mesmo não acontece com IPV6...


Eis o Código:

#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <netdb.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT "9009"

int make_server_socket(void){

int sockfd;
struct addrinfo *res=NULL, hints;

memset(&hints, 0, sizeof(hints));

hints.ai_flags=AI_PASSIVE;
hints.ai_family=AF_UNSPEC;
hints.ai_socktype=SOCK_STREAM;
hints.ai_protocol=IPPROTO_TCP;

if(getaddrinfo(NULL, PORT, &hints, &res)!=0){

sockfd=-1;

}else{

if((sockfd=socket(res->ai_family, SOCK_STREAM, IPPROTO_TCP))!=-1){

if(bind(sockfd, res->ai_addr, res->ai_addrlen)<0){

sockfd=-1;
}
}

freeaddrinfo(res);
}

return sockfd;
}

int main(void){

int sockfd=make_server_socket();

if(sockfd!=-1){

listen(sockfd, 1);

int csockfd=accept(sockfd, NULL, NULL);

if(csockfd!=-1){

send(csockfd, "Real Muthaphuckkin G's", 23, 0);
}

close(sockfd);
close(csockfd);
}

return 0;
}


Sei que o código tá meio "mixuruca", mas deve-se levar em conta que é apenas um teste :)

Código compilado e em funcionamento:

Conectando-se ao servidor via endereço local IPv4:

zherkezhi@zherkezhi :~/Documents/C/Perguntas$ nc -4 127.0.0.1 9009
Real Muthaphuckkin G's
zherkezhi@zherkezhi:~/Documents/C/Perguntas$ #Funcionou perfeitamente!


Conectando-se ao servidor via endereço local IPv6:

zherkezhi@zherkezhi:~/Documents/C/Perguntas$ nc -6 ::1 9009
zherkezhi@zherkezhi:~/Documents/C/Perguntas$ #não aconteceu nada *_*



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/10/2018 - 12:06h

Após a chamada bem-sucedida a getaddrinfo(), o último parâmetro é usado para informar uma lista encadeada de endereços válidos.

No seu programa você usa apenas o primeiro nó da lista. E possível que esse nó tenha apenas as informações necessárias para o endereço IPv4, e que haja outros nós na lista, que você não examinou, com o endereço IPv6.

Pode ser que ajude também usar AI_V4MAPPED em hints.ai_flags juntamente com AF_INET6 em hints.ai_family (ou mesmo substituir hints por NULL — não tenho como testar agora), a fim de obter um socket com mapeamento do endereço IPv4 para IPv6, ou diretamente ou como mais um nó da lista encadeada.

3. Re: Porque meu servidor não funciona com IPV6? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/10/2018 - 12:57h


Pode ser que ajude também usar AI_V4MAPPED em hints.ai_flags juntamente com AF_INET6 em hints.ai_family (ou mesmo substituir hints por NULL — não tenho como testar agora), a fim de obter um socket com mapeamento do endereço IPv4 para IPv6, ou diretamente ou como mais um nó da lista encadeada.


É possível tornar meu servidor multi-arquitetura? Tipo...fazer ele trabalhar com IPv4 e com IPv6 juntos ao mesmo tempo. É possível?




4. Re: Porque meu servidor não funciona com IPV6? [RESOLVIDO]





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts