Comunicação P2P usando Winsock
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.
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.