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.