Pergunta

Estou tentando alcançar a comunicação entre colegas para pares usando o winsock, mas gethostbyaddr Sempre me devolva nulo, essa coisa funciona apenas no localhost, server_name é endereço IP de destino

server_name="<--ipaddress-->"

struct sockaddr_in server;
addr = inet_addr(server_name);
cout<<"inet_addr(server_name) "<<addr<<endl;
hp = gethostbyaddr((char *)&addr, 4, AF_INET);
memset(&server, 0, sizeof(server));


memcpy(&(server.sin_addr), hp->h_addr, hp->h_length);
server.sin_family = hp->h_addrtype;
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

Já alcançamos a comunicação P2P usando o Python e funciona perfeitamente bem na mesma porta e endereço .. obrigado por qualquer pista ..

Não tenho idéia de como fazê-lo em C ++, no Python, acabamos de usar o Bind (---), alguém pode me mostrar o snippet de código como alcançá-lo.

Foi útil?

Solução

Onde você está conseguindo server_name a partir de? Tem certeza de que é um endereço IP válido? Além disso, verifique WSAGetLastError() Para ver especificamente o que está dando errado.

Lembre -se de que nem todos os nomes de host têm entradas DNS reversas. É perfeitamente legítimo para gethostbyaddr falhar em um endereço IP real e válido. Se você está fazendo P2P, é melhor não confiar no host nomes de maneira alguma, exceto talvez para exibições de diagnóstico (e voltar aos endereços IP se as pesquisas reversas falharem).

Editar: Com sua nova amostra de código expandido, fica claro que você realmente não precisa gethostbyaddr de forma alguma.

struct sockaddr_in server;
memset((void*)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.S_un.S_long = inet_addr(server_name);
server.sin_port = htons(port);
conn_socket = socket(AF_INET, socket_type, 0); 

connect(conn_socket, (struct sockaddr*)&server, sizeof(server))

gethostbyaddr só é necessário quando você precisa do DNS reverso nome do servidor em questão. inet_addr Já fornece um endereço adequado para se conectar.

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