Không thể giải quyết địa chỉ máy chủ gửi các gói UDP


0

Tôi có hai chương trình C chạy trên các máy tính riêng biệt và tôi gặp một số khó khăn khi gửi các gói UDP từ máy này sang máy khác. Tôi đã kiểm tra các đoạn mã giao tiếp của máy khách / máy chủ trên cùng một máy bằng localhost và mọi thứ có vẻ ổn, vì vậy tôi không nghĩ vấn đề nằm ở mã của mình. Chương trình máy chủ đang chạy trên máy tính xách tay Ubuntu và chương trình máy khách đang chạy trên máy tính để bàn Windows XP. Ngay bây giờ, tôi chỉ cần kết nối cả hai thông qua bộ định tuyến linksys wrt54s.

Mỗi lần thử kết nối, tôi gặp lỗi "Không thể giải quyết địa chỉ" 10.0.24.100 "" từ PC khách khi cố gắng thiết lập kết nối. (Tôi có thể cung cấp một số mã nếu bất cứ ai nghĩ rằng điều đó sẽ giúp ích.) Nó cũng cung cấp cho tôi mã lỗi ổ cắm 11004.

"Tên được yêu cầu là hợp lệ và được tìm thấy trong cơ sở dữ liệu, nhưng nó không có dữ liệu liên quan chính xác được giải quyết. Ví dụ thông thường cho việc này là một nỗ lực dịch tên-địa chỉ máy chủ (sử dụng gethostbyname hoặc WSAAsyncGethostByName) sử dụng DNS (Máy chủ tên miền). Một bản ghi MX được trả về nhưng không có bản ghi A nào cho thấy bản thân máy chủ tồn tại, nhưng không thể truy cập trực tiếp. "

Tôi không có ý tưởng làm thế nào để khắc phục điều này. Tuy nhiên, máy chủ lưu trữ đang cho tôi một thông báo thành công để gửi dữ liệu. (Đây có phải là vì đó là UDP?)

Tôi nghĩ vấn đề liên quan đến việc tôi thiếu kinh nghiệm kết nối mạng. Đây là lần đầu tiên tôi cố gắng gửi dữ liệu UDP bằng C và tôi khá chắc chắn rằng khách hàng không thể thấy máy chủ vì tôi chưa làm gì đó ngay trong cài đặt ở đâu đó. Tôi mới sử dụng mạng linux, vì vậy tôi không biết làm thế nào để đảm bảo rằng máy khách có thể thấy máy chủ của tôi trong linux.

Cho đến nay, tôi đã thử hai bộ định tuyến khác nhau nhưng không có kết quả. Đèn LED bật sáng khi tôi cắm cáp Ethernet. Tôi thực sự không chắc mình cần làm gì nữa với bộ định tuyến để tạo điều kiện cho việc liên lạc này. Làm thế nào tôi có thể chắc chắn rằng hai máy có thể nhìn thấy nhau? Tôi có phải thay đổi IP của bộ định tuyến / máy tính không? Tôi sẽ đi đâu để tới đó? Tôi nghĩ rằng có một cái gì đó cơ bản mà tôi đang thiếu ở đây. Bất kì sự trợ giúp nào đều được đánh giá cao.

CẬP NHẬT

Đây là Mã khách hàng 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");

Tôi không bao giờ có thể vượt qua đây.


Các luồng UDP không sử dụng trạng thái hoặc kết nối, chỉ là luồng dữ liệu, bạn sẽ không có kết nối giữa máy khách và máy chủ. Làm thế nào để bạn kết nối máy khách với máy chủ ??? Bạn chỉ có thể làm điều này bằng cách triển khai máy khách / máy chủ trên mã của bạn. Bạn có thể kiểm tra liên kết betwwen cả hai máy bằng ping.
Diogo

Xin lỗi, tôi nên đã làm rõ. Tôi đã đề cập đến máy tính nhận dữ liệu là 'máy khách' và máy tính gửi dữ liệu là 'máy chủ'.
Mike

1
Vì vậy, để kiểm tra kết nối giữa cả hai bạn chỉ có thể sử dụng với ping. Nếu ping hoạt động thì bạn có thể kiểm tra ứng dụng của mình. Nó sẽ là một chiến lược tốt của thử nghiệm.
Diogo

Bạn có thể đơn giản hóa rất nhiều mạng thử nghiệm của mình bằng cách cài đặt bộ điều hợp Ethernet hoặc USB Ethernet trong máy khách và máy chủ, sau đó gán địa chỉ IP tĩnh. Kết nối các NIC với nhau bằng cáp chéo hoặc mỗi cổng Ethernet với một công tắc. Bây giờ bạn có mạng LAN đơn giản nhất có thể.
mùn cưa

Bây giờ tôi có thể ping máy tính xách tay gửi dữ liệu từ máy tính để bàn (được cho là) ​​nhận dữ liệu. Tôi vẫn nhận được lỗi tương tự khi cố gắng sử dụng chương trình của tôi.
Mike

Câu trả lời:


1

Trong tham chiếu MSDN có một ví dụ để kiểm tra addrkết quả từ inet_addr()hàm. Bạn chỉ có thể cung cấp một địa chỉ IP không hợp lệ.

Tài liệu cho gethostbyname () gợi ý rằng bạn có thể gọi nó ngay cả khi "tên" là địa chỉ IP - không cần phải gọi inet_addr()gì cả.


điều này có ý nghĩa về nguyên tắc đối với tôi ... bạn có phiền khi cung cấp một chút mã không? Cảm ơn.
Mike

0

Thông báo "Không thể giải quyết địa chỉ" gợi ý rằng bạn có thể đang cung cấp một giá trị không chính xác cho getHostByName()hàm API

Lưu ý rằng "localhost" là tên máy chủ hợp lệ nhưng "10.0.24.100" thì không, mặc dù một số API sẽ thực hiện đúng cách.

Ngoài ra, máy khách hoặc máy chủ có độ phân giải tên (thường là DNS) của bạn có thể bị cấu hình sai.

Đăng một mẫu nhỏ (nhưng có thể biên dịch) mã của bạn có thể giúp ích.

Để quan tâm:

C: \> perl -MSocket -e "in inet_ntoa (vô hướng gethostbyname ('superuser.com'))"
64.34.119.12

C: \> perl -MSocket -e "in inet_ntoa (vô hướng gethostbyname ('localhost'))"
127.0.0.1

C: \> perl -MSocket -e "in inet_ntoa (vô hướng gethostbyname ('127.0.0.1'))"
127.0.0.1

C: \> perl -MSocket -e "in inet_ntoa (vô hướng gethostbyname ('10 .1.2.3 '))"
10.1.2.3
C: \>

Tôi đã cung cấp mã ở trên. Hy vọng rằng sẽ làm rõ vấn đề của tôi.
Mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.