Не удается разрешить адрес хоста, отправляющий пакеты UDP

2057
Mike

У меня есть две программы на C, работающие на разных компьютерах, и у меня возникают проблемы с отправкой пакетов UDP с одной машины на другую. Я тестировал части кода клиент-серверного взаимодействия на одной и той же машине, используя localhost, и все выглядело нормально, поэтому я не думаю, что проблема в моем коде. Программа сервера работает на ноутбуке с Ubuntu, а программа клиента - на рабочем столе Windows XP. Сейчас я просто подключил их через маршрутизатор linksys wrt54gs.

Каждый раз, когда я пытаюсь подключиться, я получаю сообщение об ошибке «Не удается разрешить адрес« 10.0.24.100 »» с клиентского ПК при попытке установить соединение. (Я могу предоставить некоторый код, если кто-то думает, что это поможет.) Он также дает мне код ошибки сокета windows 11004.

«Запрошенное имя является допустимым и было найдено в базе данных, но оно не имеет правильных связанных данных, для которых разрешается разрешение. Обычным примером этого является попытка преобразования имени хоста в адрес (с использованием gethostbyname или WSAAsyncGetHostByName), в которой используется DNS (сервер доменных имен). Возвращается запись MX, но нет записи A, что указывает на то, что сам хост существует, но не доступен напрямую ».

Я понятия не имею, как это исправить. Тем не менее, хост-компьютер дает мне сообщение об успешной отправке данных. (Это потому что это UDP?)

Я думаю, что проблема связана с моим отсутствием опыта работы в сети. Я впервые пытаюсь отправить UDP-данные в C, и я относительно уверен, что клиент не может видеть сервер, потому что я что-то не сделал прямо в настройках. Я новичок в сети Linux, поэтому я не уверен, как обеспечить, чтобы клиент мог видеть мой сервер в Linux.

До сих пор я пробовал два разных роутера безрезультатно. Светодиоды загораются, когда я подключаю кабели Ethernet. Я действительно не уверен, что еще мне нужно сделать с маршрутизатором, чтобы облегчить эту связь. Как я могу убедиться, что две машины видят друг друга? Нужно ли менять 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"); 

Я никогда не смогу пройти здесь.

0
Потоки UDP не используют состояния или соединения, это просто потоки данных, у вас не будет связи между клиентом и сервером. Как вы пытаетесь подключить клиента к серверу ??? Вы можете сделать это, только внедрив клиент / сервер в свой код. Вы можете проверить связь между обеими машинами с помощью ping. Diogo 12 лет назад 0
Извините, я должен был уточнить. Я имел в виду компьютер, принимающий данные, как «клиент», а компьютер, отправляющий данные, как «сервер». Mike 12 лет назад 0
Таким образом, чтобы проверить связь между обоими, вы можете просто использовать команду ping. Если пинг работает, то вы можете проверить свое приложение. Это была бы хорошая стратегия тестирования. Diogo 12 лет назад 1
Вы можете значительно упростить свою тестовую сеть, установив адаптер NIC или USB Ethernet на ПК клиента и сервера, а затем назначив статические IP-адреса. Подключите сетевые адаптеры друг к другу с помощью перекрестного кабеля или каждого порта Ethernet к коммутатору. Теперь у вас самая простая локальная сеть. sawdust 12 лет назад 0
Теперь я могу пинговать ноутбук, отправляя данные с рабочего стола (который должен быть), получая данные. Я все еще получаю ту же ошибку при попытке использовать мою программу. Mike 12 лет назад 0
Клиентский код UDP теперь выше. Стоит отметить, что это работало как «клиент» при получении данных от широковещательного UDP-хоста. Mike 12 лет назад 0

2 ответа на вопрос

1
Turbo J

В справочнике MSDN есть пример для проверки addrрезультата от inet_addr()функции. Вы можете просто указать неверный IP-адрес.

Документация для gethostbyname () предполагает, что вы можете вызывать его, даже если «имя» является IP-адресом - звонить inet_addr()вообще не нужно .

это в принципе имеет смысл для меня ... не могли бы вы предоставить немного кода? Благодарю. Mike 12 лет назад 0
0
RedGrittyBrick

Сообщение «Не удается разрешить адрес» предполагает, что вы, возможно, указали неверное значение для getHostByName()функции API

Обратите внимание, что «localhost» является допустимым именем хоста, а «10.0.24.100» - нет, хотя некоторые API в любом случае будут работать правильно.

В качестве альтернативы ваш клиент или сервер с разрешением имен (обычно DNS) может быть неправильно настроен.

Размещение небольшого (но скомпилируемого) образца вашего кода может помочь.

Для интереса:

C: \> perl -MSocket -e "print inet_ntoa (скалярное gethostbyname ('superuser.com'))" " 64.34.119.12  C: \> perl -MSocket -e "print inet_ntoa (скалярное gethostbyname ('localhost'))" " 127.0.0.1  C: \> perl -MSocket -e "print inet_ntoa (скалярное gethostbyname ('127.0.0.1'))" " 127.0.0.1  C: \> perl -MSocket -e "print inet_ntoa (скалярное gethostbyname ('10 .1.2.3 '))" 10.1.2.3 C: \> 
Я предоставил код выше. Надеюсь, это прояснит мою проблему. Mike 12 лет назад 0