无法解析发送 UDP 数据包的主机地址

无法解析发送 UDP 数据包的主机地址

我有两个 C 程序在不同的计算机上运行,​​在将 UDP 数据包从一台计算机发送到另一台计算机时遇到了一些问题。我使用本地主机在同一台计算机上测试了客户端/服务器通信代码片段,一切似乎都很好,所以我认为问题不在我的代码中。服务器程序在 Ubuntu 笔记本电脑上运行,客户端程序在 Windows XP 台式机上运行。现在,我只是通过 linksys wrt54gs 路由器将它们连接起来。

每次我尝试连接时,尝试建立连接时都会从客户端 PC 收到错误“无法解析地址“10.0.24.100””。 (如果有人认为这会有所帮助,我可以提供一些代码。)它还给了我 Windows 套接字错误代码 11004。

“请求的名称有效,并且已在数据库中找到,但它没有正确的关联数据正在解析。这种情况的常见示例是尝试使用 DNS(域名服务器)进行主机名到地址的转换(使用 gethostbyname 或 WSAAsyncGetHostByName)。返回了 MX 记录,但没有 A 记录 - 表明主机本身存在,但无法直接访问。”

我不知道该如何解决这个问题。但是,主机 PC 向我发送了一条数据发送成功的消息。(这是因为它是 UDP 吗?)

我认为问题与我缺乏网络经验有关。这是我第一次尝试用 C 发送 UDP 数据,我比较确定客户端看不到服务器,因为我在某处的设置中没有做对。我是 Linux 网络新手,所以我不确定如何确保客户端可以在 Linux 中看到我的服务器。

到目前为止,我尝试了两种不同的路由器,但都无济于事。插入以太网电缆时,LED 灯会亮起。我真的不确定还需要对路由器做些什么才能促进这种通信。我如何确保两台机器可以互相看到?我必须更改路由器/计算机的 IP 吗?我该怎么做?我觉得我这里遗漏了一些基本知识。任何帮助都将不胜感激。

更新

以下是 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");

我永远都无法从这里过去。

答案1

在里面微软参考有一个检查函数addr结果的示例inet_addr()。您可能只是输入了一个无效的 IP 地址。

文档获取主机名()建议您即使“名称”是 IP 地址也可以调用它 -inet_addr()根本不需要调用。

答案2

“无法解析地址”消息表明您可能向getHostByName()API 函数

请注意,“localhost”是有效的主机名,但“10.0.24.100”不是,尽管某些 API 无论如何都会做正确的事情。

或者您的名称解析(通常是 DNS)客户端或服务器可能配置错误。

发布一小段(但可编译)的代码样本可能会有所帮助。

有兴趣的可以看看:

C:\>perl -MSocket -e “打印 inet_ntoa(标量 gethostbyname('superuser.com'))”
64.34.119.12

C:\>perl -MSocket -e “打印 inet_ntoa(标量 gethostbyname('localhost'))”
127.0.0.1

C:\>perl -MSocket -e “打印 inet_ntoa(标量 gethostbyname('127.0.0.1'))”
127.0.0.1

C:\>perl -MSocket -e “打印 inet_ntoa(标量 gethostbyname('10.1.2.3'))”
10.1.2.3
目录:\>

相关内容