Não é possível resolver o endereço do host enviando pacotes UDP

0

Eu tenho dois programas C em execução em computadores separados e estou tendo problemas para enviar pacotes UDP de uma máquina para outra. Eu testei os pedaços de código de comunicação cliente / servidor na mesma máquina usando um localhost, e tudo parecia bem, então eu não acho que o problema está no meu código. O programa do servidor está sendo executado em um laptop Ubuntu e o programa cliente está sendo executado em uma área de trabalho do Windows XP. No momento, eu simplesmente os conecto por meio de um roteador Linksys wrt54gs.

Toda vez que tento conectar, recebo o erro "Não é possível resolver o endereço" 10.0.24.100 "" do PC cliente ao tentar estabelecer uma conexão. (Eu posso fornecer algum código, se alguém acha que vai ajudar.) Ele também está me dando o código de erro do Windows 11004.

"The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for. The usual example for this is a host name-to-address translation attempt (using gethostbyname or WSAAsyncGetHostByName) which uses the DNS (Domain Name Server). An MX record is returned but no A record—indicating the host itself exists, but is not directly reachable."

Eu não tenho ideia de como remediar isso. No entanto, o PC host está me dando uma mensagem de sucesso para enviar dados. (Isso é porque é UDP?)

Acho que o problema está relacionado à minha falta de experiência em rede. Esta é a primeira vez que tento enviar dados UDP em C, e tenho certeza de que o cliente não pode ver o servidor porque não fiz algo certo nas configurações em algum lugar. Eu sou novo em redes Linux, então não tenho certeza de como garantir que o cliente possa ver meu servidor no linux.

Até agora, eu tentei dois roteadores diferentes sem sucesso. Os LEDs acendem quando eu conecto os cabos Ethernet. Eu realmente não tenho certeza do que mais eu preciso fazer com o roteador para facilitar esta comunicação. Como posso ter certeza de que as duas máquinas podem se ver? Eu tenho que mudar o IP do roteador / computadores? Como eu iria fazer isso? Eu acho que há algo básico que sinto falta aqui. Qualquer ajuda seria muito apreciada.

UPDATE

Este é o código do cliente UDP:

int argc;
char **argv;

#define DEFAULT_PORT 61003
#define DEFAULT_PROTO SOCK_DGRAM

...

int UDPTrack(int argc, char **argv)
{

short pan1, tilt1;
char c = 'l';
char Buffer[128];
//server hardcoded in
char *server_name= "10.0.24.100";
unsigned short port = DEFAULT_PORT;
int retval, loopflag = 0;
int i, loopcount, maxloop=-1;
unsigned int addr;
int socket_type = DEFAULT_PROTO;
struct sockaddr_in server;
struct hostent *hp;
WSADATA wsaData;
SOCKET  conn_socket;
//radar data struct
struct RadarData
{
    unsigned int messageID : 32;
    unsigned int time : 32;
    float az;
    float el;
};
 struct RadarData receivedData;

if (argc >1)
   {
    for(i=1; i<argc; i++)
    {
        if ((argv[i][0] == '-') || (argv[i][0] == '/'))
       {
            switch(tolower(argv[i][1]))
             {
                case 'p':
                    if (!stricmp(argv[i+1], "TCP"))
                        socket_type = SOCK_STREAM;
                    else if (!stricmp(argv[i+1], "UDP"))
                        socket_type = SOCK_DGRAM;
                    else
                        Usage(argv[0]);
                    i++;
                    break;
                case 'n':
                    server_name = argv[++i];
                    break;
                case 'e':
                    port = atoi(argv[++i]);
                    break;
                case 'l':
                    loopflag =1;
                    if (argv[i+1]) {
                        if (argv[i+1][0] != '-')
                            maxloop = atoi(argv[i+1]);
                    }
                    else
                        maxloop = -1;
                    i++;
                    break;
                default:
                    Usage(argv[0]);
                    break;
            }
        }
        else
            Usage(argv[0]);
    }
}

if ((retval = WSAStartup(0x202, &wsaData)) != 0)
{
   fprintf(stderr,"Client: WSAStartup() failed with error %d\n", retval);
    WSACleanup();
    return -1;
}
else
   printf("Client: WSAStartup() is OK.\n");

//ERROR HAPPENS SOMEWHERE IN HERE

 if (port == 0)
{
    Usage(argv[0]);
}
// Attempt to detect if we should call gethostbyname() or gethostbyaddr()
if (isalpha(server_name[0]))
{   // server address is a name
    hp = gethostbyname(server_name);
}
else
{ // Convert nnn.nnn address to a usable one
    addr = inet_addr(server_name);
    hp = gethostbyaddr((char *)&addr, 4, AF_INET);
}
if (hp == NULL )
{
    fprintf(stderr,"Client: Cannot resolve address \"%s\": Error %d\n", server_name, WSAGetLastError());
    WSACleanup();
        system("Pause");

    exit(1);
}
else
   printf("Client: gethostbyaddr() is OK.\n");

Eu nunca consigo passar por aqui.

    
por Mike 14.07.2011 / 17:23

2 respostas

1

Na referência MSDN , há um exemplo para uma verificação do resultado addr da função inet_addr() . Você pode apenas alimentar um endereço IP inválido.

A documentação para gethostbyname () sugere que você pode chamá-lo mesmo que o "nome" seja um endereço IP - não é necessário chamar inet_addr() .

    
por 15.07.2011 / 03:04
0

A mensagem "Não é possível resolver o endereço" sugere que você pode estar fornecendo um valor incorreto para uma API getHostByName() função

Observe que "localhost" é um nome de host válido, mas "10.0.24.100" não é, embora algumas APIs façam a coisa certa de qualquer maneira.

Como alternativa, seu cliente ou servidor de resolução de nomes (normalmente DNS) pode estar configurado incorretamente.

Postar uma amostra pequena (mas compilável) do seu código pode ajudar.

Por interesse:

C:\>perl -MSocket -e "print inet_ntoa(scalar gethostbyname('superuser.com'))"
64.34.119.12

C:\>perl -MSocket -e "print inet_ntoa(scalar gethostbyname('localhost'))"
127.0.0.1

C:\>perl -MSocket -e "print inet_ntoa(scalar gethostbyname('127.0.0.1'))"
127.0.0.1

C:\>perl -MSocket -e "print inet_ntoa(scalar gethostbyname('10.1.2.3'))"
10.1.2.3
C:\>
    
por 14.07.2011 / 18:14