我有两个 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
答案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 目录:\>