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

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

Msgstr "Запрошенное имя является действительным и было найдено в базе данных, но оно не имеет правильных связанных данных, для которых разрешается. Обычным примером этого является попытка преобразования имени узла в адрес (с использованием 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");

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

2 ответа2

1

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

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

0

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

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

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

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

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

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:\>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .